diff --git a/.changeset/attachment-collapse.md b/.changeset/attachment-collapse.md new file mode 100644 index 000000000000..b4302b83fe76 --- /dev/null +++ b/.changeset/attachment-collapse.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed Attachments not respecting collapse property when using incoming webhook diff --git a/.changeset/beige-coats-wait.md b/.changeset/beige-coats-wait.md new file mode 100644 index 000000000000..1dd4c6809a83 --- /dev/null +++ b/.changeset/beige-coats-wait.md @@ -0,0 +1,56 @@ +--- +'@rocket.chat/ui-kit': minor +'@rocket.chat/server-cloud-communication': patch +'@rocket.chat/omnichannel-services': patch +'rocketchat-services': patch +'@rocket.chat/omnichannel-transcript': patch +'@rocket.chat/authorization-service': patch +'@rocket.chat/web-ui-registration': patch +'@rocket.chat/stream-hub-service': patch +'@rocket.chat/password-policies': patch +'@rocket.chat/uikit-playground': patch +'@rocket.chat/presence-service': patch +'@rocket.chat/fuselage-ui-kit': patch +'@rocket.chat/instance-status': patch +'@rocket.chat/account-service': patch +'@rocket.chat/mock-providers': patch +'@rocket.chat/release-action': patch +'@rocket.chat/api-client': patch +'@rocket.chat/ddp-client': patch +'@rocket.chat/pdf-worker': patch +'@rocket.chat/ui-theming': patch +'@rocket.chat/account-utils': patch +'@rocket.chat/core-services': patch +'@rocket.chat/eslint-config': patch +'@rocket.chat/model-typings': patch +'@rocket.chat/ui-video-conf': patch +'@rocket.chat/cas-validate': patch +'@rocket.chat/core-typings': patch +'@rocket.chat/rest-typings': patch +'@rocket.chat/server-fetch': patch +'@rocket.chat/ddp-streamer': patch +'@rocket.chat/queue-worker': patch +'@rocket.chat/presence': patch +'@rocket.chat/poplib': patch +'@rocket.chat/ui-composer': patch +'@rocket.chat/ui-contexts': patch +'@rocket.chat/license': patch +'@rocket.chat/log-format': patch +'@rocket.chat/gazzodown': patch +'@rocket.chat/ui-client': patch +'@rocket.chat/livechat': patch +'@rocket.chat/favicon': patch +'@rocket.chat/agenda': patch +'@rocket.chat/base64': patch +'@rocket.chat/logger': patch +'@rocket.chat/models': patch +'@rocket.chat/random': patch +'@rocket.chat/sha256': patch +'@rocket.chat/tools': patch +'@rocket.chat/cron': patch +'@rocket.chat/i18n': patch +'@rocket.chat/jwt': patch +'@rocket.chat/meteor': patch +--- + +feat(uikit): Move `@rocket.chat/ui-kit` package to the main monorepo diff --git a/.changeset/beige-deers-laugh.md b/.changeset/beige-deers-laugh.md new file mode 100644 index 000000000000..fe7faf5c6f9b --- /dev/null +++ b/.changeset/beige-deers-laugh.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix user being logged out after using 2FA diff --git a/.changeset/big-teachers-change.md b/.changeset/big-teachers-change.md new file mode 100644 index 000000000000..ec8980779031 --- /dev/null +++ b/.changeset/big-teachers-change.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/ui-contexts": minor +--- + +Add the possibility to hide some elements through postMessage events. diff --git a/.changeset/brave-shrimps-marry.md b/.changeset/brave-shrimps-marry.md new file mode 100644 index 000000000000..af5b0f2a8c93 --- /dev/null +++ b/.changeset/brave-shrimps-marry.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Improved support for higlighted words in threads (rooms are now marked as unread and notifications are sent) diff --git a/.changeset/brave-snakes-scream.md b/.changeset/brave-snakes-scream.md deleted file mode 100644 index 914f248cd821..000000000000 --- a/.changeset/brave-snakes-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed an issue where broadcasted events were published twice within the same instance diff --git a/.changeset/breezy-ladybugs-sip.md b/.changeset/breezy-ladybugs-sip.md new file mode 100644 index 000000000000..9a8911e79fcf --- /dev/null +++ b/.changeset/breezy-ladybugs-sip.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue not allowing admin users to edit rooms diff --git a/.changeset/brown-ads-tell.md b/.changeset/brown-ads-tell.md new file mode 100644 index 000000000000..4659ce4b4057 --- /dev/null +++ b/.changeset/brown-ads-tell.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Clear message box related items from local storage on logout diff --git a/.changeset/brown-comics-cheat.md b/.changeset/brown-comics-cheat.md deleted file mode 100644 index a7907979881b..000000000000 --- a/.changeset/brown-comics-cheat.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/core-typings": patch -"@rocket.chat/model-typings": patch ---- - -chore: Calculate & Store MAC stats -Added new info to the stats: `omnichannelContactsBySource`, `uniqueContactsOfLastMonth`, `uniqueContactsOfLastWeek`, `uniqueContactsOfYesterday` diff --git a/.changeset/calm-rules-dance.md b/.changeset/calm-rules-dance.md new file mode 100644 index 000000000000..ac0a1e58e0a4 --- /dev/null +++ b/.changeset/calm-rules-dance.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/model-typings": patch +--- + +Fixed issue with notifications for thread messages still being sent after thread has been read diff --git a/.changeset/chatty-schools-notice.md b/.changeset/chatty-schools-notice.md new file mode 100644 index 000000000000..f759b1691cc2 --- /dev/null +++ b/.changeset/chatty-schools-notice.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +fix: OAuth login by redirect failing on firefox diff --git a/.changeset/chilled-cooks-end.md b/.changeset/chilled-cooks-end.md new file mode 100644 index 000000000000..820a3bf679f1 --- /dev/null +++ b/.changeset/chilled-cooks-end.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue displaying the language selection preference empty when it should display 'Default' on the initial value diff --git a/.changeset/chilled-mails-greet.md b/.changeset/chilled-mails-greet.md new file mode 100644 index 000000000000..8ecfe5eb5c57 --- /dev/null +++ b/.changeset/chilled-mails-greet.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue that caused Omnichannel Business Units to be saved even when the "monitors" list passed on the endpoint included users without monitor role diff --git a/.changeset/clean-melons-return.md b/.changeset/clean-melons-return.md new file mode 100644 index 000000000000..3b521860efbc --- /dev/null +++ b/.changeset/clean-melons-return.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed image dropping from another browser window creates two upload dialogs in some OS and browsers diff --git a/.changeset/cool-timers-fix.md b/.changeset/cool-timers-fix.md new file mode 100644 index 000000000000..27e06d923134 --- /dev/null +++ b/.changeset/cool-timers-fix.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed issue with read receipts for older messages not being created on the first time a user reads a DM diff --git a/.changeset/cool-zoos-move.md b/.changeset/cool-zoos-move.md deleted file mode 100644 index dda6fbe2b02e..000000000000 --- a/.changeset/cool-zoos-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fixed threads breaking when sending messages too fast diff --git a/.changeset/cyan-mangos-do.md b/.changeset/cyan-mangos-do.md deleted file mode 100644 index e188686c82d5..000000000000 --- a/.changeset/cyan-mangos-do.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: UI issue on marketplace filters diff --git a/.changeset/dull-trainers-drive.md b/.changeset/dull-trainers-drive.md deleted file mode 100644 index f5a673cd8c30..000000000000 --- a/.changeset/dull-trainers-drive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -fix: Remove model-level query restrictions for monitors diff --git a/.changeset/eight-windows-report.md b/.changeset/eight-windows-report.md new file mode 100644 index 000000000000..cce370fee1ad --- /dev/null +++ b/.changeset/eight-windows-report.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed a problem with the Fallback Forward Department functionality when transferring rooms, caused by a missing return. This provoked the system to transfer to fallback department, as expected, but then continue the process and transfer to the department with no agents anyways. Also, a duplicated "user joined" message was removed from "Forward to department" functionality. diff --git a/.changeset/eleven-gorillas-deliver.md b/.changeset/eleven-gorillas-deliver.md deleted file mode 100644 index 403bd294828b..000000000000 --- a/.changeset/eleven-gorillas-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fix trying to upload same file again and again. diff --git a/.changeset/empty-files-know.md b/.changeset/empty-files-know.md deleted file mode 100644 index 5e6fb8f751b2..000000000000 --- a/.changeset/empty-files-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fix unnecessary username validation on accounts profile form diff --git a/.changeset/fifty-ducks-sing.md b/.changeset/fifty-ducks-sing.md new file mode 100644 index 000000000000..3f8d3bda1aa5 --- /dev/null +++ b/.changeset/fifty-ducks-sing.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Discussion messages deleted despite the "Do not delete discussion messages" retention policy enabled diff --git a/.changeset/fifty-maps-deny.md b/.changeset/fifty-maps-deny.md new file mode 100644 index 000000000000..a01c5e4c7121 --- /dev/null +++ b/.changeset/fifty-maps-deny.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/rest-typings": minor +--- + +Added `push.info` endpoint to enable users to retrieve info about the workspace's push gateway diff --git a/.changeset/fluffy-monkeys-sing.md b/.changeset/fluffy-monkeys-sing.md deleted file mode 100644 index db93491b0ecd..000000000000 --- a/.changeset/fluffy-monkeys-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Changed the name of the administration Logs page to "Records", implemented a tab layout in this page and added a new tab called "Analytic reports" that shows the most recent result of the statistics endpoint. diff --git a/.changeset/forty-adults-kneel.md b/.changeset/forty-adults-kneel.md new file mode 100644 index 000000000000..cafbd2bc07cb --- /dev/null +++ b/.changeset/forty-adults-kneel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Resolved Search List Issue when pressing ENTER diff --git a/.changeset/fresh-maps-rhyme.md b/.changeset/fresh-maps-rhyme.md new file mode 100644 index 000000000000..2a272a3f81a2 --- /dev/null +++ b/.changeset/fresh-maps-rhyme.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: multiple indexes creation error during 304 migration diff --git a/.changeset/fresh-socks-fix.md b/.changeset/fresh-socks-fix.md new file mode 100644 index 000000000000..004677e019b8 --- /dev/null +++ b/.changeset/fresh-socks-fix.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Mentioning users that are not in the channel now dispatches a warning message with actions diff --git a/.changeset/funny-buses-own.md b/.changeset/funny-buses-own.md new file mode 100644 index 000000000000..faa0159807cf --- /dev/null +++ b/.changeset/funny-buses-own.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +feat: add `ImageGallery` zoom controls diff --git a/.changeset/gentle-radios-relate.md b/.changeset/gentle-radios-relate.md deleted file mode 100644 index 8d5f12b3a286..000000000000 --- a/.changeset/gentle-radios-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed DM room with "guest" user kept as "read only" after reactivating user diff --git a/.changeset/giant-dancers-relate.md b/.changeset/giant-dancers-relate.md new file mode 100644 index 000000000000..d58385c5da7a --- /dev/null +++ b/.changeset/giant-dancers-relate.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an `UnhandledPromiseRejection` error on `PUT livechat/departments/:_id` endpoint when `agents` array failed validation diff --git a/.changeset/great-kings-tickle.md b/.changeset/great-kings-tickle.md new file mode 100644 index 000000000000..73e792673f08 --- /dev/null +++ b/.changeset/great-kings-tickle.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Off the record feature was calling a deprecated and useless method. diff --git a/.changeset/green-turkeys-fry.md b/.changeset/green-turkeys-fry.md new file mode 100644 index 000000000000..64443653ba8e --- /dev/null +++ b/.changeset/green-turkeys-fry.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed toolbox sub-menu not being displayed when in smaller resolutions diff --git a/.changeset/heavy-ads-carry.md b/.changeset/heavy-ads-carry.md deleted file mode 100644 index c04e52fb48a0..000000000000 --- a/.changeset/heavy-ads-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: Change plan name from Enterprise to Premium on marketplace filtering diff --git a/.changeset/hip-pans-argue.md b/.changeset/hip-pans-argue.md deleted file mode 100644 index af8050383467..000000000000 --- a/.changeset/hip-pans-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: Omnichannel webhook is not retrying requests diff --git a/.changeset/itchy-zoos-appear.md b/.changeset/itchy-zoos-appear.md new file mode 100644 index 000000000000..6d9ab31eb7c8 --- /dev/null +++ b/.changeset/itchy-zoos-appear.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Fixes an issue where avatars are not being disabled based on preference on quote attachments diff --git a/.changeset/khaki-feet-dance.md b/.changeset/khaki-feet-dance.md deleted file mode 100644 index a419afa34143..000000000000 --- a/.changeset/khaki-feet-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -feat: Save visitor's activity on agent's interaction diff --git a/.changeset/kind-beers-share.md b/.changeset/kind-beers-share.md new file mode 100644 index 000000000000..b7871e568d10 --- /dev/null +++ b/.changeset/kind-beers-share.md @@ -0,0 +1,7 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/ui-client": minor +"@rocket.chat/web-ui-registration": minor +--- + +feat: Skip to main content shortcut and useDocumentTitle diff --git a/.changeset/kind-books-love.md b/.changeset/kind-books-love.md deleted file mode 100644 index 40ce15453ff4..000000000000 --- a/.changeset/kind-books-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed message disappearing from room after erased even if "Show Deleted Status" is enabled diff --git a/.changeset/large-pandas-beam.md b/.changeset/large-pandas-beam.md deleted file mode 100644 index 19f1eade9a9b..000000000000 --- a/.changeset/large-pandas-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": minor ---- - -New setting to automatically enable autotranslate when joining rooms diff --git a/.changeset/late-pots-travel.md b/.changeset/late-pots-travel.md new file mode 100644 index 000000000000..cd2131ac65b6 --- /dev/null +++ b/.changeset/late-pots-travel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +fix: Loading state for `Marketplace` related lists diff --git a/.changeset/lazy-shoes-teach.md b/.changeset/lazy-shoes-teach.md deleted file mode 100644 index 7737f39cd671..000000000000 --- a/.changeset/lazy-shoes-teach.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -chore: adding some portugueses translations to the app details page diff --git a/.changeset/lemon-shrimps-draw.md b/.changeset/lemon-shrimps-draw.md new file mode 100644 index 000000000000..75c2031fbaee --- /dev/null +++ b/.changeset/lemon-shrimps-draw.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed error message when uploading a file that is not allowed diff --git a/.changeset/little-planes-wonder.md b/.changeset/little-planes-wonder.md new file mode 100644 index 000000000000..13c90d0efcdc --- /dev/null +++ b/.changeset/little-planes-wonder.md @@ -0,0 +1,7 @@ +--- +'@rocket.chat/core-services': patch +'@rocket.chat/ddp-streamer': patch +'@rocket.chat/meteor': patch +--- + +Fixed an issue that caused login buttons to not be reactively removed from the login page when the related authentication service was disabled by an admin. diff --git a/.changeset/long-cars-dream.md b/.changeset/long-cars-dream.md deleted file mode 100644 index 95f226d6dfb4..000000000000 --- a/.changeset/long-cars-dream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixed intermittent errors caused by the removal of subscriptions and inquiries when lacking permissions. diff --git a/.changeset/loud-foxes-grin.md b/.changeset/loud-foxes-grin.md new file mode 100644 index 000000000000..3fa989aa0dd2 --- /dev/null +++ b/.changeset/loud-foxes-grin.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: Visitor message not being sent to webhook due to wrong validation of settings diff --git a/.changeset/loud-planes-sneeze.md b/.changeset/loud-planes-sneeze.md new file mode 100644 index 000000000000..201cc9047c8e --- /dev/null +++ b/.changeset/loud-planes-sneeze.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed a problem that caused the wrong system message to be sent when a chat was resumed from on hold status. +Note: This fix is not retroactive so rooms where a wrong message was already sent will still show the wrong message. New calls to the resume actions will have the proper message. diff --git a/.changeset/lucky-vans-develop.md b/.changeset/lucky-vans-develop.md deleted file mode 100644 index e57b7a1e68d5..000000000000 --- a/.changeset/lucky-vans-develop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed issue with file attachments in rooms' messages export having no content diff --git a/.changeset/nice-chairs-add.md b/.changeset/nice-chairs-add.md deleted file mode 100644 index dfc9d763e1c0..000000000000 --- a/.changeset/nice-chairs-add.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/core-typings": minor ---- - -Added `push` statistic, containing three bits. Each bit represents a boolean: -``` -1 1 1 -| | | -| | +- push enabled = 0b1 = 1 -| +--- push gateway enabled = 0b10 = 2 -+----- push gateway changed = 0b100 = 4 -``` diff --git a/.changeset/nice-points-notice.md b/.changeset/nice-points-notice.md new file mode 100644 index 000000000000..de69416bf43c --- /dev/null +++ b/.changeset/nice-points-notice.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fixed an issue when editing a channel's type or name sometimes showing "Room not found" error. diff --git a/.changeset/odd-hounds-thank.md b/.changeset/odd-hounds-thank.md deleted file mode 100644 index aaddc5d51a38..000000000000 --- a/.changeset/odd-hounds-thank.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -chore: Change plan name Enterprise to Premium on marketplace diff --git a/.changeset/old-zoos-hang.md b/.changeset/old-zoos-hang.md deleted file mode 100644 index eb39a6c9d83c..000000000000 --- a/.changeset/old-zoos-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -fix: mobile ringing notification missing call id diff --git a/.changeset/perfect-onions-develop.md b/.changeset/perfect-onions-develop.md deleted file mode 100644 index 3ca5c3e00bb7..000000000000 --- a/.changeset/perfect-onions-develop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fix i18n translations using sprintf post processor diff --git a/.changeset/perfect-pianos-yawn.md b/.changeset/perfect-pianos-yawn.md deleted file mode 100644 index 349bca33ecf7..000000000000 --- a/.changeset/perfect-pianos-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/presence': minor ---- - -Add peak connections monitoring and methods to get and reset the counter diff --git a/.changeset/popular-actors-cheat.md b/.changeset/popular-actors-cheat.md deleted file mode 100644 index aad5ec6ae638..000000000000 --- a/.changeset/popular-actors-cheat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/model-typings": patch ---- - -Do not allow auto-translation to be enabled in E2E rooms diff --git a/.changeset/pretty-eyes-sleep.md b/.changeset/pretty-eyes-sleep.md new file mode 100644 index 000000000000..04b276b18ff5 --- /dev/null +++ b/.changeset/pretty-eyes-sleep.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed issue searching connected users on spotlight diff --git a/.changeset/proud-shrimps-cheat.md b/.changeset/proud-shrimps-cheat.md deleted file mode 100644 index cad8bc8bfa32..000000000000 --- a/.changeset/proud-shrimps-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: Unable to send attachments via email as an omni-agent diff --git a/.changeset/quiet-phones-reply.md b/.changeset/quiet-phones-reply.md deleted file mode 100644 index f2735e615491..000000000000 --- a/.changeset/quiet-phones-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Search users using full name too on share message modal diff --git a/.changeset/rich-dogs-smell.md b/.changeset/rich-dogs-smell.md deleted file mode 100644 index be27db28e227..000000000000 --- a/.changeset/rich-dogs-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Fix typing indicator of Apps user diff --git a/.changeset/rotten-dryers-allow.md b/.changeset/rotten-dryers-allow.md deleted file mode 100644 index 154dea572780..000000000000 --- a/.changeset/rotten-dryers-allow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Add pagination & tooltips to agent's dropdown on forwarding modal diff --git a/.changeset/rude-spoons-pump.md b/.changeset/rude-spoons-pump.md new file mode 100644 index 000000000000..3743d1d4b897 --- /dev/null +++ b/.changeset/rude-spoons-pump.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed Engagement Dashboard timezone selector freezing UI diff --git a/.changeset/selfish-hounds-pay.md b/.changeset/selfish-hounds-pay.md deleted file mode 100644 index 3ca321bd392f..000000000000 --- a/.changeset/selfish-hounds-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -fix: Monitors now able to forward a chat without taking it first diff --git a/.changeset/seven-carpets-march.md b/.changeset/seven-carpets-march.md deleted file mode 100644 index 46fd1b7ddb62..000000000000 --- a/.changeset/seven-carpets-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Add new permission to allow kick users from rooms without being a member diff --git a/.changeset/shiny-pillows-run.md b/.changeset/shiny-pillows-run.md deleted file mode 100644 index 9a85d37a2f9d..000000000000 --- a/.changeset/shiny-pillows-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: cloud alerts not working diff --git a/.changeset/silver-mice-allow.md b/.changeset/silver-mice-allow.md new file mode 100644 index 000000000000..0be0670a11f8 --- /dev/null +++ b/.changeset/silver-mice-allow.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +fix: mention channel redirecting to own DM diff --git a/.changeset/slow-coats-shout.md b/.changeset/slow-coats-shout.md deleted file mode 100644 index 4a226e84d161..000000000000 --- a/.changeset/slow-coats-shout.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": minor ---- - -Add the daily and monthly peaks of concurrent connections to statistics - - Added `dailyPeakConnections` statistic for monitoring the daily peak of concurrent connections in a workspace; - - Added `maxMonthlyPeakConnections` statistic for monitoring the last 30 days peak of concurrent connections in a workspace; diff --git a/.changeset/soft-cows-juggle.md b/.changeset/soft-cows-juggle.md deleted file mode 100644 index 6fcb20506483..000000000000 --- a/.changeset/soft-cows-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -download translation files through CDN diff --git a/.changeset/spotty-bulldogs-fly.md b/.changeset/spotty-bulldogs-fly.md new file mode 100644 index 000000000000..d0919fe95fcc --- /dev/null +++ b/.changeset/spotty-bulldogs-fly.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes the `overview` endpoint to show busiest time of the day in users timezone instead of UTC. diff --git a/.changeset/spotty-suns-grin.md b/.changeset/spotty-suns-grin.md new file mode 100644 index 000000000000..8045ebbd1b4b --- /dev/null +++ b/.changeset/spotty-suns-grin.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Improved the experience of receiving conference calls on the mobile app by disabling the push notification for the "new call" message if a push is already being sent to trigger the phone's ringing tone. diff --git a/.changeset/stale-masks-learn.md b/.changeset/stale-masks-learn.md deleted file mode 100644 index 1523b02b0c95..000000000000 --- a/.changeset/stale-masks-learn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/server-fetch': patch ---- - -Fixed an issue where the payload of an HTTP request made by an app wouldn't be correctly encoded in some cases diff --git a/.changeset/stale-monkeys-yell.md b/.changeset/stale-monkeys-yell.md new file mode 100644 index 000000000000..7f80c152b888 --- /dev/null +++ b/.changeset/stale-monkeys-yell.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue where room access and creation were hindered due to join codes not being fetched correctly in the API. diff --git a/.changeset/strange-papayas-yell.md b/.changeset/strange-papayas-yell.md deleted file mode 100644 index ca194dd2f9d4..000000000000 --- a/.changeset/strange-papayas-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -fix: Disables GenericMenu without any sections or items diff --git a/.changeset/sweet-chefs-exist.md b/.changeset/sweet-chefs-exist.md deleted file mode 100644 index 6ceee63dd762..000000000000 --- a/.changeset/sweet-chefs-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Check for room scoped permissions for starting discussions diff --git a/.changeset/sweet-feet-relate.md b/.changeset/sweet-feet-relate.md deleted file mode 100644 index f7da740ebcc0..000000000000 --- a/.changeset/sweet-feet-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fix: user dropdown menu position on RTL layout diff --git a/.changeset/swift-beans-reflect.md b/.changeset/swift-beans-reflect.md new file mode 100644 index 000000000000..f8e8a487493d --- /dev/null +++ b/.changeset/swift-beans-reflect.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Added a modal to confirm the intention to pin a message, preventing users from doing it by mistake diff --git a/.changeset/thick-nails-explode.md b/.changeset/thick-nails-explode.md new file mode 100644 index 000000000000..5cf9020e1911 --- /dev/null +++ b/.changeset/thick-nails-explode.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed the problem of not being possible to add a join code to a public room diff --git a/.changeset/thick-spoons-compete.md b/.changeset/thick-spoons-compete.md deleted file mode 100644 index cf6e9eb2697d..000000000000 --- a/.changeset/thick-spoons-compete.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Added new Omnichannel setting 'Hide conversation after closing' diff --git a/.changeset/thin-chairs-clean.md b/.changeset/thin-chairs-clean.md new file mode 100644 index 000000000000..0ad80730f293 --- /dev/null +++ b/.changeset/thin-chairs-clean.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed the problem of displaying the wrong composer for archived room diff --git a/.changeset/thin-socks-brush.md b/.changeset/thin-socks-brush.md new file mode 100644 index 000000000000..a1da5c81e684 --- /dev/null +++ b/.changeset/thin-socks-brush.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Removed an old behavior that allowed visitors to be created with an empty token on `livechat/visitor` endpoint. diff --git a/.changeset/thirty-jokes-compete.md b/.changeset/thirty-jokes-compete.md deleted file mode 100644 index 9d4095e7771b..000000000000 --- a/.changeset/thirty-jokes-compete.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -chore: Deprecate un-used meteor method for omnichannel analytics diff --git a/.changeset/thirty-pumpkins-fix.md b/.changeset/thirty-pumpkins-fix.md deleted file mode 100644 index 11b92b064e15..000000000000 --- a/.changeset/thirty-pumpkins-fix.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@rocket.chat/core-typings': minor -'@rocket.chat/rest-typings': minor -'@rocket.chat/tools': minor -'@rocket.chat/meteor': minor ---- - -Added option to select between two script engine options for the integrations diff --git a/.changeset/three-moles-look.md b/.changeset/three-moles-look.md new file mode 100644 index 000000000000..a6429fb6197e --- /dev/null +++ b/.changeset/three-moles-look.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed conversations in queue being limited to 50 items diff --git a/.changeset/three-steaks-cry.md b/.changeset/three-steaks-cry.md new file mode 100644 index 000000000000..3de321b2ff3f --- /dev/null +++ b/.changeset/three-steaks-cry.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/livechat": patch +--- + +Fixed a problem that caused Livechat Widget registration page to ignore the `showOnRegistration` flag for departments, showing all items. diff --git a/.changeset/tidy-bears-applaud.md b/.changeset/tidy-bears-applaud.md deleted file mode 100644 index cff12f3dc7d3..000000000000 --- a/.changeset/tidy-bears-applaud.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/core-typings": minor -"@rocket.chat/model-typings": minor -"@rocket.chat/rest-typings": minor ---- - -Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. -The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. -An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. diff --git a/.changeset/tidy-cows-destroy.md b/.changeset/tidy-cows-destroy.md deleted file mode 100644 index 0b222f8157a9..000000000000 --- a/.changeset/tidy-cows-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -feat: Community users will now be able to customize their Business hour timezone diff --git a/.changeset/tiny-wolves-deliver.md b/.changeset/tiny-wolves-deliver.md deleted file mode 100644 index f89564a9b53c..000000000000 --- a/.changeset/tiny-wolves-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/ui-theming': patch ---- - -fix: light-theme font-disabled color diff --git a/.changeset/tough-apples-turn.md b/.changeset/tough-apples-turn.md deleted file mode 100644 index 056a0645186e..000000000000 --- a/.changeset/tough-apples-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Forward headers when using proxy for file uploads diff --git a/.changeset/tough-carrots-walk.md b/.changeset/tough-carrots-walk.md deleted file mode 100644 index 2851e697b85e..000000000000 --- a/.changeset/tough-carrots-walk.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rocket.chat/rest-typings': minor -'@rocket.chat/license': patch -'@rocket.chat/meteor': patch ---- - -feat: added `licenses.info` endpoint diff --git a/.changeset/twelve-files-deny.md b/.changeset/twelve-files-deny.md deleted file mode 100644 index 123bf0a7764b..000000000000 --- a/.changeset/twelve-files-deny.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -'@rocket.chat/license': minor -'@rocket.chat/jwt': minor -'@rocket.chat/omnichannel-services': minor -'@rocket.chat/omnichannel-transcript': minor -'@rocket.chat/authorization-service': minor -'@rocket.chat/stream-hub-service': minor -'@rocket.chat/presence-service': minor -'@rocket.chat/account-service': minor -'@rocket.chat/core-services': minor -'@rocket.chat/model-typings': minor -'@rocket.chat/core-typings': minor -'@rocket.chat/rest-typings': minor -'@rocket.chat/ddp-streamer': minor -'@rocket.chat/queue-worker': minor -'@rocket.chat/presence': minor -'@rocket.chat/meteor': minor ---- - -Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. -Also added a version v3 of the license, which contains an extended list of features. -v2 is still supported, since we convert it to v3 on the fly. diff --git a/.changeset/violet-pears-cry.md b/.changeset/violet-pears-cry.md new file mode 100644 index 000000000000..8e10ad50dd55 --- /dev/null +++ b/.changeset/violet-pears-cry.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed the filter for file type in the list of room files diff --git a/.changeset/warm-melons-type.md b/.changeset/warm-melons-type.md deleted file mode 100644 index 5b187b8a7f11..000000000000 --- a/.changeset/warm-melons-type.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/core-typings": patch -"@rocket.chat/omnichannel-services": patch ---- - -feat: Disable and annonimize visitors instead of removing diff --git a/.changeset/weak-cameras-pay.md b/.changeset/weak-cameras-pay.md deleted file mode 100644 index 724f3af69a29..000000000000 --- a/.changeset/weak-cameras-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed issue with message read receipts not being created when accessing a room the first time diff --git a/.changeset/wicked-humans-hang.md b/.changeset/wicked-humans-hang.md deleted file mode 100644 index e793bc978902..000000000000 --- a/.changeset/wicked-humans-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Improve cache of static files diff --git a/.changeset/wicked-jars-double.md b/.changeset/wicked-jars-double.md deleted file mode 100644 index 23deffe8606f..000000000000 --- a/.changeset/wicked-jars-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Handle the username update in the background diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6e14d4935eaf..0b2af2ef7881 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -22,15 +22,13 @@ --> ## Proposed changes (including videos or screenshots) - - - ## Issue(s) diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml index 21fec059c8de..e5b5d7740789 100644 --- a/.github/actions/meteor-build/action.yml +++ b/.github/actions/meteor-build/action.yml @@ -103,18 +103,19 @@ runs: working-directory: ./apps/meteor run: meteor reset - - name: Build Rocket.Chat From Pull Request + - name: Build Rocket.Chat shell: bash - if: startsWith(github.ref, 'refs/pull/') == true env: METEOR_PROFILE: 1000 BABEL_ENV: ${{ inputs.coverage == 'true' && 'coverage' || '' }} - run: yarn build:ci -- --directory /tmp/dist + run: | + # check if BABEL_ENV is set to coverage + if [[ $BABEL_ENV == "coverage" ]]; then + echo -e "rocketchat:coverage\n" >> ./apps/meteor/.meteor/packages + echo "Coverage enabled" + fi - - name: Build Rocket.Chat - shell: bash - if: startsWith(github.ref, 'refs/pull/') != true - run: yarn build:ci -- --directory /tmp/dist + yarn build:ci -- --directory /tmp/dist - name: Prepare build shell: bash diff --git a/.github/workflows/ci-code-check.yml b/.github/workflows/ci-code-check.yml index 57cdac047423..75deb399d2f2 100644 --- a/.github/workflows/ci-code-check.yml +++ b/.github/workflows/ci-code-check.yml @@ -27,7 +27,7 @@ jobs: with: swap-size-gb: 4 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci-test-e2e.yml b/.github/workflows/ci-test-e2e.yml index d77966f186b3..3f75695b4877 100644 --- a/.github/workflows/ci-test-e2e.yml +++ b/.github/workflows/ci-test-e2e.yml @@ -88,7 +88,7 @@ jobs: mongodb-version: ${{ matrix.mongodb-version }} mongodb-replica-set: rs0 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup NodeJS uses: ./.github/actions/setup-node @@ -127,6 +127,12 @@ jobs: - run: yarn build + - name: Prepare code coverage directory + if: inputs.release == 'ee' + run: | + mkdir -p /tmp/coverage + chmod 777 /tmp/coverage + - name: Start containers for CE if: inputs.release == 'ce' env: @@ -141,6 +147,8 @@ jobs: MONGO_URL: 'mongodb://host.docker.internal:27017/rocketchat?replicaSet=rs0&directConnection=true' ENTERPRISE_LICENSE: ${{ inputs.enterprise-license }} TRANSPORTER: ${{ inputs.transporter }} + COVERAGE_DIR: '/tmp/coverage' + COVERAGE_REPORTER: 'lcov' run: | docker compose -f docker-compose-ci.yml up -d @@ -152,7 +160,7 @@ jobs: path: | ~/.cache/ms-playwright # This is the version of Playwright that we are using, if you are willing to upgrade, you should update this. - key: playwright-1.37.1 + key: playwright-1.40.1 - name: Install Playwright if: inputs.type == 'ui' && steps.cache-playwright.outputs.cache-hit != 'true' @@ -184,6 +192,8 @@ jobs: env: WEBHOOK_TEST_URL: 'http://host.docker.internal:10000' IS_EE: ${{ inputs.release == 'ee' && 'true' || '' }} + COVERAGE_DIR: '/tmp/coverage' + COVERAGE_REPORTER: 'lcovonly' run: | for i in $(seq 1 2); do npm run testapi && s=0 && break || s=$? @@ -204,6 +214,9 @@ jobs: sleep 10 done; done; + docker compose -f ../../docker-compose-ci.yml stop + + ls -l $COVERAGE_DIR exit $s - name: E2E Test UI (${{ matrix.shard }}/${{ inputs.total-shard }}) @@ -249,6 +262,22 @@ jobs: verbose: true token: ${{ secrets.CODECOV_TOKEN }} + - uses: codecov/codecov-action@v3 + if: inputs.type == 'api' && inputs.release == 'ee' + with: + directory: /tmp/coverage + working-directory: . + flags: e2e-api + verbose: true + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Store e2e-api-ee-coverage + if: inputs.type == 'api' && inputs.release == 'ee' + uses: actions/upload-artifact@v3 + with: + name: e2e-api-ee-coverage + path: /tmp/coverage + - name: Store e2e-ee-coverage if: inputs.type == 'ui' && inputs.release == 'ee' uses: actions/upload-artifact@v3 diff --git a/.github/workflows/ci-test-unit.yml b/.github/workflows/ci-test-unit.yml index b4ef5cb273ad..066cc2e3773e 100644 --- a/.github/workflows/ci-test-unit.yml +++ b/.github/workflows/ci-test-unit.yml @@ -21,7 +21,7 @@ jobs: name: Unit Tests steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup NodeJS uses: ./.github/actions/setup-node diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec8e905cd803..a8f8d29610bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,9 +80,49 @@ jobs: echo "DOCKER_TAG: ${DOCKER_TAG}" echo "gh-docker-tag=${DOCKER_TAG}" >> $GITHUB_OUTPUT + notify-draft-services: + name: 🚀 Notify external services - draft + runs-on: ubuntu-20.04 + needs: [release-versions] + steps: + - uses: Bhacaz/checkout-files@v2 + with: + files: package.json + branch: ${{ github.ref }} + + - name: Register release on cloud as Draft + if: github.event_name == 'release' + env: + UPDATE_TOKEN: ${{ secrets.UPDATE_TOKEN }} + run: | + REPO_VERSION=$(node -p "require('./package.json').version") + + if [[ '${{ github.event_name }}' = 'release' ]]; then + GIT_TAG="${GITHUB_REF#*tags/}" + GIT_BRANCH="" + ARTIFACT_NAME="${REPO_VERSION}" + RC_VERSION=$GIT_TAG + + if [[ '${{ needs.release-versions.outputs.release }}' = 'release-candidate' ]]; then + RC_RELEASE=candidate + elif [[ '${{ needs.release-versions.outputs.release }}' = 'latest' ]]; then + RC_RELEASE=stable + fi + else + GIT_TAG="" + GIT_BRANCH="${GITHUB_REF#*heads/}" + ARTIFACT_NAME="${REPO_VERSION}.$GITHUB_SHA" + RC_VERSION="${REPO_VERSION}" + RC_RELEASE=develop + fi; + + curl -H "Content-Type: application/json" -H "X-Update-Token: $UPDATE_TOKEN" -d \ + "{\"nodeVersion\": \"${{ needs.release-versions.outputs.node-version }}\", \"compatibleMongoVersions\": [\"4.4\", \"5.0\", \"6.0\"], \"commit\": \"$GITHUB_SHA\", \"tag\": \"$RC_VERSION\", \"branch\": \"$GIT_BRANCH\", \"artifactName\": \"$ARTIFACT_NAME\", \"releaseType\": \"draft\", \"draftAs\": \"$RC_RELEASE\"}" \ + https://releases.rocket.chat/update + packages-build: name: 📦 Build Packages - needs: [release-versions] + needs: [release-versions, notify-draft-services] runs-on: ubuntu-20.04 steps: - name: Github Info @@ -100,7 +140,7 @@ jobs: with: swap-size-gb: 4 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup NodeJS uses: ./.github/actions/setup-node @@ -138,12 +178,12 @@ jobs: echo "github.event_name: ${{ github.event_name }}" cat $GITHUB_EVENT_PATH - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/meteor-build with: node-version: ${{ needs.release-versions.outputs.node-version }} - coverage: true + coverage: ${{ github.event_name != 'release' }} build-prod: name: 📦 Meteor Build - official @@ -162,12 +202,12 @@ jobs: echo "github.event_name: ${{ github.event_name }}" cat $GITHUB_EVENT_PATH - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/meteor-build with: node-version: ${{ needs.release-versions.outputs.node-version }} - coverage: false + coverage: ${{ github.event_name != 'release' }} build-gh-docker-coverage: name: 🚢 Build Docker Images for Testing @@ -187,7 +227,7 @@ jobs: platform: ['official', 'alpine'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # we only build and publish the actual docker images if not a PR from a fork - uses: ./.github/actions/build-docker @@ -216,7 +256,7 @@ jobs: platform: ['official', 'alpine'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/build-docker with: @@ -415,7 +455,7 @@ jobs: needs: [build, checks, release-versions] if: github.event_name == 'release' || github.ref == 'refs/heads/develop' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore build uses: actions/download-artifact@v3 @@ -684,21 +724,6 @@ jobs: # Makes build fail if the release isn't there curl --fail https://releases.rocket.chat/$RC_VERSION/info - - name: RedHat Registry - if: github.event_name == 'release' - env: - REDHAT_REGISTRY_PID: ${{ secrets.REDHAT_REGISTRY_PID }} - REDHAT_REGISTRY_KEY: ${{ secrets.REDHAT_REGISTRY_KEY }} - run: | - GIT_TAG="${GITHUB_REF#*tags/}" - - curl -X POST \ - https://connect.redhat.com/api/v2/projects/$REDHAT_REGISTRY_PID/build \ - -H "Authorization: Bearer $REDHAT_REGISTRY_KEY" \ - -H 'Cache-Control: no-cache' \ - -H 'Content-Type: application/json' \ - -d '{"tag":"'$GIT_TAG'"}' - trigger-dependent-workflows: runs-on: ubuntu-latest if: github.event_name == 'release' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4e9706156c3a..483b404a6dc8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. diff --git a/.github/workflows/new-release.yml b/.github/workflows/new-release.yml index 937c4d1b6b52..f10578d5879f 100644 --- a/.github/workflows/new-release.yml +++ b/.github/workflows/new-release.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.base-ref }} fetch-depth: 0 diff --git a/.github/workflows/pr-update-description.yml b/.github/workflows/pr-update-description.yml new file mode 100644 index 000000000000..71b4ffeda801 --- /dev/null +++ b/.github/workflows/pr-update-description.yml @@ -0,0 +1,39 @@ +name: 'Release PR Description' + +on: + pull_request: + branches: + - master + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + update-pr: + runs-on: ubuntu-latest + if: startsWith(github.head_ref, 'release-') + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.CI_PAT }} + + - name: Setup NodeJS + uses: ./.github/actions/setup-node + with: + node-version: 14.21.3 + cache-modules: true + install: true + + - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + + - name: Build packages + run: yarn build + + - name: Update PR description + uses: ./packages/release-action + with: + action: update-pr-description + env: + GITHUB_TOKEN: ${{ secrets.CI_PAT }} + diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index ca4b6979961f..e133a3153722 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.CI_PAT }} diff --git a/.gitignore b/.gitignore index 3fcb40b03610..13ee265952bb 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,6 @@ yarn-error.log* .idea/ .exrc .history -.envrc \ No newline at end of file +.envrc + +*.sublime-workspace diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000000..e24ff7d2ebf1 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,26 @@ +tasks: + - init: | + nvm install $(jq -r .engines.node package.json) && + curl https://install.meteor.com/ | sh && + export PATH="$PATH:$HOME/.meteor" && + yarn && + export ROOT_URL=$(gp url 3000) + command: yarn build && yarn dev + +ports: + - port: 3000 + visibility: public + onOpen: open-preview + +github: + prebuilds: + master: true + pullRequests: true + pullRequestsFromForks: true + addCheck: true + addComment: true + addBadge: true + +vscode: + extensions: + - esbenp.prettier-vscode \ No newline at end of file diff --git a/.husky/pre-push b/.husky/pre-push deleted file mode 100755 index 7e116981132d..000000000000 --- a/.husky/pre-push +++ /dev/null @@ -1,4 +0,0 @@ -[ "$HUSKY" = "0" ] && echo "skipping push hook" && exit 0 - -yarn lint && \ -yarn testunit diff --git a/.yarn/patches/typia-npm-5.3.3-21d3e18463.patch b/.yarn/patches/typia-npm-5.3.3-21d3e18463.patch new file mode 100644 index 000000000000..1487a9f4712d --- /dev/null +++ b/.yarn/patches/typia-npm-5.3.3-21d3e18463.patch @@ -0,0 +1,320 @@ +diff --git a/lib/factories/internal/metadata/iterate_metadata_intersection.js b/lib/factories/internal/metadata/iterate_metadata_intersection.js +index 260670b8ea37b63dcacadeffa26450f81087c90e..f07b44b16099d896ab40c46f03df86ee2f2c1a90 100644 +--- a/lib/factories/internal/metadata/iterate_metadata_intersection.js ++++ b/lib/factories/internal/metadata/iterate_metadata_intersection.js +@@ -247,7 +247,7 @@ var iterate_metadata_intersection = function (checker) { + var tags = MetadataTypeTagFactory_1.MetadataTypeTagFactory.analyze(errors)(target)(objects.map(function (om) { return om.objects; }).flat(), explore); + if (tags.length) + if (target === "array") +- meta.arrays.at(-1).tags.push(tags); ++ meta.arrays.slice(-1)[0].tags.push(tags); + else if (booleanLiteral === null) + meta.atomics.find(function (a) { return a.type === target; }).tags.push(tags); + else { +diff --git a/lib/programmers/CheckerProgrammer.js b/lib/programmers/CheckerProgrammer.js +index bbec09f22798d144b96f59bb946e7e32e3438c05..dc13cb47b72358b8e6165b768cff2360db2bd617 100644 +--- a/lib/programmers/CheckerProgrammer.js ++++ b/lib/programmers/CheckerProgrammer.js +@@ -458,8 +458,8 @@ var CheckerProgrammer; + ? "".concat(explore.postfix.slice(0, -1), "[").concat(index, "]\"") + : "\"[".concat(index, "]\"") })); + }); +- var rest = tuple.elements.length && tuple.elements.at(-1).rest !== null +- ? CheckerProgrammer.decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.at(-1).rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })) ++ var rest = tuple.elements.length && tuple.elements.slice(-1)[0].rest !== null ++ ? CheckerProgrammer.decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.slice(-1)[0].rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })) + : null; + var arrayLength = typescript_1.default.factory.createPropertyAccessExpression(input, "length"); + return config.combiner(explore)("and")(input, __spreadArray(__spreadArray(__spreadArray([], __read((rest === null +diff --git a/lib/programmers/TypiaProgrammer.js b/lib/programmers/TypiaProgrammer.js +index c75ab1bc077b788e36c32834ea4916c22df34500..99452220e2dd090d4d562296e26fb266faa617f9 100644 +--- a/lib/programmers/TypiaProgrammer.js ++++ b/lib/programmers/TypiaProgrammer.js +@@ -165,7 +165,7 @@ var TypiaProgrammer; + .split("\n"); + if (lines.length === 0) + return [0, 0]; +- return [lines.length, lines.at(-1).length + 1]; ++ return [lines.length, lines.slice(-1)[0].length + 1]; + })() + : [0, 0], 2), line = _k[0], pos = _k[1]; + console.error("".concat(file, ":").concat(line, ":").concat(pos, " - ").concat(category, " TS").concat(diag.code, ": ").concat(diag.messageText)); +diff --git a/lib/programmers/internal/application_tuple.js b/lib/programmers/internal/application_tuple.js +index 5c1853a3a1692f95fe702bdae9813e958f54ac4c..04ca996c2ffe72d1cd5969e45a38e91937b975b1 100644 +--- a/lib/programmers/internal/application_tuple.js ++++ b/lib/programmers/internal/application_tuple.js +@@ -22,15 +22,15 @@ var application_tuple = function (options) { + var schema = __assign(__assign({ type: "array", items: tuple.type.elements.map(function (meta, i) { + var _a; + return (0, application_schema_1.application_schema)(options)(false)(components)((_a = meta.rest) !== null && _a !== void 0 ? _a : meta)(__assign(__assign({}, attribute), { "x-typia-rest": i === tuple.type.elements.length - 1 && meta.rest !== null, "x-typia-required": meta.required, "x-typia-optional": meta.optional })); +- }) }, attribute), { minItems: !!((_a = tuple.type.elements.at(-1)) === null || _a === void 0 ? void 0 : _a.rest) ++ }) }, attribute), { minItems: !!((_a = tuple.type.elements.slice(-1)[0]) === null || _a === void 0 ? void 0 : _a.rest) + ? tuple.type.elements.length - 1 +- : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.at(-1)) === null || _b === void 0 ? void 0 : _b.rest) ++ : tuple.type.elements.filter(function (x) { return !x.optional; }).length, maxItems: !!((_b = tuple.type.elements.slice(-1)[0]) === null || _b === void 0 ? void 0 : _b.rest) + ? undefined + : tuple.type.elements.length }); + if (options.purpose === "ajv") + if (tuple.type.elements.length === 0) + return schema; +- else if (!((_c = tuple.type.elements.at(-1)) === null || _c === void 0 ? void 0 : _c.rest)) ++ else if (!((_c = tuple.type.elements.slice(-1)[0]) === null || _c === void 0 ? void 0 : _c.rest)) + return schema; + var wrapper = __assign(__assign({}, schema), { items: (0, application_schema_1.application_schema)(options)(false)(components)(tuple.type.elements.reduce(function (x, y) { var _a, _b; return Metadata_1.Metadata.merge((_a = x.rest) !== null && _a !== void 0 ? _a : x, (_b = y.rest) !== null && _b !== void 0 ? _b : y); }, Metadata_1.Metadata.initialize()))(tuple.type.recursive ? {} : attribute), "x-typia-tuple": schema, minItems: schema.minItems, maxItems: schema.maxItems }); + return wrapper; +diff --git a/lib/programmers/json/JsonStringifyProgrammer.js b/lib/programmers/json/JsonStringifyProgrammer.js +index ce0ae787164f7eba68ef35b05232b4b94ad8e7d7..8f70cfc8c8e9d82cd1ec5004ca5637487f57b3bc 100644 +--- a/lib/programmers/json/JsonStringifyProgrammer.js ++++ b/lib/programmers/json/JsonStringifyProgrammer.js +@@ -424,10 +424,10 @@ var JsonStringifyProgrammer; + var rest = (function () { + if (tuple.elements.length === 0) + return null; +- var last = tuple.elements.at(-1); ++ var last = tuple.elements.slice(-1)[0]; + if (last.rest === null) + return null; +- var code = decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.at(-1).rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); ++ var code = decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.slice(-1)[0].rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); + return typescript_1.default.factory.createCallExpression(importer.use("rest"), undefined, [code]); + })(); + return StringifyJoinder_1.StringifyJoiner.tuple(children, rest); +diff --git a/lib/programmers/misc/MiscCloneProgrammer.js b/lib/programmers/misc/MiscCloneProgrammer.js +index 3db6bc92637284468c5fe47ef59f51a9b41d06eb..0b3fa9deaaadf28d4f348225c0d44f49700c1bca 100644 +--- a/lib/programmers/misc/MiscCloneProgrammer.js ++++ b/lib/programmers/misc/MiscCloneProgrammer.js +@@ -291,11 +291,11 @@ var MiscCloneProgrammer; + var rest = (function () { + if (tuple.elements.length === 0) + return null; +- var last = tuple.elements.at(-1); ++ var last = tuple.elements.slice(-1)[0]; + var rest = last.rest; + if (rest === null) + return null; +- return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.at(-1).rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); ++ return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.slice(-1)[0].rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); + })(); + return CloneJoiner_1.CloneJoiner.tuple(children, rest); + }; +diff --git a/lib/programmers/misc/MiscPruneProgrammer.js b/lib/programmers/misc/MiscPruneProgrammer.js +index 8440aaba9e449dae2468e96dfd7035ac7e170cfc..e97ceec78427b7eed08db23cc4775fdb10c6b2ff 100644 +--- a/lib/programmers/misc/MiscPruneProgrammer.js ++++ b/lib/programmers/misc/MiscPruneProgrammer.js +@@ -272,11 +272,11 @@ var MiscPruneProgrammer; + var rest = (function () { + if (tuple.elements.length === 0) + return null; +- var last = tuple.elements.at(-1); ++ var last = tuple.elements.slice(-1)[0]; + var rest = last.rest; + if (rest === null || filter(rest) === false) + return null; +- return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.at(-1).rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); ++ return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.slice(-1)[0].rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); + })(); + return PruneJoiner_1.PruneJoiner.tuple(children, rest); + }; +diff --git a/lib/programmers/notations/NotationGeneralProgrammer.js b/lib/programmers/notations/NotationGeneralProgrammer.js +index 6e0b582a802180d7671c00b999469e7e59193b30..f11cc1d523875a040d3e27ce9a850b083c5d0275 100644 +--- a/lib/programmers/notations/NotationGeneralProgrammer.js ++++ b/lib/programmers/notations/NotationGeneralProgrammer.js +@@ -301,11 +301,11 @@ var NotationGeneralProgrammer; + var rest = (function () { + if (tuple.elements.length === 0) + return null; +- var last = tuple.elements.at(-1); ++ var last = tuple.elements.slice(-1)[0]; + var rest = last.rest; + if (rest === null) + return null; +- return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.at(-1).rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); ++ return decode(project)(config)(importer)(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(input)("slice"), undefined, [ExpressionFactory_1.ExpressionFactory.number(tuple.elements.length - 1)]), (0, wrap_metadata_rest_tuple_1.wrap_metadata_rest_tuple)(tuple.elements.slice(-1)[0].rest), __assign(__assign({}, explore), { start: tuple.elements.length - 1 })); + })(); + return NotationJoiner_1.NotationJoiner.tuple(children, rest); + }; +diff --git a/lib/transformers/CallExpressionTransformer.js b/lib/transformers/CallExpressionTransformer.js +index 2c5a23879d171ee271ebf6857dc9c65ec29c0ea7..96a40845614f6c54fe8e4ebc48a7d8efeba52a41 100644 +--- a/lib/transformers/CallExpressionTransformer.js ++++ b/lib/transformers/CallExpressionTransformer.js +@@ -101,7 +101,7 @@ var CallExpressionTransformer; + var location = path_1.default.resolve(declaration.getSourceFile().fileName); + if (isTarget(location) === false) + return expression; +- var module = location.split(path_1.default.sep).at(-1).split(".")[0]; ++ var module = location.split(path_1.default.sep).slice(-1)[0].split(".")[0]; + var name = project.checker.getTypeAtLocation(declaration).symbol.name; + var functor = (_b = FUNCTORS[module]) === null || _b === void 0 ? void 0 : _b[name]; + if (functor === undefined) +diff --git a/src/factories/internal/metadata/iterate_metadata_intersection.ts b/src/factories/internal/metadata/iterate_metadata_intersection.ts +index f46caa25c987092597073e046ae3b9e8130bd994..1eedd727c74f173a5b98a9572b865e058885811d 100644 +--- a/src/factories/internal/metadata/iterate_metadata_intersection.ts ++++ b/src/factories/internal/metadata/iterate_metadata_intersection.ts +@@ -214,7 +214,7 @@ export const iterate_metadata_intersection = + target, + )(objects.map((om) => om.objects).flat(), explore); + if (tags.length) +- if (target === "array") meta.arrays.at(-1)!.tags.push(tags); ++ if (target === "array") meta.arrays.slice(-1)[0]!.tags.push(tags); + else if (booleanLiteral === null) + meta.atomics.find((a) => a.type === target)!.tags.push(tags); + else { +diff --git a/src/programmers/CheckerProgrammer.ts b/src/programmers/CheckerProgrammer.ts +index 892748b80755b89d1449f4d515aa3166534c6b19..8cb5ce35fe6f918545c82066f0583dead2661c89 100644 +--- a/src/programmers/CheckerProgrammer.ts ++++ b/src/programmers/CheckerProgrammer.ts +@@ -702,14 +702,14 @@ export namespace CheckerProgrammer { + ), + ); + const rest: ts.Expression | null = +- tuple.elements.length && tuple.elements.at(-1)!.rest !== null ++ tuple.elements.length && tuple.elements.slice(-1)[0]!.rest !== null + ? decode(project)(config)(importer)( + ts.factory.createCallExpression( + IdentifierFactory.access(input)("slice"), + undefined, + [ExpressionFactory.number(tuple.elements.length - 1)], + ), +- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!), ++ wrap_metadata_rest_tuple(tuple.elements.slice(-1)[0]!.rest!), + { + ...explore, + start: tuple.elements.length - 1, +diff --git a/src/programmers/TypiaProgrammer.ts b/src/programmers/TypiaProgrammer.ts +index e01eccf62eccd73e1f0720db897f539256a6bbc1..cae5eb6fc702d359d4886acefdb68d42691edf97 100644 +--- a/src/programmers/TypiaProgrammer.ts ++++ b/src/programmers/TypiaProgrammer.ts +@@ -101,7 +101,7 @@ export namespace TypiaProgrammer { + .file!.text.substring(0, diag.start) + .split("\n"); + if (lines.length === 0) return [0, 0]; +- return [lines.length, lines.at(-1)!.length + 1]; ++ return [lines.length, lines.slice(-1)[0]!.length + 1]; + })() + : [0, 0]; + console.error( +diff --git a/src/programmers/internal/application_tuple.ts b/src/programmers/internal/application_tuple.ts +index 5e10b9051e4a846f298aa8f086109e8d6bb38bf9..a8e24d5c2a2a4a4d5d1dc49eb45b4784654a4b66 100644 +--- a/src/programmers/internal/application_tuple.ts ++++ b/src/programmers/internal/application_tuple.ts +@@ -28,16 +28,16 @@ export const application_tuple = + }), + ), + ...attribute, +- minItems: !!tuple.type.elements.at(-1)?.rest ++ minItems: !!tuple.type.elements.slice(-1)[0]?.rest + ? tuple.type.elements.length - 1 + : tuple.type.elements.filter((x) => !x.optional).length, +- maxItems: !!tuple.type.elements.at(-1)?.rest ++ maxItems: !!tuple.type.elements.slice(-1)[0]?.rest + ? undefined + : tuple.type.elements.length, + }; + if (options.purpose === "ajv") + if (tuple.type.elements.length === 0) return schema; +- else if (!tuple.type.elements.at(-1)?.rest) return schema; ++ else if (!tuple.type.elements.slice(-1)[0]?.rest) return schema; + + const wrapper: IJsonSchema.IArray = { + ...schema, +diff --git a/src/programmers/json/JsonStringifyProgrammer.ts b/src/programmers/json/JsonStringifyProgrammer.ts +index c317cec2c78e984a6e64c7bf287d0c67e530e309..5974830c62dbd2b865aa2e64e2e757283258d872 100644 +--- a/src/programmers/json/JsonStringifyProgrammer.ts ++++ b/src/programmers/json/JsonStringifyProgrammer.ts +@@ -543,7 +543,7 @@ export namespace JsonStringifyProgrammer { + ); + const rest = (() => { + if (tuple.elements.length === 0) return null; +- const last = tuple.elements.at(-1)!; ++ const last = tuple.elements.slice(-1)[0]!; + if (last.rest === null) return null; + + const code = decode(project)(config)(importer)( +@@ -552,7 +552,7 @@ export namespace JsonStringifyProgrammer { + undefined, + [ExpressionFactory.number(tuple.elements.length - 1)], + ), +- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!), ++ wrap_metadata_rest_tuple(tuple.elements.slice(-1)[0]!.rest!), + { + ...explore, + start: tuple.elements.length - 1, +diff --git a/src/programmers/misc/MiscCloneProgrammer.ts b/src/programmers/misc/MiscCloneProgrammer.ts +index 94d768b0a0738c0caccd711671351d1f22fa3848..739fd5f2baf4d2eb8e9dd65d73179242a0244707 100644 +--- a/src/programmers/misc/MiscCloneProgrammer.ts ++++ b/src/programmers/misc/MiscCloneProgrammer.ts +@@ -343,7 +343,7 @@ export namespace MiscCloneProgrammer { + const rest = (() => { + if (tuple.elements.length === 0) return null; + +- const last: Metadata = tuple.elements.at(-1)!; ++ const last: Metadata = tuple.elements.slice(-1)[0]!; + const rest: Metadata | null = last.rest; + if (rest === null) return null; + +@@ -353,7 +353,7 @@ export namespace MiscCloneProgrammer { + undefined, + [ExpressionFactory.number(tuple.elements.length - 1)], + ), +- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!), ++ wrap_metadata_rest_tuple(tuple.elements.slice(-1)[0]!.rest!), + { + ...explore, + start: tuple.elements.length - 1, +diff --git a/src/programmers/misc/MiscPruneProgrammer.ts b/src/programmers/misc/MiscPruneProgrammer.ts +index ed1465267066e382ae6696a25a806c2489597593..661f3cd93ae66070c978bd3e8d2b8db07189fe47 100644 +--- a/src/programmers/misc/MiscPruneProgrammer.ts ++++ b/src/programmers/misc/MiscPruneProgrammer.ts +@@ -310,7 +310,7 @@ export namespace MiscPruneProgrammer { + const rest = (() => { + if (tuple.elements.length === 0) return null; + +- const last: Metadata = tuple.elements.at(-1)!; ++ const last: Metadata = tuple.elements.slice(-1)[0]!; + const rest: Metadata | null = last.rest; + if (rest === null || filter(rest) === false) return null; + +@@ -320,7 +320,7 @@ export namespace MiscPruneProgrammer { + undefined, + [ExpressionFactory.number(tuple.elements.length - 1)], + ), +- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!), ++ wrap_metadata_rest_tuple(tuple.elements.slice(-1)[0]!.rest!), + { + ...explore, + start: tuple.elements.length - 1, +diff --git a/src/programmers/notations/NotationGeneralProgrammer.ts b/src/programmers/notations/NotationGeneralProgrammer.ts +index bd49b1e34002b1a1ec4f5444a8f91fa0ab794360..71d676de290986045910602ab10c6ef09a19c07d 100644 +--- a/src/programmers/notations/NotationGeneralProgrammer.ts ++++ b/src/programmers/notations/NotationGeneralProgrammer.ts +@@ -353,7 +353,7 @@ export namespace NotationGeneralProgrammer { + const rest = (() => { + if (tuple.elements.length === 0) return null; + +- const last: Metadata = tuple.elements.at(-1)!; ++ const last: Metadata = tuple.elements.slice(-1)[0]!; + const rest: Metadata | null = last.rest; + if (rest === null) return null; + +@@ -363,7 +363,7 @@ export namespace NotationGeneralProgrammer { + undefined, + [ExpressionFactory.number(tuple.elements.length - 1)], + ), +- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!), ++ wrap_metadata_rest_tuple(tuple.elements.slice(-1)[0]!.rest!), + { + ...explore, + start: tuple.elements.length - 1, +diff --git a/src/transformers/CallExpressionTransformer.ts b/src/transformers/CallExpressionTransformer.ts +index c58a1b143ce4f204bb249a4858c9d16a26f97408..9e9ffcf73e4c01aa6ac8c213669fdcd50e0181b9 100644 +--- a/src/transformers/CallExpressionTransformer.ts ++++ b/src/transformers/CallExpressionTransformer.ts +@@ -111,7 +111,7 @@ export namespace CallExpressionTransformer { + // TRANSFORMATION + //---- + // FUNCTION NAME +- const module: string = location.split(path.sep).at(-1)!.split(".")[0]!; ++ const module: string = location.split(path.sep).slice(-1)[0]!.split(".")[0]!; + const { name } = project.checker.getTypeAtLocation(declaration).symbol; + + // FIND TRANSFORMER diff --git a/.yarn/releases/yarn-3.2.2.cjs b/.yarn/releases/yarn-3.2.2.cjs deleted file mode 100755 index 0912bea85eae..000000000000 --- a/.yarn/releases/yarn-3.2.2.cjs +++ /dev/null @@ -1,783 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var nge=Object.create,Mh=Object.defineProperty,sge=Object.defineProperties,oge=Object.getOwnPropertyDescriptor,age=Object.getOwnPropertyDescriptors,Age=Object.getOwnPropertyNames,DE=Object.getOwnPropertySymbols,lge=Object.getPrototypeOf,eQ=Object.prototype.hasOwnProperty,OO=Object.prototype.propertyIsEnumerable;var MO=(r,e,t)=>e in r?Mh(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,N=(r,e)=>{for(var t in e||(e={}))eQ.call(e,t)&&MO(r,t,e[t]);if(DE)for(var t of DE(e))OO.call(e,t)&&MO(r,t,e[t]);return r},te=(r,e)=>sge(r,age(e)),cge=r=>Mh(r,"__esModule",{value:!0});var Or=(r,e)=>{var t={};for(var i in r)eQ.call(r,i)&&e.indexOf(i)<0&&(t[i]=r[i]);if(r!=null&&DE)for(var i of DE(r))e.indexOf(i)<0&&OO.call(r,i)&&(t[i]=r[i]);return t},uge=(r,e)=>()=>(r&&(e=r(r=0)),e),w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ft=(r,e)=>{for(var t in e)Mh(r,t,{get:e[t],enumerable:!0})},gge=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Age(e))!eQ.call(r,i)&&i!=="default"&&Mh(r,i,{get:()=>e[i],enumerable:!(t=oge(e,i))||t.enumerable});return r},ge=r=>gge(cge(Mh(r!=null?nge(lge(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var cM=w((i7e,oM)=>{oM.exports=aM;aM.sync=xge;var AM=require("fs");function kge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{uM.exports=gM;gM.sync=Pge;var fM=require("fs");function gM(r,e,t){fM.stat(r,function(i,n){t(i,i?!1:hM(n,e))})}function Pge(r,e){return hM(fM.statSync(r),e)}function hM(r,e){return r.isFile()&&Dge(r,e)}function Dge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var CM=w((o7e,dM)=>{var s7e=require("fs"),zE;process.platform==="win32"||global.TESTING_WINDOWS?zE=cM():zE=pM();dM.exports=CQ;CQ.sync=Rge;function CQ(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){CQ(r,e||{},function(s,o){s?n(s):i(o)})})}zE(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function Rge(r,e){try{return zE.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var bM=w((a7e,mM)=>{var Xu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",EM=require("path"),Fge=Xu?";":":",IM=CM(),yM=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),wM=(r,e)=>{let t=e.colon||Fge,i=r.match(/\//)||Xu&&r.match(/\\/)?[""]:[...Xu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=Xu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Xu?n.split(t):[""];return Xu&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},BM=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=wM(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(yM(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=EM.join(h,r),m=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];IM(c+p,{pathExt:s},(m,y)=>{if(!m&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},Nge=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=wM(r,e),s=[];for(let o=0;o{"use strict";var QM=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};mQ.exports=QM;mQ.exports.default=QM});var PM=w((l7e,vM)=>{"use strict";var xM=require("path"),Lge=bM(),Tge=SM();function kM(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch(a){}let o;try{o=Lge.sync(r.command,{path:t[Tge({env:t})],pathExt:e?xM.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=xM.resolve(n?r.options.cwd:"",o)),o}function Oge(r){return kM(r)||kM(r,!0)}vM.exports=Oge});var DM=w((c7e,EQ)=>{"use strict";var IQ=/([()\][%!^"`<>&|;, *?])/g;function Mge(r){return r=r.replace(IQ,"^$1"),r}function Kge(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(IQ,"^$1"),e&&(r=r.replace(IQ,"^$1")),r}EQ.exports.command=Mge;EQ.exports.argument=Kge});var FM=w((u7e,RM)=>{"use strict";RM.exports=/^#!(.*)/});var LM=w((g7e,NM)=>{"use strict";var Uge=FM();NM.exports=(r="")=>{let e=r.match(Uge);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var OM=w((f7e,TM)=>{"use strict";var yQ=require("fs"),Hge=LM();function jge(r){let e=150,t=Buffer.alloc(e),i;try{i=yQ.openSync(r,"r"),yQ.readSync(i,t,0,e,0),yQ.closeSync(i)}catch(n){}return Hge(t.toString())}TM.exports=jge});var HM=w((h7e,MM)=>{"use strict";var Gge=require("path"),KM=PM(),UM=DM(),Yge=OM(),qge=process.platform==="win32",Jge=/\.(?:com|exe)$/i,Wge=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function zge(r){r.file=KM(r);let e=r.file&&Yge(r.file);return e?(r.args.unshift(r.file),r.command=e,KM(r)):r.file}function _ge(r){if(!qge)return r;let e=zge(r),t=!Jge.test(e);if(r.options.forceShell||t){let i=Wge.test(e);r.command=Gge.normalize(r.command),r.command=UM.command(r.command),r.args=r.args.map(s=>UM.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function Vge(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:_ge(i)}MM.exports=Vge});var YM=w((p7e,jM)=>{"use strict";var wQ=process.platform==="win32";function BQ(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Xge(r,e){if(!wQ)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=GM(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function GM(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawn"):null}function Zge(r,e){return wQ&&r===1&&!e.file?BQ(e.original,"spawnSync"):null}jM.exports={hookChildProcess:Xge,verifyENOENT:GM,verifyENOENTSync:Zge,notFoundError:BQ}});var SQ=w((d7e,Zu)=>{"use strict";var qM=require("child_process"),bQ=HM(),QQ=YM();function JM(r,e,t){let i=bQ(r,e,t),n=qM.spawn(i.command,i.args,i.options);return QQ.hookChildProcess(n,i),n}function $ge(r,e,t){let i=bQ(r,e,t),n=qM.spawnSync(i.command,i.args,i.options);return n.error=n.error||QQ.verifyENOENTSync(n.status,i),n}Zu.exports=JM;Zu.exports.spawn=JM;Zu.exports.sync=$ge;Zu.exports._parse=bQ;Zu.exports._enoent=QQ});var zM=w((C7e,WM)=>{"use strict";function efe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function cc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,cc)}efe(cc,Error);cc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",le=me(">>",!1),fe=">&",gt=me(">&",!1),Ht=">",Mt=me(">",!1),Ei="<<<",jt=me("<<<",!1),Qr="<&",Oi=me("<&",!1),Xs="<",Un=me("<",!1),Hn=function(C){return{type:"argument",segments:[].concat(...C)}},Sr=function(C){return C},jn="$'",fs=me("$'",!1),ba="'",DA=me("'",!1),Nu=function(C){return[{type:"text",text:C}]},hs='""',RA=me('""',!1),Qa=function(){return{type:"text",text:""}},Lu='"',FA=me('"',!1),NA=function(C){return C},vr=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},zl=function(C){return{type:"shell",shell:C,quoted:!0}},Tu=function(C){return te(N({type:"variable"},C),{quoted:!0})},xo=function(C){return{type:"text",text:C}},Ou=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},Sh=function(C){return{type:"shell",shell:C,quoted:!1}},vh=function(C){return te(N({type:"variable"},C),{quoted:!1})},Dr=function(C){return{type:"glob",pattern:C}},Ae=/^[^']/,ko=_e(["'"],!0,!1),Gn=function(C){return C.join("")},Mu=/^[^$"]/,St=_e(["$",'"'],!0,!1),_l=`\\ -`,Yn=me(`\\ -`,!1),ps=function(){return""},ds="\\",pt=me("\\",!1),Po=/^[\\$"`]/,lt=_e(["\\","$",'"',"`"],!1,!1),mn=function(C){return C},S="\\a",Tt=me("\\a",!1),Ku=function(){return"a"},Vl="\\b",xh=me("\\b",!1),kh=function(){return"\b"},Ph=/^[Ee]/,Dh=_e(["E","e"],!1,!1),Rh=function(){return""},j="\\f",wt=me("\\f",!1),LA=function(){return"\f"},$i="\\n",Xl=me("\\n",!1),$e=function(){return` -`},Sa="\\r",Uu=me("\\r",!1),yE=function(){return"\r"},Fh="\\t",wE=me("\\t",!1),gr=function(){return" "},qn="\\v",Zl=me("\\v",!1),Nh=function(){return"\v"},Zs=/^[\\'"?]/,va=_e(["\\","'",'"',"?"],!1,!1),En=function(C){return String.fromCharCode(parseInt(C,16))},Oe="\\x",Hu=me("\\x",!1),$l="\\u",$s=me("\\u",!1),ec="\\U",TA=me("\\U",!1),ju=function(C){return String.fromCodePoint(parseInt(C,16))},Gu=/^[0-7]/,xa=_e([["0","7"]],!1,!1),ka=/^[0-9a-fA-f]/,nt=_e([["0","9"],["a","f"],["A","f"]],!1,!1),Do=ot(),OA="-",tc=me("-",!1),eo="+",rc=me("+",!1),BE=".",Lh=me(".",!1),Yu=function(C,Q,F){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+F.join(""))}},Th=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},bE=function(C){return N({type:"variable"},C)},ic=function(C){return{type:"variable",name:C}},QE=function(C){return C},qu="*",MA=me("*",!1),Tr="/",SE=me("/",!1),to=function(C,Q,F){return{type:Q==="*"?"multiplication":"division",right:F}},ro=function(C,Q){return Q.reduce((F,U)=>N({left:F},U),C)},Ju=function(C,Q,F){return{type:Q==="+"?"addition":"subtraction",right:F}},KA="$((",R=me("$((",!1),G="))",Ce=me("))",!1),He=function(C){return C},Te="$(",Xe=me("$(",!1),Et=function(C){return C},Rt="${",Jn=me("${",!1),Ob=":-",lO=me(":-",!1),cO=function(C,Q){return{name:C,defaultValue:Q}},Mb=":-}",uO=me(":-}",!1),gO=function(C){return{name:C,defaultValue:[]}},Kb=":+",fO=me(":+",!1),hO=function(C,Q){return{name:C,alternativeValue:Q}},Ub=":+}",pO=me(":+}",!1),dO=function(C){return{name:C,alternativeValue:[]}},Hb=function(C){return{name:C}},CO="$",mO=me("$",!1),EO=function(C){return e.isGlobPattern(C)},IO=function(C){return C},jb=/^[a-zA-Z0-9_]/,Gb=_e([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Yb=function(){return M()},qb=/^[$@*?#a-zA-Z0-9_\-]/,Jb=_e(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),yO=/^[(){}<>$|&; \t"']/,Wu=_e(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Wb=/^[<>&; \t"']/,zb=_e(["<",">","&",";"," "," ",'"',"'"],!1,!1),vE=/^[ \t]/,xE=_e([" "," "],!1,!1),B=0,Ue=0,UA=[{line:1,column:1}],d=0,E=[],I=0,D;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function M(){return r.substring(Ue,B)}function z(){return yt(Ue,B)}function ie(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Mi([ut(C)],r.substring(Ue,B),Q)}function we(C,Q){throw Q=Q!==void 0?Q:yt(Ue,B),Wn(C,Q)}function me(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function _e(C,Q,F){return{type:"class",parts:C,inverted:Q,ignoreCase:F}}function ot(){return{type:"any"}}function Bt(){return{type:"end"}}function ut(C){return{type:"other",description:C}}function st(C){var Q=UA[C],F;if(Q)return Q;for(F=C-1;!UA[F];)F--;for(Q=UA[F],Q={line:Q.line,column:Q.column};Fd&&(d=B,E=[]),E.push(C))}function Wn(C,Q){return new cc(C,null,null,Q)}function Mi(C,Q,F){return new cc(cc.buildMessage(C,Q),C,Q,F)}function HA(){var C,Q;return C=B,Q=Yr(),Q===t&&(Q=null),Q!==t&&(Ue=C,Q=s(Q)),C=Q,C}function Yr(){var C,Q,F,U,ue;if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U!==t?(ue=Cs(),ue===t&&(ue=null),ue!==t?(Ue=C,Q=o(Q,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;if(C===t)if(C=B,Q=qr(),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();F!==t?(U=Pa(),U===t&&(U=null),U!==t?(Ue=C,Q=a(Q,U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Cs(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yr(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=l(F),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function Pa(){var C;return r.charCodeAt(B)===59?(C=c,B++):(C=t,I===0&&xe(u)),C===t&&(r.charCodeAt(B)===38?(C=g,B++):(C=t,I===0&&xe(f))),C}function qr(){var C,Q,F;return C=B,Q=wO(),Q!==t?(F=Hue(),F===t&&(F=null),F!==t?(Ue=C,Q=h(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Hue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=jue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=qr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=p(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function jue(){var C;return r.substr(B,2)===m?(C=m,B+=2):(C=t,I===0&&xe(y)),C===t&&(r.substr(B,2)===b?(C=b,B+=2):(C=t,I===0&&xe(v))),C}function wO(){var C,Q,F;return C=B,Q=que(),Q!==t?(F=Gue(),F===t&&(F=null),F!==t?(Ue=C,Q=x(Q,F),C=Q):(B=C,C=t)):(B=C,C=t),C}function Gue(){var C,Q,F,U,ue,De,Ct;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(F=Yue(),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=wO(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=T(F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;return C}function Yue(){var C;return r.substr(B,2)===q?(C=q,B+=2):(C=t,I===0&&xe(Y)),C===t&&(r.charCodeAt(B)===124?(C=$,B++):(C=t,I===0&&xe(_))),C}function kE(){var C,Q,F,U,ue,De;if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t)if(U=QO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(Ue=C,Q=A(Q,U),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;else B=C,C=t;if(C===t)if(C=B,Q=NO(),Q!==t)if(r.charCodeAt(B)===61?(F=ne,B++):(F=t,I===0&&xe(ee)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=oe(Q),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t;return C}function que(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===40?(F=ce,B++):(F=t,I===0&&xe(Z)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===41?(Ct=O,B++):(Ct=t,I===0&&xe(L)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=de(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t)if(r.charCodeAt(B)===123?(F=Be,B++):(F=t,I===0&&xe(je)),F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t)if(ue=Yr(),ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();if(De!==t)if(r.charCodeAt(B)===125?(Ct=re,B++):(Ct=t,I===0&&xe(se)),Ct!==t){for(bt=[],$r=Ye();$r!==t;)bt.push($r),$r=Ye();if(bt!==t){for($r=[],Ii=Oh();Ii!==t;)$r.push(Ii),Ii=Oh();if($r!==t){for(Ii=[],ms=Ye();ms!==t;)Ii.push(ms),ms=Ye();Ii!==t?(Ue=C,Q=be(ue,$r),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t}else B=C,C=t;else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){for(F=[],U=kE();U!==t;)F.push(U),U=kE();if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();if(U!==t){if(ue=[],De=bO(),De!==t)for(;De!==t;)ue.push(De),De=bO();else ue=t;if(ue!==t){for(De=[],Ct=Ye();Ct!==t;)De.push(Ct),Ct=Ye();De!==t?(Ue=C,Q=he(F,ue),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}else B=C,C=t}else B=C,C=t;if(C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=kE(),U!==t)for(;U!==t;)F.push(U),U=kE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Fe(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t}}}return C}function BO(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t){if(F=[],U=PE(),U!==t)for(;U!==t;)F.push(U),U=PE();else F=t;if(F!==t){for(U=[],ue=Ye();ue!==t;)U.push(ue),ue=Ye();U!==t?(Ue=C,Q=Ke(F),C=Q):(B=C,C=t)}else B=C,C=t}else B=C,C=t;return C}function bO(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();if(Q!==t?(F=Oh(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t){for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();Q!==t?(F=PE(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t)}return C}function Oh(){var C,Q,F,U,ue;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(ve.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(pe)),F===t&&(F=null),F!==t?(U=Jue(),U!==t?(ue=PE(),ue!==t?(Ue=C,Q=V(F,U,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Jue(){var C;return r.substr(B,2)===Qe?(C=Qe,B+=2):(C=t,I===0&&xe(le)),C===t&&(r.substr(B,2)===fe?(C=fe,B+=2):(C=t,I===0&&xe(gt)),C===t&&(r.charCodeAt(B)===62?(C=Ht,B++):(C=t,I===0&&xe(Mt)),C===t&&(r.substr(B,3)===Ei?(C=Ei,B+=3):(C=t,I===0&&xe(jt)),C===t&&(r.substr(B,2)===Qr?(C=Qr,B+=2):(C=t,I===0&&xe(Oi)),C===t&&(r.charCodeAt(B)===60?(C=Xs,B++):(C=t,I===0&&xe(Un))))))),C}function PE(){var C,Q,F;for(C=B,Q=[],F=Ye();F!==t;)Q.push(F),F=Ye();return Q!==t?(F=QO(),F!==t?(Ue=C,Q=ke(F),C=Q):(B=C,C=t)):(B=C,C=t),C}function QO(){var C,Q,F;if(C=B,Q=[],F=SO(),F!==t)for(;F!==t;)Q.push(F),F=SO();else Q=t;return Q!==t&&(Ue=C,Q=Hn(Q)),C=Q,C}function SO(){var C,Q;return C=B,Q=Wue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=zue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=_ue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q,C===t&&(C=B,Q=Vue(),Q!==t&&(Ue=C,Q=Sr(Q)),C=Q))),C}function Wue(){var C,Q,F,U;return C=B,r.substr(B,2)===jn?(Q=jn,B+=2):(Q=t,I===0&&xe(fs)),Q!==t?(F=$ue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function zue(){var C,Q,F,U;return C=B,r.charCodeAt(B)===39?(Q=ba,B++):(Q=t,I===0&&xe(DA)),Q!==t?(F=Xue(),F!==t?(r.charCodeAt(B)===39?(U=ba,B++):(U=t,I===0&&xe(DA)),U!==t?(Ue=C,Q=Nu(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function _ue(){var C,Q,F,U;if(C=B,r.substr(B,2)===hs?(Q=hs,B+=2):(Q=t,I===0&&xe(RA)),Q!==t&&(Ue=C,Q=Qa()),C=Q,C===t)if(C=B,r.charCodeAt(B)===34?(Q=Lu,B++):(Q=t,I===0&&xe(FA)),Q!==t){for(F=[],U=vO();U!==t;)F.push(U),U=vO();F!==t?(r.charCodeAt(B)===34?(U=Lu,B++):(U=t,I===0&&xe(FA)),U!==t?(Ue=C,Q=NA(F),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;return C}function Vue(){var C,Q,F;if(C=B,Q=[],F=xO(),F!==t)for(;F!==t;)Q.push(F),F=xO();else Q=t;return Q!==t&&(Ue=C,Q=NA(Q)),C=Q,C}function vO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=vr(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=zl(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=Tu(Q)),C=Q,C===t&&(C=B,Q=Zue(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q))),C}function xO(){var C,Q;return C=B,Q=RO(),Q!==t&&(Ue=C,Q=Ou(Q)),C=Q,C===t&&(C=B,Q=FO(),Q!==t&&(Ue=C,Q=Sh(Q)),C=Q,C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=vh(Q)),C=Q,C===t&&(C=B,Q=rge(),Q!==t&&(Ue=C,Q=Dr(Q)),C=Q,C===t&&(C=B,Q=tge(),Q!==t&&(Ue=C,Q=xo(Q)),C=Q)))),C}function Xue(){var C,Q,F;for(C=B,Q=[],Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));F!==t;)Q.push(F),Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Zue(){var C,Q,F;if(C=B,Q=[],F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St))),F!==t)for(;F!==t;)Q.push(F),F=kO(),F===t&&(Mu.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(St)));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function kO(){var C,Q,F;return C=B,r.substr(B,2)===_l?(Q=_l,B+=2):(Q=t,I===0&&xe(Yn)),Q!==t&&(Ue=C,Q=ps()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Po.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(lt)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t)),C}function $ue(){var C,Q,F;for(C=B,Q=[],F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));F!==t;)Q.push(F),F=PO(),F===t&&(Ae.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(ko)));return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function PO(){var C,Q,F;return C=B,r.substr(B,2)===S?(Q=S,B+=2):(Q=t,I===0&&xe(Tt)),Q!==t&&(Ue=C,Q=Ku()),C=Q,C===t&&(C=B,r.substr(B,2)===Vl?(Q=Vl,B+=2):(Q=t,I===0&&xe(xh)),Q!==t&&(Ue=C,Q=kh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Ph.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Dh)),F!==t?(Ue=C,Q=Rh(),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===j?(Q=j,B+=2):(Q=t,I===0&&xe(wt)),Q!==t&&(Ue=C,Q=LA()),C=Q,C===t&&(C=B,r.substr(B,2)===$i?(Q=$i,B+=2):(Q=t,I===0&&xe(Xl)),Q!==t&&(Ue=C,Q=$e()),C=Q,C===t&&(C=B,r.substr(B,2)===Sa?(Q=Sa,B+=2):(Q=t,I===0&&xe(Uu)),Q!==t&&(Ue=C,Q=yE()),C=Q,C===t&&(C=B,r.substr(B,2)===Fh?(Q=Fh,B+=2):(Q=t,I===0&&xe(wE)),Q!==t&&(Ue=C,Q=gr()),C=Q,C===t&&(C=B,r.substr(B,2)===qn?(Q=qn,B+=2):(Q=t,I===0&&xe(Zl)),Q!==t&&(Ue=C,Q=Nh()),C=Q,C===t&&(C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(Zs.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(va)),F!==t?(Ue=C,Q=mn(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=ege()))))))))),C}function ege(){var C,Q,F,U,ue,De,Ct,bt,$r,Ii,ms,$b;return C=B,r.charCodeAt(B)===92?(Q=ds,B++):(Q=t,I===0&&xe(pt)),Q!==t?(F=_b(),F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Oe?(Q=Oe,B+=2):(Q=t,I===0&&xe(Hu)),Q!==t?(F=B,U=B,ue=_b(),ue!==t?(De=zn(),De!==t?(ue=[ue,De],U=ue):(B=U,U=t)):(B=U,U=t),U===t&&(U=_b()),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===$l?(Q=$l,B+=2):(Q=t,I===0&&xe($s)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?(ue=[ue,De,Ct,bt],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=En(F),C=Q):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===ec?(Q=ec,B+=2):(Q=t,I===0&&xe(TA)),Q!==t?(F=B,U=B,ue=zn(),ue!==t?(De=zn(),De!==t?(Ct=zn(),Ct!==t?(bt=zn(),bt!==t?($r=zn(),$r!==t?(Ii=zn(),Ii!==t?(ms=zn(),ms!==t?($b=zn(),$b!==t?(ue=[ue,De,Ct,bt,$r,Ii,ms,$b],U=ue):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t)):(B=U,U=t),U!==t?F=r.substring(F,B):F=U,F!==t?(Ue=C,Q=ju(F),C=Q):(B=C,C=t)):(B=C,C=t)))),C}function _b(){var C;return Gu.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(xa)),C}function zn(){var C;return ka.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(nt)),C}function tge(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t)),F!==t)for(;F!==t;)Q.push(F),F=B,r.charCodeAt(B)===92?(U=ds,B++):(U=t,I===0&&xe(pt)),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F===t&&(F=B,U=B,I++,ue=LO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t));else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function Vb(){var C,Q,F,U,ue,De;if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;if(F!==t)if(r.charCodeAt(B)===46?(U=BE,B++):(U=t,I===0&&xe(Lh)),U!==t){if(ue=[],ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe)),De!==t)for(;De!==t;)ue.push(De),ve.test(r.charAt(B))?(De=r.charAt(B),B++):(De=t,I===0&&xe(pe));else ue=t;ue!==t?(Ue=C,Q=Yu(Q,F,ue),C=Q):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;if(C===t){if(C=B,r.charCodeAt(B)===45?(Q=OA,B++):(Q=t,I===0&&xe(tc)),Q===t&&(r.charCodeAt(B)===43?(Q=eo,B++):(Q=t,I===0&&xe(rc))),Q===t&&(Q=null),Q!==t){if(F=[],ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe)),U!==t)for(;U!==t;)F.push(U),ve.test(r.charAt(B))?(U=r.charAt(B),B++):(U=t,I===0&&xe(pe));else F=t;F!==t?(Ue=C,Q=Th(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;if(C===t&&(C=B,Q=Zb(),Q!==t&&(Ue=C,Q=bE(Q)),C=Q,C===t&&(C=B,Q=nc(),Q!==t&&(Ue=C,Q=ic(Q)),C=Q,C===t)))if(C=B,r.charCodeAt(B)===40?(Q=ce,B++):(Q=t,I===0&&xe(Z)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.charCodeAt(B)===41?(De=O,B++):(De=t,I===0&&xe(L)),De!==t?(Ue=C,Q=QE(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t}return C}function Xb(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Vb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===42?(De=qu,B++):(De=t,I===0&&xe(MA)),De===t&&(r.charCodeAt(B)===47?(De=Tr,B++):(De=t,I===0&&xe(SE))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Vb(),bt!==t?(Ue=U,ue=to(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function DO(){var C,Q,F,U,ue,De,Ct,bt;if(C=B,Q=Xb(),Q!==t){for(F=[],U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t;for(;U!==t;){for(F.push(U),U=B,ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();if(ue!==t)if(r.charCodeAt(B)===43?(De=eo,B++):(De=t,I===0&&xe(rc)),De===t&&(r.charCodeAt(B)===45?(De=OA,B++):(De=t,I===0&&xe(tc))),De!==t){for(Ct=[],bt=Ye();bt!==t;)Ct.push(bt),bt=Ye();Ct!==t?(bt=Xb(),bt!==t?(Ue=U,ue=Ju(Q,De,bt),U=ue):(B=U,U=t)):(B=U,U=t)}else B=U,U=t;else B=U,U=t}F!==t?(Ue=C,Q=ro(Q,F),C=Q):(B=C,C=t)}else B=C,C=t;return C}function RO(){var C,Q,F,U,ue,De;if(C=B,r.substr(B,3)===KA?(Q=KA,B+=3):(Q=t,I===0&&xe(R)),Q!==t){for(F=[],U=Ye();U!==t;)F.push(U),U=Ye();if(F!==t)if(U=DO(),U!==t){for(ue=[],De=Ye();De!==t;)ue.push(De),De=Ye();ue!==t?(r.substr(B,2)===G?(De=G,B+=2):(De=t,I===0&&xe(Ce)),De!==t?(Ue=C,Q=He(U),C=Q):(B=C,C=t)):(B=C,C=t)}else B=C,C=t;else B=C,C=t}else B=C,C=t;return C}function FO(){var C,Q,F,U;return C=B,r.substr(B,2)===Te?(Q=Te,B+=2):(Q=t,I===0&&xe(Xe)),Q!==t?(F=Yr(),F!==t?(r.charCodeAt(B)===41?(U=O,B++):(U=t,I===0&&xe(L)),U!==t?(Ue=C,Q=Et(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C}function Zb(){var C,Q,F,U,ue,De;return C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Ob?(U=Ob,B+=2):(U=t,I===0&&xe(lO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=cO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Mb?(U=Mb,B+=3):(U=t,I===0&&xe(uO)),U!==t?(Ue=C,Q=gO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,2)===Kb?(U=Kb,B+=2):(U=t,I===0&&xe(fO)),U!==t?(ue=BO(),ue!==t?(r.charCodeAt(B)===125?(De=re,B++):(De=t,I===0&&xe(se)),De!==t?(Ue=C,Q=hO(F,ue),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.substr(B,3)===Ub?(U=Ub,B+=3):(U=t,I===0&&xe(pO)),U!==t?(Ue=C,Q=dO(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.substr(B,2)===Rt?(Q=Rt,B+=2):(Q=t,I===0&&xe(Jn)),Q!==t?(F=nc(),F!==t?(r.charCodeAt(B)===125?(U=re,B++):(U=t,I===0&&xe(se)),U!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)):(B=C,C=t),C===t&&(C=B,r.charCodeAt(B)===36?(Q=CO,B++):(Q=t,I===0&&xe(mO)),Q!==t?(F=nc(),F!==t?(Ue=C,Q=Hb(F),C=Q):(B=C,C=t)):(B=C,C=t)))))),C}function rge(){var C,Q,F;return C=B,Q=ige(),Q!==t?(Ue=B,F=EO(Q),F?F=void 0:F=t,F!==t?(Ue=C,Q=IO(Q),C=Q):(B=C,C=t)):(B=C,C=t),C}function ige(){var C,Q,F,U,ue;if(C=B,Q=[],F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t),F!==t)for(;F!==t;)Q.push(F),F=B,U=B,I++,ue=TO(),I--,ue===t?U=void 0:(B=U,U=t),U!==t?(r.length>B?(ue=r.charAt(B),B++):(ue=t,I===0&&xe(Do)),ue!==t?(Ue=F,U=mn(ue),F=U):(B=F,F=t)):(B=F,F=t);else Q=t;return Q!==t&&(Ue=C,Q=Gn(Q)),C=Q,C}function NO(){var C,Q,F;if(C=B,Q=[],jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb)),F!==t)for(;F!==t;)Q.push(F),jb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Gb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function nc(){var C,Q,F;if(C=B,Q=[],qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb)),F!==t)for(;F!==t;)Q.push(F),qb.test(r.charAt(B))?(F=r.charAt(B),B++):(F=t,I===0&&xe(Jb));else Q=t;return Q!==t&&(Ue=C,Q=Yb()),C=Q,C}function LO(){var C;return yO.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(Wu)),C}function TO(){var C;return Wb.test(r.charAt(B))?(C=r.charAt(B),B++):(C=t,I===0&&xe(zb)),C}function Ye(){var C,Q;if(C=[],vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE)),Q!==t)for(;Q!==t;)C.push(Q),vE.test(r.charAt(B))?(Q=r.charAt(B),B++):(Q=t,I===0&&xe(xE));else C=t;return C}if(D=n(),D!==t&&B===r.length)return D;throw D!==t&&B{"use strict";function rfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function gc(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,gc)}rfe(gc,Error);gc.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gq&&(q=v,Y=[]),Y.push(pe))}function se(pe,V){return new gc(pe,null,null,V)}function be(pe,V,Qe){return new gc(gc.buildMessage(pe,V),pe,V,Qe)}function he(){var pe,V,Qe,le;return pe=v,V=Fe(),V!==t?(r.charCodeAt(v)===47?(Qe=s,v++):(Qe=t,$===0&&re(o)),Qe!==t?(le=Fe(),le!==t?(x=pe,V=a(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Fe(),V!==t&&(x=pe,V=l(V)),pe=V),pe}function Fe(){var pe,V,Qe,le;return pe=v,V=Ke(),V!==t?(r.charCodeAt(v)===64?(Qe=c,v++):(Qe=t,$===0&&re(u)),Qe!==t?(le=ve(),le!==t?(x=pe,V=g(V,le),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=Ke(),V!==t&&(x=pe,V=f(V)),pe=V),pe}function Ke(){var pe,V,Qe,le,fe;return pe=v,r.charCodeAt(v)===64?(V=c,v++):(V=t,$===0&&re(u)),V!==t?(Qe=ke(),Qe!==t?(r.charCodeAt(v)===47?(le=s,v++):(le=t,$===0&&re(o)),le!==t?(fe=ke(),fe!==t?(x=pe,V=h(),pe=V):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t)):(v=pe,pe=t),pe===t&&(pe=v,V=ke(),V!==t&&(x=pe,V=h()),pe=V),pe}function ke(){var pe,V,Qe;if(pe=v,V=[],p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m)),Qe!==t)for(;Qe!==t;)V.push(Qe),p.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(m));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}function ve(){var pe,V,Qe;if(pe=v,V=[],y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b)),Qe!==t)for(;Qe!==t;)V.push(Qe),y.test(r.charAt(v))?(Qe=r.charAt(v),v++):(Qe=t,$===0&&re(b));else V=t;return V!==t&&(x=pe,V=h()),pe=V,pe}if(_=n(),_!==t&&v===r.length)return _;throw _!==t&&v{"use strict";function $M(r){return typeof r=="undefined"||r===null}function nfe(r){return typeof r=="object"&&r!==null}function sfe(r){return Array.isArray(r)?r:$M(r)?[]:[r]}function ofe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function ep(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}ep.prototype=Object.create(Error.prototype);ep.prototype.constructor=ep;ep.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};e1.exports=ep});var i1=w((L7e,t1)=>{"use strict";var r1=hc();function RQ(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}RQ.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),r1.repeat(" ",e)+i+a+s+` -`+r1.repeat(" ",e+this.position-n+i.length)+"^"};RQ.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: -`+t)),i};t1.exports=RQ});var ci=w((T7e,n1)=>{"use strict";var s1=tg(),lfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],cfe=["scalar","sequence","mapping"];function ufe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function gfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(lfe.indexOf(t)===-1)throw new s1('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=ufe(e.styleAliases||null),cfe.indexOf(this.kind)===-1)throw new s1('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}n1.exports=gfe});var pc=w((O7e,o1)=>{"use strict";var a1=hc(),tI=tg(),ffe=ci();function FQ(r,e,t){var i=[];return r.include.forEach(function(n){t=FQ(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function hfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var pfe=ci();A1.exports=new pfe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var u1=w((K7e,c1)=>{"use strict";var dfe=ci();c1.exports=new dfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var f1=w((U7e,g1)=>{"use strict";var Cfe=ci();g1.exports=new Cfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var rI=w((H7e,h1)=>{"use strict";var mfe=pc();h1.exports=new mfe({explicit:[l1(),u1(),f1()]})});var d1=w((j7e,p1)=>{"use strict";var Efe=ci();function Ife(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function yfe(){return null}function wfe(r){return r===null}p1.exports=new Efe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Ife,construct:yfe,predicate:wfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var m1=w((G7e,C1)=>{"use strict";var Bfe=ci();function bfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Qfe(r){return r==="true"||r==="True"||r==="TRUE"}function Sfe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}C1.exports=new Bfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:bfe,construct:Qfe,predicate:Sfe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var I1=w((Y7e,E1)=>{"use strict";var vfe=hc(),xfe=ci();function kfe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function Pfe(r){return 48<=r&&r<=55}function Dfe(r){return 48<=r&&r<=57}function Rfe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var B1=w((q7e,y1)=>{"use strict";var w1=hc(),Lfe=ci(),Tfe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ofe(r){return!(r===null||!Tfe.test(r)||r[r.length-1]==="_")}function Mfe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var Kfe=/^[-+]?[0-9]+e/;function Ufe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w1.isNegativeZero(r))return"-0.0";return t=r.toString(10),Kfe.test(t)?t.replace("e",".e"):t}function Hfe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!=0||w1.isNegativeZero(r))}y1.exports=new Lfe("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ofe,construct:Mfe,predicate:Hfe,represent:Ufe,defaultStyle:"lowercase"})});var NQ=w((J7e,b1)=>{"use strict";var jfe=pc();b1.exports=new jfe({include:[rI()],implicit:[d1(),m1(),I1(),B1()]})});var LQ=w((W7e,Q1)=>{"use strict";var Gfe=pc();Q1.exports=new Gfe({include:[NQ()]})});var k1=w((z7e,S1)=>{"use strict";var Yfe=ci(),v1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),x1=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function qfe(r){return r===null?!1:v1.exec(r)!==null||x1.exec(r)!==null}function Jfe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=v1.exec(r),e===null&&(e=x1.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Wfe(r){return r.toISOString()}S1.exports=new Yfe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:qfe,construct:Jfe,instanceOf:Date,represent:Wfe})});var D1=w((_7e,P1)=>{"use strict";var zfe=ci();function _fe(r){return r==="<<"||r===null}P1.exports=new zfe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:_fe})});var N1=w((V7e,R1)=>{"use strict";var dc;try{F1=require,dc=F1("buffer").Buffer}catch(r){}var F1,Vfe=ci(),TQ=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function Xfe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=TQ;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8==0}function Zfe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=TQ,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),dc?dc.from?dc.from(a):new dc(a):a}function $fe(r){var e="",t=0,i,n,s=r.length,o=TQ;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function ehe(r){return dc&&dc.isBuffer(r)}R1.exports=new Vfe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Xfe,construct:Zfe,predicate:ehe,represent:$fe})});var T1=w((X7e,L1)=>{"use strict";var the=ci(),rhe=Object.prototype.hasOwnProperty,ihe=Object.prototype.toString;function nhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var ohe=ci(),ahe=Object.prototype.toString;function Ahe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var che=ci(),uhe=Object.prototype.hasOwnProperty;function ghe(r){if(r===null)return!0;var e,t=r;for(e in t)if(uhe.call(t,e)&&t[e]!==null)return!1;return!0}function fhe(r){return r!==null?r:{}}K1.exports=new che("tag:yaml.org,2002:set",{kind:"mapping",resolve:ghe,construct:fhe})});var ig=w((eXe,H1)=>{"use strict";var hhe=pc();H1.exports=new hhe({include:[LQ()],implicit:[k1(),D1()],explicit:[N1(),T1(),M1(),U1()]})});var G1=w((tXe,j1)=>{"use strict";var phe=ci();function dhe(){return!0}function Che(){}function mhe(){return""}function Ehe(r){return typeof r=="undefined"}j1.exports=new phe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:dhe,construct:Che,predicate:Ehe,represent:mhe})});var q1=w((rXe,Y1)=>{"use strict";var Ihe=ci();function yhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function whe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Bhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function bhe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}Y1.exports=new Ihe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:yhe,construct:whe,predicate:bhe,represent:Bhe})});var z1=w((iXe,J1)=>{"use strict";var iI;try{W1=require,iI=W1("esprima")}catch(r){typeof window!="undefined"&&(iI=window.esprima)}var W1,Qhe=ci();function She(r){if(r===null)return!1;try{var e="("+r+")",t=iI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function vhe(r){var e="("+r+")",t=iI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function xhe(r){return r.toString()}function khe(r){return Object.prototype.toString.call(r)==="[object Function]"}J1.exports=new Qhe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:She,construct:vhe,predicate:khe,represent:xhe})});var tp=w((nXe,_1)=>{"use strict";var V1=pc();_1.exports=V1.DEFAULT=new V1({include:[ig()],explicit:[G1(),q1(),z1()]})});var pK=w((sXe,rp)=>{"use strict";var Oa=hc(),X1=tg(),Phe=i1(),Z1=ig(),Dhe=tp(),JA=Object.prototype.hasOwnProperty,nI=1,$1=2,eK=3,sI=4,OQ=1,Rhe=2,tK=3,Fhe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Nhe=/[\x85\u2028\u2029]/,Lhe=/[,\[\]\{\}]/,rK=/^(?:!|!!|![a-z\-]+!)$/i,iK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function nK(r){return Object.prototype.toString.call(r)}function Lo(r){return r===10||r===13}function Cc(r){return r===9||r===32}function yn(r){return r===9||r===32||r===10||r===13}function ng(r){return r===44||r===91||r===93||r===123||r===125}function The(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function Ohe(r){return r===120?2:r===117?4:r===85?8:0}function Mhe(r){return 48<=r&&r<=57?r-48:-1}function sK(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` -`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function Khe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var oK=new Array(256),aK=new Array(256);for(var sg=0;sg<256;sg++)oK[sg]=sK(sg)?1:0,aK[sg]=sK(sg);function Uhe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||Dhe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function AK(r,e){return new X1(e,new Phe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function dt(r,e){throw AK(r,e)}function oI(r,e){r.onWarning&&r.onWarning.call(null,AK(r,e))}var lK={YAML:function(e,t,i){var n,s,o;e.version!==null&&dt(e,"duplication of %YAML directive"),i.length!==1&&dt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&dt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&dt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&oI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&dt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],rK.test(n)||dt(e,"ill-formed tag handle (first argument) of the TAG directive"),JA.call(e.tagMap,n)&&dt(e,'there is a previously declared suffix for "'+n+'" tag handle'),iK.test(s)||dt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function WA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=Oa.repeat(` -`,e-1))}function Hhe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),yn(h)||ng(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),yn(n)||t&&ng(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),yn(i))break}else{if(r.position===r.lineStart&&aI(r)||t&&ng(h))break;if(Lo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,ei(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(WA(r,s,o,!1),KQ(r,r.line-l),s=o=r.position,a=!1),Cc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return WA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function jhe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(WA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else Lo(t)?(WA(r,i,n,!0),KQ(r,ei(r,!1,e)),i=n=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);dt(r,"unexpected end of the stream within a single quoted scalar")}function Ghe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return WA(r,t,r.position,!0),r.position++,!0;if(a===92){if(WA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),Lo(a))ei(r,!1,e);else if(a<256&&oK[a])r.result+=aK[a],r.position++;else if((o=Ohe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=The(a))>=0?s=(s<<4)+o:dt(r,"expected hexadecimal character");r.result+=Khe(s),r.position++}else dt(r,"unknown escape sequence");t=i=r.position}else Lo(a)?(WA(r,t,i,!0),KQ(r,ei(r,!1,e)),t=i=r.position):r.position===r.lineStart&&aI(r)?dt(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}dt(r,"unexpected end of the stream within a double quoted scalar")}function Yhe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,m,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(ei(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||dt(r,"missed comma between flow collection entries"),p=h=m=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),yn(a)&&(c=u=!0,r.position++,ei(r,!0,e))),i=r.line,ag(r,e,nI,!1,!0),p=r.tag,h=r.result,ei(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),ei(r,!0,e),ag(r,e,nI,!1,!0),m=r.result),g?og(r,s,f,p,h,m):c?s.push(og(r,null,f,p,h,m)):s.push(h),ei(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}dt(r,"unexpected end of the stream within a flow collection")}function qhe(r,e){var t,i,n=OQ,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)OQ===n?n=g===43?tK:Rhe:dt(r,"repeat of a chomping mode identifier");else if((u=Mhe(g))>=0)u===0?dt(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?dt(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(Cc(g)){do g=r.input.charCodeAt(++r.position);while(Cc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!Lo(g)&&g!==0)}for(;g!==0;){for(MQ(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),Lo(g)){l++;continue}if(r.lineIndente)&&l!==0)dt(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(ag(r,e,sI,!0,n)&&(p?f=r.result:h=r.result),p||(og(r,c,u,g,f,h,s,o),g=f=h=null),ei(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)dt(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):dt(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):dt(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function Vhe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(ei(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&dt(r,"directive name must not be less than one character in length");o!==0;){for(;Cc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!Lo(o));break}if(Lo(o))break;for(t=r.position;o!==0&&!yn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&MQ(r),JA.call(lK,i)?lK[i](r,i,n):oI(r,'unknown document directive "'+i+'"')}if(ei(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,ei(r,!0,-1)):s&&dt(r,"directives end mark is expected"),ag(r,r.lineIndent-1,sI,!1,!0),ei(r,!0,-1),r.checkLineBreaks&&Nhe.test(r.input.slice(e,r.position))&&oI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&aI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,ei(r,!0,-1));return}if(r.position{"use strict";var ip=hc(),np=tg(),$he=tp(),epe=ig(),dK=Object.prototype.toString,CK=Object.prototype.hasOwnProperty,tpe=9,sp=10,rpe=13,ipe=32,npe=33,spe=34,mK=35,ope=37,ape=38,Ape=39,lpe=42,EK=44,cpe=45,IK=58,upe=61,gpe=62,fpe=63,hpe=64,yK=91,wK=93,ppe=96,BK=123,dpe=124,bK=125,Ki={};Ki[0]="\\0";Ki[7]="\\a";Ki[8]="\\b";Ki[9]="\\t";Ki[10]="\\n";Ki[11]="\\v";Ki[12]="\\f";Ki[13]="\\r";Ki[27]="\\e";Ki[34]='\\"';Ki[92]="\\\\";Ki[133]="\\N";Ki[160]="\\_";Ki[8232]="\\L";Ki[8233]="\\P";var Cpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function mpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Ag(o))return AI;a=s>0?r.charCodeAt(s-1):null,f=f&&vK(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?kK:PK:t>9&&xK(r)?AI:c?RK:DK}function Spe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Cpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Ipe(r,l)}switch(Bpe(e,o,r.indent,s,a)){case kK:return e;case PK:return"'"+e.replace(/'/g,"''")+"'";case DK:return"|"+FK(e,r.indent)+NK(SK(e,n));case RK:return">"+FK(e,r.indent)+NK(SK(bpe(e,s),n));case AI:return'"'+Qpe(e,s)+'"';default:throw new np("impossible error: invalid scalar style")}}()}function FK(r,e){var t=xK(r)?String(e):"",i=r[r.length-1]===` -`,n=i&&(r[r.length-2]===` -`||r===` -`),s=n?"+":i?"":"-";return t+s+` -`}function NK(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function bpe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` -`);return c=c!==-1?c:r.length,t.lastIndex=c,LK(r.slice(0,c),e)}(),n=r[0]===` -`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+LK(l,e),n=s}return i}function LK(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+r.slice(n,s),n=s+1),o=a;return l+=` -`,r.length-n>e&&o>n?l+=r.slice(n,o)+` -`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function Qpe(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=QK((t-55296)*1024+i-56320+65536),s++;continue}n=Ki[t],e+=!n&&Ag(t)?r[s]:n||QK(t)}return e}function vpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),!!mc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function Ppe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new np("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&sp===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=HQ(r,e)),!!mc(r,e+1,u,!0,g)&&(r.dump&&sp===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function TK(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function mc(r,e,t,i,n,s){r.tag=null,r.dump=t,TK(r,t,!1)||TK(r,t,!0);var o=dK.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(Ppe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(kpe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(xpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(vpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Spe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new np("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function Dpe(r,e){var t=[],i=[],n,s;for(GQ(r,t,i),n=0,s=i.length;n{"use strict";var lI=pK(),KK=MK();function cI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Mr.exports.Type=ci();Mr.exports.Schema=pc();Mr.exports.FAILSAFE_SCHEMA=rI();Mr.exports.JSON_SCHEMA=NQ();Mr.exports.CORE_SCHEMA=LQ();Mr.exports.DEFAULT_SAFE_SCHEMA=ig();Mr.exports.DEFAULT_FULL_SCHEMA=tp();Mr.exports.load=lI.load;Mr.exports.loadAll=lI.loadAll;Mr.exports.safeLoad=lI.safeLoad;Mr.exports.safeLoadAll=lI.safeLoadAll;Mr.exports.dump=KK.dump;Mr.exports.safeDump=KK.safeDump;Mr.exports.YAMLException=tg();Mr.exports.MINIMAL_SCHEMA=rI();Mr.exports.SAFE_SCHEMA=ig();Mr.exports.DEFAULT_SCHEMA=tp();Mr.exports.scan=cI("scan");Mr.exports.parse=cI("parse");Mr.exports.compose=cI("compose");Mr.exports.addConstructor=cI("addConstructor")});var jK=w((AXe,HK)=>{"use strict";var Fpe=UK();HK.exports=Fpe});var YK=w((lXe,GK)=>{"use strict";function Npe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Ec(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ec)}Npe(Ec,Error);Ec.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[He]:Ce})))},q=function(R){return R},Y=function(R){return R},$=Zs("correct indentation"),_=" ",ne=gr(" ",!1),ee=function(R){return R.length===KA*Ju},A=function(R){return R.length===(KA+1)*Ju},oe=function(){return KA++,!0},ce=function(){return KA--,!0},Z=function(){return Uu()},O=Zs("pseudostring"),L=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,de=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Be=/^[^\r\n\t ,\][{}:#"']/,je=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),re=function(){return Uu().replace(/^ *| *$/g,"")},se="--",be=gr("--",!1),he=/^[a-zA-Z\/0-9]/,Fe=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,ke=qn(["\r",` -`," "," ",":",","],!0,!1),ve="null",pe=gr("null",!1),V=function(){return null},Qe="true",le=gr("true",!1),fe=function(){return!0},gt="false",Ht=gr("false",!1),Mt=function(){return!1},Ei=Zs("string"),jt='"',Qr=gr('"',!1),Oi=function(){return""},Xs=function(R){return R},Un=function(R){return R.join("")},Hn=/^[^"\\\0-\x1F\x7F]/,Sr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),jn='\\"',fs=gr('\\"',!1),ba=function(){return'"'},DA="\\\\",Nu=gr("\\\\",!1),hs=function(){return"\\"},RA="\\/",Qa=gr("\\/",!1),Lu=function(){return"/"},FA="\\b",NA=gr("\\b",!1),vr=function(){return"\b"},zl="\\f",Tu=gr("\\f",!1),xo=function(){return"\f"},Ou="\\n",Sh=gr("\\n",!1),vh=function(){return` -`},Dr="\\r",Ae=gr("\\r",!1),ko=function(){return"\r"},Gn="\\t",Mu=gr("\\t",!1),St=function(){return" "},_l="\\u",Yn=gr("\\u",!1),ps=function(R,G,Ce,He){return String.fromCharCode(parseInt(`0x${R}${G}${Ce}${He}`))},ds=/^[0-9a-fA-F]/,pt=qn([["0","9"],["a","f"],["A","F"]],!1,!1),Po=Zs("blank space"),lt=/^[ \t]/,mn=qn([" "," "],!1,!1),S=Zs("white space"),Tt=/^[ \t\n\r]/,Ku=qn([" "," ",` -`,"\r"],!1,!1),Vl=`\r -`,xh=gr(`\r -`,!1),kh=` -`,Ph=gr(` -`,!1),Dh="\r",Rh=gr("\r",!1),j=0,wt=0,LA=[{line:1,column:1}],$i=0,Xl=[],$e=0,Sa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Uu(){return r.substring(wt,j)}function yE(){return En(wt,j)}function Fh(R,G){throw G=G!==void 0?G:En(wt,j),$l([Zs(R)],r.substring(wt,j),G)}function wE(R,G){throw G=G!==void 0?G:En(wt,j),Hu(R,G)}function gr(R,G){return{type:"literal",text:R,ignoreCase:G}}function qn(R,G,Ce){return{type:"class",parts:R,inverted:G,ignoreCase:Ce}}function Zl(){return{type:"any"}}function Nh(){return{type:"end"}}function Zs(R){return{type:"other",description:R}}function va(R){var G=LA[R],Ce;if(G)return G;for(Ce=R-1;!LA[Ce];)Ce--;for(G=LA[Ce],G={line:G.line,column:G.column};Ce$i&&($i=j,Xl=[]),Xl.push(R))}function Hu(R,G){return new Ec(R,null,null,G)}function $l(R,G,Ce){return new Ec(Ec.buildMessage(R,G),R,G,Ce)}function $s(){var R;return R=ju(),R}function ec(){var R,G,Ce;for(R=j,G=[],Ce=TA();Ce!==t;)G.push(Ce),Ce=TA();return G!==t&&(wt=R,G=s(G)),R=G,R}function TA(){var R,G,Ce,He,Te;return R=j,G=ka(),G!==t?(r.charCodeAt(j)===45?(Ce=o,j++):(Ce=t,$e===0&&Oe(a)),Ce!==t?(He=Tr(),He!==t?(Te=xa(),Te!==t?(wt=R,G=l(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R}function ju(){var R,G,Ce;for(R=j,G=[],Ce=Gu();Ce!==t;)G.push(Ce),Ce=Gu();return G!==t&&(wt=R,G=c(G)),R=G,R}function Gu(){var R,G,Ce,He,Te,Xe,Et,Rt,Jn;if(R=j,G=Tr(),G===t&&(G=null),G!==t){if(Ce=j,r.charCodeAt(j)===35?(He=u,j++):(He=t,$e===0&&Oe(g)),He!==t){if(Te=[],Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t),Xe!==t)for(;Xe!==t;)Te.push(Xe),Xe=j,Et=j,$e++,Rt=ro(),$e--,Rt===t?Et=void 0:(j=Et,Et=t),Et!==t?(r.length>j?(Rt=r.charAt(j),j++):(Rt=t,$e===0&&Oe(f)),Rt!==t?(Et=[Et,Rt],Xe=Et):(j=Xe,Xe=t)):(j=Xe,Xe=t);else Te=t;Te!==t?(He=[He,Te],Ce=He):(j=Ce,Ce=t)}else j=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(He=[],Te=to(),Te!==t)for(;Te!==t;)He.push(Te),Te=to();else He=t;He!==t?(wt=R,G=h(),R=G):(j=R,R=t)}else j=R,R=t}else j=R,R=t;if(R===t&&(R=j,G=ka(),G!==t?(Ce=tc(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ka(),G!==t?(Ce=eo(),Ce!==t?(He=Tr(),He===t&&(He=null),He!==t?(r.charCodeAt(j)===58?(Te=p,j++):(Te=t,$e===0&&Oe(m)),Te!==t?(Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(Et=xa(),Et!==t?(wt=R,G=y(Ce,Et),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))){if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t)if(He=Tr(),He!==t)if(Te=BE(),Te!==t){if(Xe=[],Et=to(),Et!==t)for(;Et!==t;)Xe.push(Et),Et=to();else Xe=t;Xe!==t?(wt=R,G=y(Ce,Te),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;else j=R,R=t;else j=R,R=t;if(R===t)if(R=j,G=ka(),G!==t)if(Ce=eo(),Ce!==t){if(He=[],Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t),Te!==t)for(;Te!==t;)He.push(Te),Te=j,Xe=Tr(),Xe===t&&(Xe=null),Xe!==t?(r.charCodeAt(j)===44?(Et=b,j++):(Et=t,$e===0&&Oe(v)),Et!==t?(Rt=Tr(),Rt===t&&(Rt=null),Rt!==t?(Jn=eo(),Jn!==t?(wt=Te,Xe=x(Ce,Jn),Te=Xe):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t)):(j=Te,Te=t);else He=t;He!==t?(Te=Tr(),Te===t&&(Te=null),Te!==t?(r.charCodeAt(j)===58?(Xe=p,j++):(Xe=t,$e===0&&Oe(m)),Xe!==t?(Et=Tr(),Et===t&&(Et=null),Et!==t?(Rt=xa(),Rt!==t?(wt=R,G=T(Ce,He,Rt),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)}else j=R,R=t;else j=R,R=t}return R}function xa(){var R,G,Ce,He,Te,Xe,Et;if(R=j,G=j,$e++,Ce=j,He=ro(),He!==t?(Te=nt(),Te!==t?(r.charCodeAt(j)===45?(Xe=o,j++):(Xe=t,$e===0&&Oe(a)),Xe!==t?(Et=Tr(),Et!==t?(He=[He,Te,Xe,Et],Ce=He):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t)):(j=Ce,Ce=t),$e--,Ce!==t?(j=G,G=void 0):G=t,G!==t?(Ce=to(),Ce!==t?(He=Do(),He!==t?(Te=ec(),Te!==t?(Xe=OA(),Xe!==t?(wt=R,G=q(Te),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,G=ro(),G!==t?(Ce=Do(),Ce!==t?(He=ju(),He!==t?(Te=OA(),Te!==t?(wt=R,G=q(He),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t),R===t))if(R=j,G=rc(),G!==t){if(Ce=[],He=to(),He!==t)for(;He!==t;)Ce.push(He),He=to();else Ce=t;Ce!==t?(wt=R,G=Y(G),R=G):(j=R,R=t)}else j=R,R=t;return R}function ka(){var R,G,Ce;for($e++,R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=ee(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),$e--,R===t&&(G=t,$e===0&&Oe($)),R}function nt(){var R,G,Ce;for(R=j,G=[],r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));Ce!==t;)G.push(Ce),r.charCodeAt(j)===32?(Ce=_,j++):(Ce=t,$e===0&&Oe(ne));return G!==t?(wt=j,Ce=A(G),Ce?Ce=void 0:Ce=t,Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)):(j=R,R=t),R}function Do(){var R;return wt=j,R=oe(),R?R=void 0:R=t,R}function OA(){var R;return wt=j,R=ce(),R?R=void 0:R=t,R}function tc(){var R;return R=ic(),R===t&&(R=Lh()),R}function eo(){var R,G,Ce;if(R=ic(),R===t){if(R=j,G=[],Ce=Yu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=Yu();else G=t;G!==t&&(wt=R,G=Z()),R=G}return R}function rc(){var R;return R=Th(),R===t&&(R=bE(),R===t&&(R=ic(),R===t&&(R=Lh()))),R}function BE(){var R;return R=Th(),R===t&&(R=ic(),R===t&&(R=Yu())),R}function Lh(){var R,G,Ce,He,Te,Xe;if($e++,R=j,L.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(de)),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Be.test(r.charAt(j))?(Xe=r.charAt(j),j++):(Xe=t,$e===0&&Oe(je)),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;return $e--,R===t&&(G=t,$e===0&&Oe(O)),R}function Yu(){var R,G,Ce,He,Te;if(R=j,r.substr(j,2)===se?(G=se,j+=2):(G=t,$e===0&&Oe(be)),G===t&&(G=null),G!==t)if(he.test(r.charAt(j))?(Ce=r.charAt(j),j++):(Ce=t,$e===0&&Oe(Fe)),Ce!==t){for(He=[],Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));Te!==t;)He.push(Te),Ke.test(r.charAt(j))?(Te=r.charAt(j),j++):(Te=t,$e===0&&Oe(ke));He!==t?(wt=R,G=re(),R=G):(j=R,R=t)}else j=R,R=t;else j=R,R=t;return R}function Th(){var R,G;return R=j,r.substr(j,4)===ve?(G=ve,j+=4):(G=t,$e===0&&Oe(pe)),G!==t&&(wt=R,G=V()),R=G,R}function bE(){var R,G;return R=j,r.substr(j,4)===Qe?(G=Qe,j+=4):(G=t,$e===0&&Oe(le)),G!==t&&(wt=R,G=fe()),R=G,R===t&&(R=j,r.substr(j,5)===gt?(G=gt,j+=5):(G=t,$e===0&&Oe(Ht)),G!==t&&(wt=R,G=Mt()),R=G),R}function ic(){var R,G,Ce,He;return $e++,R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(r.charCodeAt(j)===34?(Ce=jt,j++):(Ce=t,$e===0&&Oe(Qr)),Ce!==t?(wt=R,G=Oi(),R=G):(j=R,R=t)):(j=R,R=t),R===t&&(R=j,r.charCodeAt(j)===34?(G=jt,j++):(G=t,$e===0&&Oe(Qr)),G!==t?(Ce=QE(),Ce!==t?(r.charCodeAt(j)===34?(He=jt,j++):(He=t,$e===0&&Oe(Qr)),He!==t?(wt=R,G=Xs(Ce),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)),$e--,R===t&&(G=t,$e===0&&Oe(Ei)),R}function QE(){var R,G,Ce;if(R=j,G=[],Ce=qu(),Ce!==t)for(;Ce!==t;)G.push(Ce),Ce=qu();else G=t;return G!==t&&(wt=R,G=Un(G)),R=G,R}function qu(){var R,G,Ce,He,Te,Xe;return Hn.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(Sr)),R===t&&(R=j,r.substr(j,2)===jn?(G=jn,j+=2):(G=t,$e===0&&Oe(fs)),G!==t&&(wt=R,G=ba()),R=G,R===t&&(R=j,r.substr(j,2)===DA?(G=DA,j+=2):(G=t,$e===0&&Oe(Nu)),G!==t&&(wt=R,G=hs()),R=G,R===t&&(R=j,r.substr(j,2)===RA?(G=RA,j+=2):(G=t,$e===0&&Oe(Qa)),G!==t&&(wt=R,G=Lu()),R=G,R===t&&(R=j,r.substr(j,2)===FA?(G=FA,j+=2):(G=t,$e===0&&Oe(NA)),G!==t&&(wt=R,G=vr()),R=G,R===t&&(R=j,r.substr(j,2)===zl?(G=zl,j+=2):(G=t,$e===0&&Oe(Tu)),G!==t&&(wt=R,G=xo()),R=G,R===t&&(R=j,r.substr(j,2)===Ou?(G=Ou,j+=2):(G=t,$e===0&&Oe(Sh)),G!==t&&(wt=R,G=vh()),R=G,R===t&&(R=j,r.substr(j,2)===Dr?(G=Dr,j+=2):(G=t,$e===0&&Oe(Ae)),G!==t&&(wt=R,G=ko()),R=G,R===t&&(R=j,r.substr(j,2)===Gn?(G=Gn,j+=2):(G=t,$e===0&&Oe(Mu)),G!==t&&(wt=R,G=St()),R=G,R===t&&(R=j,r.substr(j,2)===_l?(G=_l,j+=2):(G=t,$e===0&&Oe(Yn)),G!==t?(Ce=MA(),Ce!==t?(He=MA(),He!==t?(Te=MA(),Te!==t?(Xe=MA(),Xe!==t?(wt=R,G=ps(Ce,He,Te,Xe),R=G):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)):(j=R,R=t)))))))))),R}function MA(){var R;return ds.test(r.charAt(j))?(R=r.charAt(j),j++):(R=t,$e===0&&Oe(pt)),R}function Tr(){var R,G;if($e++,R=[],lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn)),G!==t)for(;G!==t;)R.push(G),lt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(mn));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(Po)),R}function SE(){var R,G;if($e++,R=[],Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku)),G!==t)for(;G!==t;)R.push(G),Tt.test(r.charAt(j))?(G=r.charAt(j),j++):(G=t,$e===0&&Oe(Ku));else R=t;return $e--,R===t&&(G=t,$e===0&&Oe(S)),R}function to(){var R,G,Ce,He,Te,Xe;if(R=j,G=ro(),G!==t){for(Ce=[],He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);He!==t;)Ce.push(He),He=j,Te=Tr(),Te===t&&(Te=null),Te!==t?(Xe=ro(),Xe!==t?(Te=[Te,Xe],He=Te):(j=He,He=t)):(j=He,He=t);Ce!==t?(G=[G,Ce],R=G):(j=R,R=t)}else j=R,R=t;return R}function ro(){var R;return r.substr(j,2)===Vl?(R=Vl,j+=2):(R=t,$e===0&&Oe(xh)),R===t&&(r.charCodeAt(j)===10?(R=kh,j++):(R=t,$e===0&&Oe(Ph)),R===t&&(r.charCodeAt(j)===13?(R=Dh,j++):(R=t,$e===0&&Oe(Rh)))),R}let Ju=2,KA=0;if(Sa=n(),Sa!==t&&j===r.length)return Sa;throw Sa!==t&&j{"use strict";var Upe=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=Upe(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};JQ.exports=_K;JQ.exports.default=_K});var ZK=w((pXe,XK)=>{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var Ic=w(Xn=>{"use strict";var $K=ZK(),To=process.env;Object.defineProperty(Xn,"_vendors",{value:$K.map(function(r){return r.constant})});Xn.name=null;Xn.isPR=null;$K.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return eU(i)});if(Xn[r.constant]=t,t)switch(Xn.name=r.name,typeof r.pr){case"string":Xn.isPR=!!To[r.pr];break;case"object":"env"in r.pr?Xn.isPR=r.pr.env in To&&To[r.pr.env]!==r.pr.ne:"any"in r.pr?Xn.isPR=r.pr.any.some(function(i){return!!To[i]}):Xn.isPR=eU(r.pr);break;default:Xn.isPR=null}});Xn.isCI=!!(To.CI||To.CONTINUOUS_INTEGRATION||To.BUILD_NUMBER||To.RUN_ID||Xn.name);function eU(r){return typeof r=="string"?!!To[r]:Object.keys(r).every(function(e){return To[e]===r[e]})}});var cg={};ft(cg,{KeyRelationship:()=>Bc,applyCascade:()=>fp,base64RegExp:()=>sU,colorStringAlphaRegExp:()=>nU,colorStringRegExp:()=>iU,computeKey:()=>zA,getPrintable:()=>ti,hasExactLength:()=>cU,hasForbiddenKeys:()=>mde,hasKeyRelationship:()=>eS,hasMaxLength:()=>tde,hasMinLength:()=>ede,hasMutuallyExclusiveKeys:()=>Ede,hasRequiredKeys:()=>Cde,hasUniqueItems:()=>rde,isArray:()=>Jpe,isAtLeast:()=>sde,isAtMost:()=>ode,isBase64:()=>pde,isBoolean:()=>Gpe,isDate:()=>qpe,isDict:()=>zpe,isEnum:()=>nn,isHexColor:()=>hde,isISO8601:()=>fde,isInExclusiveRange:()=>Ade,isInInclusiveRange:()=>ade,isInstanceOf:()=>Vpe,isInteger:()=>lde,isJSON:()=>dde,isLiteral:()=>Hpe,isLowerCase:()=>cde,isNegative:()=>ide,isNullable:()=>$pe,isNumber:()=>Ype,isObject:()=>_pe,isOneOf:()=>Xpe,isOptional:()=>Zpe,isPositive:()=>nde,isString:()=>gp,isTuple:()=>Wpe,isUUID4:()=>gde,isUnknown:()=>lU,isUpperCase:()=>ude,iso8601RegExp:()=>$Q,makeCoercionFn:()=>wc,makeSetter:()=>AU,makeTrait:()=>aU,makeValidator:()=>vt,matchesRegExp:()=>hp,plural:()=>hI,pushError:()=>mt,simpleKeyRegExp:()=>rU,uuid4RegExp:()=>oU});function vt({test:r}){return aU(r)()}function ti(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function zA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:rU.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wc(r,e){return t=>{let i=r[e];return r[e]=t,wc(r,e).bind(null,i)}}function AU(r,e){return t=>{r[e]=t}}function hI(r,e,t){return r===1?e:t}function mt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function Hpe(r){return vt({test:(e,t)=>e!==r?mt(t,`Expected a literal (got ${ti(r)})`):!0})}function nn(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return vt({test:(i,n)=>t.has(i)?!0:mt(n,`Expected a valid enumeration value (got ${ti(i)})`)})}var rU,iU,nU,sU,oU,$Q,aU,lU,gp,jpe,Gpe,Ype,qpe,Jpe,Wpe,zpe,_pe,Vpe,Xpe,fp,Zpe,$pe,ede,tde,cU,rde,ide,nde,sde,ode,ade,Ade,lde,hp,cde,ude,gde,fde,hde,pde,dde,Cde,mde,Ede,Bc,Ide,eS,ys=uge(()=>{rU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,iU=/^#[0-9a-f]{6}$/i,nU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,sU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,oU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,$Q=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,aU=r=>()=>r;lU=()=>vt({test:(r,e)=>!0});gp=()=>vt({test:(r,e)=>typeof r!="string"?mt(e,`Expected a string (got ${ti(r)})`):!0});jpe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Gpe=()=>vt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i=jpe.get(r);if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a boolean (got ${ti(r)})`)}return!0}}),Ype=()=>vt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return mt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a number (got ${ti(r)})`)}return!0}}),qpe=()=>vt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return mt(e,"Unbound coercion result");let i;if(typeof r=="string"&&$Q.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch(o){}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return mt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i!="undefined")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return mt(e,`Expected a date (got ${ti(r)})`)}return!0}}),Jpe=(r,{delimiter:e}={})=>vt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return mt(i,`Expected an array (got ${ti(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=cU(r.length);return vt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return mt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return mt(n,`Expected a tuple (got ${ti(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;avt({test:(t,i)=>{if(typeof t!="object"||t===null)return mt(i,`Expected an object (got ${ti(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return vt({test:(i,n)=>{if(typeof i!="object"||i===null)return mt(n,`Expected an object (got ${ti(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:zA(n,l),coercion:wc(i,l)}))&&a:e===null?a=mt(Object.assign(Object.assign({},n),{p:zA(n,l)}),`Extraneous property (got ${ti(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:AU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Vpe=r=>vt({test:(e,t)=>e instanceof r?!0:mt(t,`Expected an instance of ${r.name} (got ${ti(e)})`)}),Xpe=(r,{exclusive:e=!1}={})=>vt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=r.length;c1?mt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fp=(r,e)=>vt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)!="undefined"?wc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)=="undefined")return mt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Zpe=r=>vt({test:(e,t)=>typeof e=="undefined"?!0:r(e,t)}),$pe=r=>vt({test:(e,t)=>e===null?!0:r(e,t)}),ede=r=>vt({test:(e,t)=>e.length>=r?!0:mt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),tde=r=>vt({test:(e,t)=>e.length<=r?!0:mt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),cU=r=>vt({test:(e,t)=>e.length!==r?mt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),rde=({map:r}={})=>vt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;svt({test:(r,e)=>r<=0?!0:mt(e,`Expected to be negative (got ${r})`)}),nde=()=>vt({test:(r,e)=>r>=0?!0:mt(e,`Expected to be positive (got ${r})`)}),sde=r=>vt({test:(e,t)=>e>=r?!0:mt(t,`Expected to be at least ${r} (got ${e})`)}),ode=r=>vt({test:(e,t)=>e<=r?!0:mt(t,`Expected to be at most ${r} (got ${e})`)}),ade=(r,e)=>vt({test:(t,i)=>t>=r&&t<=e?!0:mt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Ade=(r,e)=>vt({test:(t,i)=>t>=r&&tvt({test:(e,t)=>e!==Math.round(e)?mt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:mt(t,`Expected to be a safe integer (got ${e})`)}),hp=r=>vt({test:(e,t)=>r.test(e)?!0:mt(t,`Expected to match the pattern ${r.toString()} (got ${ti(e)})`)}),cde=()=>vt({test:(r,e)=>r!==r.toLowerCase()?mt(e,`Expected to be all-lowercase (got ${r})`):!0}),ude=()=>vt({test:(r,e)=>r!==r.toUpperCase()?mt(e,`Expected to be all-uppercase (got ${r})`):!0}),gde=()=>vt({test:(r,e)=>oU.test(r)?!0:mt(e,`Expected to be a valid UUID v4 (got ${ti(r)})`)}),fde=()=>vt({test:(r,e)=>$Q.test(r)?!1:mt(e,`Expected to be a valid ISO 8601 date string (got ${ti(r)})`)}),hde=({alpha:r=!1})=>vt({test:(e,t)=>(r?iU.test(e):nU.test(e))?!0:mt(t,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)}),pde=()=>vt({test:(r,e)=>sU.test(r)?!0:mt(e,`Expected to be a valid base 64 string (got ${ti(r)})`)}),dde=(r=lU())=>vt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch(n){return mt(t,`Expected to be a valid JSON string (got ${ti(e)})`)}return r(i,t)}}),Cde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?mt(i,`Missing required ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},mde=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?mt(i,`Forbidden ${hI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Ede=r=>{let e=new Set(r);return vt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?mt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(Bc||(Bc={}));Ide={[Bc.Forbids]:{expect:!1,message:"forbids using"},[Bc.Requires]:{expect:!0,message:"requires using"}},eS=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Ide[e];return vt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?mt(l,`Property "${r}" ${o.message} ${hI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var kU=w((dZe,xU)=>{"use strict";xU.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var gg=w((CZe,aS)=>{"use strict";var Ode=kU(),PU=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=Ode(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};aS.exports=PU;aS.exports.default=PU});var mp=w((EZe,DU)=>{var Mde="2.0.0",Kde=256,Ude=Number.MAX_SAFE_INTEGER||9007199254740991,Hde=16;DU.exports={SEMVER_SPEC_VERSION:Mde,MAX_LENGTH:Kde,MAX_SAFE_INTEGER:Ude,MAX_SAFE_COMPONENT_LENGTH:Hde}});var Ep=w((IZe,RU)=>{var jde=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};RU.exports=jde});var bc=w((VA,FU)=>{var{MAX_SAFE_COMPONENT_LENGTH:AS}=mp(),Gde=Ep();VA=FU.exports={};var Yde=VA.re=[],rt=VA.src=[],it=VA.t={},qde=0,xt=(r,e,t)=>{let i=qde++;Gde(i,e),it[r]=i,rt[i]=e,Yde[i]=new RegExp(e,t?"g":void 0)};xt("NUMERICIDENTIFIER","0|[1-9]\\d*");xt("NUMERICIDENTIFIERLOOSE","[0-9]+");xt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");xt("MAINVERSION",`(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})\\.(${rt[it.NUMERICIDENTIFIER]})`);xt("MAINVERSIONLOOSE",`(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})\\.(${rt[it.NUMERICIDENTIFIERLOOSE]})`);xt("PRERELEASEIDENTIFIER",`(?:${rt[it.NUMERICIDENTIFIER]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASEIDENTIFIERLOOSE",`(?:${rt[it.NUMERICIDENTIFIERLOOSE]}|${rt[it.NONNUMERICIDENTIFIER]})`);xt("PRERELEASE",`(?:-(${rt[it.PRERELEASEIDENTIFIER]}(?:\\.${rt[it.PRERELEASEIDENTIFIER]})*))`);xt("PRERELEASELOOSE",`(?:-?(${rt[it.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rt[it.PRERELEASEIDENTIFIERLOOSE]})*))`);xt("BUILDIDENTIFIER","[0-9A-Za-z-]+");xt("BUILD",`(?:\\+(${rt[it.BUILDIDENTIFIER]}(?:\\.${rt[it.BUILDIDENTIFIER]})*))`);xt("FULLPLAIN",`v?${rt[it.MAINVERSION]}${rt[it.PRERELEASE]}?${rt[it.BUILD]}?`);xt("FULL",`^${rt[it.FULLPLAIN]}$`);xt("LOOSEPLAIN",`[v=\\s]*${rt[it.MAINVERSIONLOOSE]}${rt[it.PRERELEASELOOSE]}?${rt[it.BUILD]}?`);xt("LOOSE",`^${rt[it.LOOSEPLAIN]}$`);xt("GTLT","((?:<|>)?=?)");xt("XRANGEIDENTIFIERLOOSE",`${rt[it.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);xt("XRANGEIDENTIFIER",`${rt[it.NUMERICIDENTIFIER]}|x|X|\\*`);xt("XRANGEPLAIN",`[v=\\s]*(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:\\.(${rt[it.XRANGEIDENTIFIER]})(?:${rt[it.PRERELEASE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGEPLAINLOOSE",`[v=\\s]*(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rt[it.XRANGEIDENTIFIERLOOSE]})(?:${rt[it.PRERELEASELOOSE]})?${rt[it.BUILD]}?)?)?`);xt("XRANGE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAIN]}$`);xt("XRANGELOOSE",`^${rt[it.GTLT]}\\s*${rt[it.XRANGEPLAINLOOSE]}$`);xt("COERCE",`(^|[^\\d])(\\d{1,${AS}})(?:\\.(\\d{1,${AS}}))?(?:\\.(\\d{1,${AS}}))?(?:$|[^\\d])`);xt("COERCERTL",rt[it.COERCE],!0);xt("LONETILDE","(?:~>?)");xt("TILDETRIM",`(\\s*)${rt[it.LONETILDE]}\\s+`,!0);VA.tildeTrimReplace="$1~";xt("TILDE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAIN]}$`);xt("TILDELOOSE",`^${rt[it.LONETILDE]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("LONECARET","(?:\\^)");xt("CARETTRIM",`(\\s*)${rt[it.LONECARET]}\\s+`,!0);VA.caretTrimReplace="$1^";xt("CARET",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAIN]}$`);xt("CARETLOOSE",`^${rt[it.LONECARET]}${rt[it.XRANGEPLAINLOOSE]}$`);xt("COMPARATORLOOSE",`^${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]})$|^$`);xt("COMPARATOR",`^${rt[it.GTLT]}\\s*(${rt[it.FULLPLAIN]})$|^$`);xt("COMPARATORTRIM",`(\\s*)${rt[it.GTLT]}\\s*(${rt[it.LOOSEPLAIN]}|${rt[it.XRANGEPLAIN]})`,!0);VA.comparatorTrimReplace="$1$2$3";xt("HYPHENRANGE",`^\\s*(${rt[it.XRANGEPLAIN]})\\s+-\\s+(${rt[it.XRANGEPLAIN]})\\s*$`);xt("HYPHENRANGELOOSE",`^\\s*(${rt[it.XRANGEPLAINLOOSE]})\\s+-\\s+(${rt[it.XRANGEPLAINLOOSE]})\\s*$`);xt("STAR","(<|>)?=?\\s*\\*");xt("GTE0","^\\s*>=\\s*0.0.0\\s*$");xt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var Ip=w((yZe,NU)=>{var Jde=["includePrerelease","loose","rtl"],Wde=r=>r?typeof r!="object"?{loose:!0}:Jde.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};NU.exports=Wde});var yI=w((wZe,LU)=>{var TU=/^[0-9]+$/,OU=(r,e)=>{let t=TU.test(r),i=TU.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rOU(e,r);LU.exports={compareIdentifiers:OU,rcompareIdentifiers:zde}});var Hi=w((BZe,MU)=>{var wI=Ep(),{MAX_LENGTH:KU,MAX_SAFE_INTEGER:BI}=mp(),{re:UU,t:HU}=bc(),_de=Ip(),{compareIdentifiers:yp}=yI(),Bs=class{constructor(e,t){if(t=_de(t),e instanceof Bs){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>KU)throw new TypeError(`version is longer than ${KU} characters`);wI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?UU[HU.LOOSE]:UU[HU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>BI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>BI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>BI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};MU.exports=Bs});var Qc=w((bZe,jU)=>{var{MAX_LENGTH:Vde}=mp(),{re:GU,t:YU}=bc(),qU=Hi(),Xde=Ip(),Zde=(r,e)=>{if(e=Xde(e),r instanceof qU)return r;if(typeof r!="string"||r.length>Vde||!(e.loose?GU[YU.LOOSE]:GU[YU.FULL]).test(r))return null;try{return new qU(r,e)}catch(i){return null}};jU.exports=Zde});var WU=w((QZe,JU)=>{var $de=Qc(),eCe=(r,e)=>{let t=$de(r,e);return t?t.version:null};JU.exports=eCe});var _U=w((SZe,zU)=>{var tCe=Qc(),rCe=(r,e)=>{let t=tCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};zU.exports=rCe});var XU=w((vZe,VU)=>{var iCe=Hi(),nCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new iCe(r,t).inc(e,i).version}catch(n){return null}};VU.exports=nCe});var bs=w((xZe,ZU)=>{var $U=Hi(),sCe=(r,e,t)=>new $U(r,t).compare(new $U(e,t));ZU.exports=sCe});var bI=w((kZe,e2)=>{var oCe=bs(),aCe=(r,e,t)=>oCe(r,e,t)===0;e2.exports=aCe});var i2=w((PZe,t2)=>{var r2=Qc(),ACe=bI(),lCe=(r,e)=>{if(ACe(r,e))return null;{let t=r2(r),i=r2(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};t2.exports=lCe});var s2=w((DZe,n2)=>{var cCe=Hi(),uCe=(r,e)=>new cCe(r,e).major;n2.exports=uCe});var a2=w((RZe,o2)=>{var gCe=Hi(),fCe=(r,e)=>new gCe(r,e).minor;o2.exports=fCe});var l2=w((FZe,A2)=>{var hCe=Hi(),pCe=(r,e)=>new hCe(r,e).patch;A2.exports=pCe});var u2=w((NZe,c2)=>{var dCe=Qc(),CCe=(r,e)=>{let t=dCe(r,e);return t&&t.prerelease.length?t.prerelease:null};c2.exports=CCe});var f2=w((LZe,g2)=>{var mCe=bs(),ECe=(r,e,t)=>mCe(e,r,t);g2.exports=ECe});var p2=w((TZe,h2)=>{var ICe=bs(),yCe=(r,e)=>ICe(r,e,!0);h2.exports=yCe});var QI=w((OZe,d2)=>{var C2=Hi(),wCe=(r,e,t)=>{let i=new C2(r,t),n=new C2(e,t);return i.compare(n)||i.compareBuild(n)};d2.exports=wCe});var E2=w((MZe,m2)=>{var BCe=QI(),bCe=(r,e)=>r.sort((t,i)=>BCe(t,i,e));m2.exports=bCe});var y2=w((KZe,I2)=>{var QCe=QI(),SCe=(r,e)=>r.sort((t,i)=>QCe(i,t,e));I2.exports=SCe});var wp=w((UZe,w2)=>{var vCe=bs(),xCe=(r,e,t)=>vCe(r,e,t)>0;w2.exports=xCe});var SI=w((HZe,B2)=>{var kCe=bs(),PCe=(r,e,t)=>kCe(r,e,t)<0;B2.exports=PCe});var lS=w((jZe,b2)=>{var DCe=bs(),RCe=(r,e,t)=>DCe(r,e,t)!==0;b2.exports=RCe});var vI=w((GZe,Q2)=>{var FCe=bs(),NCe=(r,e,t)=>FCe(r,e,t)>=0;Q2.exports=NCe});var xI=w((YZe,S2)=>{var LCe=bs(),TCe=(r,e,t)=>LCe(r,e,t)<=0;S2.exports=TCe});var cS=w((qZe,v2)=>{var OCe=bI(),MCe=lS(),KCe=wp(),UCe=vI(),HCe=SI(),jCe=xI(),GCe=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return OCe(r,t,i);case"!=":return MCe(r,t,i);case">":return KCe(r,t,i);case">=":return UCe(r,t,i);case"<":return HCe(r,t,i);case"<=":return jCe(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};v2.exports=GCe});var k2=w((JZe,x2)=>{var YCe=Hi(),qCe=Qc(),{re:kI,t:PI}=bc(),JCe=(r,e)=>{if(r instanceof YCe)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(kI[PI.COERCE]);else{let i;for(;(i=kI[PI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),kI[PI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;kI[PI.COERCERTL].lastIndex=-1}return t===null?null:qCe(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};x2.exports=JCe});var D2=w((WZe,P2)=>{"use strict";P2.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Bp=w((zZe,R2)=>{"use strict";R2.exports=Gt;Gt.Node=Sc;Gt.create=Gt;function Gt(r){var e=this;if(e instanceof Gt||(e=new Gt),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Gt.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Gt.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Gt.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Gt.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Gt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Gt.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var VCe=Bp(),vc=Symbol("max"),Ua=Symbol("length"),fg=Symbol("lengthCalculator"),bp=Symbol("allowStale"),xc=Symbol("maxAge"),Ha=Symbol("dispose"),N2=Symbol("noDisposeOnSet"),yi=Symbol("lruList"),oo=Symbol("cache"),L2=Symbol("updateAgeOnGet"),uS=()=>1,T2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[vc]=e.max||Infinity,i=e.length||uS;if(this[fg]=typeof i!="function"?uS:i,this[bp]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xc]=e.maxAge||0,this[Ha]=e.dispose,this[N2]=e.noDisposeOnSet||!1,this[L2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[vc]=e||Infinity,Qp(this)}get max(){return this[vc]}set allowStale(e){this[bp]=!!e}get allowStale(){return this[bp]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xc]=e,Qp(this)}get maxAge(){return this[xc]}set lengthCalculator(e){typeof e!="function"&&(e=uS),e!==this[fg]&&(this[fg]=e,this[Ua]=0,this[yi].forEach(t=>{t.length=this[fg](t.value,t.key),this[Ua]+=t.length})),Qp(this)}get lengthCalculator(){return this[fg]}get length(){return this[Ua]}get itemCount(){return this[yi].length}rforEach(e,t){t=t||this;for(let i=this[yi].tail;i!==null;){let n=i.prev;M2(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[yi].head;i!==null;){let n=i.next;M2(this,e,i,t),i=n}}keys(){return this[yi].toArray().map(e=>e.key)}values(){return this[yi].toArray().map(e=>e.value)}reset(){this[Ha]&&this[yi]&&this[yi].length&&this[yi].forEach(e=>this[Ha](e.key,e.value)),this[oo]=new Map,this[yi]=new VCe,this[Ua]=0}dump(){return this[yi].map(e=>DI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[yi]}set(e,t,i){if(i=i||this[xc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[fg](t,e);if(this[oo].has(e)){if(s>this[vc])return hg(this,this[oo].get(e)),!1;let l=this[oo].get(e).value;return this[Ha]&&(this[N2]||this[Ha](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[Ua]+=s-l.length,l.length=s,this.get(e),Qp(this),!0}let o=new O2(e,t,s,n,i);return o.length>this[vc]?(this[Ha]&&this[Ha](e,t),!1):(this[Ua]+=o.length,this[yi].unshift(o),this[oo].set(e,this[yi].head),Qp(this),!0)}has(e){if(!this[oo].has(e))return!1;let t=this[oo].get(e).value;return!DI(this,t)}get(e){return gS(this,e,!0)}peek(e){return gS(this,e,!1)}pop(){let e=this[yi].tail;return e?(hg(this,e),e.value):null}del(e){hg(this,this[oo].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[oo].forEach((e,t)=>gS(this,t,!1))}},gS=(r,e,t)=>{let i=r[oo].get(e);if(i){let n=i.value;if(DI(r,n)){if(hg(r,i),!r[bp])return}else t&&(r[L2]&&(i.value.now=Date.now()),r[yi].unshiftNode(i));return n.value}},DI=(r,e)=>{if(!e||!e.maxAge&&!r[xc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[xc]&&t>r[xc]},Qp=r=>{if(r[Ua]>r[vc])for(let e=r[yi].tail;r[Ua]>r[vc]&&e!==null;){let t=e.prev;hg(r,e),e=t}},hg=(r,e)=>{if(e){let t=e.value;r[Ha]&&r[Ha](t.key,t.value),r[Ua]-=t.length,r[oo].delete(t.key),r[yi].removeNode(e)}},O2=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},M2=(r,e,t,i)=>{let n=t.value;DI(r,n)&&(hg(r,t),r[bp]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};F2.exports=T2});var Qs=w((VZe,U2)=>{var pg=class{constructor(e,t){if(t=XCe(t),e instanceof pg)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new pg(e.raw,t);if(e instanceof fS)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!j2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&rme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=H2.get(i);if(n)return n;let s=this.options.loose,o=s?ji[ki.HYPHENRANGELOOSE]:ji[ki.HYPHENRANGE];e=e.replace(o,sme(this.options.includePrerelease)),zr("hyphen replace",e),e=e.replace(ji[ki.COMPARATORTRIM],$Ce),zr("comparator trim",e,ji[ki.COMPARATORTRIM]),e=e.replace(ji[ki.TILDETRIM],eme),e=e.replace(ji[ki.CARETTRIM],tme),e=e.split(/\s+/).join(" ");let a=s?ji[ki.COMPARATORLOOSE]:ji[ki.COMPARATOR],l=e.split(" ").map(f=>ime(f,this.options)).join(" ").split(/\s+/).map(f=>nme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new fS(f,this.options)),c=l.length,u=new Map;for(let f of l){if(j2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return H2.set(i,g),g}intersects(e,t){if(!(e instanceof pg))throw new TypeError("a Range is required");return this.set.some(i=>G2(i,t)&&e.set.some(n=>G2(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new ZCe(e,this.options)}catch(t){return!1}for(let t=0;tr.value==="<0.0.0-0",rme=r=>r.value==="",G2=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},ime=(r,e)=>(zr("comp",r,e),r=lme(r,e),zr("caret",r),r=Ame(r,e),zr("tildes",r),r=cme(r,e),zr("xrange",r),r=ume(r,e),zr("stars",r),r),on=r=>!r||r.toLowerCase()==="x"||r==="*",Ame=(r,e)=>r.trim().split(/\s+/).map(t=>gme(t,e)).join(" "),gme=(r,e)=>{let t=e.loose?ji[ki.TILDELOOSE]:ji[ki.TILDE];return r.replace(t,(i,n,s,o,a)=>{zr("tilde",r,i,n,s,o,a);let l;return on(n)?l="":on(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:on(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(zr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,zr("tilde return",l),l})},lme=(r,e)=>r.trim().split(/\s+/).map(t=>fme(t,e)).join(" "),fme=(r,e)=>{zr("caret",r,e);let t=e.loose?ji[ki.CARETLOOSE]:ji[ki.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{zr("caret",r,n,s,o,a,l);let c;return on(s)?c="":on(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:on(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(zr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(zr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),zr("caret return",c),c})},cme=(r,e)=>(zr("replaceXRanges",r,e),r.split(/\s+/).map(t=>hme(t,e)).join(" ")),hme=(r,e)=>{r=r.trim();let t=e.loose?ji[ki.XRANGELOOSE]:ji[ki.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{zr("xRange",r,i,n,s,o,a,l);let c=on(s),u=c||on(o),g=u||on(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),zr("xRange return",i),i})},ume=(r,e)=>(zr("replaceStars",r,e),r.trim().replace(ji[ki.STAR],"")),nme=(r,e)=>(zr("replaceGTE0",r,e),r.trim().replace(ji[e.includePrerelease?ki.GTE0PRE:ki.GTE0],"")),sme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(on(i)?t="":on(n)?t=`>=${i}.0.0${r?"-0":""}`:on(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,on(c)?l="":on(u)?l=`<${+c+1}.0.0-0`:on(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),ome=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Sp=w((XZe,Y2)=>{var vp=Symbol("SemVer ANY"),xp=class{static get ANY(){return vp}constructor(e,t){if(t=pme(t),e instanceof xp){if(e.loose===!!t.loose)return e;e=e.value}pS("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===vp?this.value="":this.value=this.operator+this.semver.version,pS("comp",this)}parse(e){let t=this.options.loose?q2[J2.COMPARATORLOOSE]:q2[J2.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new W2(i[2],this.options.loose):this.semver=vp}toString(){return this.value}test(e){if(pS("Comparator.test",e,this.options.loose),this.semver===vp||e===vp)return!0;if(typeof e=="string")try{e=new W2(e,this.options)}catch(t){return!1}return hS(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof xp))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new z2(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new z2(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=hS(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=hS(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};Y2.exports=xp;var pme=Ip(),{re:q2,t:J2}=bc(),hS=cS(),pS=Ep(),W2=Hi(),z2=Qs()});var kp=w((ZZe,_2)=>{var dme=Qs(),Cme=(r,e,t)=>{try{e=new dme(e,t)}catch(i){return!1}return e.test(r)};_2.exports=Cme});var X2=w(($Ze,V2)=>{var mme=Qs(),Eme=(r,e)=>new mme(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));V2.exports=Eme});var $2=w((e$e,Z2)=>{var Ime=Hi(),yme=Qs(),wme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new yme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Ime(i,t))}),i};Z2.exports=wme});var tH=w((t$e,eH)=>{var Bme=Hi(),bme=Qs(),Qme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new bme(e,t)}catch(o){return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Bme(i,t))}),i};eH.exports=Qme});var nH=w((r$e,rH)=>{var dS=Hi(),Sme=Qs(),iH=wp(),vme=(r,e)=>{r=new Sme(r,e);let t=new dS("0.0.0");if(r.test(t)||(t=new dS("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new dS(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||iH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||iH(t,s))&&(t=s)}return t&&r.test(t)?t:null};rH.exports=vme});var oH=w((i$e,sH)=>{var xme=Qs(),kme=(r,e)=>{try{return new xme(r,e).range||"*"}catch(t){return null}};sH.exports=kme});var RI=w((n$e,aH)=>{var Pme=Hi(),AH=Sp(),{ANY:Dme}=AH,Rme=Qs(),Fme=kp(),lH=wp(),cH=SI(),Nme=xI(),Lme=vI(),Tme=(r,e,t,i)=>{r=new Pme(r,i),e=new Rme(e,i);let n,s,o,a,l;switch(t){case">":n=lH,s=Nme,o=cH,a=">",l=">=";break;case"<":n=cH,s=Lme,o=lH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Fme(r,e,i))return!1;for(let c=0;c{h.semver===Dme&&(h=new AH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};aH.exports=Tme});var gH=w((s$e,uH)=>{var Ome=RI(),Mme=(r,e,t)=>Ome(r,e,">",t);uH.exports=Mme});var hH=w((o$e,fH)=>{var Kme=RI(),Ume=(r,e,t)=>Kme(r,e,"<",t);fH.exports=Ume});var CH=w((a$e,pH)=>{var dH=Qs(),Hme=(r,e,t)=>(r=new dH(r,t),e=new dH(e,t),r.intersects(e));pH.exports=Hme});var EH=w((A$e,mH)=>{var jme=kp(),Gme=bs();mH.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>Gme(u,g,t));for(let u of o)jme(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var yH=Qs(),FI=Sp(),{ANY:CS}=FI,Pp=kp(),mS=bs(),qme=(r,e,t={})=>{if(r===e)return!0;r=new yH(r,t),e=new yH(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=Yme(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},Yme=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===CS){if(e.length===1&&e[0].semver===CS)return!0;t.includePrerelease?r=[new FI(">=0.0.0-0")]:r=[new FI(">=0.0.0")]}if(e.length===1&&e[0].semver===CS){if(t.includePrerelease)return!0;e=[new FI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=wH(n,h,t):h.operator==="<"||h.operator==="<="?s=BH(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=mS(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Pp(h,String(n),t)||s&&!Pp(h,String(s),t))return null;for(let p of e)if(!Pp(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=wH(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!Pp(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=BH(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Pp(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},wH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},BH=(r,e,t)=>{if(!r)return e;let i=mS(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};IH.exports=qme});var ri=w((c$e,QH)=>{var ES=bc();QH.exports={re:ES.re,src:ES.src,tokens:ES.t,SEMVER_SPEC_VERSION:mp().SEMVER_SPEC_VERSION,SemVer:Hi(),compareIdentifiers:yI().compareIdentifiers,rcompareIdentifiers:yI().rcompareIdentifiers,parse:Qc(),valid:WU(),clean:_U(),inc:XU(),diff:i2(),major:s2(),minor:a2(),patch:l2(),prerelease:u2(),compare:bs(),rcompare:f2(),compareLoose:p2(),compareBuild:QI(),sort:E2(),rsort:y2(),gt:wp(),lt:SI(),eq:bI(),neq:lS(),gte:vI(),lte:xI(),cmp:cS(),coerce:k2(),Comparator:Sp(),Range:Qs(),satisfies:kp(),toComparators:X2(),maxSatisfying:$2(),minSatisfying:tH(),minVersion:nH(),validRange:oH(),outside:RI(),gtr:gH(),ltr:hH(),intersects:CH(),simplifyRange:EH(),subset:bH()}});var IS=w(NI=>{"use strict";Object.defineProperty(NI,"__esModule",{value:!0});NI.VERSION=void 0;NI.VERSION="9.1.0"});var Yt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof LI=="object"&&LI.exports?LI.exports=e():r.regexpToAst=e()})(typeof self!="undefined"?self:SH,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var m=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:m,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],m=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(m)}},r.prototype.alternative=function(){for(var p=[],m=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(m)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var m;switch(this.popChar()){case"=":m="Lookahead";break;case"!":m="NegativeLookahead";break}a(m);var y=this.disjunction();return this.consumeChar(")"),{type:m,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var m,y=this.idx;switch(this.popChar()){case"*":m={atLeast:0,atMost:Infinity};break;case"+":m={atLeast:1,atMost:Infinity};break;case"?":m={atLeast:0,atMost:1};break;case"{":var b=this.integerIncludingZero();switch(this.popChar()){case"}":m={atLeast:b,atMost:b};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),m={atLeast:b,atMost:v}):m={atLeast:b,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&m===void 0)return;a(m);break}if(!(p===!0&&m===void 0))return a(m),this.peekChar(0)==="?"?(this.consumeChar("?"),m.greedy=!1):m.greedy=!0,m.type="Quantifier",m.loc=this.loc(y),m},r.prototype.atom=function(){var p,m=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(m),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,m=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,m=!0;break;case"s":p=f;break;case"S":p=f,m=!0;break;case"w":p=g;break;case"W":p=g,m=!0;break}return a(p),{type:"Set",value:p,complement:m}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var m=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:m}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],m=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),m=!0);this.isClassAtom();){var y=this.classAtom(),b=y.type==="Character";if(b&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),x=v.type==="Character";if(x){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,m){p.length!==void 0?p.forEach(function(y){m.push(y)}):m.push(p)}function o(p,m){if(p[m]===!0)throw"duplicate flag "+m;p[m]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var m in p){var y=p[m];p.hasOwnProperty(m)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(b){this.visit(b)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var MI=w(dg=>{"use strict";Object.defineProperty(dg,"__esModule",{value:!0});dg.clearRegExpParserCache=dg.getRegExpAst=void 0;var Jme=TI(),OI={},Wme=new Jme.RegExpParser;function zme(r){var e=r.toString();if(OI.hasOwnProperty(e))return OI[e];var t=Wme.pattern(e);return OI[e]=t,t}dg.getRegExpAst=zme;function _me(){OI={}}dg.clearRegExpParserCache=_me});var DH=w(Bn=>{"use strict";var Vme=Bn&&Bn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Bn,"__esModule",{value:!0});Bn.canMatchCharCode=Bn.firstCharOptimizedIndices=Bn.getOptimizedStartCodesIndices=Bn.failedOptimizationPrefixMsg=void 0;var vH=TI(),Ss=Yt(),xH=MI(),ja=yS(),kH="Complement Sets are not supported for first char optimization";Bn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function Xme(r,e){e===void 0&&(e=!1);try{var t=(0,xH.getRegExpAst)(r),i=KI(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===kH)e&&(0,Ss.PRINT_WARNING)(""+Bn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,Ss.PRINT_ERROR)(Bn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+r.toString()+` > -`)+(" Using the regexp-to-ast library version: "+vH.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}Bn.getOptimizedStartCodesIndices=Xme;function KI(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=ja.minOptimizationVal)for(var f=u.from>=ja.minOptimizationVal?u.from:ja.minOptimizationVal,h=u.to,p=(0,ja.charCodeToOptimizedIndex)(f),m=(0,ja.charCodeToOptimizedIndex)(h),y=p;y<=m;y++)e[y]=y}}});break;case"Group":KI(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&wS(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,Ss.values)(e)}Bn.firstCharOptimizedIndices=KI;function UI(r,e,t){var i=(0,ja.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&Zme(r,e)}function Zme(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,ja.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,ja.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function PH(r,e){return(0,Ss.find)(r.value,function(t){if(typeof t=="number")return(0,Ss.contains)(e,t);var i=t;return(0,Ss.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function wS(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,Ss.isArray)(r.value)?(0,Ss.every)(r.value,wS):wS(r.value):!1}var $me=function(r){Vme(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,Ss.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?PH(t,this.targetCharCodes)===void 0&&(this.found=!0):PH(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(vH.BaseRegExpVisitor);function eEe(r,e){if(e instanceof RegExp){var t=(0,xH.getRegExpAst)(e),i=new $me(r);return i.visit(t),i.found}else return(0,Ss.find)(e,function(n){return(0,Ss.contains)(r,n.charCodeAt(0))})!==void 0}Bn.canMatchCharCode=eEe});var yS=w(Ze=>{"use strict";var RH=Ze&&Ze.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ze,"__esModule",{value:!0});Ze.charCodeToOptimizedIndex=Ze.minOptimizationVal=Ze.buildLineBreakIssueMessage=Ze.LineTerminatorOptimizedTester=Ze.isShortPattern=Ze.isCustomPattern=Ze.cloneEmptyGroups=Ze.performWarningRuntimeChecks=Ze.performRuntimeChecks=Ze.addStickyFlag=Ze.addStartOfInput=Ze.findUnreachablePatterns=Ze.findModesThatDoNotExist=Ze.findInvalidGroupType=Ze.findDuplicatePatterns=Ze.findUnsupportedFlags=Ze.findStartOfInputAnchor=Ze.findEmptyMatchRegExps=Ze.findEndOfInputAnchor=Ze.findInvalidPatterns=Ze.findMissingPatterns=Ze.validatePatterns=Ze.analyzeTokenTypes=Ze.enableSticky=Ze.disableSticky=Ze.SUPPORT_STICKY=Ze.MODES=Ze.DEFAULT_MODE=void 0;var FH=TI(),Ar=Dp(),Ne=Yt(),Cg=DH(),NH=MI(),Mo="PATTERN";Ze.DEFAULT_MODE="defaultMode";Ze.MODES="modes";Ze.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function tEe(){Ze.SUPPORT_STICKY=!1}Ze.disableSticky=tEe;function rEe(){Ze.SUPPORT_STICKY=!0}Ze.enableSticky=rEe;function nEe(r,e){e=(0,Ne.defaults)(e,{useSticky:Ze.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(v,x){return x()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){iEe()});var i;t("Reject Lexer.NA",function(){i=(0,Ne.reject)(r,function(v){return v[Mo]===Ar.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,Ne.map)(i,function(v){var x=v[Mo];if((0,Ne.isRegExp)(x)){var T=x.source;return T.length===1&&T!=="^"&&T!=="$"&&T!=="."&&!x.ignoreCase?T:T.length===2&&T[0]==="\\"&&!(0,Ne.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],T[1])?T[1]:e.useSticky?bS(x):BS(x)}else{if((0,Ne.isFunction)(x))return n=!0,{exec:x};if((0,Ne.has)(x,"exec"))return n=!0,x;if(typeof x=="string"){if(x.length===1)return x;var q=x.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),Y=new RegExp(q);return e.useSticky?bS(Y):BS(Y)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,Ne.map)(i,function(v){return v.tokenTypeIdx}),a=(0,Ne.map)(i,function(v){var x=v.GROUP;if(x!==Ar.Lexer.SKIPPED){if((0,Ne.isString)(x))return x;if((0,Ne.isUndefined)(x))return!1;throw Error("non exhaustive match")}}),l=(0,Ne.map)(i,function(v){var x=v.LONGER_ALT;if(x){var T=(0,Ne.isArray)(x)?(0,Ne.map)(x,function(q){return(0,Ne.indexOf)(i,q)}):[(0,Ne.indexOf)(i,x)];return T}}),c=(0,Ne.map)(i,function(v){return v.PUSH_MODE}),u=(0,Ne.map)(i,function(v){return(0,Ne.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=OH(e.lineTerminatorCharacters);g=(0,Ne.map)(i,function(x){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ne.map)(i,function(x){if((0,Ne.has)(x,"LINE_BREAKS"))return x.LINE_BREAKS;if(TH(x,v)===!1)return(0,Cg.canMatchCharCode)(v,x.PATTERN)}))});var f,h,p,m;t("Misc Mapping #2",function(){f=(0,Ne.map)(i,QS),h=(0,Ne.map)(s,LH),p=(0,Ne.reduce)(i,function(v,x){var T=x.GROUP;return(0,Ne.isString)(T)&&T!==Ar.Lexer.SKIPPED&&(v[T]=[]),v},{}),m=(0,Ne.map)(s,function(v,x){return{pattern:s[x],longerAlt:l[x],canLineTerminator:g[x],isCustom:f[x],short:h[x],group:a[x],push:c[x],pop:u[x],tokenTypeIdx:o[x],tokenType:i[x]}})});var y=!0,b=[];return e.safeMode||t("First Char Optimization",function(){b=(0,Ne.reduce)(i,function(v,x,T){if(typeof x.PATTERN=="string"){var q=x.PATTERN.charCodeAt(0),Y=vS(q);SS(v,Y,m[T])}else if((0,Ne.isArray)(x.START_CHARS_HINT)){var $;(0,Ne.forEach)(x.START_CHARS_HINT,function(ne){var ee=typeof ne=="string"?ne.charCodeAt(0):ne,A=vS(ee);$!==A&&($=A,SS(v,A,m[T]))})}else if((0,Ne.isRegExp)(x.PATTERN))if(x.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" Unable to analyze < "+x.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var _=(0,Cg.getOptimizedStartCodesIndices)(x.PATTERN,e.ensureOptimizations);(0,Ne.isEmpty)(_)&&(y=!1),(0,Ne.forEach)(_,function(ne){SS(v,ne,m[T])})}else e.ensureOptimizations&&(0,Ne.PRINT_ERROR)(""+Cg.failedOptimizationPrefixMsg+(" TokenType: <"+x.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){b=(0,Ne.packArray)(b)}),{emptyGroups:p,patternIdxToConfig:m,charCodeToPatternIdxToConfig:b,hasCustom:n,canBeOptimized:y}}Ze.analyzeTokenTypes=nEe;function oEe(r,e){var t=[],i=MH(r);t=t.concat(i.errors);var n=KH(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(sEe(s)),t=t.concat(UH(s)),t=t.concat(HH(s,e)),t=t.concat(jH(s)),t}Ze.validatePatterns=oEe;function sEe(r){var e=[],t=(0,Ne.filter)(r,function(i){return(0,Ne.isRegExp)(i[Mo])});return e=e.concat(GH(t)),e=e.concat(qH(t)),e=e.concat(JH(t)),e=e.concat(WH(t)),e=e.concat(YH(t)),e}function MH(r){var e=(0,Ne.filter)(r,function(n){return!(0,Ne.has)(n,Mo)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:Ar.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findMissingPatterns=MH;function KH(r){var e=(0,Ne.filter)(r,function(n){var s=n[Mo];return!(0,Ne.isRegExp)(s)&&!(0,Ne.isFunction)(s)&&!(0,Ne.has)(s,"exec")&&!(0,Ne.isString)(s)}),t=(0,Ne.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Ar.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ne.difference)(r,e);return{errors:t,valid:i}}Ze.findInvalidPatterns=KH;var aEe=/[^\\][\$]/;function GH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return aEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findEndOfInputAnchor=GH;function YH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n.test("")}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:Ar.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ze.findEmptyMatchRegExps=YH;var AEe=/[^\\[][\^]|^\^/;function qH(r){var e=function(n){RH(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(FH.BaseRegExpVisitor),t=(0,Ne.filter)(r,function(n){var s=n[Mo];try{var o=(0,NH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return AEe.test(s.source)}}),i=(0,Ne.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Ar.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ze.findStartOfInputAnchor=qH;function JH(r){var e=(0,Ne.filter)(r,function(i){var n=i[Mo];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Ar.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ze.findUnsupportedFlags=JH;function WH(r){var e=[],t=(0,Ne.map)(r,function(s){return(0,Ne.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ne.contains)(e,a)&&a.PATTERN!==Ar.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,Ne.compact)(t);var i=(0,Ne.filter)(t,function(s){return s.length>1}),n=(0,Ne.map)(i,function(s){var o=(0,Ne.map)(s,function(l){return l.name}),a=(0,Ne.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:Ar.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ze.findDuplicatePatterns=WH;function UH(r){var e=(0,Ne.filter)(r,function(i){if(!(0,Ne.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==Ar.Lexer.SKIPPED&&n!==Ar.Lexer.NA&&!(0,Ne.isString)(n)}),t=(0,Ne.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Ar.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ze.findInvalidGroupType=UH;function HH(r,e){var t=(0,Ne.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,Ne.contains)(e,n.PUSH_MODE)}),i=(0,Ne.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:Ar.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ze.findModesThatDoNotExist=HH;function jH(r){var e=[],t=(0,Ne.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===Ar.Lexer.NA||((0,Ne.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ne.isRegExp)(o)&&cEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ne.forEach)(r,function(i,n){(0,Ne.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Ar.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ze.findUnreachablePatterns=jH;function lEe(r,e){if((0,Ne.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,Ne.isFunction)(e))return e(r,0,[],{});if((0,Ne.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function cEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ne.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function BS(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ze.addStartOfInput=BS;function bS(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ze.addStickyFlag=bS;function uEe(r,e,t){var i=[];return(0,Ne.has)(r,Ze.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.DEFAULT_MODE+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ne.has)(r,Ze.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ze.MODES+`> property in its definition -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.has)(r,Ze.DEFAULT_MODE)&&!(0,Ne.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ze.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist -`,type:Ar.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ne.has)(r,Ze.MODES)&&(0,Ne.forEach)(r.modes,function(n,s){(0,Ne.forEach)(n,function(o,a){(0,Ne.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:Ar.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ze.performRuntimeChecks=uEe;function gEe(r,e,t){var i=[],n=!1,s=(0,Ne.compact)((0,Ne.flatten)((0,Ne.mapValues)(r.modes,function(l){return l}))),o=(0,Ne.reject)(s,function(l){return l[Mo]===Ar.Lexer.NA}),a=OH(t);return e&&(0,Ne.forEach)(o,function(l){var c=TH(l,a);if(c!==!1){var u=zH(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ne.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Cg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:Ar.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ze.performWarningRuntimeChecks=gEe;function fEe(r){var e={},t=(0,Ne.keys)(r);return(0,Ne.forEach)(t,function(i){var n=r[i];if((0,Ne.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ze.cloneEmptyGroups=fEe;function QS(r){var e=r.PATTERN;if((0,Ne.isRegExp)(e))return!1;if((0,Ne.isFunction)(e))return!0;if((0,Ne.has)(e,"exec"))return!0;if((0,Ne.isString)(e))return!1;throw Error("non exhaustive match")}Ze.isCustomPattern=QS;function LH(r){return(0,Ne.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ze.isShortPattern=LH;Ze.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===Ar.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+r.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ze.buildLineBreakIssueMessage=zH;function OH(r){var e=(0,Ne.map)(r,function(t){return(0,Ne.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function SS(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ze.minOptimizationVal=256;var HI=[];function vS(r){return r255?255+~~(r/255):r}}});var mg=w(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});Ft.isTokenType=Ft.hasExtendingTokensTypesMapProperty=Ft.hasExtendingTokensTypesProperty=Ft.hasCategoriesProperty=Ft.hasShortKeyProperty=Ft.singleAssignCategoriesToksMap=Ft.assignCategoriesMapProp=Ft.assignCategoriesTokensProp=Ft.assignTokenDefaultProps=Ft.expandCategories=Ft.augmentTokenTypes=Ft.tokenIdxToClass=Ft.tokenShortNameIdx=Ft.tokenStructuredMatcherNoCategories=Ft.tokenStructuredMatcher=void 0;var ii=Yt();function hEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Ft.tokenStructuredMatcher=hEe;function pEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Ft.tokenStructuredMatcherNoCategories=pEe;Ft.tokenShortNameIdx=1;Ft.tokenIdxToClass={};function dEe(r){var e=_H(r);VH(e),ZH(e),XH(e),(0,ii.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Ft.augmentTokenTypes=dEe;function _H(r){for(var e=(0,ii.cloneArr)(r),t=r,i=!0;i;){t=(0,ii.compact)((0,ii.flatten)((0,ii.map)(t,function(s){return s.CATEGORIES})));var n=(0,ii.difference)(t,e);e=e.concat(n),(0,ii.isEmpty)(n)?i=!1:t=n}return e}Ft.expandCategories=_H;function VH(r){(0,ii.forEach)(r,function(e){$H(e)||(Ft.tokenIdxToClass[Ft.tokenShortNameIdx]=e,e.tokenTypeIdx=Ft.tokenShortNameIdx++),xS(e)&&!(0,ii.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),xS(e)||(e.CATEGORIES=[]),ej(e)||(e.categoryMatches=[]),tj(e)||(e.categoryMatchesMap={})})}Ft.assignTokenDefaultProps=VH;function XH(r){(0,ii.forEach)(r,function(e){e.categoryMatches=[],(0,ii.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Ft.tokenIdxToClass[i].tokenTypeIdx)})})}Ft.assignCategoriesTokensProp=XH;function ZH(r){(0,ii.forEach)(r,function(e){kS([],e)})}Ft.assignCategoriesMapProp=ZH;function kS(r,e){(0,ii.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,ii.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,ii.contains)(i,t)||kS(i,t)})}Ft.singleAssignCategoriesToksMap=kS;function $H(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.hasShortKeyProperty=$H;function xS(r){return(0,ii.has)(r,"CATEGORIES")}Ft.hasCategoriesProperty=xS;function ej(r){return(0,ii.has)(r,"categoryMatches")}Ft.hasExtendingTokensTypesProperty=ej;function tj(r){return(0,ii.has)(r,"categoryMatchesMap")}Ft.hasExtendingTokensTypesMapProperty=tj;function CEe(r){return(0,ii.has)(r,"tokenTypeIdx")}Ft.isTokenType=CEe});var PS=w(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.defaultLexerErrorProvider=void 0;jI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var Dp=w(kc=>{"use strict";Object.defineProperty(kc,"__esModule",{value:!0});kc.Lexer=kc.LexerDefinitionErrorType=void 0;var ao=yS(),lr=Yt(),mEe=mg(),EEe=PS(),IEe=MI(),yEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(yEe=kc.LexerDefinitionErrorType||(kc.LexerDefinitionErrorType={}));var Rp={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:EEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Rp);var wEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Rp),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,lr.merge)(Rp,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===Rp.lineTerminatorsPattern)i.config.lineTerminatorsPattern=ao.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Rp.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,lr.isArray)(e)?(s={modes:{}},s.modes[ao.DEFAULT_MODE]=(0,lr.cloneArr)(e),s[ao.DEFAULT_MODE]=ao.DEFAULT_MODE):(o=!1,s=(0,lr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,ao.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,lr.forEach)(s.modes,function(u,g){s.modes[g]=(0,lr.reject)(u,function(f){return(0,lr.isUndefined)(f)})});var a=(0,lr.keys)(s.modes);if((0,lr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,ao.validatePatterns)(u,a))}),(0,lr.isEmpty)(i.lexerDefinitionErrors)){(0,mEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,ao.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,lr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,lr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,lr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,lr.forEach)(i.lexerDefinitionWarning,function(u){(0,lr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(ao.SUPPORT_STICKY?(i.chopInput=lr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=lr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=lr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=lr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=lr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,lr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,lr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,IEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,lr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,lr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,lr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,m,y,b,v,x,T=e,q=T.length,Y=0,$=0,_=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(_),ee=[],A=this.trackStartLines?1:void 0,oe=this.trackStartLines?1:void 0,ce=(0,ao.cloneEmptyGroups)(this.emptyGroups),Z=this.trackStartLines,O=this.config.lineTerminatorsPattern,L=0,de=[],Be=[],je=[],re=[];Object.freeze(re);var se=void 0;function be(){return de}function he(Sr){var jn=(0,ao.charCodeToOptimizedIndex)(Sr),fs=Be[jn];return fs===void 0?re:fs}var Fe=function(Sr){if(je.length===1&&Sr.tokenType.PUSH_MODE===void 0){var jn=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Sr);ee.push({offset:Sr.startOffset,line:Sr.startLine!==void 0?Sr.startLine:void 0,column:Sr.startColumn!==void 0?Sr.startColumn:void 0,length:Sr.image.length,message:jn})}else{je.pop();var fs=(0,lr.last)(je);de=i.patternIdxToConfig[fs],Be=i.charCodeToPatternIdxToConfig[fs],L=de.length;var ba=i.canModeBeOptimized[fs]&&i.config.safeMode===!1;Be&&ba?se=he:se=be}};function Ke(Sr){je.push(Sr),Be=this.charCodeToPatternIdxToConfig[Sr],de=this.patternIdxToConfig[Sr],L=de.length,L=de.length;var jn=this.canModeBeOptimized[Sr]&&this.config.safeMode===!1;Be&&jn?se=he:se=be}Ke.call(this,t);for(var ke;Yc.length){c=a,u=g,ke=gt;break}}}break}}if(c!==null){if(f=c.length,h=ke.group,h!==void 0&&(p=ke.tokenTypeIdx,m=this.createTokenInstance(c,Y,p,ke.tokenType,A,oe,f),this.handlePayload(m,u),h===!1?$=this.addToken(ne,$,m):ce[h].push(m)),e=this.chopInput(e,f),Y=Y+f,oe=this.computeNewColumn(oe,f),Z===!0&&ke.canLineTerminator===!0){var Mt=0,Ei=void 0,jt=void 0;O.lastIndex=0;do Ei=O.test(c),Ei===!0&&(jt=O.lastIndex-1,Mt++);while(Ei===!0);Mt!==0&&(A=A+Mt,oe=f-jt,this.updateTokenEndLineColumnLocation(m,h,jt,Mt,A,oe,f))}this.handleModes(ke,Fe,Ke,m)}else{for(var Qr=Y,Oi=A,Xs=oe,Un=!1;!Un&&Y <"+e+">");var n=(0,lr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();kc.Lexer=wEe});var XA=w(Pi=>{"use strict";Object.defineProperty(Pi,"__esModule",{value:!0});Pi.tokenMatcher=Pi.createTokenInstance=Pi.EOF=Pi.createToken=Pi.hasTokenLabel=Pi.tokenName=Pi.tokenLabel=void 0;var Ao=Yt(),BEe=Dp(),DS=mg();function bEe(r){return rj(r)?r.LABEL:r.name}Pi.tokenLabel=bEe;function QEe(r){return r.name}Pi.tokenName=QEe;function rj(r){return(0,Ao.isString)(r.LABEL)&&r.LABEL!==""}Pi.hasTokenLabel=rj;var SEe="parent",ij="categories",nj="label",sj="group",oj="push_mode",aj="pop_mode",Aj="longer_alt",lj="line_breaks",cj="start_chars_hint";function uj(r){return vEe(r)}Pi.createToken=uj;function vEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Ao.isUndefined)(e)||(t.PATTERN=e),(0,Ao.has)(r,SEe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ao.has)(r,ij)&&(t.CATEGORIES=r[ij]),(0,DS.augmentTokenTypes)([t]),(0,Ao.has)(r,nj)&&(t.LABEL=r[nj]),(0,Ao.has)(r,sj)&&(t.GROUP=r[sj]),(0,Ao.has)(r,aj)&&(t.POP_MODE=r[aj]),(0,Ao.has)(r,oj)&&(t.PUSH_MODE=r[oj]),(0,Ao.has)(r,Aj)&&(t.LONGER_ALT=r[Aj]),(0,Ao.has)(r,lj)&&(t.LINE_BREAKS=r[lj]),(0,Ao.has)(r,cj)&&(t.START_CHARS_HINT=r[cj]),t}Pi.EOF=uj({name:"EOF",pattern:BEe.Lexer.NA});(0,DS.augmentTokenTypes)([Pi.EOF]);function xEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}Pi.createTokenInstance=xEe;function kEe(r,e){return(0,DS.tokenStructuredMatcher)(r,e)}Pi.tokenMatcher=kEe});var bn=w(Vt=>{"use strict";var Ga=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.serializeProduction=Vt.serializeGrammar=Vt.Terminal=Vt.Alternation=Vt.RepetitionWithSeparator=Vt.Repetition=Vt.RepetitionMandatoryWithSeparator=Vt.RepetitionMandatory=Vt.Option=Vt.Alternative=Vt.Rule=Vt.NonTerminal=Vt.AbstractProduction=void 0;var fr=Yt(),PEe=XA(),Ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,fr.forEach)(this.definition,function(t){t.accept(e)})},r}();Vt.AbstractProduction=Ko;var gj=function(r){Ga(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(Ko);Vt.NonTerminal=gj;var fj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Rule=fj;var hj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Alternative=hj;var pj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Option=pj;var dj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatory=dj;var Cj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionMandatoryWithSeparator=Cj;var mj=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.Repetition=mj;var Ej=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return e}(Ko);Vt.RepetitionWithSeparator=Ej;var Ij=function(r){Ga(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,fr.assign)(i,(0,fr.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(Ko);Vt.Alternation=Ij;var GI=function(){function r(e){this.idx=1,(0,fr.assign)(this,(0,fr.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();Vt.Terminal=GI;function DEe(r){return(0,fr.map)(r,Fp)}Vt.serializeGrammar=DEe;function Fp(r){function e(s){return(0,fr.map)(s,Fp)}if(r instanceof gj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,fr.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof hj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof pj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof dj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Cj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Ej)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Fp(new GI({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof mj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Ij)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof GI){var i={type:"Terminal",name:r.terminalType.name,label:(0,PEe.tokenLabel)(r.terminalType),idx:r.idx};(0,fr.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,fr.isRegExp)(n)?n.source:n),i}else{if(r instanceof fj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}Vt.serializeProduction=Fp});var qI=w(YI=>{"use strict";Object.defineProperty(YI,"__esModule",{value:!0});YI.RestWalker=void 0;var RS=Yt(),Qn=bn(),REe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,RS.forEach)(e.definition,function(n,s){var o=(0,RS.drop)(e.definition,s+1);if(n instanceof Qn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Qn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Qn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Qn.Option)i.walkOption(n,o,t);else if(n instanceof Qn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Qn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Qn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Qn.Repetition)i.walkMany(n,o,t);else if(n instanceof Qn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Qn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=yj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,RS.forEach)(e.definition,function(o){var a=new Qn.Alternative({definition:[o]});n.walk(a,s)})},r}();YI.RestWalker=REe;function yj(r,e,t){var i=[new Qn.Option({definition:[new Qn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Eg=w(JI=>{"use strict";Object.defineProperty(JI,"__esModule",{value:!0});JI.GAstVisitor=void 0;var Uo=bn(),FEe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Uo.NonTerminal:return this.visitNonTerminal(t);case Uo.Alternative:return this.visitAlternative(t);case Uo.Option:return this.visitOption(t);case Uo.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Uo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Uo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Uo.Repetition:return this.visitRepetition(t);case Uo.Alternation:return this.visitAlternation(t);case Uo.Terminal:return this.visitTerminal(t);case Uo.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();JI.GAstVisitor=FEe});var Lp=w(Gi=>{"use strict";var NEe=Gi&&Gi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Gi,"__esModule",{value:!0});Gi.collectMethods=Gi.DslMethodsCollectorVisitor=Gi.getProductionDslName=Gi.isBranchingProd=Gi.isOptionalProd=Gi.isSequenceProd=void 0;var Np=Yt(),xr=bn(),LEe=Eg();function TEe(r){return r instanceof xr.Alternative||r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionMandatory||r instanceof xr.RepetitionMandatoryWithSeparator||r instanceof xr.RepetitionWithSeparator||r instanceof xr.Terminal||r instanceof xr.Rule}Gi.isSequenceProd=TEe;function FS(r,e){e===void 0&&(e=[]);var t=r instanceof xr.Option||r instanceof xr.Repetition||r instanceof xr.RepetitionWithSeparator;return t?!0:r instanceof xr.Alternation?(0,Np.some)(r.definition,function(i){return FS(i,e)}):r instanceof xr.NonTerminal&&(0,Np.contains)(e,r)?!1:r instanceof xr.AbstractProduction?(r instanceof xr.NonTerminal&&e.push(r),(0,Np.every)(r.definition,function(i){return FS(i,e)})):!1}Gi.isOptionalProd=FS;function OEe(r){return r instanceof xr.Alternation}Gi.isBranchingProd=OEe;function MEe(r){if(r instanceof xr.NonTerminal)return"SUBRULE";if(r instanceof xr.Option)return"OPTION";if(r instanceof xr.Alternation)return"OR";if(r instanceof xr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof xr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof xr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof xr.Repetition)return"MANY";if(r instanceof xr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Gi.getProductionDslName=MEe;var wj=function(r){NEe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Np.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(LEe.GAstVisitor);Gi.DslMethodsCollectorVisitor=wj;var WI=new wj;function KEe(r){WI.reset(),r.accept(WI);var e=WI.dslMethods;return WI.reset(),e}Gi.collectMethods=KEe});var LS=w(Ho=>{"use strict";Object.defineProperty(Ho,"__esModule",{value:!0});Ho.firstForTerminal=Ho.firstForBranching=Ho.firstForSequence=Ho.first=void 0;var zI=Yt(),Bj=bn(),NS=Lp();function _I(r){if(r instanceof Bj.NonTerminal)return _I(r.referencedRule);if(r instanceof Bj.Terminal)return Sj(r);if((0,NS.isSequenceProd)(r))return bj(r);if((0,NS.isBranchingProd)(r))return Qj(r);throw Error("non exhaustive match")}Ho.first=_I;function bj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,NS.isOptionalProd)(s),e=e.concat(_I(s)),i=i+1,n=t.length>i;return(0,zI.uniq)(e)}Ho.firstForSequence=bj;function Qj(r){var e=(0,zI.map)(r.definition,function(t){return _I(t)});return(0,zI.uniq)((0,zI.flatten)(e))}Ho.firstForBranching=Qj;function Sj(r){return[r.terminalType]}Ho.firstForTerminal=Sj});var TS=w(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});VI.IN=void 0;VI.IN="_~IN~_"});var Dj=w(vs=>{"use strict";var UEe=vs&&vs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(vs,"__esModule",{value:!0});vs.buildInProdFollowPrefix=vs.buildBetweenProdsFollowPrefix=vs.computeAllProdsFollows=vs.ResyncFollowsWalker=void 0;var HEe=qI(),jEe=LS(),vj=Yt(),xj=TS(),GEe=bn(),Pj=function(r){UEe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=kj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new GEe.Alternative({definition:o}),l=(0,jEe.first)(a);this.follows[s]=l},e}(HEe.RestWalker);vs.ResyncFollowsWalker=Pj;function YEe(r){var e={};return(0,vj.forEach)(r,function(t){var i=new Pj(t).startWalking();(0,vj.assign)(e,i)}),e}vs.computeAllProdsFollows=YEe;function kj(r,e){return r.name+e+xj.IN}vs.buildBetweenProdsFollowPrefix=kj;function qEe(r){var e=r.terminalType.name;return e+r.idx+xj.IN}vs.buildInProdFollowPrefix=qEe});var Tp=w(Ya=>{"use strict";Object.defineProperty(Ya,"__esModule",{value:!0});Ya.defaultGrammarValidatorErrorProvider=Ya.defaultGrammarResolverErrorProvider=Ya.defaultParserErrorProvider=void 0;var Ig=XA(),JEe=Yt(),lo=Yt(),OS=bn(),Rj=Lp();Ya.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,Ig.hasTokenLabel)(e),o=s?"--> "+(0,Ig.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,lo.first)(t).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,lo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,lo.map)(c,function(h){return"["+(0,lo.map)(h,function(p){return(0,Ig.tokenLabel)(p)}).join(", ")+"]"}),g=(0,lo.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,lo.first)(t).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,lo.map)(e,function(u){return"["+(0,lo.map)(u,function(g){return(0,Ig.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(Ya.defaultParserErrorProvider);Ya.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+r.name+"<-";return t}};Ya.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof OS.Terminal?u.terminalType.name:u instanceof OS.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,lo.first)(e),s=n.idx,o=(0,Rj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,lo.map)(r.prefixPath,function(n){return(0,Ig.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Rj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+r.topLevelRule.name+`> Rule. - has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=JEe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof OS.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var Lj=w(ZA=>{"use strict";var WEe=ZA&&ZA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(ZA,"__esModule",{value:!0});ZA.GastRefResolverVisitor=ZA.resolveGrammar=void 0;var zEe=$n(),Fj=Yt(),_Ee=Eg();function VEe(r,e){var t=new Nj(r,e);return t.resolveRefs(),t.errors}ZA.resolveGrammar=VEe;var Nj=function(r){WEe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Fj.forEach)((0,Fj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:zEe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(_Ee.GAstVisitor);ZA.GastRefResolverVisitor=Nj});var Mp=w(Kr=>{"use strict";var Pc=Kr&&Kr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Kr,"__esModule",{value:!0});Kr.nextPossibleTokensAfter=Kr.possiblePathsFrom=Kr.NextTerminalAfterAtLeastOneSepWalker=Kr.NextTerminalAfterAtLeastOneWalker=Kr.NextTerminalAfterManySepWalker=Kr.NextTerminalAfterManyWalker=Kr.AbstractNextTerminalAfterProductionWalker=Kr.NextAfterTokenWalker=Kr.AbstractNextPossibleTokensWalker=void 0;var Tj=qI(),Kt=Yt(),XEe=LS(),Dt=bn(),Oj=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Tj.RestWalker);Kr.AbstractNextPossibleTokensWalker=Oj;var ZEe=function(r){Pc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new Dt.Alternative({definition:s});this.possibleTokTypes=(0,XEe.first)(o),this.found=!0}},e}(Oj);Kr.NextAfterTokenWalker=ZEe;var Op=function(r){Pc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Tj.RestWalker);Kr.AbstractNextTerminalAfterProductionWalker=Op;var $Ee=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManyWalker=$Ee;var eIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterManySepWalker=eIe;var tIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneWalker=tIe;var rIe=function(r){Pc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof Dt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Op);Kr.NextTerminalAfterAtLeastOneSepWalker=rIe;function Mj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Mj(s(c),e,t);return i.concat(u)}for(;t.length=0;ce--){var Z=b.definition[ce],O={idx:p,def:Z.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y};g.push(O),g.push(o)}else if(b instanceof Dt.Alternative)g.push({idx:p,def:b.definition.concat((0,Kt.drop)(h)),ruleStack:m,occurrenceStack:y});else if(b instanceof Dt.Rule)g.push(iIe(b,p,m,y));else throw Error("non exhaustive match")}}return u}Kr.nextPossibleTokensAfter=nIe;function iIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Kp=w(tr=>{"use strict";var Kj=tr&&tr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(tr,"__esModule",{value:!0});tr.areTokenCategoriesNotUsed=tr.isStrictPrefixOfPath=tr.containsPath=tr.getLookaheadPathsForOptionalProd=tr.getLookaheadPathsForOr=tr.lookAheadSequenceFromAlternatives=tr.buildSingleAlternativeLookaheadFunction=tr.buildAlternativesLookAheadFunc=tr.buildLookaheadFuncForOptionalProd=tr.buildLookaheadFuncForOr=tr.getProdType=tr.PROD_TYPE=void 0;var cr=Yt(),Uj=Mp(),sIe=qI(),XI=mg(),$A=bn(),oIe=Eg(),ui;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(ui=tr.PROD_TYPE||(tr.PROD_TYPE={}));function aIe(r){if(r instanceof $A.Option)return ui.OPTION;if(r instanceof $A.Repetition)return ui.REPETITION;if(r instanceof $A.RepetitionMandatory)return ui.REPETITION_MANDATORY;if(r instanceof $A.RepetitionMandatoryWithSeparator)return ui.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof $A.RepetitionWithSeparator)return ui.REPETITION_WITH_SEPARATOR;if(r instanceof $A.Alternation)return ui.ALTERNATION;throw Error("non exhaustive match")}tr.getProdType=aIe;function AIe(r,e,t,i,n,s){var o=Hj(r,e,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o,i,a,n)}tr.buildLookaheadFuncForOr=AIe;function lIe(r,e,t,i,n,s){var o=jj(r,e,n,t),a=MS(o)?XI.tokenStructuredMatcherNoCategories:XI.tokenStructuredMatcher;return s(o[0],a,i)}tr.buildLookaheadFuncForOptionalProd=lIe;function cIe(r,e,t,i){var n=r.length,s=(0,cr.every)(r,function(l){return(0,cr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,cr.map)(l,function(x){return x.GATE}),u=0;u{"use strict";var HS=Xt&&Xt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Xt,"__esModule",{value:!0});Xt.checkPrefixAlternativesAmbiguities=Xt.validateSomeNonEmptyLookaheadPath=Xt.validateTooManyAlts=Xt.RepetionCollector=Xt.validateAmbiguousAlternationAlternatives=Xt.validateEmptyOrAlternative=Xt.getFirstNoneTerminal=Xt.validateNoLeftRecursion=Xt.validateRuleIsOverridden=Xt.validateRuleDoesNotAlreadyExist=Xt.OccurrenceValidationCollector=Xt.identifyProductionForDuplicates=Xt.validateGrammar=void 0;var nr=Yt(),kr=Yt(),jo=$n(),jS=Lp(),yg=Kp(),pIe=Mp(),co=bn(),GS=Eg();function mIe(r,e,t,i,n){var s=nr.map(r,function(h){return dIe(h,i)}),o=nr.map(r,function(h){return YS(h,h,i)}),a=[],l=[],c=[];(0,kr.every)(o,kr.isEmpty)&&(a=(0,kr.map)(r,function(h){return Wj(h,i)}),l=(0,kr.map)(r,function(h){return zj(h,e,i)}),c=Vj(r,e,i));var u=CIe(r,t,i),g=(0,kr.map)(r,function(h){return _j(h,i)}),f=(0,kr.map)(r,function(h){return Jj(h,r,n,i)});return nr.flatten(s.concat(c,o,a,l,u,g,f))}Xt.validateGrammar=mIe;function dIe(r,e){var t=new $j;r.accept(t);var i=t.allProductions,n=nr.groupBy(i,Xj),s=nr.pick(n,function(a){return a.length>1}),o=nr.map(nr.values(s),function(a){var l=nr.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,jS.getProductionDslName)(l),g={message:c,type:jo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=Zj(l);return f&&(g.parameter=f),g});return o}function Xj(r){return(0,jS.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+Zj(r)}Xt.identifyProductionForDuplicates=Xj;function Zj(r){return r instanceof co.Terminal?r.terminalType.name:r instanceof co.NonTerminal?r.nonTerminalName:""}var $j=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.OccurrenceValidationCollector=$j;function Jj(r,e,t,i){var n=[],s=(0,kr.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:jo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Xt.validateRuleDoesNotAlreadyExist=Jj;function EIe(r,e,t){var i=[],n;return nr.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:jo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Xt.validateRuleIsOverridden=EIe;function YS(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Up(e.definition);if(nr.isEmpty(s))return[];var o=r.name,a=nr.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:jo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=nr.difference(s,i.concat([r])),c=nr.map(l,function(u){var g=nr.cloneArr(i);return g.push(u),YS(r,u,t,g)});return n.concat(nr.flatten(c))}Xt.validateNoLeftRecursion=YS;function Up(r){var e=[];if(nr.isEmpty(r))return e;var t=nr.first(r);if(t instanceof co.NonTerminal)e.push(t.referencedRule);else if(t instanceof co.Alternative||t instanceof co.Option||t instanceof co.RepetitionMandatory||t instanceof co.RepetitionMandatoryWithSeparator||t instanceof co.RepetitionWithSeparator||t instanceof co.Repetition)e=e.concat(Up(t.definition));else if(t instanceof co.Alternation)e=nr.flatten(nr.map(t.definition,function(o){return Up(o.definition)}));else if(!(t instanceof co.Terminal))throw Error("non exhaustive match");var i=(0,jS.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=nr.drop(r);return e.concat(Up(s))}else return e}Xt.getFirstNoneTerminal=Up;var qS=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}(GS.GAstVisitor);function Wj(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){var a=nr.dropRight(o.definition),l=nr.map(a,function(c,u){var g=(0,pIe.nextPossibleTokensAfter)([c],[],null,1);return nr.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:jo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(nr.compact(l))},[]);return n}Xt.validateEmptyOrAlternative=Wj;function zj(r,e,t){var i=new qS;r.accept(i);var n=i.alternations;n=(0,kr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=nr.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,yg.getLookaheadPathsForOr)(l,r,c,a),g=IIe(u,a,r,t),f=eG(u,a,r,t);return o.concat(g,f)},[]);return s}Xt.validateAmbiguousAlternationAlternatives=zj;var tG=function(r){HS(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}(GS.GAstVisitor);Xt.RepetionCollector=tG;function _j(r,e){var t=new qS;r.accept(t);var i=t.alternations,n=nr.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:jo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Xt.validateTooManyAlts=_j;function Vj(r,e,t){var i=[];return(0,kr.forEach)(r,function(n){var s=new tG;n.accept(s);var o=s.allProductions;(0,kr.forEach)(o,function(a){var l=(0,yg.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,yg.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,kr.isEmpty)((0,kr.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:jo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Xt.validateSomeNonEmptyLookaheadPath=Vj;function IIe(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,kr.forEach)(l,function(u){var g=[c];(0,kr.forEach)(r,function(f,h){c!==h&&(0,yg.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,yg.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=nr.map(s,function(a){var l=(0,kr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:jo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function eG(r,e,t,i){var n=[],s=(0,kr.reduce)(r,function(o,a,l){var c=(0,kr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,kr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,kr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(wg,"__esModule",{value:!0});wg.validateGrammar=wg.resolveGrammar=void 0;var WS=Yt(),yIe=Lj(),wIe=JS(),rG=Tp();function BIe(r){r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarResolverErrorProvider});var e={};return(0,WS.forEach)(r.rules,function(t){e[t.name]=t}),(0,yIe.resolveGrammar)(e,r.errMsgProvider)}wg.resolveGrammar=BIe;function bIe(r){return r=(0,WS.defaults)(r,{errMsgProvider:rG.defaultGrammarValidatorErrorProvider}),(0,wIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}wg.validateGrammar=bIe});var Bg=w(Sn=>{"use strict";var Hp=Sn&&Sn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Sn,"__esModule",{value:!0});Sn.EarlyExitException=Sn.NotAllInputParsedException=Sn.NoViableAltException=Sn.MismatchedTokenException=Sn.isRecognitionException=void 0;var QIe=Yt(),nG="MismatchedTokenException",sG="NoViableAltException",oG="EarlyExitException",aG="NotAllInputParsedException",AG=[nG,sG,oG,aG];Object.freeze(AG);function SIe(r){return(0,QIe.contains)(AG,r.name)}Sn.isRecognitionException=SIe;var ZI=function(r){Hp(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),vIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=nG,s}return e}(ZI);Sn.MismatchedTokenException=vIe;var xIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=sG,s}return e}(ZI);Sn.NoViableAltException=xIe;var kIe=function(r){Hp(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=aG,n}return e}(ZI);Sn.NotAllInputParsedException=kIe;var PIe=function(r){Hp(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=oG,s}return e}(ZI);Sn.EarlyExitException=PIe});var _S=w(Yi=>{"use strict";Object.defineProperty(Yi,"__esModule",{value:!0});Yi.attemptInRepetitionRecovery=Yi.Recoverable=Yi.InRuleRecoveryException=Yi.IN_RULE_RECOVERY_EXCEPTION=Yi.EOF_FOLLOW_KEY=void 0;var $I=XA(),xs=Yt(),DIe=Bg(),RIe=TS(),FIe=$n();Yi.EOF_FOLLOW_KEY={};Yi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function zS(r){this.name=Yi.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Yi.InRuleRecoveryException=zS;zS.prototype=Error.prototype;var NIe=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,xs.has)(e,"recoveryEnabled")?e.recoveryEnabled:FIe.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=lG)},r.prototype.getTokenToInsert=function(e){var t=(0,$I.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),m=new DIe.MismatchedTokenException(p,u,s.LA(0));m.resyncedTokens=(0,xs.dropRight)(l),s.SAVE_ERROR(m)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new zS("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,xs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,xs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,xs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,xs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Yi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,xs.map)(t,function(n,s){return s===0?Yi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,xs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,xs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Yi.EOF_FOLLOW_KEY)return[$I.EOF];var t=e.ruleName+e.idxInCallingRule+RIe.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,$I.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,xs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,xs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,xs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Yi.Recoverable=NIe;function lG(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=$I.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Yi.attemptInRepetitionRecovery=lG});var ey=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.LooksAhead=void 0;var qa=Kp(),uo=Yt(),cG=$n(),Ja=ey(),Dc=Lp(),TIe=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,uo.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:cG.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,uo.has)(e,"maxLookahead")?e.maxLookahead:cG.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,uo.isES2015MapSupported)()?new Map:[],(0,uo.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,uo.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Dc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,uo.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,Dc.getProductionDslName)(g)+f,function(){var h=(0,qa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ja.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ja.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,uo.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_IDX,qa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ja.OPTION_IDX,qa.PROD_TYPE.OPTION,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_IDX,qa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ja.AT_LEAST_ONE_SEP_IDX,qa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))}),(0,uo.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ja.MANY_SEP_IDX,qa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Dc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,qa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ja.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,qa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,qa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ja.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();ty.LooksAhead=TIe});var gG=w(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.addNoneTerminalToCst=Go.addTerminalToCst=Go.setNodeLocationFull=Go.setNodeLocationOnlyOffset=void 0;function OIe(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(el,"__esModule",{value:!0});el.defineNameProp=el.functionName=el.classNameFromInstance=void 0;var HIe=Yt();function jIe(r){return fG(r.constructor)}el.classNameFromInstance=jIe;var hG="name";function fG(r){var e=r.name;return e||"anonymous"}el.functionName=fG;function GIe(r,e){var t=Object.getOwnPropertyDescriptor(r,hG);return(0,HIe.isUndefined)(t)||t.configurable?(Object.defineProperty(r,hG,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}el.defineNameProp=GIe});var EG=w(Di=>{"use strict";Object.defineProperty(Di,"__esModule",{value:!0});Di.validateRedundantMethods=Di.validateMissingCstMethods=Di.validateVisitor=Di.CstVisitorDefinitionError=Di.createBaseVisitorConstructorWithDefaults=Di.createBaseSemanticVisitorConstructor=Di.defaultVisit=void 0;var ks=Yt(),jp=VS();function pG(r,e){for(var t=(0,ks.keys)(r),i=t.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Di.createBaseSemanticVisitorConstructor=YIe;function qIe(r,e,t){var i=function(){};(0,jp.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,ks.forEach)(e,function(s){n[s]=pG}),i.prototype=n,i.prototype.constructor=i,i}Di.createBaseVisitorConstructorWithDefaults=qIe;var XS;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(XS=Di.CstVisitorDefinitionError||(Di.CstVisitorDefinitionError={}));function dG(r,e){var t=CG(r,e),i=mG(r,e);return t.concat(i)}Di.validateVisitor=dG;function CG(r,e){var t=(0,ks.map)(e,function(i){if(!(0,ks.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+" CST Visitor.",type:XS.MISSING_METHOD,methodName:i}});return(0,ks.compact)(t)}Di.validateMissingCstMethods=CG;var JIe=["constructor","visit","validateVisitor"];function mG(r,e){var t=[];for(var i in r)(0,ks.isFunction)(r[i])&&!(0,ks.contains)(JIe,i)&&!(0,ks.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,jp.functionName)(r.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:XS.REDUNDANT_METHOD,methodName:i});return t}Di.validateRedundantMethods=mG});var yG=w(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.TreeBuilder=void 0;var bg=gG(),ni=Yt(),IG=EG(),WIe=$n(),zIe=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,ni.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:WIe.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni.NOOP,this.cstFinallyStateUpdate=ni.NOOP,this.cstPostTerminal=ni.NOOP,this.cstPostNonTerminal=ni.NOOP,this.cstPostRule=ni.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationFull,this.setNodeLocationFromNode=bg.setNodeLocationFull,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=bg.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=bg.setNodeLocationOnlyOffset,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni.NOOP,this.setNodeLocationFromNode=ni.NOOP,this.cstPostRule=ni.NOOP,this.setInitialNodeLocation=ni.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,bg.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,ni.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,IG.createBaseSemanticVisitorConstructor)(this.className,(0,ni.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,ni.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,IG.createBaseVisitorConstructorWithDefaults)(this.className,(0,ni.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();ry.TreeBuilder=zIe});var BG=w(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.LexerAdapter=void 0;var wG=$n(),_Ie=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wG.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?wG.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();iy.LexerAdapter=_Ie});var QG=w(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.RecognizerApi=void 0;var bG=Yt(),VIe=Bg(),ZS=$n(),XIe=Tp(),ZIe=JS(),$Ie=bn(),eye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG),(0,bG.contains)(this.definedRulesNames,e)){var n=XIe.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:ZS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=ZS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,ZIe.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,VIe.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,$Ie.serializeGrammar)((0,bG.values)(this.gastProductionsCache))},r}();ny.RecognizerApi=eye});var kG=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.RecognizerEngine=void 0;var Fr=Yt(),es=ey(),oy=Bg(),SG=Kp(),Qg=Mp(),vG=$n(),tye=_S(),xG=XA(),Gp=mg(),rye=VS(),iye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,rye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Gp.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Fr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Fr.isArray)(e)){if((0,Fr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Fr.isArray)(e))this.tokensMap=(0,Fr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Fr.has)(e,"modes")&&(0,Fr.every)((0,Fr.flatten)((0,Fr.values)(e.modes)),Gp.isTokenType)){var i=(0,Fr.flatten)((0,Fr.values)(e.modes)),n=(0,Fr.uniq)(i);this.tokensMap=(0,Fr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Fr.isObject)(e))this.tokensMap=(0,Fr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=xG.EOF;var s=(0,Fr.every)((0,Fr.values)(e),function(o){return(0,Fr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Gp.tokenStructuredMatcherNoCategories:Gp.tokenStructuredMatcher,(0,Gp.augmentTokenTypes)((0,Fr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Fr.has)(i,"resyncEnabled")?i.resyncEnabled:vG.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Fr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:vG.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(es.OR_IDX,t),n=(0,Fr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new oy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,oy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new oy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===tye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Fr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),xG.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();sy.RecognizerEngine=iye});var DG=w(ay=>{"use strict";Object.defineProperty(ay,"__esModule",{value:!0});ay.ErrorHandler=void 0;var $S=Bg(),ev=Yt(),PG=Kp(),nye=$n(),sye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,ev.has)(e,"errorMessageProvider")?e.errorMessageProvider:nye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,$S.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,ev.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,ev.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,PG.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new $S.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,PG.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $S.NoViableAltException(c,this.LA(1),l))},r}();ay.ErrorHandler=sye});var NG=w(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.ContentAssist=void 0;var RG=Mp(),FG=Yt(),oye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,FG.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,RG.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,FG.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new RG.NextAfterTokenWalker(n,e).startWalking();return s},r}();Ay.ContentAssist=oye});var jG=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.GastRecorder=void 0;var vn=Yt(),Yo=bn(),aye=Dp(),LG=mg(),TG=XA(),Aye=$n(),lye=ey(),cy={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(cy);var OG=!0,MG=Math.pow(2,lye.BITS_FOR_OCCURRENCE_IDX)-1,KG=(0,TG.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:aye.Lexer.NA});(0,LG.augmentTokenTypes)([KG]);var UG=(0,TG.createTokenInstance)(KG,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(UG);var cye={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},gye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Aye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Yo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Yp.call(this,Yo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionMandatoryWithSeparator,t,e,OG)},r.prototype.manyInternalRecord=function(e,t){Yp.call(this,Yo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Yp.call(this,Yo.RepetitionWithSeparator,t,e,OG)},r.prototype.orInternalRecord=function(e,t){return uye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(uy(t),!e||(0,vn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=e.ruleName,a=new Yo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?cye:cy},r.prototype.consumeInternalRecord=function(e,t,i){if(uy(t),!(0,LG.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,vn.peek)(this.recordingProdStack),o=new Yo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),UG},r}();ly.GastRecorder=gye;function Yp(r,e,t,i){i===void 0&&(i=!1),uy(t);var n=(0,vn.peek)(this.recordingProdStack),s=(0,vn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,vn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),cy}function uye(r,e){var t=this;uy(e);var i=(0,vn.peek)(this.recordingProdStack),n=(0,vn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Yo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,vn.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,vn.some)(s,function(l){return(0,vn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,vn.forEach)(s,function(l){var c=new Yo.Alternative({definition:[]});o.definition.push(c),(0,vn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,vn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),cy}function HG(r){return r===0?"":""+r}function uy(r){if(r<0||r>MG){var e=new Error("Invalid DSL Method idx value: <"+r+`> - `+("Idx value must be a none negative value smaller than "+(MG+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var YG=w(gy=>{"use strict";Object.defineProperty(gy,"__esModule",{value:!0});gy.PerformanceTracer=void 0;var GG=Yt(),fye=$n(),hye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,GG.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:Infinity,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=fye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,GG.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();gy.PerformanceTracer=hye});var qG=w(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.applyMixins=void 0;function pye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}fy.applyMixins=pye});var $n=w(Er=>{"use strict";var JG=Er&&Er.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Er,"__esModule",{value:!0});Er.EmbeddedActionsParser=Er.CstParser=Er.Parser=Er.EMPTY_ALT=Er.ParserDefinitionErrorType=Er.DEFAULT_RULE_CONFIG=Er.DEFAULT_PARSER_CONFIG=Er.END_OF_FILE=void 0;var an=Yt(),dye=Dj(),WG=XA(),zG=Tp(),_G=iG(),Cye=_S(),mye=uG(),Eye=yG(),Iye=BG(),yye=QG(),wye=kG(),Bye=DG(),bye=NG(),Qye=jG(),Sye=YG(),vye=qG();Er.END_OF_FILE=(0,WG.createTokenInstance)(WG.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Er.END_OF_FILE);Er.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:zG.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});Er.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var xye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(xye=Er.ParserDefinitionErrorType||(Er.ParserDefinitionErrorType={}));function kye(r){return r===void 0&&(r=void 0),function(){return r}}Er.EMPTY_ALT=kye;var hy=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,an.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,an.has)(t,"skipValidations")?t.skipValidations:Er.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,an.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,an.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,_G.resolveGrammar)({rules:(0,an.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,an.isEmpty)(n)&&e.skipValidations===!1){var s=(0,_G.validateGrammar)({rules:(0,an.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,an.values)(e.tokensMap),errMsgProvider:zG.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,an.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,dye.computeAllProdsFollows)((0,an.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,an.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,an.isEmpty)(e.definitionErrors))throw t=(0,an.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+t.join(` -------------------------------- -`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();Er.Parser=hy;(0,vye.applyMixins)(hy,[Cye.Recoverable,mye.LooksAhead,Eye.TreeBuilder,Iye.LexerAdapter,wye.RecognizerEngine,yye.RecognizerApi,Bye.ErrorHandler,bye.ContentAssist,Qye.GastRecorder,Sye.PerformanceTracer]);var Pye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(hy);Er.CstParser=Pye;var Dye=function(r){JG(e,r);function e(t,i){i===void 0&&(i=Er.DEFAULT_PARSER_CONFIG);var n=this,s=(0,an.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(hy);Er.EmbeddedActionsParser=Dye});var XG=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.createSyntaxDiagramsCode=void 0;var VG=IS();function Rye(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+VG.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - - -`,u=` -
-`,g=` - -`,f=` - -`;return a+l+c+u+g+f}py.createSyntaxDiagramsCode=Rye});var eY=w(Ve=>{"use strict";Object.defineProperty(Ve,"__esModule",{value:!0});Ve.Parser=Ve.createSyntaxDiagramsCode=Ve.clearCache=Ve.GAstVisitor=Ve.serializeProduction=Ve.serializeGrammar=Ve.Terminal=Ve.Rule=Ve.RepetitionWithSeparator=Ve.RepetitionMandatoryWithSeparator=Ve.RepetitionMandatory=Ve.Repetition=Ve.Option=Ve.NonTerminal=Ve.Alternative=Ve.Alternation=Ve.defaultLexerErrorProvider=Ve.NoViableAltException=Ve.NotAllInputParsedException=Ve.MismatchedTokenException=Ve.isRecognitionException=Ve.EarlyExitException=Ve.defaultParserErrorProvider=Ve.tokenName=Ve.tokenMatcher=Ve.tokenLabel=Ve.EOF=Ve.createTokenInstance=Ve.createToken=Ve.LexerDefinitionErrorType=Ve.Lexer=Ve.EMPTY_ALT=Ve.ParserDefinitionErrorType=Ve.EmbeddedActionsParser=Ve.CstParser=Ve.VERSION=void 0;var Fye=IS();Object.defineProperty(Ve,"VERSION",{enumerable:!0,get:function(){return Fye.VERSION}});var dy=$n();Object.defineProperty(Ve,"CstParser",{enumerable:!0,get:function(){return dy.CstParser}});Object.defineProperty(Ve,"EmbeddedActionsParser",{enumerable:!0,get:function(){return dy.EmbeddedActionsParser}});Object.defineProperty(Ve,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return dy.ParserDefinitionErrorType}});Object.defineProperty(Ve,"EMPTY_ALT",{enumerable:!0,get:function(){return dy.EMPTY_ALT}});var ZG=Dp();Object.defineProperty(Ve,"Lexer",{enumerable:!0,get:function(){return ZG.Lexer}});Object.defineProperty(Ve,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return ZG.LexerDefinitionErrorType}});var Sg=XA();Object.defineProperty(Ve,"createToken",{enumerable:!0,get:function(){return Sg.createToken}});Object.defineProperty(Ve,"createTokenInstance",{enumerable:!0,get:function(){return Sg.createTokenInstance}});Object.defineProperty(Ve,"EOF",{enumerable:!0,get:function(){return Sg.EOF}});Object.defineProperty(Ve,"tokenLabel",{enumerable:!0,get:function(){return Sg.tokenLabel}});Object.defineProperty(Ve,"tokenMatcher",{enumerable:!0,get:function(){return Sg.tokenMatcher}});Object.defineProperty(Ve,"tokenName",{enumerable:!0,get:function(){return Sg.tokenName}});var Nye=Tp();Object.defineProperty(Ve,"defaultParserErrorProvider",{enumerable:!0,get:function(){return Nye.defaultParserErrorProvider}});var qp=Bg();Object.defineProperty(Ve,"EarlyExitException",{enumerable:!0,get:function(){return qp.EarlyExitException}});Object.defineProperty(Ve,"isRecognitionException",{enumerable:!0,get:function(){return qp.isRecognitionException}});Object.defineProperty(Ve,"MismatchedTokenException",{enumerable:!0,get:function(){return qp.MismatchedTokenException}});Object.defineProperty(Ve,"NotAllInputParsedException",{enumerable:!0,get:function(){return qp.NotAllInputParsedException}});Object.defineProperty(Ve,"NoViableAltException",{enumerable:!0,get:function(){return qp.NoViableAltException}});var Lye=PS();Object.defineProperty(Ve,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return Lye.defaultLexerErrorProvider}});var qo=bn();Object.defineProperty(Ve,"Alternation",{enumerable:!0,get:function(){return qo.Alternation}});Object.defineProperty(Ve,"Alternative",{enumerable:!0,get:function(){return qo.Alternative}});Object.defineProperty(Ve,"NonTerminal",{enumerable:!0,get:function(){return qo.NonTerminal}});Object.defineProperty(Ve,"Option",{enumerable:!0,get:function(){return qo.Option}});Object.defineProperty(Ve,"Repetition",{enumerable:!0,get:function(){return qo.Repetition}});Object.defineProperty(Ve,"RepetitionMandatory",{enumerable:!0,get:function(){return qo.RepetitionMandatory}});Object.defineProperty(Ve,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionMandatoryWithSeparator}});Object.defineProperty(Ve,"RepetitionWithSeparator",{enumerable:!0,get:function(){return qo.RepetitionWithSeparator}});Object.defineProperty(Ve,"Rule",{enumerable:!0,get:function(){return qo.Rule}});Object.defineProperty(Ve,"Terminal",{enumerable:!0,get:function(){return qo.Terminal}});var $G=bn();Object.defineProperty(Ve,"serializeGrammar",{enumerable:!0,get:function(){return $G.serializeGrammar}});Object.defineProperty(Ve,"serializeProduction",{enumerable:!0,get:function(){return $G.serializeProduction}});var Tye=Eg();Object.defineProperty(Ve,"GAstVisitor",{enumerable:!0,get:function(){return Tye.GAstVisitor}});function Oye(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. - It performs no action other than printing this message. - Please avoid using it as it will be completely removed in the future`)}Ve.clearCache=Oye;var Mye=XG();Object.defineProperty(Ve,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return Mye.createSyntaxDiagramsCode}});var Kye=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. -See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();Ve.Parser=Kye});var iY=w((Z$e,tY)=>{var Cy=eY(),Wa=Cy.createToken,rY=Cy.tokenMatcher,tv=Cy.Lexer,Uye=Cy.EmbeddedActionsParser;tY.exports=r=>{let e=Wa({name:"LogicalOperator",pattern:tv.NA}),t=Wa({name:"Or",pattern:/\|/,categories:e}),i=Wa({name:"Xor",pattern:/\^/,categories:e}),n=Wa({name:"And",pattern:/&/,categories:e}),s=Wa({name:"Not",pattern:/!/}),o=Wa({name:"LParen",pattern:/\(/}),a=Wa({name:"RParen",pattern:/\)/}),l=Wa({name:"Query",pattern:r}),u=[Wa({name:"WhiteSpace",pattern:/\s+/,group:tv.SKIPPED}),t,i,n,o,a,s,e,l],g=new tv(u);class f extends Uye{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let b=y,v=this.CONSUME(e),x=this.SUBRULE2(this.atomicExpression);rY(v,t)?y=T=>b(T)||x(T):rY(v,i)?y=T=>!!(b(T)^x(T)):y=T=>b(T)&&x(T)}),y}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:m}=this.CONSUME(l);return y=>y(m)}},{ALT:()=>{this.CONSUME(s);let m=this.SUBRULE(this.atomicExpression);return y=>!m(y)}}])),this.RULE("parenthesisExpression",()=>{let m;return this.CONSUME(o),m=this.SUBRULE(this.expression),this.CONSUME(a),m}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var nY=w(my=>{var Hye=iY();my.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=Hye(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};my.parse=my.makeParser()});var oY=w((eet,sY)=>{"use strict";sY.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var rv=w((tet,aY)=>{var Jp=oY(),AY={};for(let r of Object.keys(Jp))AY[Jp[r]]=r;var at={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};aY.exports=at;for(let r of Object.keys(at)){if(!("channels"in at[r]))throw new Error("missing channels property: "+r);if(!("labels"in at[r]))throw new Error("missing channel labels property: "+r);if(at[r].labels.length!==at[r].channels)throw new Error("channel and label counts mismatch: "+r);let{channels:e,labels:t}=at[r];delete at[r].channels,delete at[r].labels,Object.defineProperty(at[r],"channels",{value:e}),Object.defineProperty(at[r],"labels",{value:t})}at.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};at.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};at.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=at.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};at.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function jye(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}at.rgb.keyword=function(r){let e=AY[r];if(e)return e;let t=Infinity,i;for(let n of Object.keys(Jp)){let s=Jp[n],o=jye(r,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};at.rgb.lab=function(r){let e=at.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};at.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};at.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};at.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};at.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};at.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};at.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};at.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};at.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};at.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};at.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};at.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};at.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?at.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};at.hsv.ansi16=function(r){return at.rgb.ansi16(at.hsv.rgb(r),r[2])};at.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};at.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};at.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};at.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};at.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split("").map(a=>a+a).join(""));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};at.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};at.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};at.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};at.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};at.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};at.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};at.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};at.hwb.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=1-t,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};at.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};at.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};at.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};at.gray.hsl=function(r){return[0,0,r[0]]};at.gray.hsv=at.gray.hsl;at.gray.hwb=function(r){return[0,100,r[0]]};at.gray.cmyk=function(r){return[0,0,0,r[0]]};at.gray.lab=function(r){return[r[0],0,0]};at.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};at.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var cY=w((ret,lY)=>{var Ey=rv();function Gye(){let r={},e=Object.keys(Ey);for(let t=e.length,i=0;i{var iv=rv(),Wye=cY(),vg={},zye=Object.keys(iv);function _ye(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return"conversion"in r&&(e.conversion=r.conversion),e}function Vye(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n=="object")for(let s=n.length,o=0;o{vg[r]={},Object.defineProperty(vg[r],"channels",{value:iv[r].channels}),Object.defineProperty(vg[r],"labels",{value:iv[r].labels});let e=Wye(r);Object.keys(e).forEach(i=>{let n=e[i];vg[r][i]=Vye(n),vg[r][i].raw=_ye(n)})});uY.exports=vg});var mY=w((net,fY)=>{"use strict";var hY=(r,e)=>(...t)=>`[${r(...t)+e}m`,pY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};5;${i}m`},dY=(r,e)=>(...t)=>{let i=r(...t);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Iy=r=>r,CY=(r,e,t)=>[r,e,t],xg=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},nv,kg=(r,e,t,i)=>{nv===void 0&&(nv=gY());let n=i?10:0,s={};for(let[o,a]of Object.entries(nv)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=r(t,n):typeof a=="object"&&(s[l]=r(a[e],n))}return s};function Xye(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:r,enumerable:!1}),e.color.close="",e.bgColor.close="",xg(e.color,"ansi",()=>kg(hY,"ansi16",Iy,!1)),xg(e.color,"ansi256",()=>kg(pY,"ansi256",Iy,!1)),xg(e.color,"ansi16m",()=>kg(dY,"rgb",CY,!1)),xg(e.bgColor,"ansi",()=>kg(hY,"ansi16",Iy,!0)),xg(e.bgColor,"ansi256",()=>kg(pY,"ansi256",Iy,!0)),xg(e.bgColor,"ansi16m",()=>kg(dY,"rgb",CY,!0)),e}Object.defineProperty(fY,"exports",{enumerable:!0,get:Xye})});var IY=w((set,EY)=>{"use strict";EY.exports=(r,e=process.argv)=>{let t=r.startsWith("-")?"":r.length===1?"-":"--",i=e.indexOf(t+r),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Zye=require("os"),wY=require("tty"),Ps=IY(),{env:gi}=process,tl;Ps("no-color")||Ps("no-colors")||Ps("color=false")||Ps("color=never")?tl=0:(Ps("color")||Ps("colors")||Ps("color=true")||Ps("color=always"))&&(tl=1);"FORCE_COLOR"in gi&&(gi.FORCE_COLOR==="true"?tl=1:gi.FORCE_COLOR==="false"?tl=0:tl=gi.FORCE_COLOR.length===0?1:Math.min(parseInt(gi.FORCE_COLOR,10),3));function sv(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function ov(r,e){if(tl===0)return 0;if(Ps("color=16m")||Ps("color=full")||Ps("color=truecolor"))return 3;if(Ps("color=256"))return 2;if(r&&!e&&tl===void 0)return 0;let t=tl||0;if(gi.TERM==="dumb")return t;if(process.platform==="win32"){let i=Zye.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in gi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in gi)||gi.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in gi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(gi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in gi)return 1;if(gi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in gi){let i=parseInt((gi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(gi.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(gi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(gi.TERM)||"COLORTERM"in gi?1:t}function $ye(r){let e=ov(r,r&&r.isTTY);return sv(e)}yY.exports={supportsColor:$ye,stdout:sv(ov(!0,wY.isatty(1))),stderr:sv(ov(!0,wY.isatty(2)))}});var QY=w((aet,bY)=>{"use strict";var ewe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o="";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},twe=(r,e,t,i)=>{let n=0,s="";do{let o=r[i-1]==="\r";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+t,n=i+1,i=r.indexOf(` -`,n)}while(i!==-1);return s+=r.substr(n),s};bY.exports={stringReplaceAll:ewe,stringEncaseCRLFWithFirstIndex:twe}});var PY=w((Aet,SY)=>{"use strict";var rwe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,vY=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,iwe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,nwe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,swe=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function xY(r){let e=r[0]==="u",t=r[1]==="{";return e&&!t&&r.length===5||r[0]==="x"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):swe.get(r)||r}function owe(r,e){let t=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(iwe))t.push(n[2].replace(nwe,(a,l,c)=>l?xY(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function awe(r){vY.lastIndex=0;let e=[],t;for(;(t=vY.exec(r))!==null;){let i=t[1];if(t[2]){let n=owe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function kY(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}SY.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(rwe,(s,o,a,l,c,u)=>{if(o)n.push(xY(o));else if(l){let g=n.join("");n=[],i.push(t.length===0?g:kY(r,t)(g)),t.push({inverse:a,styles:awe(l)})}else if(c){if(t.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(kY(r,t)(n.join(""))),n=[],t.pop()}else n.push(u)}),i.push(n.join("")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var uv=w((cet,DY)=>{"use strict";var Wp=mY(),{stdout:av,stderr:Av}=BY(),{stringReplaceAll:Awe,stringEncaseCRLFWithFirstIndex:lwe}=QY(),RY=["ansi","ansi","ansi256","ansi16m"],Pg=Object.create(null),cwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let t=av?av.level:0;r.level=e.level===void 0?t:e.level},FY=class{constructor(e){return NY(e)}},NY=r=>{let e={};return cwe(e,r),e.template=(...t)=>uwe(e.template,...t),Object.setPrototypeOf(e,yy.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=FY,e.template};function yy(r){return NY(r)}for(let[r,e]of Object.entries(Wp))Pg[r]={get(){let t=wy(this,lv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};Pg.visible={get(){let r=wy(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:r}),r}};var LY=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let r of LY)Pg[r]={get(){let{level:e}=this;return function(...t){let i=lv(Wp.color[RY[e]][r](...t),Wp.color.close,this._styler);return wy(this,i,this._isEmpty)}}};for(let r of LY){let e="bg"+r[0].toUpperCase()+r.slice(1);Pg[e]={get(){let{level:t}=this;return function(...i){let n=lv(Wp.bgColor[RY[t]][r](...i),Wp.bgColor.close,this._styler);return wy(this,n,this._isEmpty)}}}}var gwe=Object.defineProperties(()=>{},te(N({},Pg),{level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}})),lv=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},wy=(r,e,t)=>{let i=(...n)=>fwe(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=gwe,i._generator=r,i._styler=e,i._isEmpty=t,i},fwe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?"":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf("")!==-1)for(;t!==void 0;)e=Awe(e,t.close,t.open),t=t.parent;let s=e.indexOf(` -`);return s!==-1&&(e=lwe(e,n,i,s)),i+e+n},cv,uwe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(" ");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s{"use strict";Ds.isInteger=r=>typeof r=="number"?Number.isInteger(r):typeof r=="string"&&r.trim()!==""?Number.isInteger(Number(r)):!1;Ds.find=(r,e)=>r.nodes.find(t=>t.type===e);Ds.exceedsLimit=(r,e,t=1,i)=>i===!1||!Ds.isInteger(r)||!Ds.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Ds.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};Ds.encloseBrace=r=>r.type!=="brace"?!1:r.commas>>0+r.ranges>>0==0?(r.invalid=!0,!0):!1;Ds.isInvalidBrace=r=>r.type!=="brace"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0==0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Ds.isOpenOrClose=r=>r.type==="open"||r.type==="close"?!0:r.open===!0||r.close===!0;Ds.reduce=r=>r.reduce((e,t)=>(t.type==="text"&&e.push(t.value),t.type==="range"&&(t.type="text"),e),[]);Ds.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n{"use strict";var OY=By();TY.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&OY.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&OY.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var KY=w((fet,MY)=>{"use strict";MY.exports=function(r){return typeof r=="number"?r-r==0:typeof r=="string"&&r.trim()!==""?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var zY=w((het,UY)=>{"use strict";var HY=KY(),Rc=(r,e,t)=>{if(HY(r)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||r===e)return String(r);if(HY(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=N({relaxZeros:!0},t);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+":"+e+"="+n+s+o+a;if(Rc.cache.hasOwnProperty(l))return Rc.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let m=r+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=GY(r)||GY(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let m=u<0?Math.abs(u):1;p=jY(m,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=jY(c,u,f,i)),f.negatives=p,f.positives=h,f.result=hwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Rc.cache[l]=f,f.result};function hwe(r,e,t){let i=gv(r,e,"-",!1,t)||[],n=gv(e,r,"",!1,t)||[],s=gv(r,e,"-?",!0,t)||[];return i.concat(s).concat(n).join("|")}function dwe(r,e){let t=1,i=1,n=YY(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=YY(r,t);for(n=qY(e+1,i)-1;r1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+JY(a.count),o=c+1;continue}t.isPadded&&(g=Iwe(c,t,i)),u.string=g+u.pattern+JY(u.count),s.push(u),o=c+1,a=u}return s}function gv(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!WY(e,"string",a)&&s.push(t+a),i&&WY(e,"string",a)&&s.push(t+a)}return s}function Cwe(r,e){let t=[];for(let i=0;ie?1:e>r?-1:0}function WY(r,e,t){return r.some(i=>i[e]===t)}function YY(r,e){return Number(String(r).slice(0,-e)+"9".repeat(e))}function qY(r,e){return r-r%Math.pow(10,e)}function JY(r){let[e=0,t=""]=r;return t||e>1?`{${e+(t?","+t:"")}}`:""}function mwe(r,e,t){return`[${r}${e-r==1?"":"-"}${e}]`}function GY(r){return/^-?(0+)\d/.test(r)}function Iwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}Rc.cache={};Rc.clearCache=()=>Rc.cache={};UY.exports=Rc});var pv=w((pet,_Y)=>{"use strict";var ywe=require("util"),VY=zY(),XY=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),wwe=r=>e=>r===!0?Number(e):String(e),fv=r=>typeof r=="number"||typeof r=="string"&&r!=="",_p=r=>Number.isInteger(+r),hv=r=>{let e=`${r}`,t=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++t]==="0";);return t>0},Bwe=(r,e,t)=>typeof r=="string"||typeof e=="string"?!0:t.stringify===!0,bwe=(r,e,t)=>{if(e>0){let i=r[0]==="-"?"-":"";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,"0")}return t===!1?String(r):r},ZY=(r,e)=>{let t=r[0]==="-"?"-":"";for(t&&(r=r.slice(1),e--);r.length{r.negatives.sort((o,a)=>oa?1:0),r.positives.sort((o,a)=>oa?1:0);let t=e.capture?"":"?:",i="",n="",s;return r.positives.length&&(i=r.positives.join("|")),r.negatives.length&&(n=`-(${t}${r.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},$Y=(r,e,t,i)=>{if(t)return VY(r,e,N({wrap:!1},i));let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},eq=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?"":"?:";return i?`(${n}${r.join("|")})`:r.join("|")}return VY(r,e,t)},tq=(...r)=>new RangeError("Invalid range arguments: "+ywe.inspect(...r)),rq=(r,e,t)=>{if(t.strictRanges===!0)throw tq([r,e]);return[]},Swe=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${r}" to be a number`);return[]},vwe=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw tq([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=hv(a)||hv(l)||hv(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Bwe(r,e,i)===!1,h=i.transform||wwe(f);if(i.toRegex&&t===1)return $Y(ZY(r,g),ZY(e,g),!0,i);let p={negatives:[],positives:[]},m=v=>p[v<0?"negatives":"positives"].push(Math.abs(v)),y=[],b=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?m(n):y.push(bwe(h(n,b),g,f)),n=o?n-t:n+t,b++;return i.toRegex===!0?t>1?Qwe(p,i):eq(y,null,N({wrap:!1},i)):y},xwe=(r,e,t=1,i={})=>{if(!_p(r)&&r.length>1||!_p(e)&&e.length>1)return rq(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return $Y(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?eq(u,null,{wrap:!1,options:i}):u},Qy=(r,e,t,i={})=>{if(e==null&&fv(r))return[r];if(!fv(r)||!fv(e))return rq(r,e,i);if(typeof t=="function")return Qy(r,e,1,{transform:t});if(XY(t))return Qy(r,e,0,t);let n=N({},i);return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,_p(t)?_p(r)&&_p(e)?vwe(r,e,t,n):xwe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!XY(t)?Swe(t,n):Qy(r,e,1,t)};_Y.exports=Qy});var sq=w((det,iq)=>{"use strict";var kwe=pv(),nq=By(),Pwe=(r,e={})=>{let t=(i,n={})=>{let s=nq.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=nq.reduce(i.nodes),g=kwe(...u,te(N({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};iq.exports=Pwe});var Aq=w((Cet,oq)=>{"use strict";var Dwe=pv(),aq=by(),Dg=By(),Fc=(r="",e="",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?Dg.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(Fc(s,e,t));else for(let s of e)t===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Fc(n,s,t):n+s);return Dg.flatten(i)},Rwe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Fc(a.pop(),aq(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Fc(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=Dg.reduce(n.nodes);if(Dg.exceedsLimit(...g,e.step,t))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=Dwe(...g,e);f.length===0&&(f=aq(n,e)),a.push(Fc(a.pop(),f)),n.nodes=[];return}let l=Dg.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";lq.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var pq=w((Eet,uq)=>{"use strict";var Fwe=by(),{MAX_LENGTH:gq,CHAR_BACKSLASH:dv,CHAR_BACKTICK:Nwe,CHAR_COMMA:Lwe,CHAR_DOT:Twe,CHAR_LEFT_PARENTHESES:Owe,CHAR_RIGHT_PARENTHESES:Mwe,CHAR_LEFT_CURLY_BRACE:Kwe,CHAR_RIGHT_CURLY_BRACE:Uwe,CHAR_LEFT_SQUARE_BRACKET:fq,CHAR_RIGHT_SQUARE_BRACKET:hq,CHAR_DOUBLE_QUOTE:Hwe,CHAR_SINGLE_QUOTE:jwe,CHAR_NO_BREAK_SPACE:Gwe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ywe}=cq(),qwe=(r,e={})=>{if(typeof r!="string")throw new TypeError("Expected a string");let t=e||{},i=typeof t.maxLength=="number"?Math.min(gq,t.maxLength):gq;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:"root",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],m=y=>{if(y.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&y.type==="text"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:"text",value:Fwe(o)}]}m({type:"comma",value:f}),o.commas++;continue}if(f===Twe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){m({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){y.pop();let b=y[y.length-1];b.value+=a.value+f,a=b,o.ranges--;continue}m({type:"dot",value:f});continue}m({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(v=>{v.nodes||(v.type==="open"&&(v.isOpen=!0),v.type==="close"&&(v.isClose=!0),v.nodes||(v.type="text"),v.invalid=!0)});let y=s[s.length-1],b=y.nodes.indexOf(o);y.nodes.splice(b,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};uq.exports=qwe});var mq=w((Iet,dq)=>{"use strict";var Cq=by(),Jwe=sq(),Wwe=Aq(),zwe=pq(),ts=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=ts.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(ts.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};ts.parse=(r,e={})=>zwe(r,e);ts.stringify=(r,e={})=>typeof r=="string"?Cq(ts.parse(r,e),e):Cq(r,e);ts.compile=(r,e={})=>(typeof r=="string"&&(r=ts.parse(r,e)),Jwe(r,e));ts.expand=(r,e={})=>{typeof r=="string"&&(r=ts.parse(r,e));let t=Wwe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};ts.create=(r,e={})=>r===""||r.length<3?[r]:e.expand!==!0?ts.compile(r,e):ts.expand(r,e);dq.exports=ts});var Vp=w((yet,Eq)=>{"use strict";var _we=require("path"),Jo="\\\\/",Iq=`[^${Jo}]`,za="\\.",Vwe="\\+",Xwe="\\?",Sy="\\/",Zwe="(?=.)",yq="[^/]",Cv=`(?:${Sy}|$)`,wq=`(?:^|${Sy})`,mv=`${za}{1,2}${Cv}`,$we=`(?!${za})`,eBe=`(?!${wq}${mv})`,tBe=`(?!${za}{0,1}${Cv})`,rBe=`(?!${mv})`,iBe=`[^.${Sy}]`,nBe=`${yq}*?`,Bq={DOT_LITERAL:za,PLUS_LITERAL:Vwe,QMARK_LITERAL:Xwe,SLASH_LITERAL:Sy,ONE_CHAR:Zwe,QMARK:yq,END_ANCHOR:Cv,DOTS_SLASH:mv,NO_DOT:$we,NO_DOTS:eBe,NO_DOT_SLASH:tBe,NO_DOTS_SLASH:rBe,QMARK_NO_DOT:iBe,STAR:nBe,START_ANCHOR:wq},sBe=te(N({},Bq),{SLASH_LITERAL:`[${Jo}]`,QMARK:Iq,STAR:`${Iq}*?`,DOTS_SLASH:`${za}{1,2}(?:[${Jo}]|$)`,NO_DOT:`(?!${za})`,NO_DOTS:`(?!(?:^|[${Jo}])${za}{1,2}(?:[${Jo}]|$))`,NO_DOT_SLASH:`(?!${za}{0,1}(?:[${Jo}]|$))`,NO_DOTS_SLASH:`(?!${za}{1,2}(?:[${Jo}]|$))`,QMARK_NO_DOT:`[^.${Jo}]`,START_ANCHOR:`(?:^|[${Jo}])`,END_ANCHOR:`(?:[${Jo}]|$)`}),oBe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Eq.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:oBe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:_we.sep,extglobChars(r){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${r.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(r){return r===!0?sBe:Bq}}});var Xp=w(xn=>{"use strict";var aBe=require("path"),ABe=process.platform==="win32",{REGEX_BACKSLASH:lBe,REGEX_REMOVE_BACKSLASH:cBe,REGEX_SPECIAL_CHARS:uBe,REGEX_SPECIAL_CHARS_GLOBAL:gBe}=Vp();xn.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);xn.hasRegexChars=r=>uBe.test(r);xn.isRegexChar=r=>r.length===1&&xn.hasRegexChars(r);xn.escapeRegex=r=>r.replace(gBe,"\\$1");xn.toPosixSlashes=r=>r.replace(lBe,"/");xn.removeBackslashes=r=>r.replace(cBe,e=>e==="\\"?"":e);xn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(".").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};xn.isWindows=r=>r&&typeof r.windows=="boolean"?r.windows:ABe===!0||aBe.sep==="\\";xn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]==="\\"?xn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\${r.slice(i)}`};xn.removePrefix=(r,e={})=>{let t=r;return t.startsWith("./")&&(t=t.slice(2),e.prefix="./"),t};xn.wrapOutput=(r,e={},t={})=>{let i=t.contains?"":"^",n=t.contains?"":"$",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var Dq=w((Bet,bq)=>{"use strict";var Qq=Xp(),{CHAR_ASTERISK:Ev,CHAR_AT:fBe,CHAR_BACKWARD_SLASH:Zp,CHAR_COMMA:hBe,CHAR_DOT:Iv,CHAR_EXCLAMATION_MARK:yv,CHAR_FORWARD_SLASH:Sq,CHAR_LEFT_CURLY_BRACE:wv,CHAR_LEFT_PARENTHESES:Bv,CHAR_LEFT_SQUARE_BRACKET:pBe,CHAR_PLUS:dBe,CHAR_QUESTION_MARK:vq,CHAR_RIGHT_CURLY_BRACE:CBe,CHAR_RIGHT_PARENTHESES:xq,CHAR_RIGHT_SQUARE_BRACKET:mBe}=Vp(),kq=r=>r===Sq||r===Zp,Pq=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?Infinity:1)},EBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,m=!1,y=!1,b=!1,v=!1,x=!1,T=!1,q=!1,Y=0,$,_,ne={value:"",depth:0,isGlob:!1},ee=()=>c>=i,A=()=>l.charCodeAt(c+1),oe=()=>($=_,l.charCodeAt(++c));for(;c0&&(Z=l.slice(0,u),l=l.slice(u),g-=u),ce&&p===!0&&g>0?(ce=l.slice(0,g),O=l.slice(g)):p===!0?(ce="",O=l):ce=l,ce&&ce!==""&&ce!=="/"&&ce!==l&&kq(ce.charCodeAt(ce.length-1))&&(ce=ce.slice(0,-1)),t.unescape===!0&&(O&&(O=Qq.removeBackslashes(O)),ce&&v===!0&&(ce=Qq.removeBackslashes(ce)));let L={prefix:Z,input:r,start:u,base:ce,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:m,isGlobstar:y,negated:x,negatedExtglob:T};if(t.tokens===!0&&(L.maxDepth=0,kq(_)||o.push(ne),L.tokens=o),t.parts===!0||t.tokens===!0){let de;for(let Be=0;Be{"use strict";var vy=Vp(),rs=Xp(),{MAX_LENGTH:xy,POSIX_REGEX_SOURCE:IBe,REGEX_NON_SPECIAL_CHARS:yBe,REGEX_SPECIAL_CHARS_BACKREF:wBe,REPLACEMENTS:Fq}=vy,BBe=(r,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...r,e);r.sort();let t=`[${r.join("-")}]`;try{new RegExp(t)}catch(i){return r.map(n=>rs.escapeRegex(n)).join("..")}return t},Rg=(r,e)=>`Missing ${r}: "${e}" - use "\\\\${e}" to match literal characters`,Nq=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");r=Fq[r]||r;let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:t.prepend||""},o=[s],a=t.capture?"":"?:",l=rs.isWindows(e),c=vy.globChars(l),u=vy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:y,NO_DOT_SLASH:b,NO_DOTS_SLASH:v,QMARK:x,QMARK_NO_DOT:T,STAR:q,START_ANCHOR:Y}=c,$=V=>`(${a}(?:(?!${Y}${V.dot?m:g}).)*?)`,_=t.dot?"":y,ne=t.dot?x:T,ee=t.bash===!0?$(t):q;t.capture&&(ee=`(${ee})`),typeof t.noext=="boolean"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=rs.removePrefix(r,A),n=r.length;let oe=[],ce=[],Z=[],O=s,L,de=()=>A.index===n-1,Be=A.peek=(V=1)=>r[A.index+V],je=A.advance=()=>r[++A.index]||"",re=()=>r.slice(A.index+1),se=(V="",Qe=0)=>{A.consumed+=V,A.index+=Qe},be=V=>{A.output+=V.output!=null?V.output:V.value,se(V.value)},he=()=>{let V=1;for(;Be()==="!"&&(Be(2)!=="("||Be(3)==="?");)je(),A.start++,V++;return V%2==0?!1:(A.negated=!0,A.start++,!0)},Fe=V=>{A[V]++,Z.push(V)},Ke=V=>{A[V]--,Z.pop()},ke=V=>{if(O.type==="globstar"){let Qe=A.braces>0&&(V.type==="comma"||V.type==="brace"),le=V.extglob===!0||oe.length&&(V.type==="pipe"||V.type==="paren");V.type!=="slash"&&V.type!=="paren"&&!Qe&&!le&&(A.output=A.output.slice(0,-O.output.length),O.type="star",O.value="*",O.output=ee,A.output+=O.output)}if(oe.length&&V.type!=="paren"&&(oe[oe.length-1].inner+=V.value),(V.value||V.output)&&be(V),O&&O.type==="text"&&V.type==="text"){O.value+=V.value,O.output=(O.output||"")+V.value;return}V.prev=O,o.push(V),O=V},ve=(V,Qe)=>{let le=te(N({},u[Qe]),{conditions:1,inner:""});le.prev=O,le.parens=A.parens,le.output=A.output;let fe=(t.capture?"(":"")+le.open;Fe("parens"),ke({type:V,value:Qe,output:A.output?"":p}),ke({type:"paren",extglob:!0,value:je(),output:fe}),oe.push(le)},pe=V=>{let Qe=V.close+(t.capture?")":""),le;if(V.type==="negate"){let fe=ee;V.inner&&V.inner.length>1&&V.inner.includes("/")&&(fe=$(t)),(fe!==ee||de()||/^\)+$/.test(re()))&&(Qe=V.close=`)$))${fe}`),V.inner.includes("*")&&(le=re())&&/^\.[^\\/.]+$/.test(le)&&(Qe=V.close=`)${le})${fe})`),V.prev.type==="bos"&&(A.negatedExtglob=!0)}ke({type:"paren",extglob:!0,value:L,output:Qe}),Ke("parens")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(r)){let V=!1,Qe=r.replace(wBe,(le,fe,gt,Ht,Mt,Ei)=>Ht==="\\"?(V=!0,le):Ht==="?"?fe?fe+Ht+(Mt?x.repeat(Mt.length):""):Ei===0?ne+(Mt?x.repeat(Mt.length):""):x.repeat(gt.length):Ht==="."?g.repeat(gt.length):Ht==="*"?fe?fe+Ht+(Mt?ee:""):ee:fe?le:`\\${le}`);return V===!0&&(t.unescape===!0?Qe=Qe.replace(/\\/g,""):Qe=Qe.replace(/\\+/g,le=>le.length%2==0?"\\\\":le?"\\":"")),Qe===r&&t.contains===!0?(A.output=r,A):(A.output=rs.wrapOutput(Qe,A,e),A)}for(;!de();){if(L=je(),L==="\0")continue;if(L==="\\"){let le=Be();if(le==="/"&&t.bash!==!0||le==="."||le===";")continue;if(!le){L+="\\",ke({type:"text",value:L});continue}let fe=/^\\+/.exec(re()),gt=0;if(fe&&fe[0].length>2&&(gt=fe[0].length,A.index+=gt,gt%2!=0&&(L+="\\")),t.unescape===!0?L=je():L+=je(),A.brackets===0){ke({type:"text",value:L});continue}}if(A.brackets>0&&(L!=="]"||O.value==="["||O.value==="[^")){if(t.posix!==!1&&L===":"){let le=O.value.slice(1);if(le.includes("[")&&(O.posix=!0,le.includes(":"))){let fe=O.value.lastIndexOf("["),gt=O.value.slice(0,fe),Ht=O.value.slice(fe+2),Mt=IBe[Ht];if(Mt){O.value=gt+Mt,A.backtrack=!0,je(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(L==="["&&Be()!==":"||L==="-"&&Be()==="]")&&(L=`\\${L}`),L==="]"&&(O.value==="["||O.value==="[^")&&(L=`\\${L}`),t.posix===!0&&L==="!"&&O.value==="["&&(L="^"),O.value+=L,be({value:L});continue}if(A.quotes===1&&L!=='"'){L=rs.escapeRegex(L),O.value+=L,be({value:L});continue}if(L==='"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ke({type:"text",value:L});continue}if(L==="("){Fe("parens"),ke({type:"paren",value:L});continue}if(L===")"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(Rg("opening","("));let le=oe[oe.length-1];if(le&&A.parens===le.parens+1){pe(oe.pop());continue}ke({type:"paren",value:L,output:A.parens?")":"\\)"}),Ke("parens");continue}if(L==="["){if(t.nobracket===!0||!re().includes("]")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));L=`\\${L}`}else Fe("brackets");ke({type:"bracket",value:L});continue}if(L==="]"){if(t.nobracket===!0||O&&O.type==="bracket"&&O.value.length===1){ke({type:"text",value:L,output:`\\${L}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(Rg("opening","["));ke({type:"text",value:L,output:`\\${L}`});continue}Ke("brackets");let le=O.value.slice(1);if(O.posix!==!0&&le[0]==="^"&&!le.includes("/")&&(L=`/${L}`),O.value+=L,be({value:L}),t.literalBrackets===!1||rs.hasRegexChars(le))continue;let fe=rs.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=fe,O.value=fe;continue}O.value=`(${a}${fe}|${O.value})`,A.output+=O.value;continue}if(L==="{"&&t.nobrace!==!0){Fe("braces");let le={type:"brace",value:L,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};ce.push(le),ke(le);continue}if(L==="}"){let le=ce[ce.length-1];if(t.nobrace===!0||!le){ke({type:"text",value:L,output:L});continue}let fe=")";if(le.dots===!0){let gt=o.slice(),Ht=[];for(let Mt=gt.length-1;Mt>=0&&(o.pop(),gt[Mt].type!=="brace");Mt--)gt[Mt].type!=="dots"&&Ht.unshift(gt[Mt].value);fe=BBe(Ht,t),A.backtrack=!0}if(le.comma!==!0&&le.dots!==!0){let gt=A.output.slice(0,le.outputIndex),Ht=A.tokens.slice(le.tokensIndex);le.value=le.output="\\{",L=fe="\\}",A.output=gt;for(let Mt of Ht)A.output+=Mt.output||Mt.value}ke({type:"brace",value:L,output:fe}),Ke("braces"),ce.pop();continue}if(L==="|"){oe.length>0&&oe[oe.length-1].conditions++,ke({type:"text",value:L});continue}if(L===","){let le=L,fe=ce[ce.length-1];fe&&Z[Z.length-1]==="braces"&&(fe.comma=!0,le="|"),ke({type:"comma",value:L,output:le});continue}if(L==="/"){if(O.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),O=s;continue}ke({type:"slash",value:L,output:h});continue}if(L==="."){if(A.braces>0&&O.type==="dot"){O.value==="."&&(O.output=g);let le=ce[ce.length-1];O.type="dots",O.output+=L,O.value+=L,le.dots=!0;continue}if(A.braces+A.parens===0&&O.type!=="bos"&&O.type!=="slash"){ke({type:"text",value:L,output:g});continue}ke({type:"dot",value:L,output:g});continue}if(L==="?"){if(!(O&&O.value==="(")&&t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("qmark",L);continue}if(O&&O.type==="paren"){let fe=Be(),gt=L;if(fe==="<"&&!rs.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(O.value==="("&&!/[!=<:]/.test(fe)||fe==="<"&&!/<([!=]|\w+>)/.test(re()))&&(gt=`\\${L}`),ke({type:"text",value:L,output:gt});continue}if(t.dot!==!0&&(O.type==="slash"||O.type==="bos")){ke({type:"qmark",value:L,output:T});continue}ke({type:"qmark",value:L,output:x});continue}if(L==="!"){if(t.noextglob!==!0&&Be()==="("&&(Be(2)!=="?"||!/[!=<:]/.test(Be(3)))){ve("negate",L);continue}if(t.nonegate!==!0&&A.index===0){he();continue}}if(L==="+"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ve("plus",L);continue}if(O&&O.value==="("||t.regex===!1){ke({type:"plus",value:L,output:f});continue}if(O&&(O.type==="bracket"||O.type==="paren"||O.type==="brace")||A.parens>0){ke({type:"plus",value:L});continue}ke({type:"plus",value:f});continue}if(L==="@"){if(t.noextglob!==!0&&Be()==="("&&Be(2)!=="?"){ke({type:"at",extglob:!0,value:L,output:""});continue}ke({type:"text",value:L});continue}if(L!=="*"){(L==="$"||L==="^")&&(L=`\\${L}`);let le=yBe.exec(re());le&&(L+=le[0],A.index+=le[0].length),ke({type:"text",value:L});continue}if(O&&(O.type==="globstar"||O.star===!0)){O.type="star",O.star=!0,O.value+=L,O.output=ee,A.backtrack=!0,A.globstar=!0,se(L);continue}let V=re();if(t.noextglob!==!0&&/^\([^?]/.test(V)){ve("star",L);continue}if(O.type==="star"){if(t.noglobstar===!0){se(L);continue}let le=O.prev,fe=le.prev,gt=le.type==="slash"||le.type==="bos",Ht=fe&&(fe.type==="star"||fe.type==="globstar");if(t.bash===!0&&(!gt||V[0]&&V[0]!=="/")){ke({type:"star",value:L,output:""});continue}let Mt=A.braces>0&&(le.type==="comma"||le.type==="brace"),Ei=oe.length&&(le.type==="pipe"||le.type==="paren");if(!gt&&le.type!=="paren"&&!Mt&&!Ei){ke({type:"star",value:L,output:""});continue}for(;V.slice(0,3)==="/**";){let jt=r[A.index+4];if(jt&&jt!=="/")break;V=V.slice(3),se("/**",3)}if(le.type==="bos"&&de()){O.type="globstar",O.value+=L,O.output=$(t),A.output=O.output,A.globstar=!0,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&!Ht&&de()){A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=$(t)+(t.strictSlashes?")":"|$)"),O.value+=L,A.globstar=!0,A.output+=le.output+O.output,se(L);continue}if(le.type==="slash"&&le.prev.type!=="bos"&&V[0]==="/"){let jt=V[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(le.output+O.output).length),le.output=`(?:${le.output}`,O.type="globstar",O.output=`${$(t)}${h}|${h}${jt})`,O.value+=L,A.output+=le.output+O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}if(le.type==="bos"&&V[0]==="/"){O.type="globstar",O.value+=L,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,se(L+je()),ke({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-O.output.length),O.type="globstar",O.output=$(t),O.value+=L,A.output+=O.output,A.globstar=!0,se(L);continue}let Qe={type:"star",value:L,output:ee};if(t.bash===!0){Qe.output=".*?",(O.type==="bos"||O.type==="slash")&&(Qe.output=_+Qe.output),ke(Qe);continue}if(O&&(O.type==="bracket"||O.type==="paren")&&t.regex===!0){Qe.output=L,ke(Qe);continue}(A.index===A.start||O.type==="slash"||O.type==="dot")&&(O.type==="dot"?(A.output+=b,O.output+=b):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=_,O.output+=_),Be()!=="*"&&(A.output+=p,O.output+=p)),ke(Qe)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","]"));A.output=rs.escapeLast(A.output,"["),Ke("brackets")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing",")"));A.output=rs.escapeLast(A.output,"("),Ke("parens")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(Rg("closing","}"));A.output=rs.escapeLast(A.output,"{"),Ke("braces")}if(t.strictSlashes!==!0&&(O.type==="star"||O.type==="bracket")&&ke({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let V of A.tokens)A.output+=V.output!=null?V.output:V.value,V.suffix&&(A.output+=V.suffix)}return A};Nq.fastpaths=(r,e)=>{let t=N({},e),i=typeof t.maxLength=="number"?Math.min(xy,t.maxLength):xy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Fq[r]||r;let s=rs.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=vy.globChars(s),m=t.dot?g:u,y=t.dot?f:u,b=t.capture?"":"?:",v={negated:!1,prefix:""},x=t.bash===!0?".*?":h;t.capture&&(x=`(${x})`);let T=_=>_.noglobstar===!0?x:`(${b}(?:(?!${p}${_.dot?c:o}).)*?)`,q=_=>{switch(_){case"*":return`${m}${l}${x}`;case".*":return`${o}${l}${x}`;case"*.*":return`${m}${x}${o}${l}${x}`;case"*/*":return`${m}${x}${a}${l}${y}${x}`;case"**":return m+T(t);case"**/*":return`(?:${m}${T(t)}${a})?${y}${l}${x}`;case"**/*.*":return`(?:${m}${T(t)}${a})?${y}${x}${o}${l}${x}`;case"**/.*":return`(?:${m}${T(t)}${a})?${o}${l}${x}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(_);if(!ne)return;let ee=q(ne[1]);return ee?ee+o+ne[2]:void 0}}},Y=rs.removePrefix(r,v),$=q(Y);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};Rq.exports=Nq});var Oq=w((Qet,Tq)=>{"use strict";var bBe=require("path"),QBe=Dq(),bv=Lq(),Qv=Xp(),SBe=Vp(),vBe=r=>r&&typeof r=="object"&&!Array.isArray(r),_r=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>_r(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=vBe(r)&&r.tokens&&r.input;if(r===""||typeof r!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=Qv.isWindows(e),o=i?_r.compileRe(r,e):_r.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=te(N({},e),{ignore:null,onMatch:null,onResult:null});l=_r(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=_r.test(u,o,e,{glob:r,posix:s}),m={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(m),f===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return t&&(c.state=a),c};_r.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!="string")throw new TypeError("Expected input to be a string");if(r==="")return{isMatch:!1,output:""};let s=t||{},o=s.format||(n?Qv.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=_r.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};_r.matchBase=(r,e,t,i=Qv.isWindows(t))=>(e instanceof RegExp?e:_r.makeRe(e,t)).test(bBe.basename(r));_r.isMatch=(r,e,t)=>_r(e,t)(r);_r.parse=(r,e)=>Array.isArray(r)?r.map(t=>_r.parse(t,e)):bv(r,te(N({},e),{fastpaths:!1}));_r.scan=(r,e)=>QBe(r,e);_r.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=_r.toRegex(a,e);return i===!0&&(l.state=r),l};_r.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!="string")throw new TypeError("Expected a non-empty string");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]==="."||r[0]==="*")&&(n.output=bv.fastpaths(r,e)),n.output||(n=bv(r,e)),_r.compileRe(n,e,t,i)};_r.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?"i":""))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};_r.constants=SBe;Tq.exports=_r});var Sv=w((vet,Mq)=>{"use strict";Mq.exports=Oq()});var is=w((xet,Kq)=>{"use strict";var Uq=require("util"),Hq=mq(),Wo=Sv(),vv=Xp(),jq=r=>r===""||r==="./",Pr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Pr.match=Pr;Pr.matcher=(r,e)=>Wo(r,e);Pr.isMatch=(r,e,t)=>Wo(e,t)(r);Pr.any=Pr.isMatch;Pr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{t.onResult&&t.onResult(a),n.push(a.output)},o=Pr(r,e,te(N({},t),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Pr.contains=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);if(Array.isArray(e))return e.some(i=>Pr.contains(r,i,t));if(typeof e=="string"){if(jq(r)||jq(e))return!1;if(r.includes(e)||r.startsWith("./")&&r.slice(2).includes(e))return!0}return Pr.isMatch(r,e,te(N({},t),{contains:!0}))};Pr.matchKeys=(r,e,t)=>{if(!vv.isObject(r))throw new TypeError("Expected the first argument to be an object");let i=Pr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Pr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Pr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Wo(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Pr.all=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`Expected a string: "${Uq.inspect(r)}"`);return[].concat(e).every(i=>Wo(i,t)(r))};Pr.capture=(r,e,t)=>{let i=vv.isWindows(t),s=Wo.makeRe(String(r),te(N({},t),{capture:!0})).exec(i?vv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Pr.makeRe=(...r)=>Wo.makeRe(...r);Pr.scan=(...r)=>Wo.scan(...r);Pr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Hq(String(i),e))t.push(Wo.parse(n,e));return t};Pr.braces=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(r)?[r]:Hq(r,e)};Pr.braceExpand=(r,e)=>{if(typeof r!="string")throw new TypeError("Expected a string");return Pr.braces(r,te(N({},e),{expand:!0}))};Kq.exports=Pr});var Yq=w((ket,Gq)=>{"use strict";Gq.exports=({onlyFirst:r=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,r?void 0:"g")}});var Jq=w((Pet,qq)=>{"use strict";var xBe=Yq();qq.exports=r=>typeof r=="string"?r.replace(xBe(),""):r});var AJ=w((zet,aJ)=>{"use strict";aJ.exports=(...r)=>[...new Set([].concat(...r))]});var jv=w((_et,lJ)=>{"use strict";var UBe=require("stream"),cJ=UBe.PassThrough,HBe=Array.prototype.slice;lJ.exports=jBe;function jBe(){let r=[],e=!1,t=HBe.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=cJ(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(Fy,"__esModule",{value:!0});function GBe(r){return r.reduce((e,t)=>[].concat(e,t),[])}Fy.flatten=GBe;function YBe(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Fy.splitWhen=YBe});var fJ=w(Gv=>{"use strict";Object.defineProperty(Gv,"__esModule",{value:!0});function qBe(r){return r.code==="ENOENT"}Gv.isEnoentCodeError=qBe});var pJ=w(Yv=>{"use strict";Object.defineProperty(Yv,"__esModule",{value:!0});var hJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function JBe(r,e){return new hJ(r,e)}Yv.createDirentFromStats=JBe});var dJ=w(Kg=>{"use strict";Object.defineProperty(Kg,"__esModule",{value:!0});var WBe=require("path"),zBe=2,_Be=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function VBe(r){return r.replace(/\\/g,"/")}Kg.unixify=VBe;function XBe(r,e){return WBe.resolve(r,e)}Kg.makeAbsolute=XBe;function ZBe(r){return r.replace(_Be,"\\$2")}Kg.escape=ZBe;function $Be(r){if(r.charAt(0)==="."){let e=r.charAt(1);if(e==="/"||e==="\\")return r.slice(zBe)}return r}Kg.removeLeadingDotSegment=$Be});var mJ=w((ett,CJ)=>{CJ.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var t;t=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var yJ=w((ttt,EJ)=>{var e0e=mJ(),IJ={"{":"}","(":")","[":"]"},t0e=function(r){if(r[0]==="!")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;ee&&(o===-1||o>i||(o=r.indexOf("\\",e),o===-1||o>i)))||n!==-1&&r[e]==="{"&&r[e+1]!=="}"&&(n=r.indexOf("}",e),n>e&&(o=r.indexOf("\\",e),o===-1||o>n))||s!==-1&&r[e]==="("&&r[e+1]==="?"&&/[:!=]/.test(r[e+2])&&r[e+3]!==")"&&(s=r.indexOf(")",e),s>e&&(o=r.indexOf("\\",e),o===-1||o>s))||t!==-1&&r[e]==="("&&r[e+1]!=="|"&&(tt&&(o=r.indexOf("\\",t),o===-1||o>s))))return!0;if(r[e]==="\\"){var a=r[e+1];e+=2;var l=IJ[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]==="!")return!0}else e++}return!1},r0e=function(r){if(r[0]==="!")return!0;for(var e=0;e{"use strict";var i0e=yJ(),n0e=require("path").posix.dirname,s0e=require("os").platform()==="win32",qv="/",o0e=/\\/g,a0e=/[\{\[].*[\}\]]$/,A0e=/(^|[^\\])([\{\[]|\([^\)]+$)/,l0e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;wJ.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&s0e&&e.indexOf(qv)<0&&(e=e.replace(o0e,qv)),a0e.test(e)&&(e+=qv),e+="a";do e=n0e(e);while(i0e(e)||A0e.test(e));return e.replace(l0e,"$1")}});var RJ=w(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});var c0e=require("path"),u0e=BJ(),bJ=is(),g0e=Sv(),QJ="**",f0e="\\",h0e=/[*?]|^!/,p0e=/\[.*]/,d0e=/(?:^|[^!*+?@])\(.*\|.*\)/,C0e=/[!*+?@]\(.*\)/,m0e=/{.*(?:,|\.\.).*}/;function vJ(r,e={}){return!SJ(r,e)}si.isStaticPattern=vJ;function SJ(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(f0e)||h0e.test(r)||p0e.test(r)||d0e.test(r)||e.extglob!==!1&&C0e.test(r)||e.braceExpansion!==!1&&m0e.test(r))}si.isDynamicPattern=SJ;function E0e(r){return Ny(r)?r.slice(1):r}si.convertToPositivePattern=E0e;function I0e(r){return"!"+r}si.convertToNegativePattern=I0e;function Ny(r){return r.startsWith("!")&&r[1]!=="("}si.isNegativePattern=Ny;function xJ(r){return!Ny(r)}si.isPositivePattern=xJ;function y0e(r){return r.filter(Ny)}si.getNegativePatterns=y0e;function w0e(r){return r.filter(xJ)}si.getPositivePatterns=w0e;function B0e(r){return u0e(r,{flipBackslashes:!1})}si.getBaseDirectory=B0e;function b0e(r){return r.includes(QJ)}si.hasGlobStar=b0e;function kJ(r){return r.endsWith("/"+QJ)}si.endsWithSlashGlobStar=kJ;function Q0e(r){let e=c0e.basename(r);return kJ(r)||vJ(e)}si.isAffectDepthOfReadingPattern=Q0e;function S0e(r){return r.reduce((e,t)=>e.concat(PJ(t)),[])}si.expandPatternsWithBraceExpansion=S0e;function PJ(r){return bJ.braces(r,{expand:!0,nodupes:!0})}si.expandBraceExpansion=PJ;function v0e(r,e){let t=g0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}si.getPatternParts=v0e;function DJ(r,e){return bJ.makeRe(r,e)}si.makeRe=DJ;function x0e(r,e){return r.map(t=>DJ(t,e))}si.convertPatternsToRe=x0e;function k0e(r,e){return e.some(t=>t.test(r))}si.matchAny=k0e});var NJ=w(Jv=>{"use strict";Object.defineProperty(Jv,"__esModule",{value:!0});var P0e=jv();function D0e(r){let e=P0e(r);return r.forEach(t=>{t.once("error",i=>e.emit("error",i))}),e.once("close",()=>FJ(r)),e.once("end",()=>FJ(r)),e}Jv.merge=D0e;function FJ(r){r.forEach(e=>e.emit("close"))}});var LJ=w(Ly=>{"use strict";Object.defineProperty(Ly,"__esModule",{value:!0});function R0e(r){return typeof r=="string"}Ly.isString=R0e;function F0e(r){return r===""}Ly.isEmpty=F0e});var Xa=w(Va=>{"use strict";Object.defineProperty(Va,"__esModule",{value:!0});var N0e=gJ();Va.array=N0e;var L0e=fJ();Va.errno=L0e;var T0e=pJ();Va.fs=T0e;var O0e=dJ();Va.path=O0e;var M0e=RJ();Va.pattern=M0e;var K0e=NJ();Va.stream=K0e;var U0e=LJ();Va.string=U0e});var UJ=w(Za=>{"use strict";Object.defineProperty(Za,"__esModule",{value:!0});var Mc=Xa();function H0e(r,e){let t=TJ(r),i=OJ(r,e.ignore),n=t.filter(l=>Mc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Mc.pattern.isDynamicPattern(l,e)),o=Wv(n,i,!1),a=Wv(s,i,!0);return o.concat(a)}Za.generate=H0e;function Wv(r,e,t){let i=MJ(r);return"."in i?[zv(".",r,e,t)]:KJ(i,e,t)}Za.convertPatternsToTasks=Wv;function TJ(r){return Mc.pattern.getPositivePatterns(r)}Za.getPositivePatterns=TJ;function OJ(r,e){return Mc.pattern.getNegativePatterns(r).concat(e).map(Mc.pattern.convertToPositivePattern)}Za.getNegativePatternsAsPositive=OJ;function MJ(r){let e={};return r.reduce((t,i)=>{let n=Mc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Za.groupPatternsByBaseDirectory=MJ;function KJ(r,e,t){return Object.keys(r).map(i=>zv(i,r[i],e,t))}Za.convertPatternGroupsToTasks=KJ;function zv(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Mc.pattern.convertToNegativePattern))}}Za.convertPatternGroupToTask=zv});var jJ=w(Ty=>{"use strict";Object.defineProperty(Ty,"__esModule",{value:!0});Ty.read=void 0;function j0e(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){HJ(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){_v(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){HJ(t,s);return}_v(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),_v(t,o)})})}Ty.read=j0e;function HJ(r,e){r(e)}function _v(r,e){r(null,e)}});var GJ=w(Oy=>{"use strict";Object.defineProperty(Oy,"__esModule",{value:!0});Oy.read=void 0;function G0e(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}Oy.read=G0e});var YJ=w(rl=>{"use strict";Object.defineProperty(rl,"__esModule",{value:!0});rl.createFileSystemAdapter=rl.FILE_SYSTEM_ADAPTER=void 0;var My=require("fs");rl.FILE_SYSTEM_ADAPTER={lstat:My.lstat,stat:My.stat,lstatSync:My.lstatSync,statSync:My.statSync};function Y0e(r){return r===void 0?rl.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rl.FILE_SYSTEM_ADAPTER),r)}rl.createFileSystemAdapter=Y0e});var JJ=w(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});var q0e=YJ(),qJ=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=q0e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};Vv.default=qJ});var Kc=w(il=>{"use strict";Object.defineProperty(il,"__esModule",{value:!0});il.statSync=il.stat=il.Settings=void 0;var WJ=jJ(),J0e=GJ(),Xv=JJ();il.Settings=Xv.default;function W0e(r,e,t){if(typeof e=="function"){WJ.read(r,Zv(),e);return}WJ.read(r,Zv(e),t)}il.stat=W0e;function z0e(r,e){let t=Zv(e);return J0e.read(r,t)}il.statSync=z0e;function Zv(r={}){return r instanceof Xv.default?r:new Xv.default(r)}});var _J=w((ftt,zJ)=>{zJ.exports=_0e;function _0e(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var $v=w(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Uy=process.versions.node.split(".");if(Uy[0]===void 0||Uy[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var VJ=Number.parseInt(Uy[0],10),V0e=Number.parseInt(Uy[1],10),XJ=10,X0e=10,Z0e=VJ>XJ,$0e=VJ===XJ&&V0e>=X0e;Ky.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Z0e||$0e});var $J=w(Hy=>{"use strict";Object.defineProperty(Hy,"__esModule",{value:!0});Hy.createDirentFromStats=void 0;var ZJ=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function ebe(r,e){return new ZJ(r,e)}Hy.createDirentFromStats=ebe});var ex=w(jy=>{"use strict";Object.defineProperty(jy,"__esModule",{value:!0});jy.fs=void 0;var tbe=$J();jy.fs=tbe});var tx=w(Gy=>{"use strict";Object.defineProperty(Gy,"__esModule",{value:!0});Gy.joinPathSegments=void 0;function rbe(r,e,t){return r.endsWith(t)?r+e:r+t+e}Gy.joinPathSegments=rbe});var s3=w(nl=>{"use strict";Object.defineProperty(nl,"__esModule",{value:!0});nl.readdir=nl.readdirWithFileTypes=nl.read=void 0;var ibe=Kc(),e3=_J(),nbe=$v(),t3=ex(),r3=tx();function sbe(r,e,t){if(!e.stats&&nbe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){i3(r,e,t);return}n3(r,e,t)}nl.read=sbe;function i3(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:r3.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){rx(t,s);return}let o=s.map(a=>obe(a,e));e3(o,(a,l)=>{if(a!==null){Yy(t,a);return}rx(t,l)})})}nl.readdirWithFileTypes=i3;function obe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=t3.fs.createDirentFromStats(r.name,n),t(null,r)})}}function n3(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Yy(t,i);return}let s=n.map(o=>{let a=r3.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{ibe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:t3.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});e3(s,(o,a)=>{if(o!==null){Yy(t,o);return}rx(t,a)})})}nl.readdir=n3;function Yy(r,e){r(e)}function rx(r,e){r(null,e)}});var c3=w(sl=>{"use strict";Object.defineProperty(sl,"__esModule",{value:!0});sl.readdir=sl.readdirWithFileTypes=sl.read=void 0;var abe=Kc(),Abe=$v(),o3=ex(),a3=tx();function lbe(r,e){return!e.stats&&Abe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?A3(r,e):l3(r,e)}sl.read=lbe;function A3(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:a3.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=o3.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}sl.readdirWithFileTypes=A3;function l3(r,e){return e.fs.readdirSync(r).map(i=>{let n=a3.joinPathSegments(r,i,e.pathSegmentSeparator),s=abe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:o3.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}sl.readdir=l3});var u3=w(ol=>{"use strict";Object.defineProperty(ol,"__esModule",{value:!0});ol.createFileSystemAdapter=ol.FILE_SYSTEM_ADAPTER=void 0;var Ug=require("fs");ol.FILE_SYSTEM_ADAPTER={lstat:Ug.lstat,stat:Ug.stat,lstatSync:Ug.lstatSync,statSync:Ug.statSync,readdir:Ug.readdir,readdirSync:Ug.readdirSync};function cbe(r){return r===void 0?ol.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},ol.FILE_SYSTEM_ADAPTER),r)}ol.createFileSystemAdapter=cbe});var f3=w(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var ube=require("path"),gbe=Kc(),fbe=u3(),g3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=fbe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,ube.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new gbe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};ix.default=g3});var qy=w(al=>{"use strict";Object.defineProperty(al,"__esModule",{value:!0});al.Settings=al.scandirSync=al.scandir=void 0;var h3=s3(),hbe=c3(),nx=f3();al.Settings=nx.default;function pbe(r,e,t){if(typeof e=="function"){h3.read(r,sx(),e);return}h3.read(r,sx(e),t)}al.scandir=pbe;function dbe(r,e){let t=sx(e);return hbe.read(r,t)}al.scandirSync=dbe;function sx(r={}){return r instanceof nx.default?r:new nx.default(r)}});var d3=w((Btt,p3)=>{"use strict";function Cbe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}p3.exports=Cbe});var m3=w((btt,ox)=>{"use strict";var mbe=d3();function C3(r,e,t){if(typeof r=="function"&&(t=e,e=r,r=null),t<1)throw new Error("fastqueue concurrency must be greater than 1");var i=mbe(Ebe),n=null,s=null,o=0,a=null,l={push:m,drain:Vo,saturated:Vo,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Vo,kill:v,killAndDrain:x,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var q=n,Y=0;q;)q=q.next,Y++;return Y}function f(){for(var q=n,Y=[];q;)Y.push(q.value),q=q.next;return Y}function h(){if(!!l.paused){l.paused=!1;for(var q=0;q{"use strict";Object.defineProperty(Xo,"__esModule",{value:!0});Xo.joinPathSegments=Xo.replacePathSegmentSeparator=Xo.isAppliedFilter=Xo.isFatalError=void 0;function ybe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Xo.isFatalError=ybe;function wbe(r,e){return r===null||r(e)}Xo.isAppliedFilter=wbe;function Bbe(r,e){return r.split(/[/\\]/).join(e)}Xo.replacePathSegmentSeparator=Bbe;function bbe(r,e,t){return r===""?e:r.endsWith(t)?r+e:r+t+e}Xo.joinPathSegments=bbe});var Ax=w(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var Qbe=Jy(),E3=class{constructor(e,t){this._root=e,this._settings=t,this._root=Qbe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};ax.default=E3});var cx=w(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var Sbe=require("events"),vbe=qy(),xbe=m3(),Wy=Jy(),kbe=Ax(),I3=class extends kbe.default{constructor(e,t){super(e,t);this._settings=t,this._scandir=vbe.scandir,this._emitter=new Sbe.EventEmitter,this._queue=xbe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!Wy.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=Wy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),Wy.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Wy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};lx.default=I3});var w3=w(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var Pbe=cx(),y3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Pbe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{Dbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{Rbe(e,[...this._storage])}),this._reader.read()}};ux.default=y3;function Dbe(r,e){r(e)}function Rbe(r,e){r(null,e)}});var b3=w(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var Fbe=require("stream"),Nbe=cx(),B3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Nbe.default(this._root,this._settings),this._stream=new Fbe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};gx.default=B3});var S3=w(fx=>{"use strict";Object.defineProperty(fx,"__esModule",{value:!0});var Lbe=qy(),zy=Jy(),Tbe=Ax(),Q3=class extends Tbe.default{constructor(){super(...arguments);this._scandir=Lbe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!zy.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=zy.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),zy.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&zy.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};fx.default=Q3});var x3=w(hx=>{"use strict";Object.defineProperty(hx,"__esModule",{value:!0});var Obe=S3(),v3=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new Obe.default(this._root,this._settings)}read(){return this._reader.read()}};hx.default=v3});var P3=w(px=>{"use strict";Object.defineProperty(px,"__esModule",{value:!0});var Mbe=require("path"),Kbe=qy(),k3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Mbe.sep),this.fsScandirSettings=new Kbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};px.default=k3});var Cx=w(Zo=>{"use strict";Object.defineProperty(Zo,"__esModule",{value:!0});Zo.Settings=Zo.walkStream=Zo.walkSync=Zo.walk=void 0;var D3=w3(),Ube=b3(),Hbe=x3(),dx=P3();Zo.Settings=dx.default;function jbe(r,e,t){if(typeof e=="function"){new D3.default(r,_y()).read(e);return}new D3.default(r,_y(e)).read(t)}Zo.walk=jbe;function Gbe(r,e){let t=_y(e);return new Hbe.default(r,t).read()}Zo.walkSync=Gbe;function Ybe(r,e){let t=_y(e);return new Ube.default(r,t).read()}Zo.walkStream=Ybe;function _y(r={}){return r instanceof dx.default?r:new dx.default(r)}});var Ex=w(mx=>{"use strict";Object.defineProperty(mx,"__esModule",{value:!0});var qbe=require("path"),Jbe=Kc(),R3=Xa(),F3=class{constructor(e){this._settings=e,this._fsStatSettings=new Jbe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return qbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:R3.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!R3.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};mx.default=F3});var yx=w(Ix=>{"use strict";Object.defineProperty(Ix,"__esModule",{value:!0});var Wbe=require("stream"),zbe=Kc(),_be=Cx(),Vbe=Ex(),N3=class extends Vbe.default{constructor(){super(...arguments);this._walkStream=_be.walkStream,this._stat=zbe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new Wbe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};Ix.default=N3});var T3=w(wx=>{"use strict";Object.defineProperty(wx,"__esModule",{value:!0});var Hg=Xa(),L3=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Hg.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Hg.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Hg.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Hg.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Hg.array.splitWhen(e,t=>t.dynamic&&Hg.pattern.hasGlobStar(t.pattern))}};wx.default=L3});var M3=w(Bx=>{"use strict";Object.defineProperty(Bx,"__esModule",{value:!0});var Xbe=T3(),O3=class extends Xbe.default{match(e){let t=e.split("/"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};Bx.default=O3});var U3=w(bx=>{"use strict";Object.defineProperty(bx,"__esModule",{value:!0});var Vy=Xa(),Zbe=M3(),K3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Zbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(Vy.pattern.isAffectDepthOfReadingPattern);return Vy.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=Vy.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split("/").length;return t.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!Vy.pattern.matchAny(e,t)}};bx.default=K3});var j3=w(Qx=>{"use strict";Object.defineProperty(Qx,"__esModule",{value:!0});var sd=Xa(),H3=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=sd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=sd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=sd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=sd.path.removeLeadingDotSegment(e);return sd.pattern.matchAny(i,t)}};Qx.default=H3});var Y3=w(Sx=>{"use strict";Object.defineProperty(Sx,"__esModule",{value:!0});var $be=Xa(),G3=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return $be.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Sx.default=G3});var W3=w(vx=>{"use strict";Object.defineProperty(vx,"__esModule",{value:!0});var q3=Xa(),J3=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=q3.path.makeAbsolute(this._settings.cwd,t),t=q3.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};vx.default=J3});var Xy=w(xx=>{"use strict";Object.defineProperty(xx,"__esModule",{value:!0});var eQe=require("path"),tQe=U3(),rQe=j3(),iQe=Y3(),nQe=W3(),z3=class{constructor(e){this._settings=e,this.errorFilter=new iQe.default(this._settings),this.entryFilter=new rQe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new tQe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new nQe.default(this._settings)}_getRootDirectory(e){return eQe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base==="."?"":e.base;return{basePath:t,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};xx.default=z3});var V3=w(kx=>{"use strict";Object.defineProperty(kx,"__esModule",{value:!0});var sQe=yx(),oQe=Xy(),_3=class extends oQe.default{constructor(){super(...arguments);this._reader=new sQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};kx.default=_3});var Z3=w(Px=>{"use strict";Object.defineProperty(Px,"__esModule",{value:!0});var aQe=require("stream"),AQe=yx(),lQe=Xy(),X3=class extends lQe.default{constructor(){super(...arguments);this._reader=new AQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new aQe.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Px.default=X3});var eW=w(Dx=>{"use strict";Object.defineProperty(Dx,"__esModule",{value:!0});var cQe=Kc(),uQe=Cx(),gQe=Ex(),$3=class extends gQe.default{constructor(){super(...arguments);this._walkSync=uQe.walkSync,this._statSync=cQe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};Dx.default=$3});var rW=w(Rx=>{"use strict";Object.defineProperty(Rx,"__esModule",{value:!0});var fQe=eW(),hQe=Xy(),tW=class extends hQe.default{constructor(){super(...arguments);this._reader=new fQe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};Rx.default=tW});var nW=w(od=>{"use strict";Object.defineProperty(od,"__esModule",{value:!0});var jg=require("fs"),pQe=require("os"),dQe=pQe.cpus().length;od.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:jg.lstat,lstatSync:jg.lstatSync,stat:jg.stat,statSync:jg.statSync,readdir:jg.readdir,readdirSync:jg.readdirSync};var iW=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,dQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},od.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};od.default=iW});var Zy=w((ztt,sW)=>{"use strict";var oW=UJ(),CQe=V3(),mQe=Z3(),EQe=rW(),Fx=nW(),Uc=Xa();async function Lx(r,e){Gg(r);let t=Nx(r,CQe.default,e),i=await Promise.all(t);return Uc.array.flatten(i)}(function(r){function e(o,a){Gg(o);let l=Nx(o,EQe.default,a);return Uc.array.flatten(l)}r.sync=e;function t(o,a){Gg(o);let l=Nx(o,mQe.default,a);return Uc.stream.merge(l)}r.stream=t;function i(o,a){Gg(o);let l=[].concat(o),c=new Fx.default(a);return oW.generate(l,c)}r.generateTasks=i;function n(o,a){Gg(o);let l=new Fx.default(a);return Uc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return Gg(o),Uc.path.escape(o)}r.escapePath=s})(Lx||(Lx={}));function Nx(r,e,t){let i=[].concat(r),n=new Fx.default(t),s=oW.generate(i,n),o=new e(n);return s.map(o.read,o)}function Gg(r){if(![].concat(r).every(i=>Uc.string.isString(i)&&!Uc.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}sW.exports=Lx});var AW=w(Hc=>{"use strict";var{promisify:IQe}=require("util"),aW=require("fs");async function Tx(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await IQe(aW[r])(t))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Ox(r,e,t){if(typeof t!="string")throw new TypeError(`Expected a string, got ${typeof t}`);try{return aW[r](t)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Hc.isFile=Tx.bind(null,"stat","isFile");Hc.isDirectory=Tx.bind(null,"stat","isDirectory");Hc.isSymlink=Tx.bind(null,"lstat","isSymbolicLink");Hc.isFileSync=Ox.bind(null,"statSync","isFile");Hc.isDirectorySync=Ox.bind(null,"statSync","isDirectory");Hc.isSymlinkSync=Ox.bind(null,"lstatSync","isSymbolicLink")});var fW=w((Vtt,Mx)=>{"use strict";var jc=require("path"),lW=AW(),cW=r=>r.length>1?`{${r.join(",")}}`:r[0],uW=(r,e)=>{let t=r[0]==="!"?r.slice(1):r;return jc.isAbsolute(t)?t:jc.join(e,t)},yQe=(r,e)=>jc.extname(r)?`**/${r}`:`**/${r}.${cW(e)}`,gW=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(t=>jc.posix.join(r,yQe(t,e.extensions))):e.files?e.files.map(t=>jc.posix.join(r,`**/${t}`)):e.extensions?[jc.posix.join(r,`**/*.${cW(e.extensions)}`)]:[jc.posix.join(r,"**")]};Mx.exports=async(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=await Promise.all([].concat(r).map(async i=>await lW.isDirectory(uW(i,e.cwd))?gW(i,e):i));return[].concat.apply([],t)};Mx.exports.sync=(r,e)=>{if(e=N({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let t=[].concat(r).map(i=>lW.isDirectorySync(uW(i,e.cwd))?gW(i,e):i);return[].concat.apply([],t)}});var BW=w((Xtt,hW)=>{function pW(r){return Array.isArray(r)?r:[r]}var dW="",CW=" ",Kx="\\",wQe=/^\s+$/,BQe=/^\\!/,bQe=/^\\#/,QQe=/\r?\n/g,SQe=/^\.*\/|^\.+$/,Ux="/",mW=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",vQe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),xQe=/([0-z])-([0-z])/g,kQe=r=>r.replace(xQe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:dW),PQe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},DQe=[[/\\?\s+$/,r=>r.indexOf("\\")===0?CW:dW],[/\\\s/g,()=>CW],[/[\\$.|*+(){^]/g,r=>`\\${r}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(r,e,t)=>e+6`${e}[^\\/]*`],[/\\\\\\(?=[$.|*+(){^])/g,()=>Kx],[/\\\\/g,()=>Kx],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(r,e,t,i,n)=>e===Kx?`\\[${t}${PQe(i)}${n}`:n==="]"&&i.length%2==0?`[${kQe(t)}${i}]`:"[]"],[/(?:[^*])$/,r=>/\/$/.test(r)?`${r}$`:`${r}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(r,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],EW=Object.create(null),RQe=(r,e)=>{let t=EW[r];return t||(t=DQe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),EW[r]=t),e?new RegExp(t,"i"):new RegExp(t)},Hx=r=>typeof r=="string",FQe=r=>r&&Hx(r)&&!wQe.test(r)&&r.indexOf("#")!==0,NQe=r=>r.split(QQe),IW=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},LQe=(r,e)=>{let t=r,i=!1;r.indexOf("!")===0&&(i=!0,r=r.substr(1)),r=r.replace(BQe,"!").replace(bQe,"#");let n=RQe(r,e);return new IW(t,r,i,n)},TQe=(r,e)=>{throw new e(r)},$a=(r,e,t)=>Hx(r)?r?$a.isNotRelative(r)?t(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:t("path must not be empty",TypeError):t(`path must be a string, but got \`${e}\``,TypeError),yW=r=>SQe.test(r);$a.isNotRelative=yW;$a.convert=r=>r;var wW=class{constructor({ignorecase:e=!0}={}){vQe(this,mW,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[mW]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(FQe(e)){let t=LQe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,pW(Hx(e)?NQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&$a.convert(e);return $a(s,e,TQe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(Ux)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(Ux)+Ux,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return pW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},$y=r=>new wW(r),OQe=()=>!1,MQe=r=>$a(r&&$a.convert(r),r,OQe);$y.isPathValid=MQe;$y.default=$y;hW.exports=$y;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let r=t=>/^\\\\\?\\/.test(t)||/["<>|\u0000-\u001F]+/u.test(t)?t:t.replace(/\\/g,"/");$a.convert=r;let e=/^[a-z]:\//i;$a.isNotRelative=t=>e.test(t)||yW(t)}});var QW=w((Ztt,bW)=>{"use strict";bW.exports=r=>{let e=/^\\\\\?\\/.test(r),t=/[^\u0000-\u0080]+/.test(r);return e||t?r:r.replace(/\\/g,"/")}});var RW=w(($tt,jx)=>{"use strict";var{promisify:KQe}=require("util"),SW=require("fs"),eA=require("path"),vW=Zy(),UQe=BW(),ad=QW(),xW=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],HQe=KQe(SW.readFile),jQe=r=>e=>e.startsWith("!")?"!"+eA.posix.join(r,e.slice(1)):eA.posix.join(r,e),GQe=(r,e)=>{let t=ad(eA.relative(e.cwd,eA.dirname(e.fileName)));return r.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(jQe(t))},kW=r=>{let e=UQe();for(let t of r)e.add(GQe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},YQe=(r,e)=>{if(r=ad(r),eA.isAbsolute(e)){if(ad(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return eA.join(r,e)},PW=(r,e)=>t=>r.ignores(ad(eA.relative(e,YQe(e,t.path||t)))),qQe=async(r,e)=>{let t=eA.join(e,r),i=await HQe(t,"utf8");return{cwd:e,filePath:t,content:i}},JQe=(r,e)=>{let t=eA.join(e,r),i=SW.readFileSync(t,"utf8");return{cwd:e,filePath:t,content:i}},DW=({ignore:r=[],cwd:e=ad(process.cwd())}={})=>({ignore:r,cwd:e});jx.exports=async r=>{r=DW(r);let e=await vW("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>qQe(n,r.cwd))),i=kW(t);return PW(i,r.cwd)};jx.exports.sync=r=>{r=DW(r);let t=vW.sync("**/.gitignore",{ignore:xW.concat(r.ignore),cwd:r.cwd}).map(n=>JQe(n,r.cwd)),i=kW(t);return PW(i,r.cwd)}});var TW=w((ert,FW)=>{"use strict";var{Transform:WQe}=require("stream"),Gx=class extends WQe{constructor(){super({objectMode:!0})}},NW=class extends Gx{constructor(e){super();this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},LW=class extends Gx{constructor(){super();this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};FW.exports={FilterStream:NW,UniqueStream:LW}});var Wx=w((trt,Gc)=>{"use strict";var OW=require("fs"),ew=AJ(),zQe=jv(),tw=Zy(),rw=fW(),Yx=RW(),{FilterStream:_Qe,UniqueStream:VQe}=TW(),MW=()=>!1,KW=r=>r[0]==="!",XQe=r=>{if(!r.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},ZQe=(r={})=>{if(!r.cwd)return;let e;try{e=OW.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},$Qe=r=>r.stats instanceof OW.Stats?r.path:r,iw=(r,e)=>{r=ew([].concat(r)),XQe(r),ZQe(e);let t=[];e=N({ignore:[],expandDirectories:!0},e);for(let[i,n]of r.entries()){if(KW(n))continue;let s=r.slice(i).filter(a=>KW(a)).map(a=>a.slice(1)),o=te(N({},e),{ignore:e.ignore.concat(s)});t.push({pattern:n,options:o})}return t},eSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t=te(N({},t),{files:r.options.expandDirectories}):typeof r.options.expandDirectories=="object"&&(t=N(N({},t),r.options.expandDirectories)),e(r.pattern,t)},qx=(r,e)=>r.options.expandDirectories?eSe(r,e):[r.pattern],UW=r=>r&&r.gitignore?Yx.sync({cwd:r.cwd,ignore:r.ignore}):MW,Jx=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=rw.sync(t.ignore)),{pattern:e,options:t}};Gc.exports=async(r,e)=>{let t=iw(r,e),i=async()=>e&&e.gitignore?Yx({cwd:e.cwd,ignore:e.ignore}):MW,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await qx(c,rw);return Promise.all(u.map(Jx(c)))}));return ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>tw(l.pattern,l.options)));return ew(...a).filter(l=>!s($Qe(l)))};Gc.exports.sync=(r,e)=>{let t=iw(r,e),i=[];for(let o of t){let a=qx(o,rw.sync).map(Jx(o));i.push(...a)}let n=UW(e),s=[];for(let o of i)s=ew(s,tw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Gc.exports.stream=(r,e)=>{let t=iw(r,e),i=[];for(let a of t){let l=qx(a,rw.sync).map(Jx(a));i.push(...l)}let n=UW(e),s=new _Qe(a=>!n(a)),o=new VQe;return zQe(i.map(a=>tw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Gc.exports.generateGlobTasks=iw;Gc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>tw.isDynamicPattern(t,e));Gc.exports.gitignore=Yx});var Rn=w((xrt,t4)=>{function fSe(r){var e=typeof r;return r!=null&&(e=="object"||e=="function")}t4.exports=fSe});var rk=w((krt,r4)=>{var hSe=typeof global=="object"&&global&&global.Object===Object&&global;r4.exports=hSe});var Ns=w((Prt,i4)=>{var pSe=rk(),dSe=typeof self=="object"&&self&&self.Object===Object&&self,CSe=pSe||dSe||Function("return this")();i4.exports=CSe});var s4=w((Drt,n4)=>{var mSe=Ns(),ESe=function(){return mSe.Date.now()};n4.exports=ESe});var a4=w((Rrt,o4)=>{var ISe=/\s/;function ySe(r){for(var e=r.length;e--&&ISe.test(r.charAt(e)););return e}o4.exports=ySe});var l4=w((Frt,A4)=>{var wSe=a4(),BSe=/^\s+/;function bSe(r){return r&&r.slice(0,wSe(r)+1).replace(BSe,"")}A4.exports=bSe});var Jc=w((Nrt,c4)=>{var QSe=Ns(),SSe=QSe.Symbol;c4.exports=SSe});var h4=w((Lrt,u4)=>{var g4=Jc(),f4=Object.prototype,vSe=f4.hasOwnProperty,xSe=f4.toString,Ed=g4?g4.toStringTag:void 0;function kSe(r){var e=vSe.call(r,Ed),t=r[Ed];try{r[Ed]=void 0;var i=!0}catch(s){}var n=xSe.call(r);return i&&(e?r[Ed]=t:delete r[Ed]),n}u4.exports=kSe});var d4=w((Trt,p4)=>{var PSe=Object.prototype,DSe=PSe.toString;function RSe(r){return DSe.call(r)}p4.exports=RSe});var Wc=w((Ort,C4)=>{var m4=Jc(),FSe=h4(),NSe=d4(),LSe="[object Null]",TSe="[object Undefined]",E4=m4?m4.toStringTag:void 0;function OSe(r){return r==null?r===void 0?TSe:LSe:E4&&E4 in Object(r)?FSe(r):NSe(r)}C4.exports=OSe});var ta=w((Mrt,I4)=>{function MSe(r){return r!=null&&typeof r=="object"}I4.exports=MSe});var Id=w((Krt,y4)=>{var KSe=Wc(),USe=ta(),HSe="[object Symbol]";function jSe(r){return typeof r=="symbol"||USe(r)&&KSe(r)==HSe}y4.exports=jSe});var Q4=w((Urt,w4)=>{var GSe=l4(),B4=Rn(),YSe=Id(),b4=0/0,qSe=/^[-+]0x[0-9a-f]+$/i,JSe=/^0b[01]+$/i,WSe=/^0o[0-7]+$/i,zSe=parseInt;function _Se(r){if(typeof r=="number")return r;if(YSe(r))return b4;if(B4(r)){var e=typeof r.valueOf=="function"?r.valueOf():r;r=B4(e)?e+"":e}if(typeof r!="string")return r===0?r:+r;r=GSe(r);var t=JSe.test(r);return t||WSe.test(r)?zSe(r.slice(2),t?2:8):qSe.test(r)?b4:+r}w4.exports=_Se});var x4=w((Hrt,S4)=>{var VSe=Rn(),ik=s4(),v4=Q4(),XSe="Expected a function",ZSe=Math.max,$Se=Math.min;function eve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!="function")throw new TypeError(XSe);e=v4(e)||0,VSe(t)&&(u=!!t.leading,g="maxWait"in t,s=g?ZSe(v4(t.maxWait)||0,e):s,f="trailing"in t?!!t.trailing:f);function h(Y){var $=i,_=n;return i=n=void 0,c=Y,o=r.apply(_,$),o}function p(Y){return c=Y,a=setTimeout(b,e),u?h(Y):o}function m(Y){var $=Y-l,_=Y-c,ne=e-$;return g?$Se(ne,s-_):ne}function y(Y){var $=Y-l,_=Y-c;return l===void 0||$>=e||$<0||g&&_>=s}function b(){var Y=ik();if(y(Y))return v(Y);a=setTimeout(b,m(Y))}function v(Y){return a=void 0,f&&i?h(Y):(i=n=void 0,o)}function x(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:v(ik())}function q(){var Y=ik(),$=y(Y);if(i=arguments,n=this,l=Y,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(b,e),h(l)}return a===void 0&&(a=setTimeout(b,e)),o}return q.cancel=x,q.flush=T,q}S4.exports=eve});var P4=w((jrt,k4)=>{var tve=x4(),rve=Rn(),ive="Expected a function";function nve(r,e,t){var i=!0,n=!0;if(typeof r!="function")throw new TypeError(ive);return rve(t)&&(i="leading"in t?!!t.leading:i,n="trailing"in t?!!t.trailing:n),tve(r,e,{leading:i,maxWait:e,trailing:n})}k4.exports=nve});var iA=w((rA,Bw)=>{"use strict";Object.defineProperty(rA,"__esModule",{value:!0});var M4=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Cve(r){return M4.includes(r)}var mve=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...M4];function Eve(r){return mve.includes(r)}var Ive=["null","undefined","string","number","bigint","boolean","symbol"];function yve(r){return Ive.includes(r)}function Xg(r){return e=>typeof e===r}var{toString:K4}=Object.prototype,vd=r=>{let e=K4.call(r).slice(8,-1);if(/HTML\w+Element/.test(e)&&W.domElement(r))return"HTMLElement";if(Eve(e))return e},hr=r=>e=>vd(e)===r;function W(r){if(r===null)return"null";switch(typeof r){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(W.observable(r))return"Observable";if(W.array(r))return"Array";if(W.buffer(r))return"Buffer";let e=vd(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}W.undefined=Xg("undefined");W.string=Xg("string");var wve=Xg("number");W.number=r=>wve(r)&&!W.nan(r);W.bigint=Xg("bigint");W.function_=Xg("function");W.null_=r=>r===null;W.class_=r=>W.function_(r)&&r.toString().startsWith("class ");W.boolean=r=>r===!0||r===!1;W.symbol=Xg("symbol");W.numericString=r=>W.string(r)&&!W.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));W.array=(r,e)=>Array.isArray(r)?W.function_(e)?r.every(e):!0:!1;W.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};W.nullOrUndefined=r=>W.null_(r)||W.undefined(r);W.object=r=>!W.null_(r)&&(typeof r=="object"||W.function_(r));W.iterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};W.asyncIterable=r=>{var e;return W.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};W.generator=r=>W.iterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.asyncGenerator=r=>W.asyncIterable(r)&&W.function_(r.next)&&W.function_(r.throw);W.nativePromise=r=>hr("Promise")(r);var Bve=r=>{var e,t;return W.function_((e=r)===null||e===void 0?void 0:e.then)&&W.function_((t=r)===null||t===void 0?void 0:t.catch)};W.promise=r=>W.nativePromise(r)||Bve(r);W.generatorFunction=hr("GeneratorFunction");W.asyncGeneratorFunction=r=>vd(r)==="AsyncGeneratorFunction";W.asyncFunction=r=>vd(r)==="AsyncFunction";W.boundFunction=r=>W.function_(r)&&!r.hasOwnProperty("prototype");W.regExp=hr("RegExp");W.date=hr("Date");W.error=hr("Error");W.map=r=>hr("Map")(r);W.set=r=>hr("Set")(r);W.weakMap=r=>hr("WeakMap")(r);W.weakSet=r=>hr("WeakSet")(r);W.int8Array=hr("Int8Array");W.uint8Array=hr("Uint8Array");W.uint8ClampedArray=hr("Uint8ClampedArray");W.int16Array=hr("Int16Array");W.uint16Array=hr("Uint16Array");W.int32Array=hr("Int32Array");W.uint32Array=hr("Uint32Array");W.float32Array=hr("Float32Array");W.float64Array=hr("Float64Array");W.bigInt64Array=hr("BigInt64Array");W.bigUint64Array=hr("BigUint64Array");W.arrayBuffer=hr("ArrayBuffer");W.sharedArrayBuffer=hr("SharedArrayBuffer");W.dataView=hr("DataView");W.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;W.urlInstance=r=>hr("URL")(r);W.urlString=r=>{if(!W.string(r))return!1;try{return new URL(r),!0}catch(e){return!1}};W.truthy=r=>Boolean(r);W.falsy=r=>!r;W.nan=r=>Number.isNaN(r);W.primitive=r=>W.null_(r)||yve(typeof r);W.integer=r=>Number.isInteger(r);W.safeInteger=r=>Number.isSafeInteger(r);W.plainObject=r=>{if(K4.call(r)!=="[object Object]")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};W.typedArray=r=>Cve(vd(r));var bve=r=>W.safeInteger(r)&&r>=0;W.arrayLike=r=>!W.nullOrUndefined(r)&&!W.function_(r)&&bve(r.length);W.inRange=(r,e)=>{if(W.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(W.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Qve=1,Sve=["innerHTML","ownerDocument","style","attributes","nodeValue"];W.domElement=r=>W.object(r)&&r.nodeType===Qve&&W.string(r.nodeName)&&!W.plainObject(r)&&Sve.every(e=>e in r);W.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};W.nodeStream=r=>W.object(r)&&W.function_(r.pipe)&&!W.observable(r);W.infinite=r=>r===Infinity||r===-Infinity;var U4=r=>e=>W.integer(e)&&Math.abs(e%2)===r;W.evenInteger=U4(0);W.oddInteger=U4(1);W.emptyArray=r=>W.array(r)&&r.length===0;W.nonEmptyArray=r=>W.array(r)&&r.length>0;W.emptyString=r=>W.string(r)&&r.length===0;W.nonEmptyString=r=>W.string(r)&&r.length>0;var vve=r=>W.string(r)&&!/\S/.test(r);W.emptyStringOrWhitespace=r=>W.emptyString(r)||vve(r);W.emptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length===0;W.nonEmptyObject=r=>W.object(r)&&!W.map(r)&&!W.set(r)&&Object.keys(r).length>0;W.emptySet=r=>W.set(r)&&r.size===0;W.nonEmptySet=r=>W.set(r)&&r.size>0;W.emptyMap=r=>W.map(r)&&r.size===0;W.nonEmptyMap=r=>W.map(r)&&r.size>0;W.propertyKey=r=>W.any([W.string,W.number,W.symbol],r);W.formData=r=>hr("FormData")(r);W.urlSearchParams=r=>hr("URLSearchParams")(r);var H4=(r,e,t)=>{if(!W.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError("Invalid number of values");return r.call(t,e)};W.any=(r,...e)=>(W.array(r)?r:[r]).some(i=>H4(Array.prototype.some,i,e));W.all=(r,...e)=>H4(Array.prototype.every,r,e);var We=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\`${W(o)}\``))].join(", ")}`:`received value of type \`${W(t)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};rA.assert={undefined:r=>We(W.undefined(r),"undefined",r),string:r=>We(W.string(r),"string",r),number:r=>We(W.number(r),"number",r),bigint:r=>We(W.bigint(r),"bigint",r),function_:r=>We(W.function_(r),"Function",r),null_:r=>We(W.null_(r),"null",r),class_:r=>We(W.class_(r),"Class",r),boolean:r=>We(W.boolean(r),"boolean",r),symbol:r=>We(W.symbol(r),"symbol",r),numericString:r=>We(W.numericString(r),"string with a number",r),array:(r,e)=>{We(W.array(r),"Array",r),e&&r.forEach(e)},buffer:r=>We(W.buffer(r),"Buffer",r),nullOrUndefined:r=>We(W.nullOrUndefined(r),"null or undefined",r),object:r=>We(W.object(r),"Object",r),iterable:r=>We(W.iterable(r),"Iterable",r),asyncIterable:r=>We(W.asyncIterable(r),"AsyncIterable",r),generator:r=>We(W.generator(r),"Generator",r),asyncGenerator:r=>We(W.asyncGenerator(r),"AsyncGenerator",r),nativePromise:r=>We(W.nativePromise(r),"native Promise",r),promise:r=>We(W.promise(r),"Promise",r),generatorFunction:r=>We(W.generatorFunction(r),"GeneratorFunction",r),asyncGeneratorFunction:r=>We(W.asyncGeneratorFunction(r),"AsyncGeneratorFunction",r),asyncFunction:r=>We(W.asyncFunction(r),"AsyncFunction",r),boundFunction:r=>We(W.boundFunction(r),"Function",r),regExp:r=>We(W.regExp(r),"RegExp",r),date:r=>We(W.date(r),"Date",r),error:r=>We(W.error(r),"Error",r),map:r=>We(W.map(r),"Map",r),set:r=>We(W.set(r),"Set",r),weakMap:r=>We(W.weakMap(r),"WeakMap",r),weakSet:r=>We(W.weakSet(r),"WeakSet",r),int8Array:r=>We(W.int8Array(r),"Int8Array",r),uint8Array:r=>We(W.uint8Array(r),"Uint8Array",r),uint8ClampedArray:r=>We(W.uint8ClampedArray(r),"Uint8ClampedArray",r),int16Array:r=>We(W.int16Array(r),"Int16Array",r),uint16Array:r=>We(W.uint16Array(r),"Uint16Array",r),int32Array:r=>We(W.int32Array(r),"Int32Array",r),uint32Array:r=>We(W.uint32Array(r),"Uint32Array",r),float32Array:r=>We(W.float32Array(r),"Float32Array",r),float64Array:r=>We(W.float64Array(r),"Float64Array",r),bigInt64Array:r=>We(W.bigInt64Array(r),"BigInt64Array",r),bigUint64Array:r=>We(W.bigUint64Array(r),"BigUint64Array",r),arrayBuffer:r=>We(W.arrayBuffer(r),"ArrayBuffer",r),sharedArrayBuffer:r=>We(W.sharedArrayBuffer(r),"SharedArrayBuffer",r),dataView:r=>We(W.dataView(r),"DataView",r),urlInstance:r=>We(W.urlInstance(r),"URL",r),urlString:r=>We(W.urlString(r),"string with a URL",r),truthy:r=>We(W.truthy(r),"truthy",r),falsy:r=>We(W.falsy(r),"falsy",r),nan:r=>We(W.nan(r),"NaN",r),primitive:r=>We(W.primitive(r),"primitive",r),integer:r=>We(W.integer(r),"integer",r),safeInteger:r=>We(W.safeInteger(r),"integer",r),plainObject:r=>We(W.plainObject(r),"plain object",r),typedArray:r=>We(W.typedArray(r),"TypedArray",r),arrayLike:r=>We(W.arrayLike(r),"array-like",r),domElement:r=>We(W.domElement(r),"HTMLElement",r),observable:r=>We(W.observable(r),"Observable",r),nodeStream:r=>We(W.nodeStream(r),"Node.js Stream",r),infinite:r=>We(W.infinite(r),"infinite number",r),emptyArray:r=>We(W.emptyArray(r),"empty array",r),nonEmptyArray:r=>We(W.nonEmptyArray(r),"non-empty array",r),emptyString:r=>We(W.emptyString(r),"empty string",r),nonEmptyString:r=>We(W.nonEmptyString(r),"non-empty string",r),emptyStringOrWhitespace:r=>We(W.emptyStringOrWhitespace(r),"empty string or whitespace",r),emptyObject:r=>We(W.emptyObject(r),"empty object",r),nonEmptyObject:r=>We(W.nonEmptyObject(r),"non-empty object",r),emptySet:r=>We(W.emptySet(r),"empty set",r),nonEmptySet:r=>We(W.nonEmptySet(r),"non-empty set",r),emptyMap:r=>We(W.emptyMap(r),"empty map",r),nonEmptyMap:r=>We(W.nonEmptyMap(r),"non-empty map",r),propertyKey:r=>We(W.propertyKey(r),"PropertyKey",r),formData:r=>We(W.formData(r),"FormData",r),urlSearchParams:r=>We(W.urlSearchParams(r),"URLSearchParams",r),evenInteger:r=>We(W.evenInteger(r),"even integer",r),oddInteger:r=>We(W.oddInteger(r),"odd integer",r),directInstanceOf:(r,e)=>We(W.directInstanceOf(r,e),"T",r),inRange:(r,e)=>We(W.inRange(r,e),"in range",r),any:(r,...e)=>We(W.any(r,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(r,...e)=>We(W.all(r,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(W,{class:{value:W.class_},function:{value:W.function_},null:{value:W.null_}});Object.defineProperties(rA.assert,{class:{value:rA.assert.class_},function:{value:rA.assert.function_},null:{value:rA.assert.null_}});rA.default=W;Bw.exports=W;Bw.exports.default=W;Bw.exports.assert=rA.assert});var j4=w((Wit,Bk)=>{"use strict";var bk=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},xd=class{static fn(e){return(...t)=>new xd((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new bk(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(xd.prototype,Promise.prototype);Bk.exports=xd;Bk.exports.CancelError=bk});var G4=w((Qk,Sk)=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});var xve=require("tls"),vk=(r,e)=>{let t;typeof e=="function"?t={connect:e}:t=e;let i=typeof t.connect=="function",n=typeof t.secureConnect=="function",s=typeof t.close=="function",o=()=>{i&&t.connect(),r instanceof xve.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once("secureConnect",t.secureConnect)),s&&r.once("close",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once("connect",o):r.destroyed&&s&&t.close(r._hadError)};Qk.default=vk;Sk.exports=vk;Sk.exports.default=vk});var Y4=w((xk,kk)=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var kve=G4(),Pve=Number(process.versions.node.split(".")[0]),Pk=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Pve>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),kve.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished=="boolean"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener("finish",n),r.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};xk.default=Pk;kk.exports=Pk;kk.exports.default=Pk});var X4=w((zit,Dk)=>{"use strict";var{V4MAPPED:Dve,ADDRCONFIG:Rve,ALL:q4,promises:{Resolver:J4},lookup:Fve}=require("dns"),{promisify:Rk}=require("util"),Nve=require("os"),Zg=Symbol("cacheableLookupCreateConnection"),Fk=Symbol("cacheableLookupInstance"),W4=Symbol("expires"),Lve=typeof q4=="number",z4=r=>{if(!(r&&typeof r.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Tve=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},_4=()=>{let r=!1,e=!1;for(let t of Object.values(Nve.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family==="IPv6"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},Ove=r=>Symbol.iterator in r,V4={ttl:!0},Mve={all:!0},Nk=class{constructor({cache:e=new Map,maxTtl:t=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new J4,lookup:o=Fve}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Rk(o),this._resolver instanceof J4?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Rk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Rk(this._resolver.resolve6.bind(this._resolver))),this._iface=_4(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t=="function"?(i=t,t={}):typeof t=="number"&&(t={family:t}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t=="number"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&Dve&&(Lve&&t.hints&q4||n.length===0)?Tve(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&Rve){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>N({},i)),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,V4),this._resolve6(e,V4)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(t){return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[W4]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Ove(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Mve);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[W4];n>=a?this._cache.delete(s):a("lookup"in t||(t.lookup=this.lookup),e[Zg](t,i))}uninstall(e){if(z4(e),e[Zg]){if(e[Fk]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Zg],delete e[Zg],delete e[Fk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=_4(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};Dk.exports=Nk;Dk.exports.default=Nk});var e8=w((_it,Lk)=>{"use strict";var Kve=typeof URL=="undefined"?require("url").URL:URL,Uve="text/plain",Hve="us-ascii",Z4=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),jve=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(";"),n=t[2],s=e?"":t[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Hve)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==Uve)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},$4=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(r=r.trim(),/^data:/i.test(r))return jve(r,e);let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new Kve(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];Z4(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Z4(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),r=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};Lk.exports=$4;Lk.exports.default=$4});var i8=w((Vit,t8)=>{t8.exports=r8;function r8(r,e){if(r&&e)return r8(r)(e);if(typeof r!="function")throw new TypeError("need wrapper function");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n{var n8=i8();Tk.exports=n8(bw);Tk.exports.strict=n8(s8);bw.proto=bw(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bw(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return s8(this)},configurable:!0})});function bw(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function s8(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||"Function wrapped with `once`";return e.onceError=t+" shouldn't be called more than once",e.called=!1,e}});var Mk=w((Zit,o8)=>{var Gve=Ok(),Yve=function(){},qve=function(r){return r.setHeader&&typeof r.abort=="function"},Jve=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},a8=function(r,e,t){if(typeof e=="function")return a8(r,null,e);e||(e={}),t=Gve(t||Yve);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error("exited with error code: "+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error("premature close"));if(o&&!(i&&i.ended))return t.call(r,new Error("premature close"))},h=function(){r.req.on("finish",l)};return qve(r)?(r.on("complete",l),r.on("abort",f),r.req?h():r.on("request",h)):o&&!i&&(r.on("end",a),r.on("close",a)),Jve(r)&&r.on("exit",u),r.on("end",c),r.on("finish",l),e.error!==!1&&r.on("error",g),r.on("close",f),function(){r.removeListener("complete",l),r.removeListener("abort",f),r.removeListener("request",h),r.req&&r.req.removeListener("finish",l),r.removeListener("end",a),r.removeListener("close",a),r.removeListener("finish",l),r.removeListener("exit",u),r.removeListener("end",c),r.removeListener("error",g),r.removeListener("close",f)}};o8.exports=a8});var c8=w(($it,A8)=>{var Wve=Ok(),zve=Mk(),Kk=require("fs"),kd=function(){},_ve=/^v?\.0/.test(process.version),Qw=function(r){return typeof r=="function"},Vve=function(r){return!_ve||!Kk?!1:(r instanceof(Kk.ReadStream||kd)||r instanceof(Kk.WriteStream||kd))&&Qw(r.close)},Xve=function(r){return r.setHeader&&Qw(r.abort)},Zve=function(r,e,t,i){i=Wve(i);var n=!1;r.on("close",function(){n=!0}),zve(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Vve(r))return r.close(kd);if(Xve(r))return r.abort();if(Qw(r.destroy))return r.destroy();i(o||new Error("stream was destroyed"))}}},l8=function(r){r()},$ve=function(r,e){return r.pipe(e)},exe=function(){var r=Array.prototype.slice.call(arguments),e=Qw(r[r.length-1]||kd)&&r.pop()||kd;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error("pump requires two streams per minimum");var t,i=r.map(function(n,s){var o=s0;return Zve(n,o,a,function(l){t||(t=l),l&&i.forEach(l8),!o&&(i.forEach(l8),e(t))})});return r.reduce($ve)};A8.exports=exe});var g8=w((ent,u8)=>{"use strict";var{PassThrough:txe}=require("stream");u8.exports=r=>{r=N({},r);let{array:e}=r,{encoding:t}=r,i=t==="buffer",n=!1;e?n=!(t||i):t=t||"utf8",i&&(t=null);let s=new txe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var f8=w((tnt,$g)=>{"use strict";var rxe=c8(),ixe=g8(),Uk=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Sw(r,e){if(!r)return Promise.reject(new Error("Expected a stream"));e=N({maxBuffer:Infinity},e);let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=rxe(r,ixe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>t&&o(new Uk)})}),i.getBufferedValue()}$g.exports=Sw;$g.exports.default=Sw;$g.exports.buffer=(r,e)=>Sw(r,te(N({},e),{encoding:"buffer"}));$g.exports.array=(r,e)=>Sw(r,te(N({},e),{array:!0}));$g.exports.MaxBufferError=Uk});var p8=w((int,h8)=>{"use strict";var nxe=[200,203,204,206,300,301,404,405,410,414,501],sxe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],oxe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},axe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Hk(r){let e={};if(!r)return e;let t=r.trim().split(/\s*,\s*/);for(let i of t){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function Axe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+"="+i)}if(!!e.length)return e.join(", ")}h8.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!t||!t.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in t?t.status:200,this._resHeaders=t.headers,this._rescc=Hk(t.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=Hk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Axe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!t.headers["cache-control"]&&/no-cache/.test(t.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&sxe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||nxe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=Hk(e.headers["cache-control"]);return t["no-cache"]||/no-cache/.test(e.headers.pragma)||t["max-age"]&&this.age()>t["max-age"]||t["min-fresh"]&&this.timeToLive()<1e3*t["min-fresh"]||this.stale()&&!(t["max-stale"]&&!this._rescc["must-revalidate"]&&(t["max-stale"]===!0||t["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)oxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(",").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let t=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete t["if-none-match"],delete t["if-modified-since"],t;if(this._resHeaders.etag&&(t["if-none-match"]=t["if-none-match"]?`${t["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t["accept-ranges"]||t["if-match"]||t["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete t["if-modified-since"],t["if-none-match"]){let n=t["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?t["if-none-match"]=n.join(",").trim():delete t["if-none-match"]}}else this._resHeaders["last-modified"]&&!t["if-modified-since"]&&(t["if-modified-since"]=this._resHeaders["last-modified"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),!t||!t.headers)throw Error("Response headers missing");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\s*W\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===t.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===t.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!t.headers.etag&&!t.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!axe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var vw=w((nnt,d8)=>{"use strict";d8.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var E8=w((snt,C8)=>{"use strict";var lxe=require("stream").Readable,cxe=vw(),m8=class extends lxe{constructor(e,t,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof t!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=cxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};C8.exports=m8});var y8=w((ont,I8)=>{"use strict";var uxe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];I8.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(uxe));for(let i of t)i in e||(e[i]=typeof r[i]=="function"?r[i].bind(r):r[i])}});var B8=w((ant,w8)=>{"use strict";var gxe=require("stream").PassThrough,fxe=y8(),hxe=r=>{if(!(r&&r.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new gxe;return fxe(r,e),r.pipe(e)};w8.exports=hxe});var b8=w(jk=>{jk.stringify=function r(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var t="",i=Array.isArray(e);t=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=","),n=!1,i?e[s]==null?t+="null":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+":"+r(e[s])))}return t+=i?"]":"}",t}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};jk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t=="string"?/^:base64:/.test(t)?Buffer.from(t.substring(8),"base64"):/^:/.test(t)?t.substring(1):t:t})}});var x8=w((lnt,Q8)=>{"use strict";var pxe=require("events"),S8=b8(),dxe=r=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(require(e[t]))(r)}return new Map},v8=class extends pxe{constructor(e,t){super();if(this.opts=Object.assign({namespace:"keyv",serialize:S8.stringify,deserialize:S8.parse},typeof e=="string"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=dxe(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};Q8.exports=v8});var D8=w((cnt,k8)=>{"use strict";var Cxe=require("events"),xw=require("url"),mxe=e8(),Exe=f8(),Gk=p8(),P8=E8(),Ixe=vw(),yxe=B8(),wxe=x8(),ia=class{constructor(e,t){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new wxe({uri:typeof t=="string"&&t,store:typeof t!="string"&&t,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t=="string")n=Yk(xw.parse(t)),t={};else if(t instanceof xw.URL)n=Yk(xw.parse(t.toString())),t={};else{let[g,...f]=(t.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=Yk(te(N({},t),{pathname:g,search:h}))}t=N(N({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},t),Bxe(n)),t.headers=Ixe(t.headers);let s=new Cxe,o=mxe(xw.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),m=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Gk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let x=v.policy.responseHeaders();y=new P8(l.statusCode,x,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Gk(g,y,g),y.fromCache=!1);let b;g.cache&&y.cachePolicy.storable()?(b=yxe(y),(async()=>{try{let v=Exe.buffer(y);if(await Promise.race([p,new Promise(Y=>y.once("end",Y))]),f)return;let x=await v,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:x},q=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(q=q?Math.min(q,g.maxTtl):g.maxTtl),await this.cache.set(a,T,q)}catch(v){s.emit("error",new ia.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit("error",new ia.CacheError(v))}})(),s.emit("response",b||y),typeof i=="function"&&i(b||y)};try{let y=e(g,m);y.once("error",h),y.once("abort",h),s.emit("request",y)}catch(y){s.emit("error",new ia.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let m=Gk.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=m.responseHeaders(),b=new P8(p.statusCode,y,p.body,p.url);b.cachePolicy=m,b.fromCache=!0,s.emit("response",b),typeof i=="function"&&i(b)}else l=p,h.headers=m.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new ia.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit("error",new ia.CacheError(h))}})(),s}}};function Bxe(r){let e=N({},r);return e.path=`${r.pathname||"/"}${r.search||""}`,delete e.pathname,delete e.search,e}function Yk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||"localhost",port:r.port,pathname:r.pathname,search:r.search}}ia.RequestError=class extends Error{constructor(r){super(r.message);this.name="RequestError",Object.assign(this,r)}};ia.CacheError=class extends Error{constructor(r){super(r.message);this.name="CacheError",Object.assign(this,r)}};k8.exports=ia});var F8=w((unt,R8)=>{"use strict";var bxe=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];R8.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let t=new Set(Object.keys(r).concat(bxe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s=="function"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once("aborted",()=>{e.destroy(),e.emit("aborted")}),r.once("close",()=>{r.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var L8=w((gnt,N8)=>{"use strict";var{Transform:Qxe,PassThrough:Sxe}=require("stream"),qk=require("zlib"),vxe=F8();N8.exports=r=>{let e=(r.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return r;let t=e==="br";if(t&&typeof qk.createBrotliDecompress!="function")return r.destroy(new Error("Brotli is not supported on Node.js < 12")),r;let i=!0,n=new Qxe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new Sxe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?qk.createBrotliDecompress():qk.createUnzip();return o.once("error",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),vxe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Jk=w((fnt,T8)=>{"use strict";var O8=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};T8.exports=O8});var zk=w((hnt,M8)=>{"use strict";var xxe=require("events"),kxe=require("tls"),Pxe=require("http2"),Dxe=Jk(),gn=Symbol("currentStreamsCount"),K8=Symbol("request"),Ls=Symbol("cachedOriginSet"),ef=Symbol("gracefullyClosing"),Rxe=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Fxe=(r,e,t)=>{let i=0,n=r.length;for(;i>>1;t(r[s],e)?i=s+1:n=s}return i},Nxe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Wk=(r,e)=>{for(let t of r)t[Ls].lengthe[Ls].includes(i))&&t[gn]+e[gn]<=e.remoteSettings.maxConcurrentStreams&&U8(t)},Lxe=(r,e)=>{for(let t of r)e[Ls].lengtht[Ls].includes(i))&&e[gn]+t[gn]<=t.remoteSettings.maxConcurrentStreams&&U8(e)},H8=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[nA.kCurrentStreamsCount]{r[ef]=!0,r[gn]===0&&r.close()},nA=class extends xxe{constructor({timeout:e=6e4,maxSessions:t=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Dxe({maxSize:n})}static normalizeOrigin(e,t){return typeof e=="string"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t="";if(e)for(let i of Rxe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=nA.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[ef]||p.destroyed)continue;h||(g=m),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=Pxe.connect(e,N({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},t));f[gn]=0,f[ef]=!1;let h=()=>f[gn]{this.tlsSessionCache.set(u,y)}),f.once("error",y=>{for(let{reject:b}of i)b(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error("Session closed without receiving a SETTINGS frame");y.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:b}of i)b(y);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Ls])if(y in this.queue[o]){let{listeners:b}=this.queue[o][y];for(;b.length!==0&&h();)b.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[Ls]=f.originSet,!!h()&&(m(),Wk(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error("Agent has been destroyed");for(let b of i)b.reject(y);f.destroy();return}f[Ls]=f.originSet;{let y=this.sessions;if(o in y){let b=y[o];b.splice(Fxe(b,f,Nxe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),m(),l(),f[gn]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on("remoteSettings",()=>{m(),Wk(this.sessions[o],f)})}),f[K8]=f.request,f.request=(y,b)=>{if(f[ef])throw new Error("The session is gracefully closing. No new streams are allowed.");let v=f[K8](y,b);return f.ref(),++f[gn],f[gn]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once("close",()=>{if(p=h(),--f[gn],!f.destroyed&&!f.closed&&(Lxe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let x=f[gn]===0;x&&f.unref(),x&&(this._freeSessionsCount>this.maxFreeSessions||f[ef])?f.close():(Wk(this.sessions[o],f),m())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return nA.connect(e,t)}static connect(e,t){t.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername=="undefined"&&(t.servername=n),kxe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[gn]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return H8({agent:this,isFree:!0})}get busySessions(){return H8({agent:this,isFree:!1})}};nA.kCurrentStreamsCount=gn;nA.kGracefullyClosing=ef;M8.exports={Agent:nA,globalAgent:new nA}});var _k=w((pnt,j8)=>{"use strict";var{Readable:Txe}=require("stream"),G8=class extends Txe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};j8.exports=G8});var Vk=w((dnt,Y8)=>{"use strict";Y8.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname=="string"&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return typeof r.port=="string"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var J8=w((Cnt,q8)=>{"use strict";q8.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var z8=w((mnt,W8)=>{"use strict";W8.exports=r=>{switch(r){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var V8=w((Int,_8)=>{"use strict";var tf=(r,e,t)=>{_8.exports[e]=class extends r{constructor(...n){super(typeof t=="string"?t:t(n));this.name=`${super.name} [${e}]`,this.code=e}}};tf(TypeError,"ERR_INVALID_ARG_TYPE",r=>{let e=r[0].includes(".")?"property":"argument",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(", ")} or ${t.slice(-1)}`),`The "${r[0]}" ${e} must be ${i?"one of":"of"} type ${t}. Received ${typeof r[2]}`});tf(TypeError,"ERR_INVALID_PROTOCOL",r=>`Protocol "${r[0]}" not supported. Expected "${r[1]}"`);tf(Error,"ERR_HTTP_HEADERS_SENT",r=>`Cannot ${r[0]} headers after they are sent to the client`);tf(TypeError,"ERR_INVALID_HTTP_TOKEN",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);tf(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",r=>`Invalid value "${r[0]} for header "${r[1]}"`);tf(TypeError,"ERR_INVALID_CHAR",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var eP=w((ynt,X8)=>{"use strict";var Oxe=require("http2"),{Writable:Mxe}=require("stream"),{Agent:Z8,globalAgent:Kxe}=zk(),Uxe=_k(),Hxe=Vk(),jxe=J8(),Gxe=z8(),{ERR_INVALID_ARG_TYPE:Xk,ERR_INVALID_PROTOCOL:Yxe,ERR_HTTP_HEADERS_SENT:$8,ERR_INVALID_HTTP_TOKEN:qxe,ERR_HTTP_INVALID_HEADER_VALUE:Jxe,ERR_INVALID_CHAR:Wxe}=V8(),{HTTP2_HEADER_STATUS:ez,HTTP2_HEADER_METHOD:tz,HTTP2_HEADER_PATH:rz,HTTP2_METHOD_CONNECT:zxe}=Oxe.constants,Wi=Symbol("headers"),Zk=Symbol("origin"),$k=Symbol("session"),iz=Symbol("options"),kw=Symbol("flushedHeaders"),Pd=Symbol("jobs"),_xe=/^[\^`\-\w!#$%&*+.|~]+$/,Vxe=/[^\t\u0020-\u007E\u0080-\u00FF]/,nz=class extends Mxe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Hxe(e instanceof URL?e:new URL(e))),typeof t=="function"||t===void 0?(i=t,t=n?e:N({},e)):t=N(N({},e),t),t.h2session)this[$k]=t.h2session;else if(t.agent===!1)this.agent=new Z8({maxFreeSessions:0});else if(typeof t.agent=="undefined"||t.agent===null)typeof t.createConnection=="function"?(this.agent=new Z8({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=Kxe;else if(typeof t.agent.request=="function")this.agent=t.agent;else throw new Xk("options.agent",["Agent-like Object","undefined","false"],t.agent);if(t.protocol&&t.protocol!=="https:")throw new Yxe(t.protocol,"https:");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||"localhost";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Wi]=Object.create(null),this[Pd]=[],this.socket=null,this.connection=null,this.method=t.method||"GET",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!("authorization"in this[Wi])&&(this[Wi].authorization="Basic "+Buffer.from(t.auth).toString("base64")),t.session=t.tlsSession,t.path=t.socketPath,this[iz]=t,s===443?(this[Zk]=`https://${o}`,":authority"in this[Wi]||(this[Wi][":authority"]=o)):(this[Zk]=`https://${o}:${s}`,":authority"in this[Wi]||(this[Wi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[kw]=!1}get method(){return this[Wi][tz]}set method(e){e&&(this[Wi][tz]=e.toUpperCase())}get path(){return this[Wi][rz]}set path(e){e&&(this[Wi][rz]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[Pd].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[Pd].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[kw]||this.destroyed)return;this[kw]=!0;let e=this.method===zxe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||jxe(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new Uxe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[ez],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[ez]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[Pd])o();this.emit("socket",this.socket)};if(this[$k])try{t(this[$k].request(this[Wi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Zk],this[iz],this[Wi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new Xk("name","string",e);return this[Wi][e.toLowerCase()]}get headersSent(){return this[kw]}removeHeader(e){if(typeof e!="string")throw new Xk("name","string",e);if(this.headersSent)throw new $8("remove");delete this[Wi][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new $8("set");if(typeof e!="string"||!_xe.test(e)&&!Gxe(e))throw new qxe("Header name",e);if(typeof t=="undefined")throw new Jxe(t,e);if(Vxe.test(t))throw new Wxe("header content",e);this[Wi][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[Pd].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};X8.exports=nz});var oz=w((wnt,sz)=>{"use strict";var Xxe=require("tls");sz.exports=(r={})=>new Promise((e,t)=>{let i=Xxe.connect(r,()=>{r.resolveSocket?(i.off("error",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",t)})});var Az=w((Bnt,az)=>{"use strict";var Zxe=require("net");az.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith("[")?t.indexOf("]")===-1?e=t:e=t.slice(1,-1):e=t.split(":",1)[0]),Zxe.isIP(e)?"":e}});var uz=w((bnt,tP)=>{"use strict";var lz=require("http"),rP=require("https"),$xe=oz(),eke=Jk(),tke=eP(),rke=Az(),ike=Vk(),Pw=new eke({maxSize:100}),Dd=new Map,cz=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit("free",e,t)};e.on("free",i);let n=()=>{r.removeSocket(e,t)};e.on("close",n);let s=()=>{r.removeSocket(e,t),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),r.emit("free",e,t)},nke=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!Pw.has(e)){if(Dd.has(e))return(await Dd.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=$xe(r);Dd.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Pw.set(e,o),r.path=t,o==="h2")s.destroy();else{let{globalAgent:a}=rP,l=rP.Agent.prototype.createConnection;i?i.createConnection===l?cz(i,s,r):s.destroy():a.createConnection===l?cz(a,s,r):s.destroy()}return Dd.delete(e),o}catch(s){throw Dd.delete(e),s}}return Pw.get(e)};tP.exports=async(r,e,t)=>{if((typeof r=="string"||r instanceof URL)&&(r=ike(new URL(r))),typeof e=="function"&&(t=e,e=void 0),e=te(N(N({ALPNProtocols:["h2","http/1.1"]},r),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||rke(e),e.port=e.port||(i?443:80),e._defaultAgent=i?rP.globalAgent:lz.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await nke(e)==="h2"?(n&&(e.agent=n.http2),new tke(e,t)):lz.request(e,t)};tP.exports.protocolCache=Pw});var fz=w((Qnt,gz)=>{"use strict";var ske=require("http2"),oke=zk(),iP=eP(),ake=_k(),Ake=uz(),lke=(r,e,t)=>new iP(r,e,t),cke=(r,e,t)=>{let i=new iP(r,e,t);return i.end(),i};gz.exports=te(N(te(N({},ske),{ClientRequest:iP,IncomingMessage:ake}),oke),{request:lke,get:cke,auto:Ake})});var sP=w(nP=>{"use strict";Object.defineProperty(nP,"__esModule",{value:!0});var hz=iA();nP.default=r=>hz.default.nodeStream(r)&&hz.default.function_(r.getBoundary)});var mz=w(oP=>{"use strict";Object.defineProperty(oP,"__esModule",{value:!0});var pz=require("fs"),dz=require("util"),Cz=iA(),uke=sP(),gke=dz.promisify(pz.stat);oP.default=async(r,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!r)return 0;if(Cz.default.string(r))return Buffer.byteLength(r);if(Cz.default.buffer(r))return r.length;if(uke.default(r))return dz.promisify(r.getLength.bind(r))();if(r instanceof pz.ReadStream){let{size:t}=await gke(r.path);return t===0?void 0:t}}});var AP=w(aP=>{"use strict";Object.defineProperty(aP,"__esModule",{value:!0});function fke(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}aP.default=fke});var Ez=w(lP=>{"use strict";Object.defineProperty(lP,"__esModule",{value:!0});lP.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var yz=w(Rd=>{"use strict";Object.defineProperty(Rd,"__esModule",{value:!0});Rd.TimeoutError=void 0;var hke=require("net"),pke=Ez(),Iz=Symbol("reentry"),dke=()=>{},cP=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`);this.event=t,this.name="TimeoutError",this.code="ETIMEDOUT"}};Rd.TimeoutError=cP;Rd.default=(r,e,t)=>{if(Iz in r)return dke;r[Iz]=!0;let i=[],{once:n,unhandleAll:s}=pke.default(),o=(g,f,h)=>{var p;let m=setTimeout(f,g,g,h);(p=m.unref)===null||p===void 0||p.call(m);let y=()=>{clearTimeout(m)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new cP(g,f))},u=()=>{for(let g of i)g();s()};if(r.once("error",g=>{if(u(),r.listenerCount("error")===0)throw g}),r.once("close",u),n(r,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener("timeout",g)})}return n(r,"socket",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:hke.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",y=>{y===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&t.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(r,"upload-complete",p())}):n(r,"upload-complete",p())}}),typeof e.response!="undefined"&&n(r,"upload-complete",()=>{let g=o(e.response,c,"response");n(r,"response",g)}),u}});var Bz=w(uP=>{"use strict";Object.defineProperty(uP,"__esModule",{value:!0});var wz=iA();uP.default=r=>{r=r;let e={protocol:r.protocol,hostname:wz.default.string(r.hostname)&&r.hostname.startsWith("[")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||""}${r.search||""}`};return wz.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||""}:${r.password||""}`),e}});var bz=w(gP=>{"use strict";Object.defineProperty(gP,"__esModule",{value:!0});var Cke=require("url"),mke=["protocol","host","hostname","port","pathname","search"];gP.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!r){if(!e.protocol)throw new TypeError("No URL protocol specified");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:""}`}let n=new Cke.URL(r);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of mke)e[s]&&(n[s]=e[s].toString());return n}});var Sz=w(fP=>{"use strict";Object.defineProperty(fP,"__esModule",{value:!0});var Qz=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e=="object"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};fP.default=Qz});var pP=w(hP=>{"use strict";Object.defineProperty(hP,"__esModule",{value:!0});var Eke=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(""))};hP.default=Eke});var xz=w(Vc=>{"use strict";Object.defineProperty(Vc,"__esModule",{value:!0});Vc.dnsLookupIpVersionToFamily=Vc.isDnsLookupIpVersion=void 0;var vz={auto:0,ipv4:4,ipv6:6};Vc.isDnsLookupIpVersion=r=>r in vz;Vc.dnsLookupIpVersionToFamily=r=>{if(Vc.isDnsLookupIpVersion(r))return vz[r];throw new Error("Invalid DNS lookup IP version")}});var dP=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.isResponseOk=void 0;Dw.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var Pz=w(CP=>{"use strict";Object.defineProperty(CP,"__esModule",{value:!0});var kz=new Set;CP.default=r=>{kz.has(r)||(kz.add(r),process.emitWarning(`Got: ${r}`,{type:"DeprecationWarning"}))}});var Dz=w(mP=>{"use strict";Object.defineProperty(mP,"__esModule",{value:!0});var Ir=iA(),Ike=(r,e)=>{if(Ir.default.null_(r.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ir.assert.any([Ir.default.string,Ir.default.undefined],r.encoding),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.resolveBodyOnly),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.methodRewriting),Ir.assert.any([Ir.default.boolean,Ir.default.undefined],r.isStream),Ir.assert.any([Ir.default.string,Ir.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType="text");let{retry:t}=r;if(e?r.retry=N({},e.retry):r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ir.default.object(t)?(r.retry=N(N({},r.retry),t),r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):Ir.default.number(t)&&(r.retry.limit=t),Ir.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(Ir.default.number))),Ir.default.object(r.pagination)){e&&(r.pagination=N(N({},e.pagination),r.pagination));let{pagination:i}=r;if(!Ir.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ir.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ir.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ir.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return r.responseType==="json"&&r.headers.accept===void 0&&(r.headers.accept="application/json"),r};mP.default=Ike});var Rz=w(Fd=>{"use strict";Object.defineProperty(Fd,"__esModule",{value:!0});Fd.retryAfterStatusCodes=void 0;Fd.retryAfterStatusCodes=new Set([413,429,503]);var yke=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};Fd.default=yke});var Ld=w(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.UnsupportedProtocolError=qt.ReadError=qt.TimeoutError=qt.UploadError=qt.CacheError=qt.HTTPError=qt.MaxRedirectsError=qt.RequestError=qt.setNonEnumerableProperties=qt.knownHookEvents=qt.withoutBody=qt.kIsNormalizedAlready=void 0;var Fz=require("util"),Nz=require("stream"),wke=require("fs"),gl=require("url"),Lz=require("http"),EP=require("http"),Bke=require("https"),bke=Y4(),Qke=X4(),Tz=D8(),Ske=L8(),vke=fz(),xke=vw(),Ee=iA(),kke=mz(),Oz=sP(),Pke=AP(),Mz=yz(),Dke=Bz(),Kz=bz(),Rke=Sz(),Fke=pP(),Uz=xz(),Nke=dP(),fl=Pz(),Lke=Dz(),Tke=Rz(),IP,Fi=Symbol("request"),Rw=Symbol("response"),rf=Symbol("responseSize"),nf=Symbol("downloadedSize"),sf=Symbol("bodySize"),of=Symbol("uploadedSize"),Fw=Symbol("serverResponsesPiped"),Hz=Symbol("unproxyEvents"),jz=Symbol("isFromCache"),yP=Symbol("cancelTimeouts"),Gz=Symbol("startedReading"),af=Symbol("stopReading"),Nw=Symbol("triggerRead"),hl=Symbol("body"),Nd=Symbol("jobs"),Yz=Symbol("originalResponse"),qz=Symbol("retryTimeout");qt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Oke=Ee.default.string(process.versions.brotli);qt.withoutBody=new Set(["GET","HEAD"]);qt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Mke(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \`searchParams\` value '${String(t)}' must be a string, number, boolean or null`)}}function Kke(r){return Ee.default.object(r)&&!("statusCode"in r)}var wP=new Rke.default,Uke=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once("error",i),r.once("ready",()=>{r.off("error",i),e()})}),Hke=new Set([300,301,302,303,304,307,308]),jke=["context","body","json","form"];qt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of jke)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var hi=class extends Error{constructor(e,t,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=t.code,i instanceof BP?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Rw]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};qt.RequestError=hi;var bP=class extends hi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};qt.MaxRedirectsError=bP;var QP=class extends hi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};qt.HTTPError=QP;var SP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="CacheError"}};qt.CacheError=SP;var vP=class extends hi{constructor(e,t){super(e.message,e,t);this.name="UploadError"}};qt.UploadError=vP;var xP=class extends hi{constructor(e,t,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=t}};qt.TimeoutError=xP;var Lw=class extends hi{constructor(e,t){super(e.message,e,t);this.name="ReadError"}};qt.ReadError=Lw;var kP=class extends hi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};qt.UnsupportedProtocolError=kP;var Gke=["socket","connect","continue","information","upgrade","timeout"],BP=class extends Nz.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0});this[nf]=0,this[of]=0,this.requestInitialized=!1,this[Fw]=new Set,this.redirects=[],this[af]=!1,this[Nw]=!1,this[Nd]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof EP.IncomingMessage&&(this.options.headers=N(N({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),qt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof wke.ReadStream&&await Uke(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Fi])===null||c===void 0||c.destroy();return}for(let g of this[Nd])g();this[Nd].length=0,this.requestInitialized=!0}catch(u){if(u instanceof hi){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t=N(N(N({},i),e),t);else{if(e&&t&&t.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");t=N(N({},i),t),e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new gl.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([Uz.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method="GET",t.headers===(i==null?void 0:i.headers)?t.headers=N({},t.headers):t.headers=xke(N(N({},i==null?void 0:i.headers),t.headers)),"slashes"in t)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in t)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof gl.URLSearchParams)h=new gl.URLSearchParams(t.searchParams);else{Mke(t.searchParams),h=new gl.URLSearchParams;for(let p in t.searchParams){let m=t.searchParams[p];m===null?h.append(p,""):m!==void 0&&h.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{h.has(m)||h.append(m,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:"",t.password=(o=t.password)!==null&&o!==void 0?o:"",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==""&&!t.prefixUrl.endsWith("/")&&(t.prefixUrl+="/")),Ee.default.string(t.url)){if(t.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");t.url=Kz.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==""||t.protocol)&&(t.url=Kz.default(t.prefixUrl,t));if(t.url){"port"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,"prefixUrl",{set:m=>{let y=t.url;if(!y.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${m}: ${y.href}`);t.url=new gl.URL(m+y.href.slice(h.length)),h=m},get:()=>h});let{protocol:p}=t.url;if(p==="unix:"&&(p="http:",t.url=new gl.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!=="http:"&&p!=="https:")throw new kP(t);t.username===""?t.username=t.url.username:t.url.username=t.username,t.password===""?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=Fz.promisify(h.bind(t.cookieJar)),p=Fz.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(wP.has(g)||wP.set(g,new Tz((h,p)=>{let m=h[Fi](h,p);return Ee.default.promise(m)&&(m.once=(y,b)=>{if(y==="error")m.catch(b);else if(y==="abort")(async()=>{try{(await m).once("abort",b)}catch(v){}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return m}),m},g))),t.cacheOptions=N({},t.cacheOptions),t.dnsCache===!0)IP||(IP=new Qke.default),t.dnsCache=IP;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout=N(N({},i.timeout),t.timeout):t.timeout=N({},t.timeout),t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks=N({},t.hooks);for(let h of qt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of qt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if("family"in t&&fl.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(t.https=N(N({},i.https),t.https)),"rejectUnauthorized"in t&&fl.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in t&&fl.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in t&&fl.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in t&&fl.default('"options.key" was never documented, please use "options.https.key"'),"cert"in t&&fl.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in t&&fl.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in t&&fl.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in t)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(t.agent){for(let h in t.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,qt.setNonEnumerableProperties([i,c],t),Lke.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=qt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof Nz.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!Oz.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!Ee.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!Ee.default.string(t["content-type"]);s?(Oz.default(e.body)&&l&&(t["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[hl]=e.body):i?(l&&(t["content-type"]="application/x-www-form-urlencoded"),this[hl]=new gl.URLSearchParams(e.form).toString()):(l&&(t["content-type"]="application/json"),this[hl]=e.stringifyJson(e.json));let c=await kke.default(this[hl],e.headers);Ee.default.undefined(t["content-length"])&&Ee.default.undefined(t["transfer-encoding"])&&!a&&!Ee.default.undefined(c)&&(t["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[sf]=Number(t["content-length"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[Yz]=e,t.decompress&&(e=Ske(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:Lz.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[jz]=s.isFromCache,this[rf]=Number(e.headers["content-length"])||void 0,this[Rw]=e,e.once("end",()=>{this[rf]=this[nf],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new Lw(a,this))}),e.once("aborted",()=>{this._beforeError(new Lw({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&Hke.has(n)){if(e.resume(),this[Fi]&&(this[yP](),delete this[Fi],this[Hz]()),(n===303&&t.method!=="GET"&&t.method!=="HEAD"||!t.methodRewriting)&&(t.method="GET","body"in t&&delete t.body,"json"in t&&delete t.json,"form"in t&&delete t.form,this[hl]=void 0,delete t.headers["content-length"]),this.redirects.length>=t.maxRedirects){this._beforeError(new bP(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new gl.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in t.headers&&delete t.headers.host,"cookie"in t.headers&&delete t.headers.cookie,"authorization"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username="",t.password="")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit("redirect",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!Nke.isResponseOk(s)){this._beforeError(new QP(s));return}e.on("readable",()=>{this[Nw]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Fw])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;bke.default(e),this[yP]=Mz.default(e,i,n);let s=t.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof Mz.TimeoutError?new xP(l,this.timings,this):new hi(l.message,l,this),this._beforeError(l)}),this[Hz]=Pke.default(e,this,Gke),this[Fi]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[hl],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new vP(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,Dke.default(e)),delete t.url;let s,o=wP.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});t.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let b in a)if(Ee.default.undefined(a[b]))delete a[b];else if(Ee.default.null_(a[b]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${b}\` header`);if(o.decompress&&Ee.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=Oke?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let b=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(b)&&(o.headers.cookie=b)}for(let b of o.hooks.beforeRequest){let v=await b(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[hl]!==o.body&&(this[hl]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let b=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(b==null?void 0:b.groups){let{socketPath:v,path:x}=b.groups;Object.assign(o,{socketPath:v,path:x,host:""})}}let f=g.protocol==="https:",h;o.http2?h=vke.auto:h=f?Bke.request:Lz.request;let p=(e=o.request)!==null&&e!==void 0?e:h,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Fi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=Uz.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(b){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let b=await m(g,y);Ee.default.undefined(b)&&(b=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),Kke(b)?this._onRequest(b):this.writable?(this.once("finish",()=>{this._onResponse(b)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(b)}catch(b){throw b instanceof Tz.CacheError?new SP(b,this):new hi(b.message,b,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new hi(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[af])return;let{options:t}=this,i=this.retryCount+1;this[af]=!0,e instanceof hi||(e=new hi(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await Fke.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:Tke.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new hi(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new hi(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[qz]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Nw]=!0;let e=this[Rw];if(e&&!this[af]){e.readableLength&&(this[Nw]=!1);let t;for(;(t=e.read())!==null;){this[nf]+=t.length,this[Gz]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[Nd].push(n)}_writeRequest(e,t,i){this[Fi].destroyed||(this._progressCallbacks.push(()=>{this[of]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Fi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Fi in this)){e();return}if(this[Fi].destroyed){e();return}this[Fi].end(i=>{i||(this[sf]=this[of],this.emit("uploadProgress",this.uploadProgress),this[Fi].emit("upload-complete")),e(i)})};this.requestInitialized?t():this[Nd].push(t)}_destroy(e,t){var i;this[af]=!0,clearTimeout(this[qz]),Fi in this&&(this[yP](),((i=this[Rw])===null||i===void 0?void 0:i.complete)||this[Fi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof hi)&&(e=new hi(e.message,e,this)),t(e)}get _isAboutToError(){return this[af]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Fi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!((i=this[Yz])===null||i===void 0?void 0:i.complete)}get socket(){var e,t;return(t=(e=this[Fi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[rf]?e=this[nf]/this[rf]:this[rf]===this[nf]?e=1:e=0,{percent:e,transferred:this[nf],total:this[rf]}}get uploadProgress(){let e;return this[sf]?e=this[of]/this[sf]:this[sf]===this[of]?e=1:e=0,{percent:e,transferred:this[of],total:this[sf]}}get timings(){var e;return(e=this[Fi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[jz]}pipe(e,t){if(this[Gz])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof EP.ServerResponse&&this[Fw].add(e),super.pipe(e,t)}unpipe(e){return e instanceof EP.ServerResponse&&this[Fw].delete(e),super.unpipe(e),this}};qt.default=BP});var Td=w(Co=>{"use strict";var Yke=Co&&Co.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),qke=Co&&Co.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Yke(e,r,t)};Object.defineProperty(Co,"__esModule",{value:!0});Co.CancelError=Co.ParseError=void 0;var Jz=Ld(),Wz=class extends Jz.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in "${i.url.toString()}"`,e,t.request);this.name="ParseError"}};Co.ParseError=Wz;var zz=class extends Jz.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Co.CancelError=zz;qke(Ld(),Co)});var Vz=w(PP=>{"use strict";Object.defineProperty(PP,"__esModule",{value:!0});var _z=Td(),Jke=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":t(n.toString());if(e==="buffer")return n;throw new _z.ParseError({message:`Unknown body type '${e}'`,name:"Error"},r)}catch(s){throw new _z.ParseError(s,r)}};PP.default=Jke});var DP=w(pl=>{"use strict";var Wke=pl&&pl.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),zke=pl&&pl.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Wke(e,r,t)};Object.defineProperty(pl,"__esModule",{value:!0});var _ke=require("events"),Vke=iA(),Xke=j4(),Tw=Td(),Xz=Vz(),Zz=Ld(),Zke=AP(),$ke=pP(),$z=dP(),ePe=["request","response","redirect","uploadProgress","downloadProgress"];function e5(r){let e,t,i=new _ke.EventEmitter,n=new Xke((o,a,l)=>{let c=u=>{let g=new Zz.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Tw.CancelError(g))),e=g,g.once("response",async p=>{var m;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await $ke.default(g),p.rawBody=y}catch(T){return}if(g._isAboutToError)return;let b=((m=p.headers["content-encoding"])!==null&&m!==void 0?m:"").toLowerCase(),v=["gzip","deflate","br"].includes(b),{options:x}=g;if(v&&!x.decompress)p.body=y;else try{p.body=Xz.default(p,x.responseType,x.parseJson,x.encoding)}catch(T){if(p.body=y.toString(),$z.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,q]of x.hooks.afterResponse.entries())p=await q(p,async Y=>{let $=Zz.default.normalizeArguments(void 0,te(N({},Y),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),x);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,T);for(let ne of $.hooks.beforeRetry)await ne($);let _=e5($);return l(()=>{_.catch(()=>{}),_.cancel()}),_})}catch(T){g._beforeError(new Tw.RequestError(T.message,T,g));return}if(!$z.isResponseOk(p)){g._beforeError(new Tw.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:m}=g;if(p instanceof Tw.HTTPError&&!m.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,m)=>{var y,b;if(h===((y=m.request)===null||y===void 0?void 0:y.options.body)&&Vke.default.nodeStream((b=m.request)===null||b===void 0?void 0:b.options.body)){f(m);return}c(p)}),Zke.default(g,i,ePe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return Xz.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}pl.default=e5;zke(Td(),pl)});var t5=w(RP=>{"use strict";Object.defineProperty(RP,"__esModule",{value:!0});var tPe=Td();function rPe(r,...e){let t=(async()=>{if(r instanceof tPe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}RP.default=rPe});var n5=w(FP=>{"use strict";Object.defineProperty(FP,"__esModule",{value:!0});var r5=iA();function i5(r){for(let e of Object.values(r))(r5.default.plainObject(e)||r5.default.array(e))&&i5(e);return Object.freeze(r)}FP.default=i5});var o5=w(s5=>{"use strict";Object.defineProperty(s5,"__esModule",{value:!0})});var NP=w(Ts=>{"use strict";var iPe=Ts&&Ts.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),nPe=Ts&&Ts.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&iPe(e,r,t)};Object.defineProperty(Ts,"__esModule",{value:!0});Ts.defaultHandler=void 0;var a5=iA(),Os=DP(),sPe=t5(),Ow=Ld(),oPe=n5(),aPe={RequestError:Os.RequestError,CacheError:Os.CacheError,ReadError:Os.ReadError,HTTPError:Os.HTTPError,MaxRedirectsError:Os.MaxRedirectsError,TimeoutError:Os.TimeoutError,ParseError:Os.ParseError,CancelError:Os.CancelError,UnsupportedProtocolError:Os.UnsupportedProtocolError,UploadError:Os.UploadError},APe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:Mw}=Ow.default,A5=(...r)=>{let e;for(let t of r)e=Mw(void 0,t,e);return e},lPe=r=>r.isStream?new Ow.default(void 0,r):Os.default(r),cPe=r=>"defaults"in r&&"options"in r.defaults,uPe=["get","post","put","patch","head","delete"];Ts.defaultHandler=(r,e)=>e(r);var l5=(r,e)=>{if(r)for(let t of r)t(e)},c5=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?lPe:c);if(a5.default.plainObject(i)){let u=N(N({},i),n);Ow.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{l5(r.options.hooks.init,n),l5((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Mw(i,n,s!=null?s:r.options);if(g[Ow.kIsNormalizedAlready]=!0,u)throw new Os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return sPe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)cPe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==Ts.defaultHandler),s.length===0&&s.push(Ts.defaultHandler),c5({options:A5(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=Mw(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!a5.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,te(N({},n),{isStream:!0}));for(let i of uPe)e[i]=(n,s)=>e(n,te(N({},s),{method:i})),e.stream[i]=(n,s)=>e(n,te(N({},s),{method:i,isStream:!0}));return Object.assign(e,aPe),Object.defineProperty(e,"defaults",{value:r.mutableDefaults?r:oPe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=A5,e};Ts.default=c5;nPe(o5(),Ts)});var Uw=w((sA,Kw)=>{"use strict";var gPe=sA&&sA.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),u5=sA&&sA.__exportStar||function(r,e){for(var t in r)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&gPe(e,r,t)};Object.defineProperty(sA,"__esModule",{value:!0});var fPe=require("url"),g5=NP(),hPe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType==="json"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,"link"))return!1;let e=r.headers.link.split(","),t;for(let i of e){let n=i.split(";");if(n[1].includes("next")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new fPe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[g5.defaultHandler],mutableDefaults:!1},LP=g5.default(hPe);sA.default=LP;Kw.exports=LP;Kw.exports.default=LP;Kw.exports.__esModule=!0;u5(NP(),sA);u5(DP(),sA)});var d5=w(Af=>{"use strict";var znt=require("net"),pPe=require("tls"),TP=require("http"),f5=require("https"),dPe=require("events"),_nt=require("assert"),CPe=require("util");Af.httpOverHttp=mPe;Af.httpsOverHttp=EPe;Af.httpOverHttps=IPe;Af.httpsOverHttps=yPe;function mPe(r){var e=new oA(r);return e.request=TP.request,e}function EPe(r){var e=new oA(r);return e.request=TP.request,e.createSocket=h5,e.defaultPort=443,e}function IPe(r){var e=new oA(r);return e.request=f5.request,e}function yPe(r){var e=new oA(r);return e.request=f5.request,e.createSocket=h5,e.defaultPort=443,e}function oA(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||TP.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=p5(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};oA.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=OP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),dl("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){dl("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){dl("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return dl("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),dl(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};oA.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function h5(r,e){var t=this;oA.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader("host"),s=OP({},t.options,{socket:i,servername:n?n.replace(/:.*$/,""):r.host}),o=pPe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function p5(r,e,t){return typeof r=="string"?{host:r,port:e,localAddress:t}:r}function OP(r){for(var e=1,t=arguments.length;e{C5.exports=d5()});var x5=w((Gw,jP)=>{var v5=Object.assign({},require("fs")),GP=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(e){e=e||{};var t=typeof e!="undefined"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l="./this.program",c=function(d,E){throw E},u=!1,g=!0,f="";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,m,y,b;g&&(u?f=require("path").dirname(f)+"/":f=__dirname+"/",p=function(E,I){var D=xa(E);return D?I?D:D.toString():(y||(y=v5),b||(b=require("path")),E=b.normalize(E),y.readFileSync(E,I?null:"utf8"))},m=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),Z(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\/g,"/")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return"[Emscripten Module object]"});var v=t.print||console.log.bind(console),x=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var T=16;function q(d,E){return E||(E=T),Math.ceil(d/E)*E}var Y=0,$=function(d){Y=d},_;t.wasmBinary&&(_=t.wasmBinary);var ne=t.noExitRuntime||!0;typeof WebAssembly!="object"&&vr("no native wasm support detected");function ee(d,E,I){switch(E=E||"i8",E.charAt(E.length-1)==="*"&&(E="i32"),E){case"i1":return pe[d>>0];case"i8":return pe[d>>0];case"i16":return Qe[d>>1];case"i32":return fe[d>>2];case"i64":return fe[d>>2];case"float":return Ht[d>>2];case"double":return Mt[d>>3];default:vr("invalid type for getValue: "+E)}return null}var A,oe=!1,ce;function Z(d,E){d||vr("Assertion failed: "+E)}function O(d){var E=t["_"+d];return Z(E,"Cannot call unknown function "+d+", make sure it is exported"),E}function L(d,E,I,D,M){var z={string:function(st){var yt=0;if(st!=null&&st!==0){var xe=(st.length<<2)+1;yt=B(xe),be(st,yt,xe)}return yt},array:function(st){var yt=B(st.length);return Ke(st,yt),yt}};function ie(st){return E==="string"?re(st):E==="boolean"?Boolean(st):st}var we=O(d),me=[],_e=0;if(D)for(var ot=0;ot=D);)++M;if(M-E>16&&d.subarray&&Be)return Be.decode(d.subarray(E,M));for(var z="";E>10,56320|_e&1023)}}return z}function re(d,E){return d?je(V,d,E):""}function se(d,E,I,D){if(!(D>0))return 0;for(var M=I,z=I+D-1,ie=0;ie=55296&&we<=57343){var me=d.charCodeAt(++ie);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=z)break;E[I++]=we}else if(we<=2047){if(I+1>=z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-M}function be(d,E,I){return se(d,V,E,I)}function he(d){for(var E=0,I=0;I=55296&&D<=57343&&(D=65536+((D&1023)<<10)|d.charCodeAt(++I)&1023),D<=127?++E:D<=2047?E+=2:D<=65535?E+=3:E+=4}return E}function Fe(d){var E=he(d)+1,I=Et(E);return I&&se(d,pe,I,E),I}function Ke(d,E){pe.set(d,E)}function ke(d,E){return d%E>0&&(d+=E-d%E),d}var ve,pe,V,Qe,le,fe,gt,Ht,Mt;function Ei(d){ve=d,t.HEAP8=pe=new Int8Array(d),t.HEAP16=Qe=new Int16Array(d),t.HEAP32=fe=new Int32Array(d),t.HEAPU8=V=new Uint8Array(d),t.HEAPU16=le=new Uint16Array(d),t.HEAPU32=gt=new Uint32Array(d),t.HEAPF32=Ht=new Float32Array(d),t.HEAPF64=Mt=new Float64Array(d)}var jt=t.INITIAL_MEMORY||16777216,Qr,Oi=[],Xs=[],Un=[],Hn=!1;function Sr(){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)ba(t.preRun.shift());ko(Oi)}function jn(){Hn=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ps.init(),ko(Xs)}function fs(){if(t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;)Nu(t.postRun.shift());ko(Un)}function ba(d){Oi.unshift(d)}function DA(d){Xs.unshift(d)}function Nu(d){Un.unshift(d)}var hs=0,RA=null,Qa=null;function Lu(d){return d}function FA(d){hs++,t.monitorRunDependencies&&t.monitorRunDependencies(hs)}function NA(d){if(hs--,t.monitorRunDependencies&&t.monitorRunDependencies(hs),hs==0&&(RA!==null&&(clearInterval(RA),RA=null),Qa)){var E=Qa;Qa=null,E()}}t.preloadedImages={},t.preloadedAudios={};function vr(d){t.onAbort&&t.onAbort(d),d+="",x(d),oe=!0,ce=1,d="abort("+d+"). Build with -s ASSERTIONS=1 for more info.";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var zl="data:application/octet-stream;base64,";function Tu(d){return d.startsWith(zl)}var xo="data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIcKAJABEAgASgCCCgCKCABKAIIKAIcKAJAIAEoAggoAiQRBAALIAEoAggoAhwoAjgEQCABKAIIKAIoIAEoAggoAhwoAjggASgCCCgCJBEEAAsgASgCCCgCKCABKAIIKAIcIAEoAggoAiQRBAAgASgCCEEANgIcIAFBfUEAIAEoAgRB8QBGGzYCDAsgASgCDCEAIAFBEGokACAAC+sXAQJ/IwBB8ABrIgMgADYCbCADIAE2AmggAyACNgJkIANBfzYCXCADIAMoAmgvAQI2AlQgA0EANgJQIANBBzYCTCADQQQ2AkggAygCVEUEQCADQYoBNgJMIANBAzYCSAsgA0EANgJgA0AgAygCYCADKAJkSkUEQCADIAMoAlQ2AlggAyADKAJoIAMoAmBBAWpBAnRqLwECNgJUIAMgAygCUEEBaiIANgJQAkACQCADKAJMIABMDQAgAygCWCADKAJURw0ADAELAkAgAygCUCADKAJISARAA0AgAyADKAJsQfwUaiADKAJYQQJ0ai8BAjYCRAJAIAMoAmwoArwtQRAgAygCRGtKBEAgAyADKAJsQfwUaiADKAJYQQJ0ai8BADYCQCADKAJsIgAgAC8BuC0gAygCQEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAJAQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCREEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsQfwUaiADKAJYQQJ0ai8BACADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCRCAAKAK8LWo2ArwtCyADIAMoAlBBAWsiADYCUCAADQALDAELAkAgAygCWARAIAMoAlggAygCXEcEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwECNgI8AkAgAygCbCgCvC1BECADKAI8a0oEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwEANgI4IAMoAmwiACAALwG4LSADKAI4Qf//A3EgAygCbCgCvC10cjsBuC0gAygCbC8BuC1B/wFxIQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbC8BuC1BCHYhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsIAMoAjhB//8DcUEQIAMoAmwoArwta3U7AbgtIAMoAmwiACAAKAK8LSADKAI8QRBrajYCvC0MAQsgAygCbCIAIAAvAbgtIAMoAmxB/BRqIAMoAlhBAnRqLwEAIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAI8IAAoArwtajYCvC0LIAMgAygCUEEBazYCUAsgAyADKAJsLwG+FTYCNAJAIAMoAmwoArwtQRAgAygCNGtKBEAgAyADKAJsLwG8FTYCMCADKAJsIgAgAC8BuC0gAygCMEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIwQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCNEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwG8FSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCNCAAKAK8LWo2ArwtCyADQQI2AiwCQCADKAJsKAK8LUEQIAMoAixrSgRAIAMgAygCUEEDazYCKCADKAJsIgAgAC8BuC0gAygCKEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIoQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAiwgACgCvC1qNgK8LQsMAQsCQCADKAJQQQpMBEAgAyADKAJsLwHCFTYCJAJAIAMoAmwoArwtQRAgAygCJGtKBEAgAyADKAJsLwHAFTYCICADKAJsIgAgAC8BuC0gAygCIEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIgQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHAFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCJCAAKAK8LWo2ArwtCyADQQM2AhwCQCADKAJsKAK8LUEQIAMoAhxrSgRAIAMgAygCUEEDazYCGCADKAJsIgAgAC8BuC0gAygCGEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIYQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCHEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAhwgACgCvC1qNgK8LQsMAQsgAyADKAJsLwHGFTYCFAJAIAMoAmwoArwtQRAgAygCFGtKBEAgAyADKAJsLwHEFTYCECADKAJsIgAgAC8BuC0gAygCEEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIQQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHEFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCFCAAKAK8LWo2ArwtCyADQQc2AgwCQCADKAJsKAK8LUEQIAMoAgxrSgRAIAMgAygCUEELazYCCCADKAJsIgAgAC8BuC0gAygCCEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIIQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQtrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAgwgACgCvC1qNgK8LQsLCwsgA0EANgJQIAMgAygCWDYCXAJAIAMoAlRFBEAgA0GKATYCTCADQQM2AkgMAQsCQCADKAJYIAMoAlRGBEAgA0EGNgJMIANBAzYCSAwBCyADQQc2AkwgA0EENgJICwsLIAMgAygCYEEBajYCYAwBCwsLkQQBAX8jAEEwayIDIAA2AiwgAyABNgIoIAMgAjYCJCADQX82AhwgAyADKAIoLwECNgIUIANBADYCECADQQc2AgwgA0EENgIIIAMoAhRFBEAgA0GKATYCDCADQQM2AggLIAMoAiggAygCJEEBakECdGpB//8DOwECIANBADYCIANAIAMoAiAgAygCJEpFBEAgAyADKAIUNgIYIAMgAygCKCADKAIgQQFqQQJ0ai8BAjYCFCADIAMoAhBBAWoiADYCEAJAAkAgAygCDCAATA0AIAMoAhggAygCFEcNAAwBCwJAIAMoAhAgAygCCEgEQCADKAIsQfwUaiADKAIYQQJ0aiIAIAMoAhAgAC8BAGo7AQAMAQsCQCADKAIYBEAgAygCGCADKAIcRwRAIAMoAiwgAygCGEECdGpB/BRqIgAgAC8BAEEBajsBAAsgAygCLCIAIABBvBVqLwEAQQFqOwG8FQwBCwJAIAMoAhBBCkwEQCADKAIsIgAgAEHAFWovAQBBAWo7AcAVDAELIAMoAiwiACAAQcQVai8BAEEBajsBxBULCwsgA0EANgIQIAMgAygCGDYCHAJAIAMoAhRFBEAgA0GKATYCDCADQQM2AggMAQsCQCADKAIYIAMoAhRGBEAgA0EGNgIMIANBAzYCCAwBCyADQQc2AgwgA0EENgIICwsLIAMgAygCIEEBajYCIAwBCwsLpxIBAn8jAEHQAGsiAyAANgJMIAMgATYCSCADIAI2AkQgA0EANgI4IAMoAkwoAqAtBEADQCADIAMoAkwoAqQtIAMoAjhBAXRqLwEANgJAIAMoAkwoApgtIQAgAyADKAI4IgFBAWo2AjggAyAAIAFqLQAANgI8AkAgAygCQEUEQCADIAMoAkggAygCPEECdGovAQI2AiwCQCADKAJMKAK8LUEQIAMoAixrSgRAIAMgAygCSCADKAI8QQJ0ai8BADYCKCADKAJMIgAgAC8BuC0gAygCKEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIoQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjxBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIsIAAoArwtajYCvC0LDAELIAMgAygCPC0A0F02AjQgAyADKAJIIAMoAjRBgQJqQQJ0ai8BAjYCJAJAIAMoAkwoArwtQRAgAygCJGtKBEAgAyADKAJIIAMoAjRBgQJqQQJ0ai8BADYCICADKAJMIgAgAC8BuC0gAygCIEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIgQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjRBgQJqQQJ0ai8BACADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCJCAAKAK8LWo2ArwtCyADIAMoAjRBAnRBkOoAaigCADYCMCADKAIwBEAgAyADKAI8IAMoAjRBAnRBgO0AaigCAGs2AjwgAyADKAIwNgIcAkAgAygCTCgCvC1BECADKAIca0oEQCADIAMoAjw2AhggAygCTCIAIAAvAbgtIAMoAhhB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdiEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCGEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAhxBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCPEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIcIAAoArwtajYCvC0LCyADIAMoAkBBAWs2AkAgAwJ/IAMoAkBBgAJJBEAgAygCQC0A0FkMAQsgAygCQEEHdkGAAmotANBZCzYCNCADIAMoAkQgAygCNEECdGovAQI2AhQCQCADKAJMKAK8LUEQIAMoAhRrSgRAIAMgAygCRCADKAI0QQJ0ai8BADYCECADKAJMIgAgAC8BuC0gAygCEEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIQQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJEIAMoAjRBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIUIAAoArwtajYCvC0LIAMgAygCNEECdEGQ6wBqKAIANgIwIAMoAjAEQCADIAMoAkAgAygCNEECdEGA7gBqKAIAazYCQCADIAMoAjA2AgwCQCADKAJMKAK8LUEQIAMoAgxrSgRAIAMgAygCQDYCCCADKAJMIgAgAC8BuC0gAygCCEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIIQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJAQf//A3EgAygCTCgCvC10cjsBuC0gAygCTCIAIAMoAgwgACgCvC1qNgK8LQsLCyADKAI4IAMoAkwoAqAtSQ0ACwsgAyADKAJILwGCCDYCBAJAIAMoAkwoArwtQRAgAygCBGtKBEAgAyADKAJILwGACDYCACADKAJMIgAgAC8BuC0gAygCAEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIAQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCBEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJILwGACCADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCBCAAKAK8LWo2ArwtCwuXAgEEfyMAQRBrIgEgADYCDAJAIAEoAgwoArwtQRBGBEAgASgCDC8BuC1B/wFxIQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCDC8BuC1BCHYhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMQQA7AbgtIAEoAgxBADYCvC0MAQsgASgCDCgCvC1BCE4EQCABKAIMLwG4LSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAgwiACAALwG4LUEIdjsBuC0gASgCDCIAIAAoArwtQQhrNgK8LQsLC+8BAQR/IwBBEGsiASAANgIMAkAgASgCDCgCvC1BCEoEQCABKAIMLwG4LUH/AXEhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMLwG4LUEIdiECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAADAELIAEoAgwoArwtQQBKBEAgASgCDC8BuC0hAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAAAsLIAEoAgxBADsBuC0gASgCDEEANgK8LQv8AQEBfyMAQRBrIgEgADYCDCABQQA2AggDQCABKAIIQZ4CTkUEQCABKAIMQZQBaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgAUEANgIIA0AgASgCCEEeTkUEQCABKAIMQYgTaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgAUEANgIIA0AgASgCCEETTkUEQCABKAIMQfwUaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgASgCDEEBOwGUCSABKAIMQQA2AqwtIAEoAgxBADYCqC0gASgCDEEANgKwLSABKAIMQQA2AqAtCyIBAX8jAEEQayIBJAAgASAANgIMIAEoAgwQFSABQRBqJAAL6QEBAX8jAEEwayICIAA2AiQgAiABNwMYIAJCADcDECACIAIoAiQpAwhCAX03AwgCQANAIAIpAxAgAikDCFQEQCACIAIpAxAgAikDCCACKQMQfUIBiHw3AwACQCACKAIkKAIEIAIpAwCnQQN0aikDACACKQMYVgRAIAIgAikDAEIBfTcDCAwBCwJAIAIpAwAgAigCJCkDCFIEQCACKAIkKAIEIAIpAwBCAXynQQN0aikDACACKQMYWA0BCyACIAIpAwA3AygMBAsgAiACKQMAQgF8NwMQCwwBCwsgAiACKQMQNwMoCyACKQMoC6cBAQF/IwBBMGsiBCQAIAQgADYCKCAEIAE2AiQgBCACNwMYIAQgAzYCFCAEIAQoAigpAzggBCgCKCkDMCAEKAIkIAQpAxggBCgCFBCIATcDCAJAIAQpAwhCAFMEQCAEQX82AiwMAQsgBCgCKCAEKQMINwM4IAQoAiggBCgCKCkDOBDAASECIAQoAiggAjcDQCAEQQA2AiwLIAQoAiwhACAEQTBqJAAgAAvrAQEBfyMAQSBrIgMkACADIAA2AhggAyABNwMQIAMgAjYCDAJAIAMpAxAgAygCGCkDEFQEQCADQQE6AB8MAQsgAyADKAIYKAIAIAMpAxBCBIanEE4iADYCCCAARQRAIAMoAgxBDkEAEBQgA0EAOgAfDAELIAMoAhggAygCCDYCACADIAMoAhgoAgQgAykDEEIBfEIDhqcQTiIANgIEIABFBEAgAygCDEEOQQAQFCADQQA6AB8MAQsgAygCGCADKAIENgIEIAMoAhggAykDEDcDECADQQE6AB8LIAMtAB9BAXEhACADQSBqJAAgAAvOAgEBfyMAQTBrIgQkACAEIAA2AiggBCABNwMgIAQgAjYCHCAEIAM2AhgCQAJAIAQoAigNACAEKQMgUA0AIAQoAhhBEkEAEBQgBEEANgIsDAELIAQgBCgCKCAEKQMgIAQoAhwgBCgCGBBMIgA2AgwgAEUEQCAEQQA2AiwMAQsgBEEYEBgiADYCFCAARQRAIAQoAhhBDkEAEBQgBCgCDBAyIARBADYCLAwBCyAEKAIUIAQoAgw2AhAgBCgCFEEANgIUQQAQASEAIAQoAhQgADYCDCMAQRBrIgAgBCgCFDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEQQIgBCgCFCAEKAIYEIMBIgA2AhAgAEUEQCAEKAIUKAIQEDIgBCgCFBAVIARBADYCLAwBCyAEIAQoAhA2AiwLIAQoAiwhACAEQTBqJAAgAAupAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNwMgIAQgAjYCHCAEIAM2AhgCQCAEKAIoRQRAIAQpAyBCAFIEQCAEKAIYQRJBABAUIARBADYCLAwCCyAEQQBCACAEKAIcIAQoAhgQwwE2AiwMAQsgBCAEKAIoNgIIIAQgBCkDIDcDECAEIARBCGpCASAEKAIcIAQoAhgQwwE2AiwLIAQoAiwhACAEQTBqJAAgAAtGAQF/IwBBIGsiAyQAIAMgADYCHCADIAE3AxAgAyACNgIMIAMoAhwgAykDECADKAIMIAMoAhxBCGoQTSEAIANBIGokACAAC4sMAQZ/IAAgAWohBQJAAkAgACgCBCICQQFxDQAgAkEDcUUNASAAKAIAIgIgAWohAQJAIAAgAmsiAEH4mwEoAgBHBEAgAkH/AU0EQCAAKAIIIgQgAkEDdiICQQN0QYycAWpGGiAAKAIMIgMgBEcNAkHkmwFB5JsBKAIAQX4gAndxNgIADAMLIAAoAhghBgJAIAAgACgCDCIDRwRAIAAoAggiAkH0mwEoAgBJGiACIAM2AgwgAyACNgIIDAELAkAgAEEUaiICKAIAIgQNACAAQRBqIgIoAgAiBA0AQQAhAwwBCwNAIAIhByAEIgNBFGoiAigCACIEDQAgA0EQaiECIAMoAhAiBA0ACyAHQQA2AgALIAZFDQICQCAAIAAoAhwiBEECdEGUngFqIgIoAgBGBEAgAiADNgIAIAMNAUHomwFB6JsBKAIAQX4gBHdxNgIADAQLIAZBEEEUIAYoAhAgAEYbaiADNgIAIANFDQMLIAMgBjYCGCAAKAIQIgIEQCADIAI2AhAgAiADNgIYCyAAKAIUIgJFDQIgAyACNgIUIAIgAzYCGAwCCyAFKAIEIgJBA3FBA0cNAUHsmwEgATYCACAFIAJBfnE2AgQgACABQQFyNgIEIAUgATYCAA8LIAQgAzYCDCADIAQ2AggLAkAgBSgCBCICQQJxRQRAIAVB/JsBKAIARgRAQfybASAANgIAQfCbAUHwmwEoAgAgAWoiATYCACAAIAFBAXI2AgQgAEH4mwEoAgBHDQNB7JsBQQA2AgBB+JsBQQA2AgAPCyAFQfibASgCAEYEQEH4mwEgADYCAEHsmwFB7JsBKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LIAJBeHEgAWohAQJAIAJB/wFNBEAgBSgCCCIEIAJBA3YiAkEDdEGMnAFqRhogBCAFKAIMIgNGBEBB5JsBQeSbASgCAEF+IAJ3cTYCAAwCCyAEIAM2AgwgAyAENgIIDAELIAUoAhghBgJAIAUgBSgCDCIDRwRAIAUoAggiAkH0mwEoAgBJGiACIAM2AgwgAyACNgIIDAELAkAgBUEUaiIEKAIAIgINACAFQRBqIgQoAgAiAg0AQQAhAwwBCwNAIAQhByACIgNBFGoiBCgCACICDQAgA0EQaiEEIAMoAhAiAg0ACyAHQQA2AgALIAZFDQACQCAFIAUoAhwiBEECdEGUngFqIgIoAgBGBEAgAiADNgIAIAMNAUHomwFB6JsBKAIAQX4gBHdxNgIADAILIAZBEEEUIAYoAhAgBUYbaiADNgIAIANFDQELIAMgBjYCGCAFKAIQIgIEQCADIAI2AhAgAiADNgIYCyAFKAIUIgJFDQAgAyACNgIUIAIgAzYCGAsgACABQQFyNgIEIAAgAWogATYCACAAQfibASgCAEcNAUHsmwEgATYCAA8LIAUgAkF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyABQf8BTQRAIAFBA3YiAkEDdEGMnAFqIQECf0HkmwEoAgAiA0EBIAJ0IgJxRQRAQeSbASACIANyNgIAIAEMAQsgASgCCAshAiABIAA2AgggAiAANgIMIAAgATYCDCAAIAI2AggPC0EfIQIgAEIANwIQIAFB////B00EQCABQQh2IgIgAkGA/j9qQRB2QQhxIgR0IgIgAkGA4B9qQRB2QQRxIgN0IgIgAkGAgA9qQRB2QQJxIgJ0QQ92IAMgBHIgAnJrIgJBAXQgASACQRVqdkEBcXJBHGohAgsgACACNgIcIAJBAnRBlJ4BaiEHAkACQEHomwEoAgAiBEEBIAJ0IgNxRQRAQeibASADIARyNgIAIAcgADYCACAAIAc2AhgMAQsgAUEAQRkgAkEBdmsgAkEfRht0IQIgBygCACEDA0AgAyIEKAIEQXhxIAFGDQIgAkEddiEDIAJBAXQhAiAEIANBBHFqIgdBEGooAgAiAw0ACyAHIAA2AhAgACAENgIYCyAAIAA2AgwgACAANgIIDwsgBCgCCCIBIAA2AgwgBCAANgIIIABBADYCGCAAIAQ2AgwgACABNgIICwsGAEG0mwELtQkBAX8jAEHgwABrIgUkACAFIAA2AtRAIAUgATYC0EAgBSACNgLMQCAFIAM3A8BAIAUgBDYCvEAgBSAFKALQQDYCuEACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCvEAOEQMEAAYBAgUJCgoKCgoKCAoHCgsgBUIANwPYQAwKCyAFIAUoArhAQeQAaiAFKALMQCAFKQPAQBBDNwPYQAwJCyAFKAK4QBAVIAVCADcD2EAMCAsgBSgCuEAoAhAEQCAFIAUoArhAKAIQIAUoArhAKQMYIAUoArhAQeQAahBgIgM3A5hAIANQBEAgBUJ/NwPYQAwJCyAFKAK4QCkDCCAFKAK4QCkDCCAFKQOYQHxWBEAgBSgCuEBB5ABqQRVBABAUIAVCfzcD2EAMCQsgBSgCuEAiACAFKQOYQCAAKQMAfDcDACAFKAK4QCIAIAUpA5hAIAApAwh8NwMIIAUoArhAQQA2AhALIAUoArhALQB4QQFxRQRAIAVCADcDqEADQCAFKQOoQCAFKAK4QCkDAFQEQCAFIAUoArhAKQMAIAUpA6hAfUKAwABWBH5CgMAABSAFKAK4QCkDACAFKQOoQH0LNwOgQCAFIAUoAtRAIAVBEGogBSkDoEAQKyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqIAUoAtRAEBcgBUJ/NwPYQAwLCyAFKQOwQFAEQCAFKAK4QEHkAGpBEUEAEBQgBUJ/NwPYQAwLBSAFIAUpA7BAIAUpA6hAfDcDqEAMAgsACwsLIAUoArhAIAUoArhAKQMANwMgIAVCADcD2EAMBwsgBSkDwEAgBSgCuEApAwggBSgCuEApAyB9VgRAIAUgBSgCuEApAwggBSgCuEApAyB9NwPAQAsgBSkDwEBQBEAgBUIANwPYQAwHCyAFKAK4QC0AeEEBcQRAIAUoAtRAIAUoArhAKQMgQQAQJ0EASARAIAUoArhAQeQAaiAFKALUQBAXIAVCfzcD2EAMCAsLIAUgBSgC1EAgBSgCzEAgBSkDwEAQKyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqQRFBABAUIAVCfzcD2EAMBwsgBSgCuEAiACAFKQOwQCAAKQMgfDcDICAFKQOwQFAEQCAFKAK4QCkDICAFKAK4QCkDCFQEQCAFKAK4QEHkAGpBEUEAEBQgBUJ/NwPYQAwICwsgBSAFKQOwQDcD2EAMBgsgBSAFKAK4QCkDICAFKAK4QCkDAH0gBSgCuEApAwggBSgCuEApAwB9IAUoAsxAIAUpA8BAIAUoArhAQeQAahCIATcDCCAFKQMIQgBTBEAgBUJ/NwPYQAwGCyAFKAK4QCAFKQMIIAUoArhAKQMAfDcDICAFQgA3A9hADAULIAUgBSgCzEA2AgQgBSgCBCAFKAK4QEEoaiAFKAK4QEHkAGoQhAFBAEgEQCAFQn83A9hADAULIAVCADcD2EAMBAsgBSAFKAK4QCwAYKw3A9hADAMLIAUgBSgCuEApA3A3A9hADAILIAUgBSgCuEApAyAgBSgCuEApAwB9NwPYQAwBCyAFKAK4QEHkAGpBHEEAEBQgBUJ/NwPYQAsgBSkD2EAhAyAFQeDAAGokACADCwgAQQFBDBB/CyIBAX8jAEEQayIBIAA2AgwgASgCDCIAIAAoAjBBAWo2AjALBwAgACgCLAsHACAAKAIoCxgBAX8jAEEQayIBIAA2AgwgASgCDEEMagsHACAAKAIYCwcAIAAoAhALBwAgACgCCAtFAEGgmwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgELFAAgACABrSACrUIghoQgAyAEEH4LEwEBfiAAEEkiAUIgiKcQACABpwsVACAAIAGtIAKtQiCGhCADIAQQxAELFAAgACABIAKtIAOtQiCGhCAEEH0LrQQBAX8jAEEgayIFJAAgBSAANgIYIAUgAa0gAq1CIIaENwMQIAUgAzYCDCAFIAQ2AggCQAJAIAUpAxAgBSgCGCkDMFQEQCAFKAIIQQlNDQELIAUoAhhBCGpBEkEAEBQgBUF/NgIcDAELIAUoAhgoAhhBAnEEQCAFKAIYQQhqQRlBABAUIAVBfzYCHAwBCwJ/IAUoAgwhASMAQRBrIgAkACAAIAE2AgggAEEBOgAHAkAgACgCCEUEQCAAQQE6AA8MAQsgACAAKAIIIAAtAAdBAXEQswFBAEc6AA8LIAAtAA9BAXEhASAAQRBqJAAgAUULBEAgBSgCGEEIakEQQQAQFCAFQX82AhwMAQsgBSAFKAIYKAJAIAUpAxCnQQR0ajYCBCAFIAUoAgQoAgAEfyAFKAIEKAIAKAIQBUF/CzYCAAJAIAUoAgwgBSgCAEYEQCAFKAIEKAIEBEAgBSgCBCgCBCIAIAAoAgBBfnE2AgAgBSgCBCgCBEEAOwFQIAUoAgQoAgQoAgBFBEAgBSgCBCgCBBA3IAUoAgRBADYCBAsLDAELIAUoAgQoAgRFBEAgBSgCBCgCABBAIQAgBSgCBCAANgIEIABFBEAgBSgCGEEIakEOQQAQFCAFQX82AhwMAwsLIAUoAgQoAgQgBSgCDDYCECAFKAIEKAIEIAUoAgg7AVAgBSgCBCgCBCIAIAAoAgBBAXI2AgALIAVBADYCHAsgBSgCHCEAIAVBIGokACAACxcBAX4gACABIAIQciIDQiCIpxAAIAOnCx8BAX4gACABIAKtIAOtQiCGhBArIgRCIIinEAAgBKcLrgECAX8BfgJ/IwBBIGsiAiAANgIUIAIgATYCEAJAIAIoAhRFBEAgAkJ/NwMYDAELIAIoAhBBCHEEQCACIAIoAhQpAzA3AwgDQCACKQMIQgBSBH8gAigCFCgCQCACKQMIQgF9p0EEdGooAgAFQQELRQRAIAIgAikDCEIBfTcDCAwBCwsgAiACKQMINwMYDAELIAIgAigCFCkDMDcDGAsgAikDGCIDQiCIpwsQACADpwsTACAAIAGtIAKtQiCGhCADEMUBC4gCAgF/AX4CfyMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAq0gA61CIIaENwMIAkAgBCgCFEUEQCAEQn83AxgMAQsgBCgCFCgCBARAIARCfzcDGAwBCyAEKQMIQv///////////wBWBEAgBCgCFEEEakESQQAQFCAEQn83AxgMAQsCQCAEKAIULQAQQQFxRQRAIAQpAwhQRQ0BCyAEQgA3AxgMAQsgBCAEKAIUKAIUIAQoAhAgBCkDCBArIgU3AwAgBUIAUwRAIAQoAhRBBGogBCgCFCgCFBAXIARCfzcDGAwBCyAEIAQpAwA3AxgLIAQpAxghBSAEQSBqJAAgBUIgiKcLEAAgBacLTwEBfyMAQSBrIgQkACAEIAA2AhwgBCABrSACrUIghoQ3AxAgBCADNgIMIAQoAhwgBCkDECAEKAIMIAQoAhwoAhwQrQEhACAEQSBqJAAgAAvZAwEBfyMAQSBrIgUkACAFIAA2AhggBSABrSACrUIghoQ3AxAgBSADNgIMIAUgBDYCCAJAIAUoAhggBSkDEEEAQQAQP0UEQCAFQX82AhwMAQsgBSgCGCgCGEECcQRAIAUoAhhBCGpBGUEAEBQgBUF/NgIcDAELIAUoAhgoAkAgBSkDEKdBBHRqKAIIBEAgBSgCGCgCQCAFKQMQp0EEdGooAgggBSgCDBBnQQBIBEAgBSgCGEEIakEPQQAQFCAFQX82AhwMAgsgBUEANgIcDAELIAUgBSgCGCgCQCAFKQMQp0EEdGo2AgQgBSAFKAIEKAIABH8gBSgCDCAFKAIEKAIAKAIURwVBAQtBAXE2AgACQCAFKAIABEAgBSgCBCgCBEUEQCAFKAIEKAIAEEAhACAFKAIEIAA2AgQgAEUEQCAFKAIYQQhqQQ5BABAUIAVBfzYCHAwECwsgBSgCBCgCBCAFKAIMNgIUIAUoAgQoAgQiACAAKAIAQSByNgIADAELIAUoAgQoAgQEQCAFKAIEKAIEIgAgACgCAEFfcTYCACAFKAIEKAIEKAIARQRAIAUoAgQoAgQQNyAFKAIEQQA2AgQLCwsgBUEANgIcCyAFKAIcIQAgBUEgaiQAIAALFwAgACABrSACrUIghoQgAyAEIAUQmQELEgAgACABrSACrUIghoQgAxAnC48BAgF/AX4CfyMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAjYCDCAEIAM2AggCQAJAIAQoAhAEQCAEKAIMDQELIAQoAhRBCGpBEkEAEBQgBEJ/NwMYDAELIAQgBCgCFCAEKAIQIAQoAgwgBCgCCBCaATcDGAsgBCkDGCEFIARBIGokACAFQiCIpwsQACAFpwuFBQIBfwF+An8jAEEwayIDJAAgAyAANgIkIAMgATYCICADIAI2AhwCQCADKAIkKAIYQQJxBEAgAygCJEEIakEZQQAQFCADQn83AygMAQsgAygCIEUEQCADKAIkQQhqQRJBABAUIANCfzcDKAwBCyADQQA2AgwgAyADKAIgEC42AhggAygCICADKAIYQQFraiwAAEEvRwRAIAMgAygCGEECahAYIgA2AgwgAEUEQCADKAIkQQhqQQ5BABAUIANCfzcDKAwCCwJAAkAgAygCDCIBIAMoAiAiAHNBA3ENACAAQQNxBEADQCABIAAtAAAiAjoAACACRQ0DIAFBAWohASAAQQFqIgBBA3ENAAsLIAAoAgAiAkF/cyACQYGChAhrcUGAgYKEeHENAANAIAEgAjYCACAAKAIEIQIgAUEEaiEBIABBBGohACACQYGChAhrIAJBf3NxQYCBgoR4cUUNAAsLIAEgAC0AACICOgAAIAJFDQADQCABIAAtAAEiAjoAASABQQFqIQEgAEEBaiEAIAINAAsLIAMoAgwgAygCGGpBLzoAACADKAIMIAMoAhhBAWpqQQA6AAALIAMgAygCJEEAQgBBABB9IgA2AgggAEUEQCADKAIMEBUgA0J/NwMoDAELIAMgAygCJAJ/IAMoAgwEQCADKAIMDAELIAMoAiALIAMoAgggAygCHBCaATcDECADKAIMEBUCQCADKQMQQgBTBEAgAygCCBAbDAELIAMoAiQgAykDEEEAQQNBgID8jwQQmQFBAEgEQCADKAIkIAMpAxAQmAEaIANCfzcDKAwCCwsgAyADKQMQNwMoCyADKQMoIQQgA0EwaiQAIARCIIinCxAAIASnCxEAIAAgAa0gAq1CIIaEEJgBCxcAIAAgAa0gAq1CIIaEIAMgBCAFEIoBC38CAX8BfiMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhggAygCFCADKAIQEHIiBDcDCAJAIARCAFMEQCADQQA2AhwMAQsgAyADKAIYIAMpAwggAygCECADKAIYKAIcEK0BNgIcCyADKAIcIQAgA0EgaiQAIAALEAAjACAAa0FwcSIAJAAgAAsGACAAJAALBAAjAAuCAQIBfwF+IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDCAEIAQoAhggBCgCFCAEKAIQEHIiBTcDAAJAIAVCAFMEQCAEQX82AhwMAQsgBCAEKAIYIAQpAwAgBCgCECAEKAIMEH42AhwLIAQoAhwhACAEQSBqJAAgAAvQRQMGfwF+AnwjAEHgAGsiASQAIAEgADYCWAJAIAEoAlhFBEAgAUF/NgJcDAELIwBBIGsiACABKAJYNgIcIAAgAUFAazYCGCAAQQA2AhQgAEIANwMAAkAgACgCHC0AKEEBcUUEQCAAKAIcKAIYIAAoAhwoAhRGDQELIABBATYCFAsgAEIANwMIA0AgACkDCCAAKAIcKQMwVARAAkACQCAAKAIcKAJAIAApAwinQQR0aigCCA0AIAAoAhwoAkAgACkDCKdBBHRqLQAMQQFxDQAgACgCHCgCQCAAKQMIp0EEdGooAgRFDQEgACgCHCgCQCAAKQMIp0EEdGooAgQoAgBFDQELIABBATYCFAsgACgCHCgCQCAAKQMIp0EEdGotAAxBAXFFBEAgACAAKQMAQgF8NwMACyAAIAApAwhCAXw3AwgMAQsLIAAoAhgEQCAAKAIYIAApAwA3AwALIAEgACgCFDYCJCABKQNAUARAAkAgASgCWCgCBEEIcUUEQCABKAIkRQ0BCwJ/IAEoAlgoAgAhAiMAQRBrIgAkACAAIAI2AggCQCAAKAIIKAIkQQNGBEAgAEEANgIMDAELIAAoAggoAiAEQCAAKAIIEC9BAEgEQCAAQX82AgwMAgsLIAAoAggoAiQEQCAAKAIIEGILIAAoAghBAEIAQQ8QIEIAUwRAIABBfzYCDAwBCyAAKAIIQQM2AiQgAEEANgIMCyAAKAIMIQIgAEEQaiQAIAJBAEgLBEACQAJ/IwBBEGsiACABKAJYKAIANgIMIwBBEGsiAiAAKAIMQQxqNgIMIAIoAgwoAgBBFkYLBEAjAEEQayIAIAEoAlgoAgA2AgwjAEEQayICIAAoAgxBDGo2AgwgAigCDCgCBEEsRg0BCyABKAJYQQhqIAEoAlgoAgAQFyABQX82AlwMBAsLCyABKAJYEDwgAUEANgJcDAELIAEoAiRFBEAgASgCWBA8IAFBADYCXAwBCyABKQNAIAEoAlgpAzBWBEAgASgCWEEIakEUQQAQFCABQX82AlwMAQsgASABKQNAp0EDdBAYIgA2AiggAEUEQCABQX82AlwMAQsgAUJ/NwM4IAFCADcDSCABQgA3A1ADQCABKQNQIAEoAlgpAzBUBEACQCABKAJYKAJAIAEpA1CnQQR0aigCAEUNAAJAIAEoAlgoAkAgASkDUKdBBHRqKAIIDQAgASgCWCgCQCABKQNQp0EEdGotAAxBAXENACABKAJYKAJAIAEpA1CnQQR0aigCBEUNASABKAJYKAJAIAEpA1CnQQR0aigCBCgCAEUNAQsgAQJ+IAEpAzggASgCWCgCQCABKQNQp0EEdGooAgApA0hUBEAgASkDOAwBCyABKAJYKAJAIAEpA1CnQQR0aigCACkDSAs3AzgLIAEoAlgoAkAgASkDUKdBBHRqLQAMQQFxRQRAIAEpA0ggASkDQFoEQCABKAIoEBUgASgCWEEIakEUQQAQFCABQX82AlwMBAsgASgCKCABKQNIp0EDdGogASkDUDcDACABIAEpA0hCAXw3A0gLIAEgASkDUEIBfDcDUAwBCwsgASkDSCABKQNAVARAIAEoAigQFSABKAJYQQhqQRRBABAUIAFBfzYCXAwBCwJAAn8jAEEQayIAIAEoAlgoAgA2AgwgACgCDCkDGEKAgAiDUAsEQCABQgA3AzgMAQsgASkDOEJ/UQRAIAFCfzcDGCABQgA3AzggAUIANwNQA0AgASkDUCABKAJYKQMwVARAIAEoAlgoAkAgASkDUKdBBHRqKAIABEAgASgCWCgCQCABKQNQp0EEdGooAgApA0ggASkDOFoEQCABIAEoAlgoAkAgASkDUKdBBHRqKAIAKQNINwM4IAEgASkDUDcDGAsLIAEgASkDUEIBfDcDUAwBCwsgASkDGEJ/UgRAIAEoAlghAiABKQMYIQcgASgCWEEIaiEDIwBBMGsiACQAIAAgAjYCJCAAIAc3AxggACADNgIUIAAgACgCJCAAKQMYIAAoAhQQYCIHNwMIAkAgB1AEQCAAQgA3AygMAQsgACAAKAIkKAJAIAApAxinQQR0aigCADYCBAJAIAApAwggACkDCCAAKAIEKQMgfFgEQCAAKQMIIAAoAgQpAyB8Qv///////////wBYDQELIAAoAhRBBEEWEBQgAEIANwMoDAELIAAgACgCBCkDICAAKQMIfDcDCCAAKAIELwEMQQhxBEAgACgCJCgCACAAKQMIQQAQJ0EASARAIAAoAhQgACgCJCgCABAXIABCADcDKAwCCyAAKAIkKAIAIABCBBArQgRSBEAgACgCFCAAKAIkKAIAEBcgAEIANwMoDAILIAAoAABB0JadwABGBEAgACAAKQMIQgR8NwMICyAAIAApAwhCDHw3AwggACgCBEEAEGVBAXEEQCAAIAApAwhCCHw3AwgLIAApAwhC////////////AFYEQCAAKAIUQQRBFhAUIABCADcDKAwCCwsgACAAKQMINwMoCyAAKQMoIQcgAEEwaiQAIAEgBzcDOCAHUARAIAEoAigQFSABQX82AlwMBAsLCyABKQM4QgBSBEACfyABKAJYKAIAIQIgASkDOCEHIwBBEGsiACQAIAAgAjYCCCAAIAc3AwACQCAAKAIIKAIkQQFGBEAgACgCCEEMakESQQAQFCAAQX82AgwMAQsgACgCCEEAIAApAwBBERAgQgBTBEAgAEF/NgIMDAELIAAoAghBATYCJCAAQQA2AgwLIAAoAgwhAiAAQRBqJAAgAkEASAsEQCABQgA3AzgLCwsgASkDOFAEQAJ/IAEoAlgoAgAhAiMAQRBrIgAkACAAIAI2AggCQCAAKAIIKAIkQQFGBEAgACgCCEEMakESQQAQFCAAQX82AgwMAQsgACgCCEEAQgBBCBAgQgBTBEAgAEF/NgIMDAELIAAoAghBATYCJCAAQQA2AgwLIAAoAgwhAiAAQRBqJAAgAkEASAsEQCABKAJYQQhqIAEoAlgoAgAQFyABKAIoEBUgAUF/NgJcDAILCyABKAJYKAJUIQIjAEEQayIAJAAgACACNgIMIAAoAgwEQCAAKAIMRAAAAAAAAAAAOQMYIAAoAgwoAgBEAAAAAAAAAAAgACgCDCgCDCAAKAIMKAIEERYACyAAQRBqJAAgAUEANgIsIAFCADcDSANAAkAgASkDSCABKQNAWg0AIAEoAlgoAlQhAiABKQNIIge6IAEpA0C6IgijIQkjAEEgayIAJAAgACACNgIcIAAgCTkDECAAIAdCAXy6IAijOQMIIAAoAhwEQCAAKAIcIAArAxA5AyAgACgCHCAAKwMIOQMoIAAoAhxEAAAAAAAAAAAQVwsgAEEgaiQAIAEgASgCKCABKQNIp0EDdGopAwA3A1AgASABKAJYKAJAIAEpA1CnQQR0ajYCEAJAAkAgASgCECgCAEUNACABKAIQKAIAKQNIIAEpAzhaDQAMAQsgAQJ/QQEgASgCECgCCA0AGiABKAIQKAIEBEBBASABKAIQKAIEKAIAQQFxDQEaCyABKAIQKAIEBH8gASgCECgCBCgCAEHAAHFBAEcFQQALC0EBcTYCFCABKAIQKAIERQRAIAEoAhAoAgAQQCEAIAEoAhAgADYCBCAARQRAIAEoAlhBCGpBDkEAEBQgAUEBNgIsDAMLCyABIAEoAhAoAgQ2AgwCfyABKAJYIQIgASkDUCEHIwBBMGsiACQAIAAgAjYCKCAAIAc3AyACQCAAKQMgIAAoAigpAzBaBEAgACgCKEEIakESQQAQFCAAQX82AiwMAQsgACAAKAIoKAJAIAApAyCnQQR0ajYCHAJAIAAoAhwoAgAEQCAAKAIcKAIALQAEQQFxRQ0BCyAAQQA2AiwMAQsgACgCHCgCACkDSEIafEL///////////8AVgRAIAAoAihBCGpBBEEWEBQgAEF/NgIsDAELIAAoAigoAgAgACgCHCgCACkDSEIafEEAECdBAEgEQCAAKAIoQQhqIAAoAigoAgAQFyAAQX82AiwMAQsgACAAKAIoKAIAQgQgAEEYaiAAKAIoQQhqEEIiAjYCFCACRQRAIABBfzYCLAwBCyAAIAAoAhQQHTsBEiAAIAAoAhQQHTsBECAAKAIUEEdBAXFFBEAgACgCFBAWIAAoAihBCGpBFEEAEBQgAEF/NgIsDAELIAAoAhQQFiAALwEQBEAgACgCKCgCACAALwESrUEBECdBAEgEQCAAKAIoQQhqQQRBtJsBKAIAEBQgAEF/NgIsDAILIABBACAAKAIoKAIAIAAvARBBACAAKAIoQQhqEGM2AgggACgCCEUEQCAAQX82AiwMAgsgACgCCCAALwEQQYACIABBDGogACgCKEEIahCUAUEBcUUEQCAAKAIIEBUgAEF/NgIsDAILIAAoAggQFSAAKAIMBEAgACAAKAIMEJMBNgIMIAAoAhwoAgAoAjQgACgCDBCVASECIAAoAhwoAgAgAjYCNAsLIAAoAhwoAgBBAToABAJAIAAoAhwoAgRFDQAgACgCHCgCBC0ABEEBcQ0AIAAoAhwoAgQgACgCHCgCACgCNDYCNCAAKAIcKAIEQQE6AAQLIABBADYCLAsgACgCLCECIABBMGokACACQQBICwRAIAFBATYCLAwCCyABIAEoAlgoAgAQNSIHNwMwIAdCAFMEQCABQQE2AiwMAgsgASgCDCABKQMwNwNIAkAgASgCFARAIAFBADYCCCABKAIQKAIIRQRAIAEgASgCWCABKAJYIAEpA1BBCEEAEK4BIgA2AgggAEUEQCABQQE2AiwMBQsLAn8gASgCWCECAn8gASgCCARAIAEoAggMAQsgASgCECgCCAshAyABKAIMIQQjAEGgAWsiACQAIAAgAjYCmAEgACADNgKUASAAIAQ2ApABAkAgACgClAEgAEE4ahA5QQBIBEAgACgCmAFBCGogACgClAEQFyAAQX82ApwBDAELIAApAzhCwACDUARAIAAgACkDOELAAIQ3AzggAEEAOwFoCwJAAkAgACgCkAEoAhBBf0cEQCAAKAKQASgCEEF+Rw0BCyAALwFoRQ0AIAAoApABIAAvAWg2AhAMAQsCQAJAIAAoApABKAIQDQAgACkDOEIEg1ANACAAIAApAzhCCIQ3AzggACAAKQNQNwNYDAELIAAgACkDOEL3////D4M3AzgLCyAAKQM4QoABg1AEQCAAIAApAzhCgAGENwM4IABBADsBagsgAEGAAjYCJAJAIAApAzhCBINQBEAgACAAKAIkQYAIcjYCJCAAQn83A3AMAQsgACgCkAEgACkDUDcDKCAAIAApA1A3A3ACQCAAKQM4QgiDUARAAkACQAJAAkACQAJ/AkAgACgCkAEoAhBBf0cEQCAAKAKQASgCEEF+Rw0BC0EIDAELIAAoApABKAIQC0H//wNxDg0CAwMDAwMDAwEDAwMAAwsgAEKUwuTzDzcDEAwDCyAAQoODsP8PNwMQDAILIABC/////w83AxAMAQsgAEIANwMQCyAAKQNQIAApAxBWBEAgACAAKAIkQYAIcjYCJAsMAQsgACgCkAEgACkDWDcDIAsLIAAgACgCmAEoAgAQNSIHNwOIASAHQgBTBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAAoApABIgIgAi8BDEH3/wNxOwEMIAAgACgCmAEgACgCkAEgACgCJBBUIgI2AiggAkEASARAIABBfzYCnAEMAQsgACAALwFoAn8CQCAAKAKQASgCEEF/RwRAIAAoApABKAIQQX5HDQELQQgMAQsgACgCkAEoAhALQf//A3FHOgAiIAAgAC0AIkEBcQR/IAAvAWhBAEcFQQALQQFxOgAhIAAgAC8BaAR/IAAtACEFQQELQQFxOgAgIAAgAC0AIkEBcQR/IAAoApABKAIQQQBHBUEAC0EBcToAHyAAAn9BASAALQAiQQFxDQAaQQEgACgCkAEoAgBBgAFxDQAaIAAoApABLwFSIAAvAWpHC0EBcToAHiAAIAAtAB5BAXEEfyAALwFqQQBHBUEAC0EBcToAHSAAIAAtAB5BAXEEfyAAKAKQAS8BUkEARwVBAAtBAXE6ABwgACAAKAKUATYCNCMAQRBrIgIgACgCNDYCDCACKAIMIgIgAigCMEEBajYCMCAALQAdQQFxBEAgACAALwFqQQAQeyICNgIMIAJFBEAgACgCmAFBCGpBGEEAEBQgACgCNBAbIABBfzYCnAEMAgsgACAAKAKYASAAKAI0IAAvAWpBACAAKAKYASgCHCAAKAIMEQUAIgI2AjAgAkUEQCAAKAI0EBsgAEF/NgKcAQwCCyAAKAI0EBsgACAAKAIwNgI0CyAALQAhQQFxBEAgACAAKAKYASAAKAI0IAAvAWgQsAEiAjYCMCACRQRAIAAoAjQQGyAAQX82ApwBDAILIAAoAjQQGyAAIAAoAjA2AjQLIAAtACBBAXEEQCAAIAAoApgBIAAoAjRBABCvASICNgIwIAJFBEAgACgCNBAbIABBfzYCnAEMAgsgACgCNBAbIAAgACgCMDYCNAsgAC0AH0EBcQRAIAAoApgBIQMgACgCNCEEIAAoApABKAIQIQUgACgCkAEvAVAhBiMAQRBrIgIkACACIAM2AgwgAiAENgIIIAIgBTYCBCACIAY2AgAgAigCDCACKAIIIAIoAgRBASACKAIAELIBIQMgAkEQaiQAIAAgAyICNgIwIAJFBEAgACgCNBAbIABBfzYCnAEMAgsgACgCNBAbIAAgACgCMDYCNAsgAC0AHEEBcQRAIABBADYCBAJAIAAoApABKAJUBEAgACAAKAKQASgCVDYCBAwBCyAAKAKYASgCHARAIAAgACgCmAEoAhw2AgQLCyAAIAAoApABLwFSQQEQeyICNgIIIAJFBEAgACgCmAFBCGpBGEEAEBQgACgCNBAbIABBfzYCnAEMAgsgACAAKAKYASAAKAI0IAAoApABLwFSQQEgACgCBCAAKAIIEQUAIgI2AjAgAkUEQCAAKAI0EBsgAEF/NgKcAQwCCyAAKAI0EBsgACAAKAIwNgI0CyAAIAAoApgBKAIAEDUiBzcDgAEgB0IAUwRAIAAoApgBQQhqIAAoApgBKAIAEBcgAEF/NgKcAQwBCyAAKAKYASEDIAAoAjQhBCAAKQNwIQcjAEHAwABrIgIkACACIAM2ArhAIAIgBDYCtEAgAiAHNwOoQAJAIAIoArRAEEhBAEgEQCACKAK4QEEIaiACKAK0QBAXIAJBfzYCvEAMAQsgAkEANgIMIAJCADcDEANAAkAgAiACKAK0QCACQSBqQoDAABArIgc3AxggB0IAVw0AIAIoArhAIAJBIGogAikDGBA2QQBIBEAgAkF/NgIMBSACKQMYQoDAAFINAiACKAK4QCgCVEUNAiACKQOoQEIAVw0CIAIgAikDGCACKQMQfDcDECACKAK4QCgCVCACKQMQuSACKQOoQLmjEFcMAgsLCyACKQMYQgBTBEAgAigCuEBBCGogAigCtEAQFyACQX82AgwLIAIoArRAEC8aIAIgAigCDDYCvEALIAIoArxAIQMgAkHAwABqJAAgACADNgIsIAAoAjQgAEE4ahA5QQBIBEAgACgCmAFBCGogACgCNBAXIABBfzYCLAsgACgCNCEDIwBBEGsiAiQAIAIgAzYCCAJAA0AgAigCCARAIAIoAggpAxhCgIAEg0IAUgRAIAIgAigCCEEAQgBBEBAgNwMAIAIpAwBCAFMEQCACQf8BOgAPDAQLIAIpAwBCA1UEQCACKAIIQQxqQRRBABAUIAJB/wE6AA8MBAsgAiACKQMAPAAPDAMFIAIgAigCCCgCADYCCAwCCwALCyACQQA6AA8LIAIsAA8hAyACQRBqJAAgACADIgI6ACMgAkEYdEEYdUEASARAIAAoApgBQQhqIAAoAjQQFyAAQX82AiwLIAAoAjQQGyAAKAIsQQBIBEAgAEF/NgKcAQwBCyAAIAAoApgBKAIAEDUiBzcDeCAHQgBTBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAAoApgBKAIAIAApA4gBEJsBQQBIBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAApAzhC5ACDQuQAUgRAIAAoApgBQQhqQRRBABAUIABBfzYCnAEMAQsgACgCkAEoAgBBIHFFBEACQCAAKQM4QhCDQgBSBEAgACgCkAEgACgCYDYCFAwBCyAAKAKQAUEUahABGgsLIAAoApABIAAvAWg2AhAgACgCkAEgACgCZDYCGCAAKAKQASAAKQNQNwMoIAAoApABIAApA3ggACkDgAF9NwMgIAAoApABIAAoApABLwEMQfn/A3EgAC0AI0EBdHI7AQwgACgCkAEhAyAAKAIkQYAIcUEARyEEIwBBEGsiAiQAIAIgAzYCDCACIAQ6AAsCQCACKAIMKAIQQQ5GBEAgAigCDEE/OwEKDAELIAIoAgwoAhBBDEYEQCACKAIMQS47AQoMAQsCQCACLQALQQFxRQRAIAIoAgxBABBlQQFxRQ0BCyACKAIMQS07AQoMAQsCQCACKAIMKAIQQQhHBEAgAigCDC8BUkEBRw0BCyACKAIMQRQ7AQoMAQsgAiACKAIMKAIwEFEiAzsBCCADQf//A3EEQCACKAIMKAIwKAIAIAIvAQhBAWtqLQAAQS9GBEAgAigCDEEUOwEKDAILCyACKAIMQQo7AQoLIAJBEGokACAAIAAoApgBIAAoApABIAAoAiQQVCICNgIsIAJBAEgEQCAAQX82ApwBDAELIAAoAiggACgCLEcEQCAAKAKYAUEIakEUQQAQFCAAQX82ApwBDAELIAAoApgBKAIAIAApA3gQmwFBAEgEQCAAKAKYAUEIaiAAKAKYASgCABAXIABBfzYCnAEMAQsgAEEANgKcAQsgACgCnAEhAiAAQaABaiQAIAJBAEgLBEAgAUEBNgIsIAEoAggEQCABKAIIEBsLDAQLIAEoAggEQCABKAIIEBsLDAELIAEoAgwiACAALwEMQff/A3E7AQwgASgCWCABKAIMQYACEFRBAEgEQCABQQE2AiwMAwsgASABKAJYIAEpA1AgASgCWEEIahBgIgc3AwAgB1AEQCABQQE2AiwMAwsgASgCWCgCACABKQMAQQAQJ0EASARAIAEoAlhBCGogASgCWCgCABAXIAFBATYCLAwDCwJ/IAEoAlghAiABKAIMKQMgIQcjAEGgwABrIgAkACAAIAI2AphAIAAgBzcDkEAgACAAKQOQQLo5AwACQANAIAApA5BAUEUEQCAAIAApA5BAQoDAAFYEfkKAwAAFIAApA5BACz4CDCAAKAKYQCgCACAAQRBqIAAoAgytIAAoAphAQQhqEGRBAEgEQCAAQX82ApxADAMLIAAoAphAIABBEGogACgCDK0QNkEASARAIABBfzYCnEAMAwUgACAAKQOQQCAANQIMfTcDkEAgACgCmEAoAlQgACsDACAAKQOQQLqhIAArAwCjEFcMAgsACwsgAEEANgKcQAsgACgCnEAhAiAAQaDAAGokACACQQBICwRAIAFBATYCLAwDCwsLIAEgASkDSEIBfDcDSAwBCwsgASgCLEUEQAJ/IAEoAlghACABKAIoIQMgASkDQCEHIwBBMGsiAiQAIAIgADYCKCACIAM2AiQgAiAHNwMYIAIgAigCKCgCABA1Igc3AxACQCAHQgBTBEAgAkF/NgIsDAELIAIoAighAyACKAIkIQQgAikDGCEHIwBBwAFrIgAkACAAIAM2ArQBIAAgBDYCsAEgACAHNwOoASAAIAAoArQBKAIAEDUiBzcDIAJAIAdCAFMEQCAAKAK0AUEIaiAAKAK0ASgCABAXIABCfzcDuAEMAQsgACAAKQMgNwOgASAAQQA6ABcgAEIANwMYA0AgACkDGCAAKQOoAVQEQCAAIAAoArQBKAJAIAAoArABIAApAxinQQN0aikDAKdBBHRqNgIMIAAgACgCtAECfyAAKAIMKAIEBEAgACgCDCgCBAwBCyAAKAIMKAIAC0GABBBUIgM2AhAgA0EASARAIABCfzcDuAEMAwsgACgCEARAIABBAToAFwsgACAAKQMYQgF8NwMYDAELCyAAIAAoArQBKAIAEDUiBzcDICAHQgBTBEAgACgCtAFBCGogACgCtAEoAgAQFyAAQn83A7gBDAELIAAgACkDICAAKQOgAX03A5gBAkAgACkDoAFC/////w9YBEAgACkDqAFC//8DWA0BCyAAQQE6ABcLIAAgAEEwakLiABApIgM2AiwgA0UEQCAAKAK0AUEIakEOQQAQFCAAQn83A7gBDAELIAAtABdBAXEEQCAAKAIsQecSQQQQQSAAKAIsQiwQLSAAKAIsQS0QHyAAKAIsQS0QHyAAKAIsQQAQISAAKAIsQQAQISAAKAIsIAApA6gBEC0gACgCLCAAKQOoARAtIAAoAiwgACkDmAEQLSAAKAIsIAApA6ABEC0gACgCLEHiEkEEEEEgACgCLEEAECEgACgCLCAAKQOgASAAKQOYAXwQLSAAKAIsQQEQIQsgACgCLEHsEkEEEEEgACgCLEEAECEgACgCLCAAKQOoAUL//wNaBH5C//8DBSAAKQOoAQunQf//A3EQHyAAKAIsIAApA6gBQv//A1oEfkL//wMFIAApA6gBC6dB//8DcRAfIAAoAiwgACkDmAFC/////w9aBH9BfwUgACkDmAGnCxAhIAAoAiwgACkDoAFC/////w9aBH9BfwUgACkDoAGnCxAhIAACfyAAKAK0AS0AKEEBcQRAIAAoArQBKAIkDAELIAAoArQBKAIgCzYClAEgACgCLAJ/IAAoApQBBEAgACgClAEvAQQMAQtBAAtB//8DcRAfAn8jAEEQayIDIAAoAiw2AgwgAygCDC0AAEEBcUULBEAgACgCtAFBCGpBFEEAEBQgACgCLBAWIABCfzcDuAEMAQsgACgCtAECfyMAQRBrIgMgACgCLDYCDCADKAIMKAIECwJ+IwBBEGsiAyAAKAIsNgIMAn4gAygCDC0AAEEBcQRAIAMoAgwpAxAMAQtCAAsLEDZBAEgEQCAAKAIsEBYgAEJ/NwO4AQwBCyAAKAIsEBYgACgClAEEQCAAKAK0ASAAKAKUASgCACAAKAKUAS8BBK0QNkEASARAIABCfzcDuAEMAgsLIAAgACkDmAE3A7gBCyAAKQO4ASEHIABBwAFqJAAgAiAHNwMAIAdCAFMEQCACQX82AiwMAQsgAiACKAIoKAIAEDUiBzcDCCAHQgBTBEAgAkF/NgIsDAELIAJBADYCLAsgAigCLCEAIAJBMGokACAAQQBICwRAIAFBATYCLAsLIAEoAigQFSABKAIsRQRAAn8gASgCWCgCACECIwBBEGsiACQAIAAgAjYCCAJAIAAoAggoAiRBAUcEQCAAKAIIQQxqQRJBABAUIABBfzYCDAwBCyAAKAIIKAIgQQFLBEAgACgCCEEMakEdQQAQFCAAQX82AgwMAQsgACgCCCgCIARAIAAoAggQL0EASARAIABBfzYCDAwCCwsgACgCCEEAQgBBCRAgQgBTBEAgACgCCEECNgIkIABBfzYCDAwBCyAAKAIIQQA2AiQgAEEANgIMCyAAKAIMIQIgAEEQaiQAIAILBEAgASgCWEEIaiABKAJYKAIAEBcgAUEBNgIsCwsgASgCWCgCVCECIwBBEGsiACQAIAAgAjYCDCAAKAIMRAAAAAAAAPA/EFcgAEEQaiQAIAEoAiwEQCABKAJYKAIAEGIgAUF/NgJcDAELIAEoAlgQPCABQQA2AlwLIAEoAlwhACABQeAAaiQAIAAL0g4CB38CfiMAQTBrIgMkACADIAA2AiggAyABNgIkIAMgAjYCICMAQRBrIgAgA0EIajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCADKAIoIQAjAEEgayIEJAAgBCAANgIYIARCADcDECAEQn83AwggBCADQQhqNgIEAkACQCAEKAIYBEAgBCkDCEJ/WQ0BCyAEKAIEQRJBABAUIARBADYCHAwBCyAEKAIYIQAgBCkDECEKIAQpAwghCyAEKAIEIQEjAEGgAWsiAiQAIAIgADYCmAEgAkEANgKUASACIAo3A4gBIAIgCzcDgAEgAkEANgJ8IAIgATYCeAJAAkAgAigClAENACACKAKYAQ0AIAIoAnhBEkEAEBQgAkEANgKcAQwBCyACKQOAAUIAUwRAIAJCADcDgAELAkAgAikDiAFC////////////AFgEQCACKQOIASACKQOIASACKQOAAXxYDQELIAIoAnhBEkEAEBQgAkEANgKcAQwBCyACQYgBEBgiADYCdCAARQRAIAIoAnhBDkEAEBQgAkEANgKcAQwBCyACKAJ0QQA2AhggAigCmAEEQCACKAKYASIAEC5BAWoiARAYIgUEfyAFIAAgARAZBUEACyEAIAIoAnQgADYCGCAARQRAIAIoAnhBDkEAEBQgAigCdBAVIAJBADYCnAEMAgsLIAIoAnQgAigClAE2AhwgAigCdCACKQOIATcDaCACKAJ0IAIpA4ABNwNwAkAgAigCfARAIAIoAnQiACACKAJ8IgEpAwA3AyAgACABKQMwNwNQIAAgASkDKDcDSCAAIAEpAyA3A0AgACABKQMYNwM4IAAgASkDEDcDMCAAIAEpAwg3AyggAigCdEEANgIoIAIoAnQiACAAKQMgQv7///8PgzcDIAwBCyACKAJ0QSBqEDsLIAIoAnQpA3BCAFIEQCACKAJ0IAIoAnQpA3A3AzggAigCdCIAIAApAyBCBIQ3AyALIwBBEGsiACACKAJ0QdgAajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCACKAJ0QQA2AoABIAIoAnRBADYChAEjAEEQayIAIAIoAnQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggAkF/NgIEIAJBBzYCAEEOIAIQNEI/hCEKIAIoAnQgCjcDEAJAIAIoAnQoAhgEQCACIAIoAnQoAhggAkEYahCmAUEATjoAFyACLQAXQQFxRQRAAkAgAigCdCkDaFBFDQAgAigCdCkDcFBFDQAgAigCdEL//wM3AxALCwwBCwJAIAIoAnQoAhwiACgCTEEASA0ACyAAKAI8IQBBACEFIwBBIGsiBiQAAn8CQCAAIAJBGGoiCRAKIgFBeEYEQCMAQSBrIgckACAAIAdBCGoQCSIIBH9BtJsBIAg2AgBBAAVBAQshCCAHQSBqJAAgCA0BCyABQYFgTwR/QbSbAUEAIAFrNgIAQX8FIAELDAELA0AgBSAGaiIBIAVBxxJqLQAAOgAAIAVBDkchByAFQQFqIQUgBw0ACwJAIAAEQEEPIQUgACEBA0AgAUEKTwRAIAVBAWohBSABQQpuIQEMAQsLIAUgBmpBADoAAANAIAYgBUEBayIFaiAAIABBCm4iAUEKbGtBMHI6AAAgAEEJSyEHIAEhACAHDQALDAELIAFBMDoAACAGQQA6AA8LIAYgCRACIgBBgWBPBH9BtJsBQQAgAGs2AgBBfwUgAAsLIQAgBkEgaiQAIAIgAEEATjoAFwsCQCACLQAXQQFxRQRAIAIoAnRB2ABqQQVBtJsBKAIAEBQMAQsgAigCdCkDIEIQg1AEQCACKAJ0IAIoAlg2AkggAigCdCIAIAApAyBCEIQ3AyALIAIoAiRBgOADcUGAgAJGBEAgAigCdEL/gQE3AxAgAikDQCACKAJ0KQNoIAIoAnQpA3B8VARAIAIoAnhBEkEAEBQgAigCdCgCGBAVIAIoAnQQFSACQQA2ApwBDAMLIAIoAnQpA3BQBEAgAigCdCACKQNAIAIoAnQpA2h9NwM4IAIoAnQiACAAKQMgQgSENwMgAkAgAigCdCgCGEUNACACKQOIAVBFDQAgAigCdEL//wM3AxALCwsLIAIoAnQiACAAKQMQQoCAEIQ3AxAgAkEeIAIoAnQgAigCeBCDASIANgJwIABFBEAgAigCdCgCGBAVIAIoAnQQFSACQQA2ApwBDAELIAIgAigCcDYCnAELIAIoApwBIQAgAkGgAWokACAEIAA2AhwLIAQoAhwhACAEQSBqJAAgAyAANgIYAkAgAEUEQCADKAIgIANBCGoQnQEgA0EIahA4IANBADYCLAwBCyADIAMoAhggAygCJCADQQhqEJwBIgA2AhwgAEUEQCADKAIYEBsgAygCICADQQhqEJ0BIANBCGoQOCADQQA2AiwMAQsgA0EIahA4IAMgAygCHDYCLAsgAygCLCEAIANBMGokACAAC5IfAQZ/IwBB4ABrIgQkACAEIAA2AlQgBCABNgJQIAQgAjcDSCAEIAM2AkQgBCAEKAJUNgJAIAQgBCgCUDYCPAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAkQOEwYHAgwEBQoOAQMJEAsPDQgREQARCyAEQgA3A1gMEQsgBCgCQCgCGEUEQCAEKAJAQRxBABAUIARCfzcDWAwRCyAEKAJAIQAjAEGAAWsiASQAIAEgADYCeCABIAEoAngoAhgQLkEIahAYIgA2AnQCQCAARQRAIAEoAnhBDkEAEBQgAUF/NgJ8DAELAkAgASgCeCgCGCABQRBqEKYBRQRAIAEgASgCHDYCbAwBCyABQX82AmwLIAEoAnQhACABIAEoAngoAhg2AgAgAEGrEiABEG8gASgCdCEDIAEoAmwhByMAQTBrIgAkACAAIAM2AiggACAHNgIkIABBADYCECAAIAAoAiggACgCKBAuajYCGCAAIAAoAhhBAWs2AhwDQCAAKAIcIAAoAihPBH8gACgCHCwAAEHYAEYFQQALQQFxBEAgACAAKAIQQQFqNgIQIAAgACgCHEEBazYCHAwBCwsCQCAAKAIQRQRAQbSbAUEcNgIAIABBfzYCLAwBCyAAIAAoAhxBAWo2AhwDQCMAQRBrIgckAAJAAn8jAEEQayIDJAAgAyAHQQhqNgIIIANBBDsBBiADQegLQQBBABBsIgU2AgACQCAFQQBIBEAgA0EAOgAPDAELAn8gAygCACEGIAMoAgghCCADLwEGIQkjAEEQayIFJAAgBSAJNgIMIAUgCDYCCCAGIAVBCGpBASAFQQRqEAYiBgR/QbSbASAGNgIAQX8FQQALIQYgBSgCBCEIIAVBEGokACADLwEGQX8gCCAGG0cLBEAgAygCABBrIANBADoADwwBCyADKAIAEGsgA0EBOgAPCyADLQAPQQFxIQUgA0EQaiQAIAULBEAgByAHKAIINgIMDAELQcCgAS0AAEEBcUUEQEEAEAEhBgJAQciZASgCACIDRQRAQcyZASgCACAGNgIADAELQdCZAUEDQQNBASADQQdGGyADQR9GGzYCAEG8oAFBADYCAEHMmQEoAgAhBSADQQFOBEAgBq0hAkEAIQYDQCAFIAZBAnRqIAJCrf7V5NSF/ajYAH5CAXwiAkIgiD4CACAGQQFqIgYgA0cNAAsLIAUgBSgCAEEBcjYCAAsLQcyZASgCACEDAkBByJkBKAIAIgVFBEAgAyADKAIAQe2cmY4EbEG54ABqQf////8HcSIDNgIADAELIANB0JkBKAIAIgZBAnRqIgggCCgCACADQbygASgCACIIQQJ0aigCAGoiAzYCAEG8oAFBACAIQQFqIgggBSAIRhs2AgBB0JkBQQAgBkEBaiIGIAUgBkYbNgIAIANBAXYhAwsgByADNgIMCyAHKAIMIQMgB0EQaiQAIAAgAzYCDCAAIAAoAhw2AhQDQCAAKAIUIAAoAhhJBEAgACAAKAIMQSRwOgALAn8gACwAC0EKSARAIAAsAAtBMGoMAQsgACwAC0HXAGoLIQMgACAAKAIUIgdBAWo2AhQgByADOgAAIAAgACgCDEEkbjYCDAwBCwsgACgCKCEDIAAgACgCJEF/RgR/QbYDBSAAKAIkCzYCACAAIANBwoEgIAAQbCIDNgIgIANBAE4EQCAAKAIkQX9HBEAgACgCKCAAKAIkEA8iA0GBYE8Ef0G0mwFBACADazYCAEEABSADCxoLIAAgACgCIDYCLAwCC0G0mwEoAgBBFEYNAAsgAEF/NgIsCyAAKAIsIQMgAEEwaiQAIAEgAyIANgJwIABBf0YEQCABKAJ4QQxBtJsBKAIAEBQgASgCdBAVIAFBfzYCfAwBCyABIAEoAnBBoxIQoQEiADYCaCAARQRAIAEoAnhBDEG0mwEoAgAQFCABKAJwEGsgASgCdBBtGiABKAJ0EBUgAUF/NgJ8DAELIAEoAnggASgCaDYChAEgASgCeCABKAJ0NgKAASABQQA2AnwLIAEoAnwhACABQYABaiQAIAQgAKw3A1gMEAsgBCgCQCgCGARAIAQoAkAoAhwQVhogBCgCQEEANgIcCyAEQgA3A1gMDwsgBCgCQCgChAEQVkEASARAIAQoAkBBADYChAEgBCgCQEEGQbSbASgCABAUCyAEKAJAQQA2AoQBIAQoAkAoAoABIAQoAkAoAhgQCCIAQYFgTwR/QbSbAUEAIABrNgIAQX8FIAALQQBIBEAgBCgCQEECQbSbASgCABAUIARCfzcDWAwPCyAEKAJAKAKAARAVIAQoAkBBADYCgAEgBEIANwNYDA4LIAQgBCgCQCAEKAJQIAQpA0gQQzcDWAwNCyAEKAJAKAIYEBUgBCgCQCgCgAEQFSAEKAJAKAIcBEAgBCgCQCgCHBBWGgsgBCgCQBAVIARCADcDWAwMCyAEKAJAKAIYBEAgBCgCQCgCGCEBIwBBIGsiACQAIAAgATYCGCAAQQA6ABcgAEGAgCA2AgwCQCAALQAXQQFxBEAgACAAKAIMQQJyNgIMDAELIAAgACgCDDYCDAsgACgCGCEBIAAoAgwhAyAAQbYDNgIAIAAgASADIAAQbCIBNgIQAkAgAUEASARAIABBADYCHAwBCyAAIAAoAhBBoxJBoBIgAC0AF0EBcRsQoQEiATYCCCABRQRAIABBADYCHAwBCyAAIAAoAgg2AhwLIAAoAhwhASAAQSBqJAAgBCgCQCABNgIcIAFFBEAgBCgCQEELQbSbASgCABAUIARCfzcDWAwNCwsgBCgCQCkDaEIAUgRAIAQoAkAoAhwgBCgCQCkDaCAEKAJAEJ8BQQBIBEAgBEJ/NwNYDA0LCyAEKAJAQgA3A3ggBEIANwNYDAsLAkAgBCgCQCkDcEIAUgRAIAQgBCgCQCkDcCAEKAJAKQN4fTcDMCAEKQMwIAQpA0hWBEAgBCAEKQNINwMwCwwBCyAEIAQpA0g3AzALIAQpAzBC/////w9WBEAgBEL/////DzcDMAsgBAJ/IAQoAjwhByAEKQMwpyEAIAQoAkAoAhwiAygCTBogAyADLQBKIgFBAWsgAXI6AEogAygCCCADKAIEIgVrIgFBAUgEfyAABSAHIAUgASAAIAAgAUsbIgEQGRogAyADKAIEIAFqNgIEIAEgB2ohByAAIAFrCyIBBEADQAJAAn8gAyADLQBKIgVBAWsgBXI6AEogAygCFCADKAIcSwRAIANBAEEAIAMoAiQRAQAaCyADQQA2AhwgA0IANwMQIAMoAgAiBUEEcQRAIAMgBUEgcjYCAEF/DAELIAMgAygCLCADKAIwaiIGNgIIIAMgBjYCBCAFQRt0QR91C0UEQCADIAcgASADKAIgEQEAIgVBAWpBAUsNAQsgACABawwDCyAFIAdqIQcgASAFayIBDQALCyAACyIANgIsIABFBEACfyAEKAJAKAIcIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxBEAgBCgCQEEFQbSbASgCABAUIARCfzcDWAwMCwsgBCgCQCIAIAApA3ggBCgCLK18NwN4IAQgBCgCLK03A1gMCgsgBCgCQCgCGBBtQQBIBEAgBCgCQEEWQbSbASgCABAUIARCfzcDWAwKCyAEQgA3A1gMCQsgBCgCQCgChAEEQCAEKAJAKAKEARBWGiAEKAJAQQA2AoQBCyAEKAJAKAKAARBtGiAEKAJAKAKAARAVIAQoAkBBADYCgAEgBEIANwNYDAgLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFEEADAELIAQoAlALNgIYIAQoAhhFBEAgBEJ/NwNYDAgLIARBATYCHAJAAkACQAJAAkAgBCgCGCgCCA4DAAIBAwsgBCAEKAIYKQMANwMgDAMLAkAgBCgCQCkDcFAEQCAEKAJAKAIcIAQoAhgpAwBBAiAEKAJAEGpBAEgEQCAEQn83A1gMDQsgBCAEKAJAKAIcEKMBIgI3AyAgAkIAUwRAIAQoAkBBBEG0mwEoAgAQFCAEQn83A1gMDQsgBCAEKQMgIAQoAkApA2h9NwMgIARBADYCHAwBCyAEIAQoAkApA3AgBCgCGCkDAHw3AyALDAILIAQgBCgCQCkDeCAEKAIYKQMAfDcDIAwBCyAEKAJAQRJBABAUIARCfzcDWAwICwJAAkAgBCkDIEIAUw0AIAQoAkApA3BCAFIEQCAEKQMgIAQoAkApA3BWDQELIAQoAkApA2ggBCkDICAEKAJAKQNofFgNAQsgBCgCQEESQQAQFCAEQn83A1gMCAsgBCgCQCAEKQMgNwN4IAQoAhwEQCAEKAJAKAIcIAQoAkApA3ggBCgCQCkDaHwgBCgCQBCfAUEASARAIARCfzcDWAwJCwsgBEIANwNYDAcLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFEEADAELIAQoAlALNgIUIAQoAhRFBEAgBEJ/NwNYDAcLIAQoAkAoAoQBIAQoAhQpAwAgBCgCFCgCCCAEKAJAEGpBAEgEQCAEQn83A1gMBwsgBEIANwNYDAYLIAQpA0hCOFQEQCAEQn83A1gMBgsCfyMAQRBrIgAgBCgCQEHYAGo2AgwgACgCDCgCAAsEQCAEKAJAAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgALAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgQLEBQgBEJ/NwNYDAYLIAQoAlAiACAEKAJAIgEpACA3AAAgACABKQBQNwAwIAAgASkASDcAKCAAIAEpAEA3ACAgACABKQA4NwAYIAAgASkAMDcAECAAIAEpACg3AAggBEI4NwNYDAULIAQgBCgCQCkDEDcDWAwECyAEIAQoAkApA3g3A1gMAwsgBCAEKAJAKAKEARCjATcDCCAEKQMIQgBTBEAgBCgCQEEeQbSbASgCABAUIARCfzcDWAwDCyAEIAQpAwg3A1gMAgsgBCgCQCgChAEiACgCTEEAThogACAAKAIAQU9xNgIAIAQCfyAEKAJQIQEgBCkDSKciACAAAn8gBCgCQCgChAEiAygCTEF/TARAIAEgACADEHEMAQsgASAAIAMQcQsiAUYNABogAQs2AgQCQCAEKQNIIAQoAgStUQRAAn8gBCgCQCgChAEiACgCTEF/TARAIAAoAgAMAQsgACgCAAtBBXZBAXFFDQELIAQoAkBBBkG0mwEoAgAQFCAEQn83A1gMAgsgBCAEKAIErTcDWAwBCyAEKAJAQRxBABAUIARCfzcDWAsgBCkDWCECIARB4ABqJAAgAgsJACAAKAI8EAUL5AEBBH8jAEEgayIDJAAgAyABNgIQIAMgAiAAKAIwIgRBAEdrNgIUIAAoAiwhBSADIAQ2AhwgAyAFNgIYQX8hBAJAAkAgACgCPCADQRBqQQIgA0EMahAGIgUEf0G0mwEgBTYCAEF/BUEAC0UEQCADKAIMIgRBAEoNAQsgACAAKAIAIARBMHFBEHNyNgIADAELIAQgAygCFCIGTQ0AIAAgACgCLCIFNgIEIAAgBSAEIAZrajYCCCAAKAIwBEAgACAFQQFqNgIEIAEgAmpBAWsgBS0AADoAAAsgAiEECyADQSBqJAAgBAv0AgEHfyMAQSBrIgMkACADIAAoAhwiBTYCECAAKAIUIQQgAyACNgIcIAMgATYCGCADIAQgBWsiATYCFCABIAJqIQVBAiEHIANBEGohAQJ/AkACQCAAKAI8IANBEGpBAiADQQxqEAMiBAR/QbSbASAENgIAQX8FQQALRQRAA0AgBSADKAIMIgRGDQIgBEF/TA0DIAEgBCABKAIEIghLIgZBA3RqIgkgBCAIQQAgBhtrIgggCSgCAGo2AgAgAUEMQQQgBhtqIgkgCSgCACAIazYCACAFIARrIQUgACgCPCABQQhqIAEgBhsiASAHIAZrIgcgA0EMahADIgQEf0G0mwEgBDYCAEF/BUEAC0UNAAsLIAVBf0cNAQsgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCECACDAELIABBADYCHCAAQgA3AxAgACAAKAIAQSByNgIAQQAgB0ECRg0AGiACIAEoAgRrCyEAIANBIGokACAAC1IBAX8jAEEQayIDJAAgACgCPCABpyABQiCIpyACQf8BcSADQQhqEA0iAAR/QbSbASAANgIAQX8FQQALIQAgAykDCCEBIANBEGokAEJ/IAEgABsL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQOAJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQbyABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";Tu(xo)||(xo=h(xo));function Ou(d){try{if(d==xo&&_)return new Uint8Array(_);var E=xa(d);if(E)return E;if(m)return m(d);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(I){vr(I)}}function Sh(d,E){var I,D,M;try{M=Ou(d),D=new WebAssembly.Module(M),I=new WebAssembly.Instance(D,E)}catch(ie){var z=ie.toString();throw x("failed to compile wasm module: "+z),(z.includes("imported Memory")||z.includes("memory import"))&&x("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),ie}return[I,D]}function vh(){var d={a:ka};function E(M,z){var ie=M.exports;t.asm=ie,A=t.asm.u,Ei(A.buffer),Qr=t.asm.pa,DA(t.asm.v),NA("wasm-instantiate")}if(FA("wasm-instantiate"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(M){return x("Module.instantiateWasm callback failed with error: "+M),!1}var D=Sh(xo,d);return E(D[0]),t.asm}var Dr,Ae;function ko(d){for(;d.length>0;){var E=d.shift();if(typeof E=="function"){E(t);continue}var I=E.func;typeof I=="number"?E.arg===void 0?Qr.get(I)():Qr.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Gn(d,E){var I=new Date(fe[d>>2]*1e3);fe[E>>2]=I.getUTCSeconds(),fe[E+4>>2]=I.getUTCMinutes(),fe[E+8>>2]=I.getUTCHours(),fe[E+12>>2]=I.getUTCDate(),fe[E+16>>2]=I.getUTCMonth(),fe[E+20>>2]=I.getUTCFullYear()-1900,fe[E+24>>2]=I.getUTCDay(),fe[E+36>>2]=0,fe[E+32>>2]=0;var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[E+28>>2]=M,Gn.GMTString||(Gn.GMTString=Fe("GMT")),fe[E+40>>2]=Gn.GMTString,E}function Mu(d,E){return Gn(d,E)}var St={splitPath:function(d){var E=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,D=d.length-1;D>=0;D--){var M=d[D];M==="."?d.splice(D,1):M===".."?(d.splice(D,1),I++):I&&(d.splice(D,1),I--)}if(E)for(;I;I--)d.unshift("..");return d},normalize:function(d){var E=d.charAt(0)==="/",I=d.substr(-1)==="/";return d=St.normalizeArray(d.split("/").filter(function(D){return!!D}),!E).join("/"),!d&&!E&&(d="."),d&&I&&(d+="/"),(E?"/":"")+d},dirname:function(d){var E=St.splitPath(d),I=E[0],D=E[1];return!I&&!D?".":(D&&(D=D.substr(0,D.length-1)),I+D)},basename:function(d){if(d==="/")return"/";d=St.normalize(d),d=d.replace(/\/$/,"");var E=d.lastIndexOf("/");return E===-1?d:d.substr(E+1)},extname:function(d){return St.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return St.normalize(d.join("/"))},join2:function(d,E){return St.normalize(d+"/"+E)}};function _l(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=require("crypto");return function(){return E.randomBytes(1)[0]}}catch(I){}return function(){vr("randomDevice")}}var Yn={resolve:function(){for(var d="",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var D=I>=0?arguments[I]:S.cwd();if(typeof D!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!D)return"";d=D+"/"+d,E=D.charAt(0)==="/"}return d=St.normalizeArray(d.split("/").filter(function(M){return!!M}),!E).join("/"),(E?"/":"")+d||"."},relative:function(d,E){d=Yn.resolve(d).substr(1),E=Yn.resolve(E).substr(1);function I(_e){for(var ot=0;ot<_e.length&&_e[ot]==="";ot++);for(var Bt=_e.length-1;Bt>=0&&_e[Bt]==="";Bt--);return ot>Bt?[]:_e.slice(ot,Bt-ot+1)}for(var D=I(d.split("/")),M=I(E.split("/")),z=Math.min(D.length,M.length),ie=z,we=0;we0?E=D.slice(0,M).toString("utf-8"):E=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(E=window.prompt("Input: "),E!==null&&(E+=` -`)):typeof readline=="function"&&(E=readline(),E!==null&&(E+=` -`));if(!E)return null;d.input=TA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(je(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(x(je(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(x(je(d.output,0)),d.output=[])}}};function ds(d){for(var E=q(d,65536),I=Et(E);d=E)){var D=1024*1024;E=Math.max(E,I*(I>>0),I!=0&&(E=Math.max(E,256));var M=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(M.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&pt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,D){return pt.createNode(d,E,I,D)},rename:function(d,E,I){if(S.isDir(d.mode)){var D;try{D=S.lookupNode(E,I)}catch(z){}if(D)for(var M in D.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var D in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[".",".."];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var D=pt.createNode(d,E,511|40960,0);return D.link=I,D},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,D,M){var z=d.node.contents;if(M>=d.node.usedBytes)return 0;var ie=Math.min(d.node.usedBytes-M,D);if(ie>8&&z.subarray)E.set(z.subarray(M,M+ie),I);else for(var we=0;we0||D+I>2)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),St.join.apply(null,E)},flagsForNode:function(d){d&=~2097152,d&=~2048,d&=~32768,d&=~524288;var E=0;for(var I in lt.flagsForNodeMap)d&I&&(E|=lt.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=lt.realPath(d),I;try{I=Oe.lstatSync(E)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}return lt.isWindows&&!I.blksize&&(I.blksize=4096),lt.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=lt.realPath(d);try{if(E.mode!==void 0&&(Oe.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var D=new Date(E.timestamp);Oe.utimesSync(I,D,D)}E.size!==void 0&&Oe.truncateSync(I,E.size)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},lookup:function(d,E){var I=St.join2(lt.realPath(d),E),D=lt.getMode(I);return lt.createNode(d,E,D)},mknod:function(d,E,I,D){var M=lt.createNode(d,E,I,D),z=lt.realPath(M);try{S.isDir(M.mode)?Oe.mkdirSync(z,M.mode):Oe.writeFileSync(z,"",{mode:M.mode})}catch(ie){throw ie.code?new S.ErrnoError(lt.convertNodeCode(ie)):ie}return M},rename:function(d,E,I){var D=lt.realPath(d),M=St.join2(lt.realPath(E),I);try{Oe.renameSync(D,M)}catch(z){throw z.code?new S.ErrnoError(lt.convertNodeCode(z)):z}d.name=I},unlink:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.unlinkSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},rmdir:function(d,E){var I=St.join2(lt.realPath(d),E);try{Oe.rmdirSync(I)}catch(D){throw D.code?new S.ErrnoError(lt.convertNodeCode(D)):D}},readdir:function(d){var E=lt.realPath(d);try{return Oe.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},symlink:function(d,E,I){var D=St.join2(lt.realPath(d),E);try{Oe.symlinkSync(I,D)}catch(M){throw M.code?new S.ErrnoError(lt.convertNodeCode(M)):M}},readlink:function(d){var E=lt.realPath(d);try{return E=Oe.readlinkSync(E),E=Hu.relative(Hu.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=lt.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Oe.openSync(E,lt.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(lt.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Oe.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(lt.convertNodeCode(E)):E}},read:function(d,E,I,D,M){if(D===0)return 0;try{return Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},write:function(d,E,I,D,M){try{return Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M)}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}},llseek:function(d,E,I){var D=E;if(I===1)D+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var M=Oe.fstatSync(d.nfd);D+=M.size}catch(z){throw new S.ErrnoError(lt.convertNodeCode(z))}if(D<0)throw new S.ErrnoError(28);return D},mmap:function(d,E,I,D,M,z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var ie=ds(I);return lt.stream_ops.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(M&2)return 0;var z=lt.stream_ops.write(d,E,0,D,I,!1);return 0}}},mn={lookupPath:function(d){return{path:d,node:{mode:lt.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Oe.mkdirSync(d,E):Oe.writeFileSync(d,"",{mode:E})},mkdir:function(){Oe.mkdirSync.apply(void 0,arguments)},symlink:function(){Oe.symlinkSync.apply(void 0,arguments)},rename:function(){Oe.renameSync.apply(void 0,arguments)},rmdir:function(){Oe.rmdirSync.apply(void 0,arguments)},readdir:function(){Oe.readdirSync.apply(void 0,arguments)},unlink:function(){Oe.unlinkSync.apply(void 0,arguments)},readlink:function(){return Oe.readlinkSync.apply(void 0,arguments)},stat:function(){return Oe.statSync.apply(void 0,arguments)},lstat:function(){return Oe.lstatSync.apply(void 0,arguments)},chmod:function(){Oe.chmodSync.apply(void 0,arguments)},fchmod:function(){Oe.fchmodSync.apply(void 0,arguments)},chown:function(){Oe.chownSync.apply(void 0,arguments)},fchown:function(){Oe.fchownSync.apply(void 0,arguments)},truncate:function(){Oe.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Oe.ftruncateSync.apply(void 0,arguments)},utime:function(){Oe.utimesSync.apply(void 0,arguments)},open:function(d,E,I,D){typeof E=="string"&&(E=$s.modeStringToFlags(E));var M=Oe.openSync(d,lt.flagsForNode(E),I),z=D!=null?D:S.nextfd(M),ie={fd:z,nfd:M,position:0,path:d,flags:E,seekable:!0};return S.streams[z]=ie,ie},close:function(d){d.stream_ops||Oe.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return $s.llseek(d,E,I);var D=E;if(I===1)D+=d.position;else if(I===2)D+=Oe.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(Po.EINVAL);if(D<0)throw new S.ErrnoError(Po.EINVAL);return d.position=D,D},read:function(d,E,I,D,M){if(d.stream_ops)return $s.read(d,E,I,D,M);var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.readSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},write:function(d,E,I,D,M){if(d.stream_ops)return $s.write(d,E,I,D,M);d.flags&+"1024"&&S.llseek(d,0,+"2");var z=typeof M!="undefined";!z&&d.seekable&&(M=d.position);var ie=Oe.writeSync(d.nfd,lt.bufferFrom(E.buffer),I,D,M);return z||(d.position+=ie),ie},allocate:function(){throw new S.ErrnoError(Po.EOPNOTSUPP)},mmap:function(d,E,I,D,M,z){if(d.stream_ops)return $s.mmap(d,E,I,D,M,z);if(E!==0)throw new S.ErrnoError(28);var ie=ds(I);return S.read(d,pe,ie,I,D),{ptr:ie,allocated:!0}},msync:function(d,E,I,D,M){return d.stream_ops?$s.msync(d,E,I,D,M):(M&2||S.write(d,E,0,D,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(Po.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Yn.resolve(S.cwd(),d),E=E||{},!d)return{path:"",node:null};var I={follow_mount:!0,recurse_count:0};for(var D in I)E[D]===void 0&&(E[D]=I[D]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var M=St.normalizeArray(d.split("/").filter(function(ut){return!!ut}),!1),z=S.root,ie="/",we=0;we40)throw new S.ErrnoError(32)}}return{path:ie,node:z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!=="/"?I+"/"+E:I+E:I}E=E?d.name+"/"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,D=0;D>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var D=S.hashName(d.id,E),M=S.nameTable[D];M;M=M.name_next){var z=M.name;if(M.parent.id===d.id&&z===E)return M}return S.lookup(d,E)},createNode:function(d,E,I,D){var M=new S.FSNode(d,E,I,D);return S.hashAddNode(M),M},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)==32768},isDir:function(d){return(d&61440)==16384},isLink:function(d){return(d&61440)==40960},isChrdev:function(d){return(d&61440)==8192},isBlkdev:function(d){return(d&61440)==24576},isFIFO:function(d){return(d&61440)==4096},isSocket:function(d){return(d&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E=="undefined")throw new Error("Unknown file open mode: "+d);return E},flagsToPermissionString:function(d){var E=["r","w","rw"][d&3];return d&512&&(E+="w"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes("r")&&!(d.mode&292)||E.includes("w")&&!(d.mode&146)||E.includes("x")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,"x");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch(D){}return S.nodePermissions(d,"wx")},mayDelete:function(d,E,I){var D;try{D=S.lookupNode(d,E)}catch(z){return z.errno}var M=S.nodePermissions(d,"wx");if(M)return M;if(I){if(!S.isDir(D.mode))return 54;if(S.isRoot(D)||S.getPath(D)===S.cwd())return 10}else if(S.isDir(D.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!=="r"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(ie){this.node=ie}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var D=new S.FSStream;for(var M in d)D[M]=d[M];d=D;var z=S.nextfd(E,I);return d.fd=z,S.streams[z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var D=I.pop();E.push(D),I.push.apply(I,D.mounts)}return E},syncfs:function(d,E){typeof d=="function"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&x("warning: "+S.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var I=S.getMounts(S.root.mount),D=0;function M(ie){return S.syncFSRequests--,E(ie)}function z(ie){if(ie)return z.errored?void 0:(z.errored=!0,M(ie));++D>=I.length&&M(null)}I.forEach(function(ie){if(!ie.type.syncfs)return z(null);ie.type.syncfs(ie,d,z)})},mount:function(d,E,I){var D=I==="/",M=!I,z;if(D&&S.root)throw new S.ErrnoError(10);if(!D&&!M){var ie=S.lookupPath(I,{follow_mount:!1});if(I=ie.path,z=ie.node,S.isMountpoint(z))throw new S.ErrnoError(10);if(!S.isDir(z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,D?S.root=me:z&&(z.mounted=we,z.mount&&z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,D=I.mounted,M=S.getMounts(D);Object.keys(S.nameTable).forEach(function(ie){for(var we=S.nameTable[ie];we;){var me=we.name_next;M.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var z=I.mount.mounts.indexOf(D);I.mount.mounts.splice(z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var D=S.lookupPath(d,{parent:!0}),M=D.node,z=St.basename(d);if(!z||z==="."||z==="..")throw new S.ErrnoError(28);var ie=S.mayCreate(M,z);if(ie)throw new S.ErrnoError(ie);if(!M.node_ops.mknod)throw new S.ErrnoError(63);return M.node_ops.mknod(M,z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=511|512,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split("/"),D="",M=0;Mthis.length-1||ut<0)){var st=ut%this.chunkSize,yt=ut/this.chunkSize|0;return this.getter(yt)[st]}},z.prototype.setDataGetter=function(ut){this.getter=ut},z.prototype.cacheLength=function(){var ut=new XMLHttpRequest;if(ut.open("HEAD",I,!1),ut.send(null),!(ut.status>=200&&ut.status<300||ut.status===304))throw new Error("Couldn't load "+I+". Status: "+ut.status);var st=Number(ut.getResponseHeader("Content-length")),yt,xe=(yt=ut.getResponseHeader("Accept-Ranges"))&&yt==="bytes",Wn=(yt=ut.getResponseHeader("Content-Encoding"))&&yt==="gzip",Mi=1024*1024;xe||(Mi=st);var HA=function(Cs,Pa){if(Cs>Pa)throw new Error("invalid range ("+Cs+", "+Pa+") or no bytes requested!");if(Pa>st-1)throw new Error("only "+st+" bytes available! programmer error!");var qr=new XMLHttpRequest;if(qr.open("GET",I,!1),st!==Mi&&qr.setRequestHeader("Range","bytes="+Cs+"-"+Pa),typeof Uint8Array!="undefined"&&(qr.responseType="arraybuffer"),qr.overrideMimeType&&qr.overrideMimeType("text/plain; charset=x-user-defined"),qr.send(null),!(qr.status>=200&&qr.status<300||qr.status===304))throw new Error("Couldn't load "+I+". Status: "+qr.status);return qr.response!==void 0?new Uint8Array(qr.response||[]):TA(qr.responseText||"",!0)},Yr=this;Yr.setDataGetter(function(Cs){var Pa=Cs*Mi,qr=(Cs+1)*Mi-1;if(qr=Math.min(qr,st-1),typeof Yr.chunks[Cs]=="undefined"&&(Yr.chunks[Cs]=HA(Pa,qr)),typeof Yr.chunks[Cs]=="undefined")throw new Error("doXHR failed!");return Yr.chunks[Cs]}),(Wn||!st)&&(Mi=st=1,st=this.getter(0).length,Mi=st,v("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=st,this._chunkSize=Mi,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!u)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ie=new z;Object.defineProperties(ie,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:ie}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,D,M);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var _e={},ot=Object.keys(me.stream_ops);return ot.forEach(function(Bt){var ut=me.stream_ops[Bt];_e[Bt]=function(){return S.forceLoadFile(me),ut.apply(null,arguments)}}),_e.read=function(ut,st,yt,xe,Wn){S.forceLoadFile(me);var Mi=ut.node.contents;if(Wn>=Mi.length)return 0;var HA=Math.min(Mi.length-Wn,xe);if(Mi.slice)for(var Yr=0;Yr>2]=D.dev,fe[I+4>>2]=0,fe[I+8>>2]=D.ino,fe[I+12>>2]=D.mode,fe[I+16>>2]=D.nlink,fe[I+20>>2]=D.uid,fe[I+24>>2]=D.gid,fe[I+28>>2]=D.rdev,fe[I+32>>2]=0,Ae=[D.size>>>0,(Dr=D.size,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+40>>2]=Ae[0],fe[I+44>>2]=Ae[1],fe[I+48>>2]=4096,fe[I+52>>2]=D.blocks,fe[I+56>>2]=D.atime.getTime()/1e3|0,fe[I+60>>2]=0,fe[I+64>>2]=D.mtime.getTime()/1e3|0,fe[I+68>>2]=0,fe[I+72>>2]=D.ctime.getTime()/1e3|0,fe[I+76>>2]=0,Ae=[D.ino>>>0,(Dr=D.ino,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[I+80>>2]=Ae[0],fe[I+84>>2]=Ae[1],0},doMsync:function(d,E,I,D,M){var z=V.slice(d,d+I);S.msync(E,z,M,I,D)},doMkdir:function(d,E){return d=St.normalize(d),d[d.length-1]==="/"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var D=S.readlink(d),M=Math.min(I,he(D)),z=pe[E+M];return be(D,E,I+1),pe[E+M]=z,M},doAccess:function(d,E){if(E&~7)return-28;var I,D=S.lookupPath(d,{follow:!0});if(I=D.node,!I)return-44;var M="";return E&4&&(M+="r"),E&2&&(M+="w"),E&1&&(M+="x"),M&&S.nodePermissions(I,M)?-2:0},doDup:function(d,E,I){var D=S.getStream(I);return D&&S.close(D),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,D){for(var M=0,z=0;z>2],we=fe[E+(z*8+4)>>2],me=S.read(d,pe,ie,we,D);if(me<0)return-1;if(M+=me,me>2],we=fe[E+(z*8+4)>>2],me=S.write(d,pe,ie,we,D);if(me<0)return-1;M+=me}return M},varargs:void 0,get:function(){Tt.varargs+=4;var d=fe[Tt.varargs-4>>2];return d},getStr:function(d){var E=re(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function Ku(d,E){try{return d=Tt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function Vl(d){return fe[Rt()>>2]=d,d}function xh(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 0:{var M=Tt.get();if(M<0)return-28;var z;return z=S.open(D.path,D.flags,0,M),z.fd}case 1:case 2:return 0;case 3:return D.flags;case 4:{var M=Tt.get();return D.flags|=M,0}case 12:{var M=Tt.get(),ie=0;return Qe[M+ie>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Vl(28),-1;default:return-28}}catch(we){return(typeof S=="undefined"||!(we instanceof S.ErrnoError))&&vr(we),-we.errno}}function kh(d,E){try{var I=Tt.getStreamFromFD(d);return Tt.doStat(S.stat,I.path,E)}catch(D){return(typeof S=="undefined"||!(D instanceof S.ErrnoError))&&vr(D),-D.errno}}function Ph(d,E,I){Tt.varargs=I;try{var D=Tt.getStreamFromFD(d);switch(E){case 21509:case 21505:return D.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return D.tty?0:-59;case 21519:{if(!D.tty)return-59;var M=Tt.get();return fe[M>>2]=0,0}case 21520:return D.tty?-28:-59;case 21531:{var M=Tt.get();return S.ioctl(D,E,M)}case 21523:return D.tty?0:-59;case 21524:return D.tty?0:-59;default:vr("bad ioctl syscall "+E)}}catch(z){return(typeof S=="undefined"||!(z instanceof S.ErrnoError))&&vr(z),-z.errno}}function Dh(d,E,I){Tt.varargs=I;try{var D=Tt.getStr(d),M=I?Tt.get():0,z=S.open(D,E,M);return z.fd}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),-ie.errno}}function Rh(d,E){try{return d=Tt.getStr(d),E=Tt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function j(d){try{return d=Tt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function wt(d,E){try{return d=Tt.getStr(d),Tt.doStat(S.stat,d,E)}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),-I.errno}}function LA(d){try{return d=Tt.getStr(d),S.unlink(d),0}catch(E){return(typeof S=="undefined"||!(E instanceof S.ErrnoError))&&vr(E),-E.errno}}function $i(d,E,I){V.copyWithin(d,E,E+I)}function Xl(d){try{return A.grow(d-ve.byteLength+65535>>>16),Ei(A.buffer),1}catch(E){}}function $e(d){var E=V.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var D=1;D<=4;D*=2){var M=E*(1+.2/D);M=Math.min(M,d+100663296);var z=Math.min(I,ke(Math.max(d,M),65536)),ie=Xl(z);if(ie)return!0}return!1}function Sa(d){try{var E=Tt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S=="undefined"||!(I instanceof S.ErrnoError))&&vr(I),I.errno}}function Uu(d,E){try{var I=Tt.getStreamFromFD(d),D=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return pe[E>>0]=D,0}catch(M){return(typeof S=="undefined"||!(M instanceof S.ErrnoError))&&vr(M),M.errno}}function yE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doReadv(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function Fh(d,E,I,D,M){try{var z=Tt.getStreamFromFD(d),ie=4294967296,we=I*ie+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(z,we,D),Ae=[z.position>>>0,(Dr=z.position,+Math.abs(Dr)>=1?Dr>0?(Math.min(+Math.floor(Dr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Dr-+(~~Dr>>>0))/4294967296)>>>0:0)],fe[M>>2]=Ae[0],fe[M+4>>2]=Ae[1],z.getdents&&we===0&&D===0&&(z.getdents=null),0)}catch(_e){return(typeof S=="undefined"||!(_e instanceof S.ErrnoError))&&vr(_e),_e.errno}}function wE(d,E,I,D){try{var M=Tt.getStreamFromFD(d),z=Tt.doWritev(M,E,I);return fe[D>>2]=z,0}catch(ie){return(typeof S=="undefined"||!(ie instanceof S.ErrnoError))&&vr(ie),ie.errno}}function gr(d){$(d)}function qn(d){var E=Date.now()/1e3|0;return d&&(fe[d>>2]=E),E}function Zl(){if(Zl.called)return;Zl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),D=E.getTimezoneOffset(),M=I.getTimezoneOffset(),z=Math.max(D,M);fe[zb()>>2]=z*60,fe[Wb()>>2]=Number(D!=M);function ie(Bt){var ut=Bt.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ut?ut[1]:"GMT"}var we=ie(E),me=ie(I),_e=Fe(we),ot=Fe(me);M>2]=_e,fe[Wu()+4>>2]=ot):(fe[Wu()>>2]=ot,fe[Wu()+4>>2]=_e)}function Nh(d){Zl();var E=Date.UTC(fe[d+20>>2]+1900,fe[d+16>>2],fe[d+12>>2],fe[d+8>>2],fe[d+4>>2],fe[d>>2],0),I=new Date(E);fe[d+24>>2]=I.getUTCDay();var D=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),M=(I.getTime()-D)/(1e3*60*60*24)|0;return fe[d+28>>2]=M,I.getTime()/1e3|0}var Zs=function(d,E,I,D){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=D},va=292|73,En=146;if(Object.defineProperties(Zs.prototype,{read:{get:function(){return(this.mode&va)===va},set:function(d){d?this.mode|=va:this.mode&=~va}},write:{get:function(){return(this.mode&En)===En},set:function(d){d?this.mode|=En:this.mode&=~En}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Zs,S.staticInit(),g){var Oe=v5,Hu=require("path");lt.staticInit()}if(g){var $l=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(Po[E.code]):E}}},$s=Object.assign({},S);for(var ec in mn)S[ec]=$l(mn[ec])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");function TA(d,E,I){var D=I>0?I:he(d)+1,M=new Array(D),z=se(d,M,0,M.length);return E&&(M.length=z),M}var ju=typeof atob=="function"?atob:function(d){var E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",I="",D,M,z,ie,we,me,_e,ot=0;d=d.replace(/[^A-Za-z0-9\+\/\=]/g,"");do ie=E.indexOf(d.charAt(ot++)),we=E.indexOf(d.charAt(ot++)),me=E.indexOf(d.charAt(ot++)),_e=E.indexOf(d.charAt(ot++)),D=ie<<2|we>>4,M=(we&15)<<4|me>>2,z=(me&3)<<6|_e,I=I+String.fromCharCode(D),me!==64&&(I=I+String.fromCharCode(M)),_e!==64&&(I=I+String.fromCharCode(z));while(ot0||(Sr(),hs>0))return;function E(){Ue||(Ue=!0,t.calledRun=!0,!oe&&(jn(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),fs()))}t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),E()},1)):E()}if(t.run=UA,t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return UA(),e}}();typeof Gw=="object"&&typeof jP=="object"?jP.exports=GP:typeof define=="function"&&define.amd?define([],function(){return GP}):typeof Gw=="object"&&(Gw.createModule=GP)});var $5=w((Nst,Z5)=>{function KPe(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t{var UPe=Array.isArray;e9.exports=UPe});var o9=w((Tst,t9)=>{var r9=Jc(),HPe=$5(),jPe=Ks(),GPe=Id(),YPe=1/0,i9=r9?r9.prototype:void 0,n9=i9?i9.toString:void 0;function s9(r){if(typeof r=="string")return r;if(jPe(r))return HPe(r,s9)+"";if(GPe(r))return n9?n9.call(r):"";var e=r+"";return e=="0"&&1/r==-YPe?"-0":e}t9.exports=s9});var lf=w((Ost,a9)=>{var qPe=o9();function JPe(r){return r==null?"":qPe(r)}a9.exports=JPe});var VP=w((Mst,A9)=>{function WPe(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i{var zPe=VP();function _Pe(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:zPe(r,e,t)}l9.exports=_Pe});var XP=w((Ust,u9)=>{var VPe="\\ud800-\\udfff",XPe="\\u0300-\\u036f",ZPe="\\ufe20-\\ufe2f",$Pe="\\u20d0-\\u20ff",eDe=XPe+ZPe+$Pe,tDe="\\ufe0e\\ufe0f",rDe="\\u200d",iDe=RegExp("["+rDe+VPe+eDe+tDe+"]");function nDe(r){return iDe.test(r)}u9.exports=nDe});var f9=w((Hst,g9)=>{function sDe(r){return r.split("")}g9.exports=sDe});var y9=w((jst,h9)=>{var p9="\\ud800-\\udfff",oDe="\\u0300-\\u036f",aDe="\\ufe20-\\ufe2f",ADe="\\u20d0-\\u20ff",lDe=oDe+aDe+ADe,cDe="\\ufe0e\\ufe0f",uDe="["+p9+"]",ZP="["+lDe+"]",$P="\\ud83c[\\udffb-\\udfff]",gDe="(?:"+ZP+"|"+$P+")",d9="[^"+p9+"]",C9="(?:\\ud83c[\\udde6-\\uddff]){2}",m9="[\\ud800-\\udbff][\\udc00-\\udfff]",fDe="\\u200d",E9=gDe+"?",I9="["+cDe+"]?",hDe="(?:"+fDe+"(?:"+[d9,C9,m9].join("|")+")"+I9+E9+")*",pDe=I9+E9+hDe,dDe="(?:"+[d9+ZP+"?",ZP,C9,m9,uDe].join("|")+")",CDe=RegExp($P+"(?="+$P+")|"+dDe+pDe,"g");function mDe(r){return r.match(CDe)||[]}h9.exports=mDe});var B9=w((Gst,w9)=>{var EDe=f9(),IDe=XP(),yDe=y9();function wDe(r){return IDe(r)?yDe(r):EDe(r)}w9.exports=wDe});var Q9=w((Yst,b9)=>{var BDe=c9(),bDe=XP(),QDe=B9(),SDe=lf();function vDe(r){return function(e){e=SDe(e);var t=bDe(e)?QDe(e):void 0,i=t?t[0]:e.charAt(0),n=t?BDe(t,1).join(""):e.slice(1);return i[r]()+n}}b9.exports=vDe});var v9=w((qst,S9)=>{var xDe=Q9(),kDe=xDe("toUpperCase");S9.exports=kDe});var Zw=w((Jst,x9)=>{var PDe=lf(),DDe=v9();function RDe(r){return DDe(PDe(r).toLowerCase())}x9.exports=RDe});var k9=w((Wst,$w)=>{function FDe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,m=15,y=16,b=17,v=0,x=1,T=2,q=3,Y=4;function $(A,oe){return 55296<=A.charCodeAt(oe)&&A.charCodeAt(oe)<=56319&&56320<=A.charCodeAt(oe+1)&&A.charCodeAt(oe+1)<=57343}function _(A,oe){oe===void 0&&(oe=0);var ce=A.charCodeAt(oe);if(55296<=ce&&ce<=56319&&oe=1){var Z=A.charCodeAt(oe-1),O=ce;return 55296<=Z&&Z<=56319?(Z-55296)*1024+(O-56320)+65536:O}return ce}function ne(A,oe,ce){var Z=[A].concat(oe).concat([ce]),O=Z[Z.length-2],L=ce,de=Z.lastIndexOf(p);if(de>1&&Z.slice(1,de).every(function(re){return re==i})&&[i,h,b].indexOf(A)==-1)return T;var Be=Z.lastIndexOf(n);if(Be>0&&Z.slice(1,Be).every(function(re){return re==n})&&[f,n].indexOf(O)==-1)return Z.filter(function(re){return re==n}).length%2==1?q:Y;if(O==r&&L==e)return v;if(O==t||O==r||O==e)return L==p&&oe.every(function(re){return re==i})?T:x;if(L==t||L==r||L==e)return x;if(O==o&&(L==o||L==a||L==c||L==u))return v;if((O==c||O==a)&&(L==a||L==l))return v;if((O==u||O==l)&&L==l)return v;if(L==i||L==m)return v;if(L==s)return v;if(O==f)return v;var je=Z.indexOf(i)!=-1?Z.lastIndexOf(i)-1:Z.length-2;return[h,b].indexOf(Z[je])!=-1&&Z.slice(je+1,-1).every(function(re){return re==i})&&L==p||O==m&&[y,b].indexOf(L)!=-1?v:oe.indexOf(n)!=-1?T:O==n&&L==n?v:x}this.nextBreak=function(A,oe){if(oe===void 0&&(oe=0),oe<0)return 0;if(oe>=A.length-1)return A.length;for(var ce=ee(_(A,oe)),Z=[],O=oe+1;O{var NDe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,eB;function LDe(){if(eB)return eB;if(typeof Intl.Segmenter!="undefined"){let r=new Intl.Segmenter("en",{granularity:"grapheme"});return eB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=k9(),e=new r;return eB=t=>e.splitGraphemes(t)}}P9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=t-e,n="",s=0,o=0;for(;r.length>0;){let a=r.match(NDe)||[r,r,void 0],l=LDe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var cf=w((Bot,q9)=>{"use strict";var J9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),wot=q9.exports=r=>r?Object.keys(r).map(e=>[J9.has(e)?J9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var uf=w((bot,W9)=>{"use strict";var zDe=require("events"),z9=require("stream"),qd=Bp(),_9=require("string_decoder").StringDecoder,lA=Symbol("EOF"),Jd=Symbol("maybeEmitEnd"),Il=Symbol("emittedEnd"),oB=Symbol("emittingEnd"),aB=Symbol("closed"),V9=Symbol("read"),iD=Symbol("flush"),X9=Symbol("flushChunk"),Nn=Symbol("encoding"),cA=Symbol("decoder"),AB=Symbol("flowing"),Wd=Symbol("paused"),zd=Symbol("resume"),pn=Symbol("bufferLength"),Z9=Symbol("bufferPush"),nD=Symbol("bufferShift"),_i=Symbol("objectMode"),Vi=Symbol("destroyed"),$9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",_De=$9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),VDe=$9&&Symbol.iterator||Symbol("iterator not implemented"),e_=r=>r==="end"||r==="finish"||r==="prefinish",XDe=r=>r instanceof ArrayBuffer||typeof r=="object"&&r.constructor&&r.constructor.name==="ArrayBuffer"&&r.byteLength>=0,ZDe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r);W9.exports=class t_ extends z9{constructor(e){super();this[AB]=!1,this[Wd]=!1,this.pipes=new qd,this.buffer=new qd,this[_i]=e&&e.objectMode||!1,this[_i]?this[Nn]=null:this[Nn]=e&&e.encoding||null,this[Nn]==="buffer"&&(this[Nn]=null),this[cA]=this[Nn]?new _9(this[Nn]):null,this[lA]=!1,this[Il]=!1,this[oB]=!1,this[aB]=!1,this.writable=!0,this.readable=!0,this[pn]=0,this[Vi]=!1}get bufferLength(){return this[pn]}get encoding(){return this[Nn]}set encoding(e){if(this[_i])throw new Error("cannot set encoding in objectMode");if(this[Nn]&&e!==this[Nn]&&(this[cA]&&this[cA].lastNeed||this[pn]))throw new Error("cannot change encoding");this[Nn]!==e&&(this[cA]=e?new _9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[cA].write(t)))),this[Nn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[_i]}set objectMode(e){this[_i]=this[_i]||!!e}write(e,t,i){if(this[lA])throw new Error("write after end");return this[Vi]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8"),!this[_i]&&!Buffer.isBuffer(e)&&(ZDe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):XDe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[_i]&&!(t===this[Nn]&&!this[cA].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[Nn]&&(e=this[cA].write(e)),this.flowing?(this[pn]!==0&&this[iD](!0),this.emit("data",e)):this[Z9](e),this[pn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Vi])return null;try{return this[pn]===0||e===0||e>this[pn]?null:(this[_i]&&(e=null),this.buffer.length>1&&!this[_i]&&(this.encoding?this.buffer=new qd([Array.from(this.buffer).join("")]):this.buffer=new qd([Buffer.concat(Array.from(this.buffer),this[pn])])),this[V9](e||null,this.buffer.head.value))}finally{this[Jd]()}}[V9](e,t){return e===t.length||e===null?this[nD]():(this.buffer.head.value=t.slice(e),t=t.slice(0,e),this[pn]-=e),this.emit("data",t),!this.buffer.length&&!this[lA]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=null),typeof t=="function"&&(i=t,t="utf8"),e&&this.write(e,t),i&&this.once("end",i),this[lA]=!0,this.writable=!1,(this.flowing||!this[Wd])&&this[Jd](),this}[zd](){this[Vi]||(this[Wd]=!1,this[AB]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[lA]?this[Jd]():this.emit("drain"))}resume(){return this[zd]()}pause(){this[AB]=!1,this[Wd]=!0}get destroyed(){return this[Vi]}get flowing(){return this[AB]}get paused(){return this[Wd]}[Z9](e){return this[_i]?this[pn]+=1:this[pn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[_i]?this[pn]-=1:this[pn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[X9](this[nD]()));!e&&!this.buffer.length&&!this[lA]&&this.emit("drain")}[X9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,t){if(this[Vi])return;let i=this[Il];t=t||{},e===process.stdout||e===process.stderr?t.end=!1:t.end=t.end!==!1;let n={dest:e,opts:t,ondrain:s=>this[zd]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[zd](),i&&n.opts.end&&n.dest.end(),e}addListener(e,t){return this.on(e,t)}on(e,t){try{return super.on(e,t)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[zd]():e_(e)&&this[Il]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[Il]}[Jd](){!this[oB]&&!this[Il]&&!this[Vi]&&this.buffer.length===0&&this[lA]&&(this[oB]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[aB]&&this.emit("close"),this[oB]=!1)}emit(e,t){if(e!=="error"&&e!=="close"&&e!==Vi&&this[Vi])return;if(e==="data"){if(!t)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(t)===!1&&this.pause())}else if(e==="end"){if(this[Il]===!0)return;this[Il]=!0,this.readable=!1,this[cA]&&(t=this[cA].end(),t&&(this.pipes.forEach(n=>n.dest.write(t)),super.emit("data",t))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[aB]=!0,!this[Il]&&!this[Vi]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=t,arguments.length>2)for(let n=2;n{e.push(i),this[_i]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[_i]?Promise.reject(new Error("cannot concat in objectMode")):this[Nn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Vi,()=>t(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>t(i))})}[_De](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[lA])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[lA]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Vi,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[VDe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Vi]?(e?this.emit("error",e):this.emit(Vi),this):(this[Vi]=!0,this.buffer=new qd,this[pn]=0,typeof this.close=="function"&&!this[aB]&&this.close(),e?this.emit("error",e):this.emit(Vi),this)}static isStream(e){return!!e&&(e instanceof t_||e instanceof z9||e instanceof zDe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var i_=w((Qot,r_)=>{var $De=require("zlib").constants||{ZLIB_VERNUM:4736};r_.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},$De))});var fD=w(as=>{"use strict";var sD=require("assert"),yl=require("buffer").Buffer,n_=require("zlib"),Zc=as.constants=i_(),eRe=uf(),s_=yl.concat,$c=Symbol("_superWrite"),_d=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},tRe=Symbol("opts"),Vd=Symbol("flushFlag"),o_=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),pr=Symbol("handle"),lB=Symbol("onError"),gf=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),Sot=Symbol("_defaultFullFlush"),cD=class extends eRe{constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[gf]=!1,this[lD]=!1,this[tRe]=e,this[Vd]=e.flush,this[o_]=e.finishFlush;try{this[pr]=new n_[t](e)}catch(i){throw new _d(i)}this[lB]=i=>{this[gf]||(this[gf]=!0,this.close(),this.emit("error",i))},this[pr].on("error",i=>this[lB](new _d(i))),this.once("end",()=>this.close)}close(){this[pr]&&(this[pr].close(),this[pr]=null,this.emit("close"))}reset(){if(!this[gf])return sD(this[pr],"zlib binding closed"),this[pr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(yl.alloc(0),{[Vd]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[o_]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=yl.from(e,t)),this[gf])return;sD(this[pr],"zlib binding closed");let n=this[pr]._handle,s=n.close;n.close=()=>{};let o=this[pr].close;this[pr].close=()=>{},yl.concat=c=>c;let a;try{let c=typeof e[Vd]=="number"?e[Vd]:this[Vd];a=this[pr]._processChunk(e,c),yl.concat=s_}catch(c){yl.concat=s_,this[lB](new _d(c))}finally{this[pr]&&(this[pr]._handle=n,n.close=s,this[pr].close=o,this[pr].removeAllListeners("error"))}this[pr]&&this[pr].on("error",c=>this[lB](new _d(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[$c](yl.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[pr].params(e,t)}finally{this[pr].flush=i}this[pr]&&(this[aD]=e,this[AD]=t)}}}},a_=class extends wl{constructor(e){super(e,"Deflate")}},A_=class extends wl{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),l_=class extends wl{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[$c](e){return this[uD]?(this[uD]=!1,e[9]=255,super[$c](e)):super[$c](e)}},c_=class extends wl{constructor(e){super(e,"Gunzip")}},u_=class extends wl{constructor(e){super(e,"DeflateRaw")}},g_=class extends wl{constructor(e){super(e,"InflateRaw")}},f_=class extends wl{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,t){e=e||{},e.flush=e.flush||Zc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Zc.BROTLI_OPERATION_FINISH,super(e,t),this[oD]=Zc.BROTLI_OPERATION_FLUSH}},h_=class extends gD{constructor(e){super(e,"BrotliCompress")}},p_=class extends gD{constructor(e){super(e,"BrotliDecompress")}};as.Deflate=a_;as.Inflate=A_;as.Gzip=l_;as.Gunzip=c_;as.DeflateRaw=u_;as.InflateRaw=g_;as.Unzip=f_;typeof n_.BrotliCompress=="function"?(as.BrotliCompress=h_,as.BrotliDecompress=p_):as.BrotliCompress=as.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Xd=w(cB=>{"use strict";cB.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);cB.code=new Map(Array.from(cB.name).map(r=>[r[1],r[0]]))});var Zd=w((Dot,d_)=>{"use strict";var kot=Xd(),rRe=uf(),hD=Symbol("slurp");d_.exports=class extends rRe{constructor(e,t,i){super();switch(this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,t&&this[hD](t),i&&this[hD](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[hD](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i==="path")&&(this[i]=e[i])}}});var E_=w(pD=>{"use strict";var Rot=pD.encode=(r,e)=>{if(Number.isSafeInteger(r))r<0?nRe(r,e):iRe(r,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},iRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},nRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=C_(n):n===0?e[i-1]=0:(t=!0,e[i-1]=m_(n))}},Fot=pD.parse=r=>{var e=r[r.length-1],t=r[0],i;if(t===128)i=oRe(r.slice(1,r.length));else if(t===255)i=sRe(r);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},sRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=C_(s):s===0?o=s:(i=!0,o=m_(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},oRe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},C_=r=>(255^r)&255,m_=r=>(255^r)+1&255});var hf=w((Lot,I_)=>{"use strict";var dD=Xd(),ff=require("path").posix,y_=E_(),CD=Symbol("slurp"),As=Symbol("type"),w_=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[As]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");if(this.path=eu(e,t,100),this.mode=Bl(e,t+100,8),this.uid=Bl(e,t+108,8),this.gid=Bl(e,t+116,8),this.size=Bl(e,t+124,12),this.mtime=mD(e,t+136,12),this.cksum=Bl(e,t+148,12),this[CD](i),this[CD](n,!0),this[As]=eu(e,t+156,1),this[As]===""&&(this[As]="0"),this[As]==="0"&&this.path.substr(-1)==="/"&&(this[As]="5"),this[As]==="5"&&(this.size=0),this.linkpath=eu(e,t+157,100),e.slice(t+257,t+265).toString()==="ustar\x0000")if(this.uname=eu(e,t+265,32),this.gname=eu(e,t+297,32),this.devmaj=Bl(e,t+329,8),this.devmin=Bl(e,t+337,8),e[t+475]!==0){let o=eu(e,t+345,155);this.path=o+"/"+this.path}else{let o=eu(e,t+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,t+476,12),this.ctime=mD(e,t+488,12)}let s=8*32;for(let o=t;o=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=aRe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=tu(e,t,100,s)||this.needPax,this.needPax=bl(e,t+100,8,this.mode)||this.needPax,this.needPax=bl(e,t+108,8,this.uid)||this.needPax,this.needPax=bl(e,t+116,8,this.gid)||this.needPax,this.needPax=bl(e,t+124,12,this.size)||this.needPax,this.needPax=ED(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[As].charCodeAt(0),this.needPax=tu(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=tu(e,t+265,32,this.uname)||this.needPax,this.needPax=tu(e,t+297,32,this.gname)||this.needPax,this.needPax=bl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=bl(e,t+337,8,this.devmin)||this.needPax,this.needPax=tu(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=tu(e,t+345,155,o)||this.needPax:(this.needPax=tu(e,t+345,130,o)||this.needPax,this.needPax=ED(e,t+476,12,this.atime)||this.needPax,this.needPax=ED(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l{let t=100,i=r,n="",s,o=ff.parse(r).root||".";if(Buffer.byteLength(i)t&&Buffer.byteLength(n)<=e?s=[i.substr(0,t-1),n,!0]:(i=ff.join(ff.basename(n),i),n=ff.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,t-1),"",!0])}return s},eu=(r,e,t)=>r.slice(e,e+t).toString("utf8").replace(/\0.*/,""),mD=(r,e,t)=>ARe(Bl(r,e,t)),ARe=r=>r===null?null:new Date(r*1e3),Bl=(r,e,t)=>r[e]&128?y_.parse(r.slice(e,e+t)):lRe(r,e,t),cRe=r=>isNaN(r)?null:r,lRe=(r,e,t)=>cRe(parseInt(r.slice(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),uRe={12:8589934591,8:2097151},bl=(r,e,t,i)=>i===null?!1:i>uRe[t]||i<0?(y_.encode(i,r.slice(e,e+t)),!0):(gRe(r,e,t,i),!1),gRe=(r,e,t,i)=>r.write(fRe(i,t),e,t,"ascii"),fRe=(r,e)=>hRe(Math.floor(r).toString(8),e),hRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join("0")+r+" ")+"\0",ED=(r,e,t,i)=>i===null?!1:bl(r,e,t,i.getTime()/1e3),pRe=new Array(156).join("\0"),tu=(r,e,t,i)=>i===null?!1:(r.write(i+pRe,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t);I_.exports=w_});var gB=w((Tot,B_)=>{"use strict";var dRe=hf(),CRe=require("path"),uB=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e==="")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new dRe({path:("PaxHeader/"+CRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,"utf8");for(let s=t+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};uB.parse=(r,e,t)=>new uB(mRe(ERe(r),e),t);var mRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,ERe=r=>r.replace(/\n$/,"").split(` -`).reduce(IRe,Object.create(null)),IRe=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return r;let s=i.join("=");return r[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};B_.exports=uB});var fB=w((Oot,b_)=>{"use strict";b_.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit("warn",i.tarCode,t,i)):t instanceof Error?this.emit("error",Object.assign(t,i)):this.emit("error",Object.assign(new Error(`${e}: ${t}`),i))}}});var yD=w((Mot,Q_)=>{"use strict";var hB=["|","<",">","?",":"],ID=hB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),yRe=new Map(hB.map((r,e)=>[r,ID[e]])),wRe=new Map(ID.map((r,e)=>[r,hB[e]]));Q_.exports={encode:r=>hB.reduce((e,t)=>e.split(t).join(yRe.get(t)),r),decode:r=>ID.reduce((e,t)=>e.split(t).join(wRe.get(t)),r)}});var v_=w((Kot,S_)=>{"use strict";S_.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&~18),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var xD=w((Yot,x_)=>{"use strict";var k_=uf(),P_=gB(),D_=hf(),Uot=Zd(),sa=require("fs"),pf=require("path"),Hot=Xd(),BRe=16*1024*1024,R_=Symbol("process"),F_=Symbol("file"),N_=Symbol("directory"),wD=Symbol("symlink"),L_=Symbol("hardlink"),$d=Symbol("header"),pB=Symbol("read"),BD=Symbol("lstat"),dB=Symbol("onlstat"),bD=Symbol("onread"),QD=Symbol("onreadlink"),SD=Symbol("openfile"),vD=Symbol("onopenfile"),ru=Symbol("close"),CB=Symbol("mode"),T_=fB(),bRe=yD(),O_=v_(),mB=T_(class extends k_{constructor(e,t){if(t=t||{},super(t),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=t.maxReadSize||BRe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=t.cwd||process.cwd(),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(!this.preservePaths&&pf.win32.isAbsolute(e)){let n=pf.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!t.win32||process.platform==="win32",this.win32&&(this.path=bRe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=t.absolute||pf.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[dB](this.statCache.get(this.absolute)):this[BD]()}[BD](){sa.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[dB](t)})}[dB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=QRe(e),this.emit("stat",e),this[R_]()}[R_](){switch(this.type){case"File":return this[F_]();case"Directory":return this[N_]();case"SymbolicLink":return this[wD]();default:return this.end()}}[CB](e){return O_(e,this.type==="Directory",this.portable)}[$d](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this[CB](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new P_({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[N_](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[$d](),this.end()}[wD](){sa.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[QD](t)})}[QD](e){this.linkpath=e.replace(/\\/g,"/"),this[$d](),this.end()}[L_](e){this.type="Link",this.linkpath=pf.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[$d](),this.end()}[F_](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[L_](t)}this.linkCache.set(e,this.absolute)}if(this[$d](),this.stat.size===0)return this.end();this[SD]()}[SD](){sa.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[vD](t)})}[vD](e){let t=512*Math.ceil(this.stat.size/512),i=Math.min(t,this.maxReadSize),n=Buffer.allocUnsafe(i);this[pB](e,n,0,n.length,0,this.stat.size,t)}[pB](e,t,i,n,s,o,a){sa.read(e,t,i,n,s,(l,c)=>{if(l)return this[ru](e,()=>this.emit("error",l));this[bD](e,t,i,n,s,o,a,c)})}[ru](e,t){sa.close(e,t)}[bD](e,t,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[ru](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(t=Buffer.allocUnsafe(n),i=0),n=t.length-i,this[pB](e,t,i,n,s,o,a)}}),M_=class extends mB{constructor(e,t){super(e,t)}[BD](){this[dB](sa.lstatSync(this.absolute))}[wD](){this[QD](sa.readlinkSync(this.absolute))}[SD](){this[vD](sa.openSync(this.absolute,"r"))}[pB](e,t,i,n,s,o,a){let l=!0;try{let c=sa.readSync(e,t,i,n,s);this[bD](e,t,i,n,s,o,a,c),l=!1}finally{if(l)try{this[ru](e,()=>{})}catch(c){}}}[ru](e,t){sa.closeSync(e),t()}},SRe=T_(class extends k_{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[CB](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof t.onwarn=="function"&&this.on("warn",t.onwarn);let i=!1;if(pf.isAbsolute(this.path)&&!this.preservePaths){let n=pf.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new D_({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new P_({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[CB](e){return O_(e,this.type==="Directory",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});mB.Sync=M_;mB.Tar=SRe;var QRe=r=>r.isFile()?"File":r.isDirectory()?"Directory":r.isSymbolicLink()?"SymbolicLink":"Unsupported";x_.exports=mB});var SB=w((Jot,K_)=>{"use strict";var kD=class{constructor(e,t){this.path=e||"./",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},vRe=uf(),xRe=fD(),kRe=Zd(),PD=xD(),PRe=PD.Sync,DRe=PD.Tar,RRe=Bp(),U_=Buffer.alloc(1024),EB=Symbol("onStat"),IB=Symbol("ended"),oa=Symbol("queue"),df=Symbol("current"),iu=Symbol("process"),yB=Symbol("processing"),H_=Symbol("processJob"),aa=Symbol("jobs"),DD=Symbol("jobDone"),wB=Symbol("addFSEntry"),j_=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),BB=Symbol("onreaddir"),bB=Symbol("pipe"),G_=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),Y_=Symbol("write"),TD=Symbol("ondrain"),QB=require("fs"),q_=require("path"),FRe=fB(),OD=FRe(class extends vRe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new xRe.Gzip(e.gzip),this.zip.on("data",t=>super.write(t)),this.zip.on("end",t=>super.end()),this.zip.on("drain",t=>this[TD]()),this.on("resume",t=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:t=>!0,this[oa]=new RRe,this[aa]=0,this.jobs=+e.jobs||4,this[yB]=!1,this[IB]=!1}[Y_](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[IB]=!0,this[iu](),this}write(e){if(this[IB])throw new Error("write after end");return e instanceof kRe?this[j_](e):this[wB](e),this.flowing}[j_](e){let t=q_.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,t,!1);i.entry=new DRe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[aa]+=1,this[oa].push(i)}this[iu]()}[wB](e){let t=q_.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[oa].push(new kD(e,t)),this[iu]()}[RD](e){e.pending=!0,this[aa]+=1;let t=this.follow?"stat":"lstat";QB[t](e.absolute,(i,n)=>{e.pending=!1,this[aa]-=1,i?this.emit("error",i):this[EB](e,n)})}[EB](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[iu]()}[FD](e){e.pending=!0,this[aa]+=1,QB.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[aa]-=1,t)return this.emit("error",t);this[BB](e,i)})}[BB](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[iu]()}[iu](){if(!this[yB]){this[yB]=!0;for(let e=this[oa].head;e!==null&&this[aa]this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[G_](e){this[aa]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",t=>this.emit("error",t))}catch(t){this.emit("error",t)}}[TD](){this[df]&&this[df].entry&&this[df].entry.resume()}[bB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)});let t=e.entry,i=this.zip;i?t.on("data",n=>{i.write(n)||t.pause()}):t.on("data",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),J_=class extends OD{constructor(e){super(e);this[LD]=PRe}pause(){}resume(){}[RD](e){let t=this.follow?"statSync":"lstatSync";this[EB](e,QB[t](e.absolute))}[FD](e,t){this[BB](e,QB.readdirSync(e.absolute))}[bB](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[wB](o+n)}),i?t.on("data",n=>{i.write(n)}):t.on("data",n=>{super[Y_](n)})}};OD.Sync=J_;K_.exports=OD});var wf=w(eC=>{"use strict";var NRe=uf(),LRe=require("events").EventEmitter,Us=require("fs"),vB=process.binding("fs"),Wot=vB.writeBuffers,TRe=vB.FSReqWrap||vB.FSReqCallback,Cf=Symbol("_autoClose"),Aa=Symbol("_close"),tC=Symbol("_ended"),or=Symbol("_fd"),W_=Symbol("_finished"),nu=Symbol("_flags"),MD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),xB=Symbol("_needDrain"),mf=Symbol("_onerror"),Ef=Symbol("_onopen"),jD=Symbol("_onread"),su=Symbol("_onwrite"),Ql=Symbol("_open"),Sl=Symbol("_path"),ou=Symbol("_pos"),la=Symbol("_queue"),If=Symbol("_read"),z_=Symbol("_readSize"),vl=Symbol("_reading"),kB=Symbol("_remain"),__=Symbol("_size"),PB=Symbol("_write"),yf=Symbol("_writing"),DB=Symbol("_defaultFlag"),GD=class extends NRe{constructor(e,t){if(t=t||{},super(t),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[or]=typeof t.fd=="number"?t.fd:null,this[Sl]=e,this[z_]=t.readSize||16*1024*1024,this[vl]=!1,this[__]=typeof t.size=="number"?t.size:Infinity,this[kB]=this[__],this[Cf]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[or]=="number"?this[If]():this[Ql]()}get fd(){return this[or]}get path(){return this[Sl]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ql](){Us.open(this[Sl],"r",(e,t)=>this[Ef](e,t))}[Ef](e,t){e?this[mf](e):(this[or]=t,this.emit("open",t),this[If]())}[UD](){return Buffer.allocUnsafe(Math.min(this[z_],this[kB]))}[If](){if(!this[vl]){this[vl]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[jD](null,0,e));Us.read(this[or],e,0,e.length,null,(t,i,n)=>this[jD](t,i,n))}}[jD](e,t,i){this[vl]=!1,e?this[mf](e):this[KD](t,i)&&this[If]()}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}[mf](e){this[vl]=!0,this[Aa](),this.emit("error",e)}[KD](e,t){let i=!1;return this[kB]-=e,e>0&&(i=super.write(ethis[Ef](e,t))}[Ef](e,t){this[DB]&&this[nu]==="r+"&&e&&e.code==="ENOENT"?(this[nu]="w",this[Ql]()):e?this[mf](e):(this[or]=t,this.emit("open",t),this[MD]())}end(e,t){e&&this.write(e,t),this[tC]=!0,!this[yf]&&!this[la].length&&typeof this[or]=="number"&&this[su](null,0)}write(e,t){return typeof e=="string"&&(e=new Buffer(e,t)),this[tC]?(this.emit("error",new Error("write() after end()")),!1):this[or]===null||this[yf]||this[la].length?(this[la].push(e),this[xB]=!0,!1):(this[yf]=!0,this[PB](e),!0)}[PB](e){Us.write(this[or],e,0,e.length,this[ou],(t,i)=>this[su](t,i))}[su](e,t){e?this[mf](e):(this[ou]!==null&&(this[ou]+=t),this[la].length?this[MD]():(this[yf]=!1,this[tC]&&!this[W_]?(this[W_]=!0,this[Aa](),this.emit("finish")):this[xB]&&(this[xB]=!1,this.emit("drain"))))}[MD](){if(this[la].length===0)this[tC]&&this[su](null,0);else if(this[la].length===1)this[PB](this[la].pop());else{let e=this[la];this[la]=[],ORe(this[or],e,this[ou],(t,i)=>this[su](t,i))}}[Aa](){this[Cf]&&typeof this[or]=="number"&&(Us.close(this[or],e=>this.emit("close")),this[or]=null)}},X_=class extends YD{[Ql](){let e;try{e=Us.openSync(this[Sl],this[nu],this[HD])}catch(t){if(this[DB]&&this[nu]==="r+"&&t&&t.code==="ENOENT")return this[nu]="w",this[Ql]();throw t}this[Ef](null,e)}[Aa](){if(this[Cf]&&typeof this[or]=="number"){try{Us.closeSync(this[or])}catch(e){}this[or]=null,this.emit("close")}}[PB](e){try{this[su](null,Us.writeSync(this[or],e,0,e.length,this[ou]))}catch(t){this[su](t,0)}}},ORe=(r,e,t,i)=>{let n=(o,a)=>i(o,a,e),s=new TRe;s.oncomplete=n,vB.writeBuffers(r,e,t,s)};eC.ReadStream=GD;eC.ReadStreamSync=V_;eC.WriteStream=YD;eC.WriteStreamSync=X_});var nC=w((Xot,Z_)=>{"use strict";var MRe=fB(),_ot=require("path"),KRe=hf(),URe=require("events"),HRe=Bp(),jRe=1024*1024,GRe=Zd(),$_=gB(),YRe=fD(),qD=Buffer.from([31,139]),Hs=Symbol("state"),au=Symbol("writeEntry"),uA=Symbol("readEntry"),JD=Symbol("nextEntry"),eV=Symbol("processEntry"),js=Symbol("extendedHeader"),rC=Symbol("globalExtendedHeader"),xl=Symbol("meta"),tV=Symbol("emitMeta"),yr=Symbol("buffer"),gA=Symbol("queue"),Au=Symbol("ended"),rV=Symbol("emittedEnd"),lu=Symbol("emit"),Ln=Symbol("unzip"),RB=Symbol("consumeChunk"),FB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),iV=Symbol("consumeMeta"),nV=Symbol("consumeHeader"),NB=Symbol("consuming"),zD=Symbol("bufferConcat"),_D=Symbol("maybeEnd"),iC=Symbol("writing"),kl=Symbol("aborted"),LB=Symbol("onDone"),cu=Symbol("sawValidEntry"),TB=Symbol("sawNullBlock"),OB=Symbol("sawEOF"),qRe=r=>!0;Z_.exports=MRe(class extends URe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[cu]=null,this.on(LB,t=>{(this[Hs]==="begin"||this[cu]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(LB,e.ondone):this.on(LB,t=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||jRe,this.filter=typeof e.filter=="function"?e.filter:qRe,this.writable=!0,this.readable=!1,this[gA]=new HRe,this[yr]=null,this[uA]=null,this[au]=null,this[Hs]="begin",this[xl]="",this[js]=null,this[rC]=null,this[Au]=!1,this[Ln]=null,this[kl]=!1,this[TB]=!1,this[OB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[nV](e,t){this[cu]===null&&(this[cu]=!1);let i;try{i=new KRe(e,t,this[js],this[rC])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[TB]?(this[OB]=!0,this[Hs]==="begin"&&(this[Hs]="header"),this[lu]("eof")):(this[TB]=!0,this[lu]("nullBlock"));else if(this[TB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[au]=new GRe(i,this[js],this[rC]);if(!this[cu])if(s.remain){let o=()=>{s.invalid||(this[cu]=!0)};s.on("end",o)}else this[cu]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[lu]("ignoredEntry",s),this[Hs]="ignore",s.resume()):s.size>0&&(this[xl]="",s.on("data",o=>this[xl]+=o),this[Hs]="meta"):(this[js]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[lu]("ignoredEntry",s),this[Hs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[Hs]="body":(this[Hs]="header",s.end()),this[uA]?this[gA].push(s):(this[gA].push(s),this[JD]())))}}}[eV](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[uA]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),t=!1)):(this[uA]=null,t=!1),t}[JD](){do;while(this[eV](this[gA].shift()));if(!this[gA].length){let e=this[uA];!e||e.flowing||e.size===e.remain?this[iC]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,t){let i=this[au],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[Hs]="header",this[au]=null,i.end()),s.length}[iV](e,t){let i=this[au],n=this[WD](e,t);return this[au]||this[tV](i),n}[lu](e,t,i){!this[gA].length&&!this[uA]?this.emit(e,t,i):this[gA].push([e,t,i])}[tV](e){switch(this[lu]("meta",this[xl]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[js]=$_.parse(this[xl],this[js],!1);break;case"GlobalExtendedHeader":this[rC]=$_.parse(this[xl],this[rC],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[js]=this[js]||Object.create(null),this[js].path=this[xl].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[js]=this[js]||Object.create(null),this[js].linkpath=this[xl].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[kl]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[kl])return;if(this[Ln]===null&&e){if(this[yr]&&(e=Buffer.concat([this[yr],e]),this[yr]=null),e.lengththis[RB](s)),this[Ln].on("error",s=>this.abort(s)),this[Ln].on("end",s=>{this[Au]=!0,this[RB]()}),this[iC]=!0;let n=this[Ln][i?"end":"write"](e);return this[iC]=!1,n}}this[iC]=!0,this[Ln]?this[Ln].write(e):this[RB](e),this[iC]=!1;let t=this[gA].length?!1:this[uA]?this[uA].flowing:!0;return!t&&!this[gA].length&&this[uA].once("drain",i=>this.emit("drain")),t}[zD](e){e&&!this[kl]&&(this[yr]=this[yr]?Buffer.concat([this[yr],e]):e)}[_D](){if(this[Au]&&!this[rV]&&!this[kl]&&!this[NB]){this[rV]=!0;let e=this[au];if(e&&e.blockRemain){let t=this[yr]?this[yr].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[yr]&&e.write(this[yr]),e.end()}this[lu](LB)}}[RB](e){if(this[NB])this[zD](e);else if(!e&&!this[yr])this[_D]();else{if(this[NB]=!0,this[yr]){this[zD](e);let t=this[yr];this[yr]=null,this[FB](t)}else this[FB](e);for(;this[yr]&&this[yr].length>=512&&!this[kl]&&!this[OB];){let t=this[yr];this[yr]=null,this[FB](t)}this[NB]=!1}(!this[yr]||this[Au])&&this[_D]()}[FB](e){let t=0,i=e.length;for(;t+512<=i&&!this[kl]&&!this[OB];)switch(this[Hs]){case"begin":case"header":this[nV](e,t),t+=512;break;case"ignore":case"body":t+=this[WD](e,t);break;case"meta":t+=this[iV](e,t);break;default:throw new Error("invalid state: "+this[Hs])}t{"use strict";var JRe=cf(),oV=nC(),Bf=require("fs"),WRe=wf(),aV=require("path"),Zot=sV.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=JRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&_Re(i,e),i.noResume||zRe(i),i.file&&i.sync?VRe(i):i.file?XRe(i,t):AV(i)},zRe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},_Re=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||aV.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(aV.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},VRe=r=>{let e=AV(r),t=r.file,i=!0,n;try{let s=Bf.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size{let t=new oV(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("end",o),Bf.stat(n,(l,c)=>{if(l)a(l);else{let u=new WRe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},AV=r=>new oV(r)});var hV=w((rat,lV)=>{"use strict";var ZRe=cf(),KB=SB(),eat=require("fs"),cV=wf(),uV=MB(),gV=require("path"),tat=lV.exports=(r,e,t)=>{if(typeof e=="function"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=ZRe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?$Re(i,e):i.file?eFe(i,e,t):i.sync?tFe(i,e):rFe(i,e)},$Re=(r,e)=>{let t=new KB.Sync(r),i=new cV.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),fV(t,e)},eFe=(r,e,t)=>{let i=new KB(r),n=new cV.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return VD(i,e),t?s.then(t,t):s},fV=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?uV({file:gV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},VD=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return uV({file:gV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>VD(r,e));r.add(t)}r.end()},tFe=(r,e)=>{let t=new KB.Sync(r);return fV(t,e),t},rFe=(r,e)=>{let t=new KB(r);return VD(t,e),t}});var XD=w((sat,pV)=>{"use strict";var iFe=cf(),dV=SB(),iat=nC(),Gs=require("fs"),CV=wf(),mV=MB(),EV=require("path"),IV=hf(),nat=pV.exports=(r,e,t)=>{let i=iFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?nFe(i,e):sFe(i,e,t)},nFe=(r,e)=>{let t=new dV.Sync(r),i=!0,n,s;try{try{n=Gs.openSync(r.file,"r+")}catch(l){if(l.code==="ENOENT")n=Gs.openSync(r.file,"w+");else throw l}let o=Gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,oFe(r,t,s,n,e)}finally{if(i)try{Gs.closeSync(n)}catch(o){}}},oFe=(r,e,t,i,n)=>{let s=new CV.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),aFe(e,n)},sFe=(r,e,t)=>{e=Array.from(e);let i=new dV(r),n=(o,a,l)=>{let c=(p,m)=>{p?Gs.close(o,y=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return Gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let y=new IV(f);if(!y.cksumValid)return c(null,u);let b=512*Math.ceil(y.size/512);if(u+b+512>a||(u+=b+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,Gs.read(o,f,0,512,u,h)};Gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",Gs.open(r.file,l,c);if(u)return a(u);Gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,m)=>{if(p)return a(p);let y=new CV.WriteStream(r.file,{fd:g,start:m});i.pipe(y),y.on("error",a),y.on("close",o),yV(i,e)})})};Gs.open(r.file,l,c)});return t?s.then(t,t):s},aFe=(r,e)=>{e.forEach(t=>{t.charAt(0)==="@"?mV({file:EV.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},yV=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)==="@")return mV({file:EV.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>yV(r,e));r.add(t)}r.end()}});var BV=w((aat,wV)=>{"use strict";var AFe=cf(),lFe=XD(),oat=wV.exports=(r,e,t)=>{let i=AFe(r);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),cFe(i),lFe(i,e,t)},cFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var SV=w((Aat,bV)=>{var{promisify:QV}=require("util"),Pl=require("fs"),uFe=r=>{if(!r)r={mode:511,fs:Pl};else if(typeof r=="object")r=N({mode:511,fs:Pl},r);else if(typeof r=="number")r={mode:r,fs:Pl};else if(typeof r=="string")r={mode:parseInt(r,8),fs:Pl};else throw new TypeError("invalid options argument");return r.mkdir=r.mkdir||r.fs.mkdir||Pl.mkdir,r.mkdirAsync=QV(r.mkdir),r.stat=r.stat||r.fs.stat||Pl.stat,r.statAsync=QV(r.stat),r.statSync=r.statSync||r.fs.statSync||Pl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||Pl.mkdirSync,r};bV.exports=uFe});var xV=w((lat,vV)=>{var gFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:fFe,parse:hFe}=require("path"),pFe=r=>{if(/\0/.test(r))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:r,code:"ERR_INVALID_ARG_VALUE"});if(r=fFe(r),gFe==="win32"){let e=/[*|"<>?:]/,{root:t}=hFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error("Illegal characters in path."),{path:r,code:"EINVAL"})}return r};vV.exports=pFe});var FV=w((cat,kV)=>{var{dirname:PV}=require("path"),DV=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code==="ENOENT"?DV(r,PV(e),e):void 0),RV=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code==="ENOENT"?RV(r,PV(e),e):void 0}};kV.exports={findMade:DV,findMadeSync:RV}});var eR=w((uat,NV)=>{var{dirname:LV}=require("path"),ZD=(r,e,t)=>{e.recursive=!1;let i=LV(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(r,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},$D=(r,e,t)=>{let i=LV(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code==="ENOENT")return $D(r,e,$D(i,e,t));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch(s){throw n}}};NV.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var MV=w((gat,TV)=>{var{dirname:OV}=require("path"),{findMade:dFe,findMadeSync:CFe}=FV(),{mkdirpManual:mFe,mkdirpManualSync:EFe}=eR(),IFe=(r,e)=>(e.recursive=!0,OV(r)===r?e.mkdirAsync(r,e):dFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return mFe(r,e);throw n}))),yFe=(r,e)=>{if(e.recursive=!0,OV(r)===r)return e.mkdirSync(r,e);let i=CFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code==="ENOENT")return EFe(r,e);throw n}};TV.exports={mkdirpNative:IFe,mkdirpNativeSync:yFe}});var jV=w((fat,KV)=>{var UV=require("fs"),wFe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=wFe.replace(/^v/,"").split("."),HV=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,BFe=HV?r=>r.mkdir===UV.mkdir:()=>!1,bFe=HV?r=>r.mkdirSync===UV.mkdirSync:()=>!1;KV.exports={useNative:BFe,useNativeSync:bFe}});var zV=w((hat,GV)=>{var bf=SV(),Qf=xV(),{mkdirpNative:YV,mkdirpNativeSync:qV}=MV(),{mkdirpManual:JV,mkdirpManualSync:WV}=eR(),{useNative:QFe,useNativeSync:SFe}=jV(),Sf=(r,e)=>(r=Qf(r),e=bf(e),QFe(e)?YV(r,e):JV(r,e)),vFe=(r,e)=>(r=Qf(r),e=bf(e),SFe(e)?qV(r,e):WV(r,e));Sf.sync=vFe;Sf.native=(r,e)=>YV(Qf(r),bf(e));Sf.manual=(r,e)=>JV(Qf(r),bf(e));Sf.nativeSync=(r,e)=>qV(Qf(r),bf(e));Sf.manualSync=(r,e)=>WV(Qf(r),bf(e));GV.exports=Sf});var t6=w((pat,_V)=>{"use strict";var Ys=require("fs"),uu=require("path"),xFe=Ys.lchown?"lchown":"chown",kFe=Ys.lchownSync?"lchownSync":"chownSync",VV=Ys.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),XV=(r,e,t)=>{try{return Ys[kFe](r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},PFe=(r,e,t)=>{try{return Ys.chownSync(r,e,t)}catch(i){if(i.code!=="ENOENT")throw i}},DFe=VV?(r,e,t,i)=>n=>{!n||n.code!=="EISDIR"?i(n):Ys.chown(r,e,t,i)}:(r,e,t,i)=>i,rR=VV?(r,e,t)=>{try{return XV(r,e,t)}catch(i){if(i.code!=="EISDIR")throw i;PFe(r,e,t)}}:(r,e,t)=>XV(r,e,t),RFe=process.version,ZV=(r,e,t)=>Ys.readdir(r,e,t),FFe=(r,e)=>Ys.readdirSync(r,e);/^v4\./.test(RFe)&&(ZV=(r,e,t)=>Ys.readdir(r,t));var UB=(r,e,t,i)=>{Ys[xFe](r,e,t,DFe(r,e,t,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},$V=(r,e,t,i,n)=>{if(typeof e=="string")return Ys.lstat(uu.resolve(r,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,$V(r,o,t,i,n)});if(e.isDirectory())iR(uu.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=uu.resolve(r,e.name);UB(o,t,i,n)});else{let s=uu.resolve(r,e.name);UB(s,t,i,n)}},iR=(r,e,t,i)=>{ZV(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return UB(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return UB(r,e,t,i)}};s.forEach(c=>$V(r,c,e,t,l))})},NFe=(r,e,t,i)=>{if(typeof e=="string")try{let n=Ys.lstatSync(uu.resolve(r,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&e6(uu.resolve(r,e.name),t,i),rR(uu.resolve(r,e.name),t,i)},e6=(r,e,t)=>{let i;try{i=FFe(r,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(r,e,t);throw n}return i&&i.length&&i.forEach(n=>NFe(r,n,e,t)),rR(r,e,t)};_V.exports=iR;iR.sync=e6});var s6=w((mat,nR)=>{"use strict";var r6=zV(),qs=require("fs"),HB=require("path"),i6=t6(),sR=class extends Error{constructor(e,t){super("Cannot extract through symbolic link");this.path=t,this.symlink=e}get name(){return"SylinkError"}},sC=class extends Error{constructor(e,t){super(t+": Cannot cd into '"+e+"'");this.path=e,this.code=t}get name(){return"CwdError"}},dat=nR.exports=(r,e,t)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(y,b)=>{y?t(y):(g.set(r,!0),b&&l?i6(b,o,a,v=>h(v)):s?qs.chmod(r,n,t):t())};if(g&&g.get(r)===!0)return h();if(r===f)return qs.stat(r,(y,b)=>{(y||!b.isDirectory())&&(y=new sC(r,y&&y.code||"ENOTDIR")),h(y)});if(c)return r6(r,{mode:n}).then(y=>h(null,y),h);let m=HB.relative(f,r).split(/\/|\\/);jB(f,m,n,g,u,f,null,h)},jB=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=r+"/"+l;if(i.get(c))return jB(c,e,t,i,n,s,o,a);qs.mkdir(c,t,n6(c,e,t,i,n,s,o,a))},n6=(r,e,t,i,n,s,o,a)=>l=>{if(l){if(l.path&&HB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new sC(s,l.code));qs.lstat(r,(c,u)=>{if(c)a(c);else if(u.isDirectory())jB(r,e,t,i,n,s,o,a);else if(n)qs.unlink(r,g=>{if(g)return a(g);qs.mkdir(r,t,n6(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(r,r+"/"+e.join("/")));a(l)}})}else o=o||r,jB(r,e,t,i,n,s,o,a)},Cat=nR.exports.sync=(r,e)=>{let t=e.umask,i=e.mode|448,n=(i&t)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=y=>{u.set(r,!0),y&&a&&i6.sync(y,s,o),n&&qs.chmodSync(r,i)};if(u&&u.get(r)===!0)return f();if(r===g){let y=!1,b="ENOTDIR";try{y=qs.statSync(r).isDirectory()}catch(v){b=v.code}finally{if(!y)throw new sC(r,b)}f();return}if(l)return f(r6.sync(r,i));let p=HB.relative(g,r).split(/\/|\\/),m=null;for(let y=p.shift(),b=g;y&&(b+="/"+y);y=p.shift())if(!u.get(b))try{qs.mkdirSync(b,i),m=m||b,u.set(b,!0)}catch(v){if(v.path&&HB.dirname(v.path)===g&&(v.code==="ENOTDIR"||v.code==="ENOENT"))return new sC(g,v.code);let x=qs.lstatSync(b);if(x.isDirectory()){u.set(b,!0);continue}else if(c){qs.unlinkSync(b),qs.mkdirSync(b,i),m=m||b,u.set(b,!0);continue}else if(x.isSymbolicLink())return new sR(b,b+"/"+p.join("/"))}return f(m)}});var A6=w((Eat,o6)=>{var a6=require("assert");o6.exports=()=>{let r=new Map,e=new Map,{join:t}=require("path"),i=u=>t(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(t(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>r.get(f)),dirs:[...g.dirs].map(f=>r.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let m=r.get(p);a6.equal(m[0],u),m.length===1?r.delete(p):(m.shift(),typeof m[0]=="function"?h.add(m[0]):m[0].forEach(y=>h.add(y)))}),f.forEach(p=>{let m=r.get(p);a6(m[0]instanceof Set),m[0].size===1&&m.length===1?r.delete(p):m[0].size===1?(m.shift(),h.add(m[0])):m[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=r.get(h);p?p.push(g):r.set(h,[g])}),f.forEach(h=>{let p=r.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):r.set(h,[new Set([g])])}),a(g)}}}});var u6=w((Iat,l6)=>{var LFe=process.env.__FAKE_PLATFORM__||process.platform,TFe=LFe==="win32",OFe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:MFe,O_TRUNC:KFe,O_WRONLY:UFe,UV_FS_O_FILEMAP:c6=0}=OFe.constants,HFe=TFe&&!!c6,jFe=512*1024,GFe=c6|KFe|MFe|UFe;l6.exports=HFe?r=>r"w"});var hR=w((bat,g6)=>{"use strict";var YFe=require("assert"),yat=require("events").EventEmitter,qFe=nC(),$t=require("fs"),JFe=wf(),fA=require("path"),oR=s6(),wat=oR.sync,f6=yD(),WFe=A6(),h6=Symbol("onEntry"),aR=Symbol("checkFs"),p6=Symbol("checkFs2"),AR=Symbol("isReusable"),hA=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),GB=Symbol("link"),d6=Symbol("symlink"),C6=Symbol("hardlink"),m6=Symbol("unsupported"),Bat=Symbol("unknown"),E6=Symbol("checkPath"),vf=Symbol("mkdir"),dn=Symbol("onError"),YB=Symbol("pending"),I6=Symbol("pend"),xf=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),oC=Symbol("doChown"),aC=Symbol("uid"),AC=Symbol("gid"),y6=require("crypto"),w6=u6(),qB=()=>{throw new Error("sync function called cb somehow?!?")},zFe=(r,e)=>{if(process.platform!=="win32")return $t.unlink(r,e);let t=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.rename(r,t,i=>{if(i)return e(i);$t.unlink(t,e)})},_Fe=r=>{if(process.platform!=="win32")return $t.unlinkSync(r);let e=r+".DELETE."+y6.randomBytes(16).toString("hex");$t.renameSync(r,e),$t.unlinkSync(e)},B6=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,JB=class extends qFe{constructor(e){if(e||(e={}),e.ondone=t=>{this[uR]=!0,this[gR]()},super(e),this.reservations=WFe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[YB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=fA.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[h6](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[gR](){this[uR]&&this[YB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[E6](e){if(this.strip){let t=e.path.split(/\/|\\/);if(t.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let t=e.path;if(t.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:t}),!1;if(fA.win32.isAbsolute(t)){let i=fA.win32.parse(t);e.path=t.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:t})}}if(this.win32){let t=fA.win32.parse(e.path);e.path=t.root===""?f6.encode(e.path):t.root+f6.encode(e.path.substr(t.root.length))}return fA.isAbsolute(e.path)?e.absolute=e.path:e.absolute=fA.resolve(this.cwd,e.path),!0}[h6](e){if(!this[E6](e))return e.resume();switch(YFe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[m6](e)}}[dn](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[xf](),t.resume())}[vf](e,t,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t},i)}[oC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[aC](e){return B6(this.uid,e.uid,this.processUid)}[AC](e){return B6(this.gid,e.gid,this.processGid)}[lR](e,t){let i=e.mode&4095||this.fmode,n=new JFe.WriteStream(e.absolute,{flags:w6(e.size),mode:i,autoClose:!1});n.on("error",l=>this[dn](l,e));let s=1,o=l=>{if(l)return this[dn](l,e);--s==0&&$t.close(n.fd,c=>{t(),c?this[dn](c,e):this[xf]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;$t.futimes(u,g,f,h=>h?$t.utimes(c,g,f,p=>o(p&&h)):o())}if(this[oC](e)){s++;let g=this[aC](e),f=this[AC](e);$t.fchown(u,g,f,h=>h?$t.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,t){let i=e.mode&4095||this.dmode;this[vf](e.absolute,i,n=>{if(n)return t(),this[dn](n,e);let s=1,o=a=>{--s==0&&(t(),this[xf](),e.resume())};e.mtime&&!this.noMtime&&(s++,$t.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[oC](e)&&(s++,$t.chown(e.absolute,this[aC](e),this[AC](e),o)),o()})}[m6](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[d6](e,t){this[GB](e,e.linkpath,"symlink",t)}[C6](e,t){this[GB](e,fA.resolve(this.cwd,e.linkpath),"link",t)}[I6](){this[YB]++}[xf](){this[YB]--,this[gR]()}[fR](e){this[xf](),e.resume()}[AR](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&process.platform!=="win32"}[aR](e){this[I6]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[p6](e,i))}[p6](e,t){this[vf](fA.dirname(e.absolute),this.dmode,i=>{if(i)return t(),this[dn](i,e);$t.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),t()):n||this[AR](e,s)?this[hA](null,e,t):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[hA](null,e,t):$t.chmod(e.absolute,e.mode,o=>this[hA](o,e,t)):$t.rmdir(e.absolute,o=>this[hA](o,e,t)):zFe(e.absolute,o=>this[hA](o,e,t))})})}[hA](e,t,i){if(e)return this[dn](e,t);switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](t,i);case"Link":return this[C6](t,i);case"SymbolicLink":return this[d6](t,i);case"Directory":case"GNUDumpDir":return this[cR](t,i)}}[GB](e,t,i,n){$t[i](t,e.absolute,s=>{if(s)return this[dn](s,e);n(),this[xf](),e.resume()})}},b6=class extends JB{constructor(e){super(e)}[aR](e){let t=this[vf](fA.dirname(e.absolute),this.dmode,qB);if(t)return this[dn](t,e);try{let i=$t.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[hA](null,e,qB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&$t.chmodSync(e.absolute,e.mode):$t.rmdirSync(e.absolute):_Fe(e.absolute),this[hA](null,e,qB)}catch(n){return this[dn](n,e)}}catch(i){return this[hA](null,e,qB)}}[lR](e,t){let i=e.mode&4095||this.fmode,n=l=>{let c;try{$t.closeSync(o)}catch(u){c=u}(l||c)&&this[dn](l||c,e)},s,o;try{o=$t.openSync(e.absolute,w6(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[dn](l,e)),e.pipe(a)),a.on("data",l=>{try{$t.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{$t.futimesSync(o,u,g)}catch(f){try{$t.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[oC](e)){let u=this[aC](e),g=this[AC](e);try{$t.fchownSync(o,u,g)}catch(f){try{$t.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,t){let i=e.mode&4095||this.dmode,n=this[vf](e.absolute,i);if(n)return this[dn](n,e);if(e.mtime&&!this.noMtime)try{$t.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[oC](e))try{$t.chownSync(e.absolute,this[aC](e),this[AC](e))}catch(s){}e.resume()}[vf](e,t){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(i){return i}}[GB](e,t,i,n){try{$t[i+"Sync"](t,e.absolute),e.resume()}catch(s){return this[dn](s,e)}}};JB.Sync=b6;g6.exports=JB});var k6=w((Sat,Q6)=>{"use strict";var VFe=cf(),WB=hR(),S6=require("fs"),v6=wf(),x6=require("path"),Qat=Q6.exports=(r,e,t)=>{typeof r=="function"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e=="function"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=VFe(r);if(i.sync&&typeof t=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof t=="function")throw new TypeError("callback only supported with file option");return e.length&&XFe(i,e),i.file&&i.sync?ZFe(i):i.file?$Fe(i,t):i.sync?eNe(i):tNe(i)},XFe=(r,e)=>{let t=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=r.filter,n=(s,o)=>{let a=o||x6.parse(s).root||".",l=s===a?!1:t.has(s)?t.get(s):n(x6.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},ZFe=r=>{let e=new WB.Sync(r),t=r.file,i=!0,n,s=S6.statSync(t),o=r.maxReadSize||16*1024*1024;new v6.ReadStreamSync(t,{readSize:o,size:s.size}).pipe(e)},$Fe=(r,e)=>{let t=new WB(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on("error",a),t.on("close",o),S6.stat(n,(l,c)=>{if(l)a(l);else{let u=new v6.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(t)}})});return e?s.then(e,e):s},eNe=r=>new WB.Sync(r),tNe=r=>new WB(r)});var P6=w(pi=>{"use strict";pi.c=pi.create=hV();pi.r=pi.replace=XD();pi.t=pi.list=MB();pi.u=pi.update=BV();pi.x=pi.extract=k6();pi.Pack=SB();pi.Unpack=hR();pi.Parse=nC();pi.ReadEntry=Zd();pi.WriteEntry=xD();pi.Header=hf();pi.Pax=gB();pi.types=Xd()});var L6=w((kat,N6)=>{var dR;N6.exports.getContent=()=>(typeof dR=="undefined"&&(dR=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),dR)});var H6=w((CR,U6)=>{(function(r,e){typeof CR=="object"?U6.exports=e():typeof define=="function"&&define.amd?define(e):r.treeify=e()})(CR,function(){function r(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g="",f=0,h,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(b,v){v>0&&(g+=(b[1]?" ":"\u2502")+" "),!p&&b[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var y=e(s,c);y.forEach(function(b){h=++f===y.length,t(b,s[b],h,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;t(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return t(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var _B=w((sAt,X6)=>{var ENe=Ks(),INe=Id(),yNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wNe=/^\w*$/;function BNe(r,e){if(ENe(r))return!1;var t=typeof r;return t=="number"||t=="symbol"||t=="boolean"||r==null||INe(r)?!0:wNe.test(r)||!yNe.test(r)||e!=null&&r in Object(e)}X6.exports=BNe});var VB=w((oAt,Z6)=>{var bNe=Wc(),QNe=Rn(),SNe="[object AsyncFunction]",vNe="[object Function]",xNe="[object GeneratorFunction]",kNe="[object Proxy]";function PNe(r){if(!QNe(r))return!1;var e=bNe(r);return e==vNe||e==xNe||e==SNe||e==kNe}Z6.exports=PNe});var e7=w((aAt,$6)=>{var DNe=Ns(),RNe=DNe["__core-js_shared__"];$6.exports=RNe});var i7=w((AAt,t7)=>{var QR=e7(),r7=function(){var r=/[^.]+$/.exec(QR&&QR.keys&&QR.keys.IE_PROTO||"");return r?"Symbol(src)_1."+r:""}();function FNe(r){return!!r7&&r7 in r}t7.exports=FNe});var SR=w((lAt,n7)=>{var NNe=Function.prototype,LNe=NNe.toString;function TNe(r){if(r!=null){try{return LNe.call(r)}catch(e){}try{return r+""}catch(e){}}return""}n7.exports=TNe});var o7=w((cAt,s7)=>{var ONe=VB(),MNe=i7(),KNe=Rn(),UNe=SR(),HNe=/[\\^$.*+?()[\]{}|]/g,jNe=/^\[object .+?Constructor\]$/,GNe=Function.prototype,YNe=Object.prototype,qNe=GNe.toString,JNe=YNe.hasOwnProperty,WNe=RegExp("^"+qNe.call(JNe).replace(HNe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function zNe(r){if(!KNe(r)||MNe(r))return!1;var e=ONe(r)?WNe:jNe;return e.test(UNe(r))}s7.exports=zNe});var A7=w((uAt,a7)=>{function _Ne(r,e){return r==null?void 0:r[e]}a7.exports=_Ne});var Rl=w((gAt,l7)=>{var VNe=o7(),XNe=A7();function ZNe(r,e){var t=XNe(r,e);return VNe(t)?t:void 0}l7.exports=ZNe});var cC=w((fAt,c7)=>{var $Ne=Rl(),eLe=$Ne(Object,"create");c7.exports=eLe});var f7=w((hAt,u7)=>{var g7=cC();function tLe(){this.__data__=g7?g7(null):{},this.size=0}u7.exports=tLe});var p7=w((pAt,h7)=>{function rLe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}h7.exports=rLe});var C7=w((dAt,d7)=>{var iLe=cC(),nLe="__lodash_hash_undefined__",sLe=Object.prototype,oLe=sLe.hasOwnProperty;function aLe(r){var e=this.__data__;if(iLe){var t=e[r];return t===nLe?void 0:t}return oLe.call(e,r)?e[r]:void 0}d7.exports=aLe});var E7=w((CAt,m7)=>{var ALe=cC(),lLe=Object.prototype,cLe=lLe.hasOwnProperty;function uLe(r){var e=this.__data__;return ALe?e[r]!==void 0:cLe.call(e,r)}m7.exports=uLe});var y7=w((mAt,I7)=>{var gLe=cC(),fLe="__lodash_hash_undefined__";function hLe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=gLe&&e===void 0?fLe:e,this}I7.exports=hLe});var B7=w((EAt,w7)=>{var pLe=f7(),dLe=p7(),CLe=C7(),mLe=E7(),ELe=y7();function kf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{function ILe(){this.__data__=[],this.size=0}b7.exports=ILe});var Pf=w((yAt,S7)=>{function yLe(r,e){return r===e||r!==r&&e!==e}S7.exports=yLe});var uC=w((wAt,v7)=>{var wLe=Pf();function BLe(r,e){for(var t=r.length;t--;)if(wLe(r[t][0],e))return t;return-1}v7.exports=BLe});var k7=w((BAt,x7)=>{var bLe=uC(),QLe=Array.prototype,SLe=QLe.splice;function vLe(r){var e=this.__data__,t=bLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():SLe.call(e,t,1),--this.size,!0}x7.exports=vLe});var D7=w((bAt,P7)=>{var xLe=uC();function kLe(r){var e=this.__data__,t=xLe(e,r);return t<0?void 0:e[t][1]}P7.exports=kLe});var F7=w((QAt,R7)=>{var PLe=uC();function DLe(r){return PLe(this.__data__,r)>-1}R7.exports=DLe});var L7=w((SAt,N7)=>{var RLe=uC();function FLe(r,e){var t=this.__data__,i=RLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}N7.exports=FLe});var gC=w((vAt,T7)=>{var NLe=Q7(),LLe=k7(),TLe=D7(),OLe=F7(),MLe=L7();function Df(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var KLe=Rl(),ULe=Ns(),HLe=KLe(ULe,"Map");O7.exports=HLe});var U7=w((kAt,M7)=>{var K7=B7(),jLe=gC(),GLe=XB();function YLe(){this.size=0,this.__data__={hash:new K7,map:new(GLe||jLe),string:new K7}}M7.exports=YLe});var j7=w((PAt,H7)=>{function qLe(r){var e=typeof r;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?r!=="__proto__":r===null}H7.exports=qLe});var fC=w((DAt,G7)=>{var JLe=j7();function WLe(r,e){var t=r.__data__;return JLe(e)?t[typeof e=="string"?"string":"hash"]:t.map}G7.exports=WLe});var q7=w((RAt,Y7)=>{var zLe=fC();function _Le(r){var e=zLe(this,r).delete(r);return this.size-=e?1:0,e}Y7.exports=_Le});var W7=w((FAt,J7)=>{var VLe=fC();function XLe(r){return VLe(this,r).get(r)}J7.exports=XLe});var _7=w((NAt,z7)=>{var ZLe=fC();function $Le(r){return ZLe(this,r).has(r)}z7.exports=$Le});var X7=w((LAt,V7)=>{var eTe=fC();function tTe(r,e){var t=eTe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}V7.exports=tTe});var ZB=w((TAt,Z7)=>{var rTe=U7(),iTe=q7(),nTe=W7(),sTe=_7(),oTe=X7();function Rf(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e{var eX=ZB(),aTe="Expected a function";function vR(r,e){if(typeof r!="function"||e!=null&&typeof e!="function")throw new TypeError(aTe);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(vR.Cache||eX),t}vR.Cache=eX;$7.exports=vR});var iX=w((MAt,rX)=>{var ATe=tX(),lTe=500;function cTe(r){var e=ATe(r,function(i){return t.size===lTe&&t.clear(),i}),t=e.cache;return e}rX.exports=cTe});var sX=w((KAt,nX)=>{var uTe=iX(),gTe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fTe=/\\(\\)?/g,hTe=uTe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(""),r.replace(gTe,function(t,i,n,s){e.push(n?s.replace(fTe,"$1"):i||t)}),e});nX.exports=hTe});var Ff=w((UAt,oX)=>{var pTe=Ks(),dTe=_B(),CTe=sX(),mTe=lf();function ETe(r,e){return pTe(r)?r:dTe(r,e)?[r]:CTe(mTe(r))}oX.exports=ETe});var gu=w((HAt,aX)=>{var ITe=Id(),yTe=1/0;function wTe(r){if(typeof r=="string"||ITe(r))return r;var e=r+"";return e=="0"&&1/r==-yTe?"-0":e}aX.exports=wTe});var hC=w((jAt,AX)=>{var BTe=Ff(),bTe=gu();function QTe(r,e){e=BTe(e,r);for(var t=0,i=e.length;r!=null&&t{var STe=Rl(),vTe=function(){try{var r=STe(Object,"defineProperty");return r({},"",{}),r}catch(e){}}();lX.exports=vTe});var Nf=w((YAt,cX)=>{var uX=xR();function xTe(r,e,t){e=="__proto__"&&uX?uX(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}cX.exports=xTe});var $B=w((qAt,gX)=>{var kTe=Nf(),PTe=Pf(),DTe=Object.prototype,RTe=DTe.hasOwnProperty;function FTe(r,e,t){var i=r[e];(!(RTe.call(r,e)&&PTe(i,t))||t===void 0&&!(e in r))&&kTe(r,e,t)}gX.exports=FTe});var pC=w((JAt,fX)=>{var NTe=9007199254740991,LTe=/^(?:0|[1-9]\d*)$/;function TTe(r,e){var t=typeof r;return e=e==null?NTe:e,!!e&&(t=="number"||t!="symbol"&<e.test(r))&&r>-1&&r%1==0&&r{var OTe=$B(),MTe=Ff(),KTe=pC(),pX=Rn(),UTe=gu();function HTe(r,e,t,i){if(!pX(r))return r;e=MTe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n{var jTe=hC(),GTe=kR(),YTe=Ff();function qTe(r,e,t){for(var i=-1,n=e.length,s={};++i{function JTe(r,e){return r!=null&&e in Object(r)}mX.exports=JTe});var yX=w((VAt,IX)=>{var WTe=Wc(),zTe=ta(),_Te="[object Arguments]";function VTe(r){return zTe(r)&&WTe(r)==_Te}IX.exports=VTe});var dC=w((XAt,wX)=>{var BX=yX(),XTe=ta(),bX=Object.prototype,ZTe=bX.hasOwnProperty,$Te=bX.propertyIsEnumerable,eOe=BX(function(){return arguments}())?BX:function(r){return XTe(r)&&ZTe.call(r,"callee")&&!$Te.call(r,"callee")};wX.exports=eOe});var e0=w((ZAt,QX)=>{var tOe=9007199254740991;function rOe(r){return typeof r=="number"&&r>-1&&r%1==0&&r<=tOe}QX.exports=rOe});var PR=w(($At,SX)=>{var iOe=Ff(),nOe=dC(),sOe=Ks(),oOe=pC(),aOe=e0(),AOe=gu();function lOe(r,e,t){e=iOe(e,r);for(var i=-1,n=e.length,s=!1;++i{var cOe=EX(),uOe=PR();function gOe(r,e){return r!=null&&uOe(r,e,cOe)}vX.exports=gOe});var kX=w((tlt,xX)=>{var fOe=CX(),hOe=DR();function pOe(r,e){return fOe(r,e,function(t,i){return hOe(r,i)})}xX.exports=pOe});var t0=w((rlt,PX)=>{function dOe(r,e){for(var t=-1,i=e.length,n=r.length;++t{var RX=Jc(),COe=dC(),mOe=Ks(),FX=RX?RX.isConcatSpreadable:void 0;function EOe(r){return mOe(r)||COe(r)||!!(FX&&r&&r[FX])}DX.exports=EOe});var OX=w((nlt,LX)=>{var IOe=t0(),yOe=NX();function TX(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=yOe),n||(n=[]);++s0&&t(a)?e>1?TX(a,e-1,t,i,n):IOe(n,a):i||(n[n.length]=a)}return n}LX.exports=TX});var KX=w((slt,MX)=>{var wOe=OX();function BOe(r){var e=r==null?0:r.length;return e?wOe(r,1):[]}MX.exports=BOe});var HX=w((olt,UX)=>{function bOe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}UX.exports=bOe});var RR=w((alt,jX)=>{var QOe=HX(),GX=Math.max;function SOe(r,e,t){return e=GX(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=GX(i.length-e,0),o=Array(s);++n{function vOe(r){return function(){return r}}YX.exports=vOe});var r0=w((llt,JX)=>{function xOe(r){return r}JX.exports=xOe});var _X=w((clt,WX)=>{var kOe=qX(),zX=xR(),POe=r0(),DOe=zX?function(r,e){return zX(r,"toString",{configurable:!0,enumerable:!1,value:kOe(e),writable:!0})}:POe;WX.exports=DOe});var XX=w((ult,VX)=>{var ROe=800,FOe=16,NOe=Date.now;function LOe(r){var e=0,t=0;return function(){var i=NOe(),n=FOe-(i-t);if(t=i,n>0){if(++e>=ROe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}VX.exports=LOe});var FR=w((glt,ZX)=>{var TOe=_X(),OOe=XX(),MOe=OOe(TOe);ZX.exports=MOe});var eZ=w((flt,$X)=>{var KOe=KX(),UOe=RR(),HOe=FR();function jOe(r){return HOe(UOe(r,void 0,KOe),r+"")}$X.exports=jOe});var rZ=w((hlt,tZ)=>{var GOe=kX(),YOe=eZ(),qOe=YOe(function(r,e){return r==null?{}:GOe(r,e)});tZ.exports=qOe});var hZ=w((uut,uZ)=>{"use strict";var GR;try{GR=Map}catch(r){}var YR;try{YR=Set}catch(r){}function gZ(r,e,t){if(!r||typeof r!="object"||typeof r=="function")return r;if(r.nodeType&&"cloneNode"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(fZ);if(GR&&r instanceof GR)return new Map(Array.from(r.entries()));if(YR&&r instanceof YR)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:gZ(r[n],e,t)}return i}return r}function fZ(r){return gZ(r,[],[])}uZ.exports=fZ});var IC=w(qR=>{"use strict";Object.defineProperty(qR,"__esModule",{value:!0});qR.default=eMe;var tMe=Object.prototype.toString,rMe=Error.prototype.toString,iMe=RegExp.prototype.toString,nMe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",sMe=/^Symbol\((.*)\)(.*)$/;function oMe(r){return r!=+r?"NaN":r===0&&1/r<0?"-0":""+r}function pZ(r,e=!1){if(r==null||r===!0||r===!1)return""+r;let t=typeof r;if(t==="number")return oMe(r);if(t==="string")return e?`"${r}"`:r;if(t==="function")return"[Function "+(r.name||"anonymous")+"]";if(t==="symbol")return nMe.call(r).replace(sMe,"Symbol($1)");let i=tMe.call(r).slice(8,-1);return i==="Date"?isNaN(r.getTime())?""+r:r.toISOString(r):i==="Error"||r instanceof Error?"["+rMe.call(r)+"]":i==="RegExp"?iMe.call(r):null}function eMe(r,e){let t=pZ(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=pZ(this[i],e);return s!==null?s:n},2)}});var CA=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.default=bi.array=bi.object=bi.boolean=bi.date=bi.number=bi.string=bi.mixed=void 0;var dZ=aMe(IC());function aMe(r){return r&&r.__esModule?r:{default:r}}var CZ={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \`${e}\` type, but the final value was: \`${(0,dZ.default)(t,!0)}\``+(n?` (cast from the value \`${(0,dZ.default)(i,!0)}\`).`:".");return t===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};bi.mixed=CZ;var mZ={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};bi.string=mZ;var EZ={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};bi.number=EZ;var IZ={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};bi.date=IZ;var yZ={isValue:"${path} field must be ${value}"};bi.boolean=yZ;var wZ={noUnknown:"${path} field has unspecified keys: ${unknown}"};bi.object=wZ;var BZ={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};bi.array=BZ;var AMe=Object.assign(Object.create(null),{mixed:CZ,string:mZ,number:EZ,date:IZ,object:wZ,array:BZ,boolean:yZ});bi.default=AMe});var QZ=w((hut,bZ)=>{var lMe=Object.prototype,cMe=lMe.hasOwnProperty;function uMe(r,e){return r!=null&&cMe.call(r,e)}bZ.exports=uMe});var yC=w((put,SZ)=>{var gMe=QZ(),fMe=PR();function hMe(r,e){return r!=null&&fMe(r,e,gMe)}SZ.exports=hMe});var Tf=w(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var pMe=r=>r&&r.__isYupSchema__;o0.default=pMe});var kZ=w(a0=>{"use strict";Object.defineProperty(a0,"__esModule",{value:!0});a0.default=void 0;var dMe=vZ(yC()),CMe=vZ(Tf());function vZ(r){return r&&r.__esModule?r:{default:r}}var xZ=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t=="function"){this.fn=t;return}if(!(0,dMe.default)(t,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!t.then&&!t.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=t,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,CMe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(t)}},mMe=xZ;a0.default=mMe});var WR=w(JR=>{"use strict";Object.defineProperty(JR,"__esModule",{value:!0});JR.default=EMe;function EMe(r){return r==null?[]:[].concat(r)}});var fu=w(A0=>{"use strict";Object.defineProperty(A0,"__esModule",{value:!0});A0.default=void 0;var IMe=PZ(IC()),yMe=PZ(WR());function PZ(r){return r&&r.__esModule?r:{default:r}}function zR(){return zR=Object.assign||function(r){for(var e=1;e(0,IMe.default)(t[s])):typeof e=="function"?e(t):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,t,i,n){super();this.name="ValidationError",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,yMe.default)(e).forEach(s=>{wC.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,wC)}};A0.default=wC});var l0=w(_R=>{"use strict";Object.defineProperty(_R,"__esModule",{value:!0});_R.default=BMe;var VR=bMe(fu());function bMe(r){return r&&r.__esModule?r:{default:r}}var QMe=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function BMe(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=QMe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new VR.default(o,s,l)):c(null,s);for(let f=0;f{function SMe(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}DZ.exports=SMe});var XR=w((wut,FZ)=>{var vMe=RZ(),xMe=vMe();FZ.exports=xMe});var LZ=w((But,NZ)=>{function kMe(r,e){for(var t=-1,i=Array(r);++t{function PMe(){return!1}TZ.exports=PMe});var bC=w((BC,Of)=>{var DMe=Ns(),RMe=OZ(),MZ=typeof BC=="object"&&BC&&!BC.nodeType&&BC,KZ=MZ&&typeof Of=="object"&&Of&&!Of.nodeType&&Of,FMe=KZ&&KZ.exports===MZ,UZ=FMe?DMe.Buffer:void 0,NMe=UZ?UZ.isBuffer:void 0,LMe=NMe||RMe;Of.exports=LMe});var jZ=w((Qut,HZ)=>{var TMe=Wc(),OMe=e0(),MMe=ta(),KMe="[object Arguments]",UMe="[object Array]",HMe="[object Boolean]",jMe="[object Date]",GMe="[object Error]",YMe="[object Function]",qMe="[object Map]",JMe="[object Number]",WMe="[object Object]",zMe="[object RegExp]",_Me="[object Set]",VMe="[object String]",XMe="[object WeakMap]",ZMe="[object ArrayBuffer]",$Me="[object DataView]",e1e="[object Float32Array]",t1e="[object Float64Array]",r1e="[object Int8Array]",i1e="[object Int16Array]",n1e="[object Int32Array]",s1e="[object Uint8Array]",o1e="[object Uint8ClampedArray]",a1e="[object Uint16Array]",A1e="[object Uint32Array]",wr={};wr[e1e]=wr[t1e]=wr[r1e]=wr[i1e]=wr[n1e]=wr[s1e]=wr[o1e]=wr[a1e]=wr[A1e]=!0;wr[KMe]=wr[UMe]=wr[ZMe]=wr[HMe]=wr[$Me]=wr[jMe]=wr[GMe]=wr[YMe]=wr[qMe]=wr[JMe]=wr[WMe]=wr[zMe]=wr[_Me]=wr[VMe]=wr[XMe]=!1;function l1e(r){return MMe(r)&&OMe(r.length)&&!!wr[TMe(r)]}HZ.exports=l1e});var c0=w((Sut,GZ)=>{function c1e(r){return function(e){return r(e)}}GZ.exports=c1e});var u0=w((QC,Mf)=>{var u1e=rk(),YZ=typeof QC=="object"&&QC&&!QC.nodeType&&QC,SC=YZ&&typeof Mf=="object"&&Mf&&!Mf.nodeType&&Mf,g1e=SC&&SC.exports===YZ,ZR=g1e&&u1e.process,f1e=function(){try{var r=SC&&SC.require&&SC.require("util").types;return r||ZR&&ZR.binding&&ZR.binding("util")}catch(e){}}();Mf.exports=f1e});var g0=w((vut,qZ)=>{var h1e=jZ(),p1e=c0(),JZ=u0(),WZ=JZ&&JZ.isTypedArray,d1e=WZ?p1e(WZ):h1e;qZ.exports=d1e});var $R=w((xut,zZ)=>{var C1e=LZ(),m1e=dC(),E1e=Ks(),I1e=bC(),y1e=pC(),w1e=g0(),B1e=Object.prototype,b1e=B1e.hasOwnProperty;function Q1e(r,e){var t=E1e(r),i=!t&&m1e(r),n=!t&&!i&&I1e(r),s=!t&&!i&&!n&&w1e(r),o=t||i||n||s,a=o?C1e(r.length,String):[],l=a.length;for(var c in r)(e||b1e.call(r,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||y1e(c,l)))&&a.push(c);return a}zZ.exports=Q1e});var f0=w((kut,_Z)=>{var S1e=Object.prototype;function v1e(r){var e=r&&r.constructor,t=typeof e=="function"&&e.prototype||S1e;return r===t}_Z.exports=v1e});var eF=w((Put,VZ)=>{function x1e(r,e){return function(t){return r(e(t))}}VZ.exports=x1e});var ZZ=w((Dut,XZ)=>{var k1e=eF(),P1e=k1e(Object.keys,Object);XZ.exports=P1e});var e$=w((Rut,$Z)=>{var D1e=f0(),R1e=ZZ(),F1e=Object.prototype,N1e=F1e.hasOwnProperty;function L1e(r){if(!D1e(r))return R1e(r);var e=[];for(var t in Object(r))N1e.call(r,t)&&t!="constructor"&&e.push(t);return e}$Z.exports=L1e});var vC=w((Fut,t$)=>{var T1e=VB(),O1e=e0();function M1e(r){return r!=null&&O1e(r.length)&&!T1e(r)}t$.exports=M1e});var Kf=w((Nut,r$)=>{var K1e=$R(),U1e=e$(),H1e=vC();function j1e(r){return H1e(r)?K1e(r):U1e(r)}r$.exports=j1e});var tF=w((Lut,i$)=>{var G1e=XR(),Y1e=Kf();function q1e(r,e){return r&&G1e(r,e,Y1e)}i$.exports=q1e});var s$=w((Tut,n$)=>{var J1e=gC();function W1e(){this.__data__=new J1e,this.size=0}n$.exports=W1e});var a$=w((Out,o$)=>{function z1e(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}o$.exports=z1e});var l$=w((Mut,A$)=>{function _1e(r){return this.__data__.get(r)}A$.exports=_1e});var u$=w((Kut,c$)=>{function V1e(r){return this.__data__.has(r)}c$.exports=V1e});var f$=w((Uut,g$)=>{var X1e=gC(),Z1e=XB(),$1e=ZB(),eKe=200;function tKe(r,e){var t=this.__data__;if(t instanceof X1e){var i=t.__data__;if(!Z1e||i.length{var rKe=gC(),iKe=s$(),nKe=a$(),sKe=l$(),oKe=u$(),aKe=f$();function Uf(r){var e=this.__data__=new rKe(r);this.size=e.size}Uf.prototype.clear=iKe;Uf.prototype.delete=nKe;Uf.prototype.get=sKe;Uf.prototype.has=oKe;Uf.prototype.set=aKe;h$.exports=Uf});var d$=w((jut,p$)=>{var AKe="__lodash_hash_undefined__";function lKe(r){return this.__data__.set(r,AKe),this}p$.exports=lKe});var m$=w((Gut,C$)=>{function cKe(r){return this.__data__.has(r)}C$.exports=cKe});var I$=w((Yut,E$)=>{var uKe=ZB(),gKe=d$(),fKe=m$();function h0(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new uKe;++e{function hKe(r,e){for(var t=-1,i=r==null?0:r.length;++t{function pKe(r,e){return r.has(e)}B$.exports=pKe});var rF=w((Wut,Q$)=>{var dKe=I$(),CKe=w$(),mKe=b$(),EKe=1,IKe=2;function yKe(r,e,t,i,n,s){var o=t&EKe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&IKe?new dKe:void 0;for(s.set(r,e),s.set(e,r);++g{var wKe=Ns(),BKe=wKe.Uint8Array;S$.exports=BKe});var x$=w((_ut,v$)=>{function bKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}v$.exports=bKe});var P$=w((Vut,k$)=>{function QKe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}k$.exports=QKe});var L$=w((Xut,D$)=>{var R$=Jc(),F$=iF(),SKe=Pf(),vKe=rF(),xKe=x$(),kKe=P$(),PKe=1,DKe=2,RKe="[object Boolean]",FKe="[object Date]",NKe="[object Error]",LKe="[object Map]",TKe="[object Number]",OKe="[object RegExp]",MKe="[object Set]",KKe="[object String]",UKe="[object Symbol]",HKe="[object ArrayBuffer]",jKe="[object DataView]",N$=R$?R$.prototype:void 0,nF=N$?N$.valueOf:void 0;function GKe(r,e,t,i,n,s,o){switch(t){case jKe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case HKe:return!(r.byteLength!=e.byteLength||!s(new F$(r),new F$(e)));case RKe:case FKe:case TKe:return SKe(+r,+e);case NKe:return r.name==e.name&&r.message==e.message;case OKe:case KKe:return r==e+"";case LKe:var a=xKe;case MKe:var l=i&PKe;if(a||(a=kKe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=DKe,o.set(r,e);var u=vKe(a(r),a(e),i,n,s,o);return o.delete(r),u;case UKe:if(nF)return nF.call(r)==nF.call(e)}return!1}D$.exports=GKe});var sF=w((Zut,T$)=>{var YKe=t0(),qKe=Ks();function JKe(r,e,t){var i=e(r);return qKe(r)?i:YKe(i,t(r))}T$.exports=JKe});var M$=w(($ut,O$)=>{function WKe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t{function zKe(){return[]}K$.exports=zKe});var p0=w((tgt,U$)=>{var _Ke=M$(),VKe=oF(),XKe=Object.prototype,ZKe=XKe.propertyIsEnumerable,H$=Object.getOwnPropertySymbols,$Ke=H$?function(r){return r==null?[]:(r=Object(r),_Ke(H$(r),function(e){return ZKe.call(r,e)}))}:VKe;U$.exports=$Ke});var aF=w((rgt,j$)=>{var eUe=sF(),tUe=p0(),rUe=Kf();function iUe(r){return eUe(r,rUe,tUe)}j$.exports=iUe});var q$=w((igt,G$)=>{var Y$=aF(),nUe=1,sUe=Object.prototype,oUe=sUe.hasOwnProperty;function aUe(r,e,t,i,n,s){var o=t&nUe,a=Y$(r),l=a.length,c=Y$(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:oUe.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var m=!0;s.set(r,e),s.set(e,r);for(var y=o;++g{var AUe=Rl(),lUe=Ns(),cUe=AUe(lUe,"DataView");J$.exports=cUe});var _$=w((sgt,z$)=>{var uUe=Rl(),gUe=Ns(),fUe=uUe(gUe,"Promise");z$.exports=fUe});var X$=w((ogt,V$)=>{var hUe=Rl(),pUe=Ns(),dUe=hUe(pUe,"Set");V$.exports=dUe});var $$=w((agt,Z$)=>{var CUe=Rl(),mUe=Ns(),EUe=CUe(mUe,"WeakMap");Z$.exports=EUe});var kC=w((Agt,eee)=>{var AF=W$(),lF=XB(),cF=_$(),uF=X$(),gF=$$(),tee=Wc(),Hf=SR(),ree="[object Map]",IUe="[object Object]",iee="[object Promise]",nee="[object Set]",see="[object WeakMap]",oee="[object DataView]",yUe=Hf(AF),wUe=Hf(lF),BUe=Hf(cF),bUe=Hf(uF),QUe=Hf(gF),hu=tee;(AF&&hu(new AF(new ArrayBuffer(1)))!=oee||lF&&hu(new lF)!=ree||cF&&hu(cF.resolve())!=iee||uF&&hu(new uF)!=nee||gF&&hu(new gF)!=see)&&(hu=function(r){var e=tee(r),t=e==IUe?r.constructor:void 0,i=t?Hf(t):"";if(i)switch(i){case yUe:return oee;case wUe:return ree;case BUe:return iee;case bUe:return nee;case QUe:return see}return e});eee.exports=hu});var hee=w((lgt,aee)=>{var fF=xC(),SUe=rF(),vUe=L$(),xUe=q$(),Aee=kC(),lee=Ks(),cee=bC(),kUe=g0(),PUe=1,uee="[object Arguments]",gee="[object Array]",d0="[object Object]",DUe=Object.prototype,fee=DUe.hasOwnProperty;function RUe(r,e,t,i,n,s){var o=lee(r),a=lee(e),l=o?gee:Aee(r),c=a?gee:Aee(e);l=l==uee?d0:l,c=c==uee?d0:c;var u=l==d0,g=c==d0,f=l==c;if(f&&cee(r)){if(!cee(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new fF),o||kUe(r)?SUe(r,e,t,i,n,s):vUe(r,e,l,t,i,n,s);if(!(t&PUe)){var h=u&&fee.call(r,"__wrapped__"),p=g&&fee.call(e,"__wrapped__");if(h||p){var m=h?r.value():r,y=p?e.value():e;return s||(s=new fF),n(m,y,t,i,s)}}return f?(s||(s=new fF),xUe(r,e,t,i,n,s)):!1}aee.exports=RUe});var hF=w((cgt,pee)=>{var FUe=hee(),dee=ta();function Cee(r,e,t,i,n){return r===e?!0:r==null||e==null||!dee(r)&&!dee(e)?r!==r&&e!==e:FUe(r,e,t,i,Cee,n)}pee.exports=Cee});var Eee=w((ugt,mee)=>{var NUe=xC(),LUe=hF(),TUe=1,OUe=2;function MUe(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n{var KUe=Rn();function UUe(r){return r===r&&!KUe(r)}Iee.exports=UUe});var wee=w((fgt,yee)=>{var HUe=pF(),jUe=Kf();function GUe(r){for(var e=jUe(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,HUe(n)]}return e}yee.exports=GUe});var dF=w((hgt,Bee)=>{function YUe(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}Bee.exports=YUe});var Qee=w((pgt,bee)=>{var qUe=Eee(),JUe=wee(),WUe=dF();function zUe(r){var e=JUe(r);return e.length==1&&e[0][2]?WUe(e[0][0],e[0][1]):function(t){return t===r||qUe(t,r,e)}}bee.exports=zUe});var C0=w((dgt,See)=>{var _Ue=hC();function VUe(r,e,t){var i=r==null?void 0:_Ue(r,e);return i===void 0?t:i}See.exports=VUe});var xee=w((Cgt,vee)=>{var XUe=hF(),ZUe=C0(),$Ue=DR(),e2e=_B(),t2e=pF(),r2e=dF(),i2e=gu(),n2e=1,s2e=2;function o2e(r,e){return e2e(r)&&t2e(e)?r2e(i2e(r),e):function(t){var i=ZUe(t,r);return i===void 0&&i===e?$Ue(t,r):XUe(e,i,n2e|s2e)}}vee.exports=o2e});var Pee=w((mgt,kee)=>{function a2e(r){return function(e){return e==null?void 0:e[r]}}kee.exports=a2e});var Ree=w((Egt,Dee)=>{var A2e=hC();function l2e(r){return function(e){return A2e(e,r)}}Dee.exports=l2e});var Nee=w((Igt,Fee)=>{var c2e=Pee(),u2e=Ree(),g2e=_B(),f2e=gu();function h2e(r){return g2e(r)?c2e(f2e(r)):u2e(r)}Fee.exports=h2e});var CF=w((ygt,Lee)=>{var p2e=Qee(),d2e=xee(),C2e=r0(),m2e=Ks(),E2e=Nee();function I2e(r){return typeof r=="function"?r:r==null?C2e:typeof r=="object"?m2e(r)?d2e(r[0],r[1]):p2e(r):E2e(r)}Lee.exports=I2e});var mF=w((wgt,Tee)=>{var y2e=Nf(),w2e=tF(),B2e=CF();function b2e(r,e){var t={};return e=B2e(e,3),w2e(r,function(i,n,s){y2e(t,n,e(i,n,s))}),t}Tee.exports=b2e});var PC=w((Bgt,Oee)=>{"use strict";function pu(r){this._maxSize=r,this.clear()}pu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};pu.prototype.get=function(r){return this._values[r]};pu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var Q2e=/[^.^\]^[]+|(?=\[\]|\.\.)/g,Mee=/^\d+$/,S2e=/^\d/,v2e=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,x2e=/^\s*(['"]?)(.*?)(\1)\s*$/,EF=512,Kee=new pu(EF),Uee=new pu(EF),Hee=new pu(EF);Oee.exports={Cache:pu,split:yF,normalizePath:IF,setter:function(r){var e=IF(r);return Uee.get(r)||Uee.set(r,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(DC,"__esModule",{value:!0});DC.create=F2e;DC.default=void 0;var N2e=PC(),m0={context:"$",value:"."};function F2e(r,e){return new E0(r,e)}var E0=class{constructor(e,t={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===m0.context,this.isValue=this.key[0]===m0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?m0.context:this.isValue?m0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,N2e.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};DC.default=E0;E0.prototype.__isYupRef=!0});var jee=w(BF=>{"use strict";Object.defineProperty(BF,"__esModule",{value:!0});BF.default=L2e;var T2e=bF(mF()),I0=bF(fu()),O2e=bF(du());function bF(r){return r&&r.__esModule?r:{default:r}}function y0(){return y0=Object.assign||function(r){for(var e=1;e=0)&&(t[n]=r[n]);return t}function L2e(r){function e(t,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=t,u=M2e(t,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=r,{parent:m,context:y}=a;function b(Y){return O2e.default.isRef(Y)?Y.getValue(n,m,y):Y}function v(Y={}){let $=(0,T2e.default)(y0({value:n,originalValue:l,label:o,path:Y.path||s},h,Y.params),b),_=new I0.default(I0.default.formatError(Y.message||p,$),n,$.path,Y.type||g);return _.params=$,_}let x=y0({path:s,parent:m,type:g,createError:v,resolve:b,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(x,n,x)).then(Y=>{I0.default.isError(Y)?i(Y):Y?i(null,Y):i(v())})}catch(Y){i(Y)}return}let T;try{var q;if(T=f.call(x,n,x),typeof((q=T)==null?void 0:q.then)=="function")throw new Error(`Validation test of type: "${x.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(Y){i(Y);return}I0.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var QF=w(RC=>{"use strict";Object.defineProperty(RC,"__esModule",{value:!0});RC.getIn=Gee;RC.default=void 0;var K2e=PC(),U2e=r=>r.substr(0,r.length-1).substr(1);function Gee(r,e,t,i=t){let n,s,o;return e?((0,K2e.forEach)(e,(a,l,c)=>{let u=l?U2e(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${r._type}")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var H2e=(r,e,t,i)=>Gee(r,e,t,i).schema,j2e=H2e;RC.default=j2e});var qee=w(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var Yee=G2e(du());function G2e(r){return r&&r.__esModule?r:{default:r}}var B0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){Yee.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){Yee.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new B0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};w0.default=B0});var EA=w(b0=>{"use strict";Object.defineProperty(b0,"__esModule",{value:!0});b0.default=void 0;var Jee=mA(hZ()),jf=CA(),Y2e=mA(kZ()),Wee=mA(l0()),Q0=mA(jee()),zee=mA(IC()),q2e=mA(du()),J2e=QF(),W2e=mA(WR()),_ee=mA(fu()),Vee=mA(qee());function mA(r){return r&&r.__esModule?r:{default:r}}function Js(){return Js=Object.assign||function(r){for(var e=1;e{this.typeError(jf.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=Js({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Js({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,Jee.default)(Js({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Js({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Js({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,zee.default)(e),o=(0,zee.default)(n);throw new TypeError(`The value of ${t.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Js({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,Wee.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,Wee.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Js({},t,{value:e}));return typeof i=="function"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Js({},t,{value:e})),n;return i._validate(e,Js({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(_ee.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(_ee.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,Jee.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=jf.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(t){return t!==void 0}})}required(e=jf.mixed.required){return this.clone({presence:"required"}).withMutation(t=>t.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!=="required"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]=="function"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=jf.mixed.default),typeof t.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,Q0.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!="string"&&(t=e,e=".");let i=this.clone(),n=(0,W2e.default)(e).map(s=>new q2e.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new Y2e.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,Q0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=jf.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,Q0.default)({message:t,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,t=jf.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,Q0.default)({message:t,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};b0.default=ua;ua.prototype.__isYupSchema__=!0;for(let r of["validate","validateSync"])ua.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,J2e.getIn)(this,e,t,i.context);return o[r](n&&n[s],Js({},i,{parent:n,path:e}))};for(let r of["equals","is"])ua.prototype[r]=ua.prototype.oneOf;for(let r of["not","nope"])ua.prototype[r]=ua.prototype.notOneOf;ua.prototype.optional=ua.prototype.notRequired});var Zee=w(FC=>{"use strict";Object.defineProperty(FC,"__esModule",{value:!0});FC.create=Xee;FC.default=void 0;var _2e=z2e(EA());function z2e(r){return r&&r.__esModule?r:{default:r}}var SF=_2e.default,V2e=SF;FC.default=V2e;function Xee(){return new SF}Xee.prototype=SF.prototype});var Gf=w(S0=>{"use strict";Object.defineProperty(S0,"__esModule",{value:!0});S0.default=void 0;var X2e=r=>r==null;S0.default=X2e});var ite=w(NC=>{"use strict";Object.defineProperty(NC,"__esModule",{value:!0});NC.create=$ee;NC.default=void 0;var Z2e=ete(EA()),tte=CA(),rte=ete(Gf());function ete(r){return r&&r.__esModule?r:{default:r}}function $ee(){return new v0}var v0=class extends Z2e.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(t){return(0,rte.default)(t)||t===!0}})}isFalse(e=tte.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(t){return(0,rte.default)(t)||t===!1}})}};NC.default=v0;$ee.prototype=v0.prototype});var ote=w(LC=>{"use strict";Object.defineProperty(LC,"__esModule",{value:!0});LC.create=nte;LC.default=void 0;var ga=CA(),IA=ste(Gf()),$2e=ste(EA());function ste(r){return r&&r.__esModule?r:{default:r}}var eHe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,tHe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,rHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,iHe=r=>(0,IA.default)(r)||r===r.trim(),nHe={}.toString();function nte(){return new x0}var x0=class extends $2e.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===nHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ga.string.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,IA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ga.string.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,IA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ga.string.max){return this.test({name:"max",exclusive:!0,message:t,params:{max:e},test(i){return(0,IA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t=="object"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||"matches",message:n||ga.string.matches,params:{regex:e},test:o=>(0,IA.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=ga.string.email){return this.matches(eHe,{name:"email",message:e,excludeEmptyString:!0})}url(e=ga.string.url){return this.matches(tHe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=ga.string.uuid){return this.matches(rHe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=ga.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:"trim",test:iHe})}lowercase(e=ga.string.lowercase){return this.transform(t=>(0,IA.default)(t)?t:t.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toLowerCase()})}uppercase(e=ga.string.uppercase){return this.transform(t=>(0,IA.default)(t)?t:t.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:t=>(0,IA.default)(t)||t===t.toUpperCase()})}};LC.default=x0;nte.prototype=x0.prototype});var lte=w(TC=>{"use strict";Object.defineProperty(TC,"__esModule",{value:!0});TC.create=ate;TC.default=void 0;var Cu=CA(),mu=Ate(Gf()),sHe=Ate(EA());function Ate(r){return r&&r.__esModule?r:{default:r}}var oHe=r=>r!=+r;function ate(){return new k0}var k0=class extends sHe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t=="string"){if(t=t.replace(/\s/g,""),t==="")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!oHe(e)}min(e,t=Cu.number.min){return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,mu.default)(i)||i>=this.resolve(e)}})}max(e,t=Cu.number.max){return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,mu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=Cu.number.lessThan){return this.test({message:t,name:"max",exclusive:!0,params:{less:e},test(i){return(0,mu.default)(i)||ithis.resolve(e)}})}positive(e=Cu.number.positive){return this.moreThan(0,e)}negative(e=Cu.number.negative){return this.lessThan(0,e)}integer(e=Cu.number.integer){return this.test({name:"integer",message:e,test:t=>(0,mu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,mu.default)(e)?e:e|0)}round(e){var t,i=["ceil","floor","round","trunc"];if(e=((t=e)==null?void 0:t.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,mu.default)(n)?n:Math[e](n))}};TC.default=k0;ate.prototype=k0.prototype});var cte=w(vF=>{"use strict";Object.defineProperty(vF,"__esModule",{value:!0});vF.default=aHe;var AHe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function aHe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=AHe.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]==="+"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var fte=w(OC=>{"use strict";Object.defineProperty(OC,"__esModule",{value:!0});OC.create=xF;OC.default=void 0;var lHe=P0(cte()),ute=CA(),gte=P0(Gf()),cHe=P0(du()),uHe=P0(EA());function P0(r){return r&&r.__esModule?r:{default:r}}var kF=new Date(""),gHe=r=>Object.prototype.toString.call(r)==="[object Date]";function xF(){return new MC}var MC=class extends uHe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,lHe.default)(e),isNaN(e)?kF:new Date(e))})})}_typeCheck(e){return gHe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(cHe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${t}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,t=ute.date.min){let i=this.prepareParam(e,"min");return this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(n){return(0,gte.default)(n)||n>=this.resolve(i)}})}max(e,t=ute.date.max){var i=this.prepareParam(e,"max");return this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(n){return(0,gte.default)(n)||n<=this.resolve(i)}})}};OC.default=MC;MC.INVALID_DATE=kF;xF.prototype=MC.prototype;xF.INVALID_DATE=kF});var pte=w((Tgt,hte)=>{function fHe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n{function hHe(r){return function(e){return r==null?void 0:r[e]}}dte.exports=hHe});var Ete=w((Mgt,mte)=>{var pHe=Cte(),dHe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},CHe=pHe(dHe);mte.exports=CHe});var yte=w((Kgt,Ite)=>{var mHe=Ete(),EHe=lf(),IHe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,yHe="\\u0300-\\u036f",wHe="\\ufe20-\\ufe2f",BHe="\\u20d0-\\u20ff",bHe=yHe+wHe+BHe,QHe="["+bHe+"]",SHe=RegExp(QHe,"g");function vHe(r){return r=EHe(r),r&&r.replace(IHe,mHe).replace(SHe,"")}Ite.exports=vHe});var Bte=w((Ugt,wte)=>{var xHe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function kHe(r){return r.match(xHe)||[]}wte.exports=kHe});var Qte=w((Hgt,bte)=>{var PHe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function DHe(r){return PHe.test(r)}bte.exports=DHe});var Yte=w((jgt,Ste)=>{var vte="\\ud800-\\udfff",RHe="\\u0300-\\u036f",FHe="\\ufe20-\\ufe2f",NHe="\\u20d0-\\u20ff",LHe=RHe+FHe+NHe,xte="\\u2700-\\u27bf",kte="a-z\\xdf-\\xf6\\xf8-\\xff",THe="\\xac\\xb1\\xd7\\xf7",OHe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",MHe="\\u2000-\\u206f",KHe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Pte="A-Z\\xc0-\\xd6\\xd8-\\xde",UHe="\\ufe0e\\ufe0f",Dte=THe+OHe+MHe+KHe,Rte="['\u2019]",Fte="["+Dte+"]",HHe="["+LHe+"]",Nte="\\d+",jHe="["+xte+"]",Lte="["+kte+"]",Tte="[^"+vte+Dte+Nte+xte+kte+Pte+"]",GHe="\\ud83c[\\udffb-\\udfff]",YHe="(?:"+HHe+"|"+GHe+")",qHe="[^"+vte+"]",Ote="(?:\\ud83c[\\udde6-\\uddff]){2}",Mte="[\\ud800-\\udbff][\\udc00-\\udfff]",Yf="["+Pte+"]",JHe="\\u200d",Kte="(?:"+Lte+"|"+Tte+")",WHe="(?:"+Yf+"|"+Tte+")",Ute="(?:"+Rte+"(?:d|ll|m|re|s|t|ve))?",Hte="(?:"+Rte+"(?:D|LL|M|RE|S|T|VE))?",jte=YHe+"?",Gte="["+UHe+"]?",zHe="(?:"+JHe+"(?:"+[qHe,Ote,Mte].join("|")+")"+Gte+jte+")*",_He="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",VHe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",XHe=Gte+jte+zHe,ZHe="(?:"+[jHe,Ote,Mte].join("|")+")"+XHe,$He=RegExp([Yf+"?"+Lte+"+"+Ute+"(?="+[Fte,Yf,"$"].join("|")+")",WHe+"+"+Hte+"(?="+[Fte,Yf+Kte,"$"].join("|")+")",Yf+"?"+Kte+"+"+Ute,Yf+"+"+Hte,VHe,_He,Nte,ZHe].join("|"),"g");function eje(r){return r.match($He)||[]}Ste.exports=eje});var Jte=w((Ggt,qte)=>{var tje=Bte(),rje=Qte(),ije=lf(),nje=Yte();function sje(r,e,t){return r=ije(r),e=t?void 0:e,e===void 0?rje(r)?nje(r):tje(r):r.match(e)||[]}qte.exports=sje});var PF=w((Ygt,Wte)=>{var oje=pte(),aje=yte(),Aje=Jte(),lje="['\u2019]",cje=RegExp(lje,"g");function uje(r){return function(e){return oje(Aje(aje(e).replace(cje,"")),r,"")}}Wte.exports=uje});var _te=w((qgt,zte)=>{var gje=PF(),fje=gje(function(r,e,t){return r+(t?"_":"")+e.toLowerCase()});zte.exports=fje});var Xte=w((Jgt,Vte)=>{var hje=Zw(),pje=PF(),dje=pje(function(r,e,t){return e=e.toLowerCase(),r+(t?hje(e):e)});Vte.exports=dje});var $te=w((Wgt,Zte)=>{var Cje=Nf(),mje=tF(),Eje=CF();function Ije(r,e){var t={};return e=Eje(e,3),mje(r,function(i,n,s){Cje(t,e(i,n,s),i)}),t}Zte.exports=Ije});var tre=w((zgt,DF)=>{DF.exports=function(r){return ere(yje(r),r)};DF.exports.array=ere;function ere(r,e){var t=r.length,i=new Array(t),n={},s=t,o=wje(e),a=Bje(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(m){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function yje(r){for(var e=new Set,t=0,i=r.length;t{"use strict";Object.defineProperty(RF,"__esModule",{value:!0});RF.default=bje;var Qje=D0(yC()),Sje=D0(tre()),vje=PC(),xje=D0(du()),kje=D0(Tf());function D0(r){return r&&r.__esModule?r:{default:r}}function bje(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,vje.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,Qje.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),xje.default.isRef(o)&&o.isSibling?n(o.path,s):(0,kje.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Sje.default.array(i,t).reverse()}});var nre=w(FF=>{"use strict";Object.defineProperty(FF,"__esModule",{value:!0});FF.default=Pje;function ire(r,e){let t=Infinity;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function Pje(r){return(e,t)=>ire(r,e)-ire(r,t)}});var ure=w(KC=>{"use strict";Object.defineProperty(KC,"__esModule",{value:!0});KC.create=sre;KC.default=void 0;var ore=fa(yC()),are=fa(_te()),Dje=fa(Xte()),Rje=fa($te()),Fje=fa(mF()),Nje=PC(),Are=CA(),Lje=fa(rre()),lre=fa(nre()),Tje=fa(l0()),Oje=fa(fu()),NF=fa(EA());function fa(r){return r&&r.__esModule?r:{default:r}}function qf(){return qf=Object.assign||function(r){for(var e=1;eObject.prototype.toString.call(r)==="[object Object]";function Mje(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var Kje=(0,lre.default)([]),R0=class extends NF.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=Kje,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return cre(e)||typeof e=="function"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=qf({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,ore.default)(n,g);if(f){let p,m=n[g];c.path=(t.path?`${t.path}.`:"")+g,f=f.resolve({value:m,context:t.context,parent:l});let y="spec"in f?f.spec:void 0,b=y==null?void 0:y.strict;if(y==null?void 0:y.strip){u=u||g in n;continue}p=!t.__validating||!b?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!Oje.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!cre(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,m)=>{let y=h.indexOf(".")===-1?(t.path?`${t.path}.`:"")+h:`${t.path||""}["${h}"]`,b=this.fields[h];if(b&&"validate"in b){b.validate(g[h],qf({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),m);return}m(null)});(0,Tje.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=qf({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof NF.default&&s instanceof NF.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,lre.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Lje.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,Nje.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,ore.default)(s,e)&&(o=qf({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Are.object.noUnknown){typeof e=="string"&&(t=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=Mje(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Are.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,Rje.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Dje.default)}snakeCase(){return this.transformKeys(are.default)}constantCase(){return this.transformKeys(e=>(0,are.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Fje.default)(this.fields,t=>t.describe()),e}};KC.default=R0;function sre(r){return new R0(r)}sre.prototype=R0.prototype});var fre=w(UC=>{"use strict";Object.defineProperty(UC,"__esModule",{value:!0});UC.create=gre;UC.default=void 0;var LF=Jf(Gf()),Uje=Jf(Tf()),Hje=Jf(IC()),TF=CA(),jje=Jf(l0()),Gje=Jf(fu()),Yje=Jf(EA());function Jf(r){return r&&r.__esModule?r:{default:r}}function F0(){return F0=Object.assign||function(r){for(var e=1;e{this.transform(function(t){if(typeof t=="string")try{t=JSON.parse(t)}catch(i){t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,F0({},t,{path:`${t.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!Gje.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let m=new Array(p.length);for(let y=0;yc.validate(b,x,q)}(0,jje.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,Uje.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Hje.default)(e));return t.innerType=e,t}length(e,t=TF.array.length){return this.test({message:t,name:"length",exclusive:!0,params:{length:e},test(i){return(0,LF.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||TF.array.min,this.test({message:t,name:"min",exclusive:!0,params:{min:e},test(i){return(0,LF.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||TF.array.max,this.test({message:t,name:"max",exclusive:!0,params:{max:e},test(i){return(0,LF.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};UC.default=N0;gre.prototype=N0.prototype});var hre=w(HC=>{"use strict";Object.defineProperty(HC,"__esModule",{value:!0});HC.create=qje;HC.default=void 0;var Wje=Jje(Tf());function Jje(r){return r&&r.__esModule?r:{default:r}}function qje(r){return new OF(r)}var OF=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,Wje.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},zje=OF;HC.default=zje});var pre=w(MF=>{"use strict";Object.defineProperty(MF,"__esModule",{value:!0});MF.default=_je;var Xje=Vje(CA());function Vje(r){return r&&r.__esModule?r:{default:r}}function _je(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{Xje.default[e][t]=r[e][t]})})}});var UF=w(Br=>{"use strict";Object.defineProperty(Br,"__esModule",{value:!0});Br.addMethod=Zje;Object.defineProperty(Br,"MixedSchema",{enumerable:!0,get:function(){return dre.default}});Object.defineProperty(Br,"mixed",{enumerable:!0,get:function(){return dre.create}});Object.defineProperty(Br,"BooleanSchema",{enumerable:!0,get:function(){return KF.default}});Object.defineProperty(Br,"bool",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"boolean",{enumerable:!0,get:function(){return KF.create}});Object.defineProperty(Br,"StringSchema",{enumerable:!0,get:function(){return Cre.default}});Object.defineProperty(Br,"string",{enumerable:!0,get:function(){return Cre.create}});Object.defineProperty(Br,"NumberSchema",{enumerable:!0,get:function(){return mre.default}});Object.defineProperty(Br,"number",{enumerable:!0,get:function(){return mre.create}});Object.defineProperty(Br,"DateSchema",{enumerable:!0,get:function(){return Ere.default}});Object.defineProperty(Br,"date",{enumerable:!0,get:function(){return Ere.create}});Object.defineProperty(Br,"ObjectSchema",{enumerable:!0,get:function(){return Ire.default}});Object.defineProperty(Br,"object",{enumerable:!0,get:function(){return Ire.create}});Object.defineProperty(Br,"ArraySchema",{enumerable:!0,get:function(){return yre.default}});Object.defineProperty(Br,"array",{enumerable:!0,get:function(){return yre.create}});Object.defineProperty(Br,"ref",{enumerable:!0,get:function(){return $je.create}});Object.defineProperty(Br,"lazy",{enumerable:!0,get:function(){return eGe.create}});Object.defineProperty(Br,"ValidationError",{enumerable:!0,get:function(){return tGe.default}});Object.defineProperty(Br,"reach",{enumerable:!0,get:function(){return rGe.default}});Object.defineProperty(Br,"isSchema",{enumerable:!0,get:function(){return wre.default}});Object.defineProperty(Br,"setLocale",{enumerable:!0,get:function(){return iGe.default}});Object.defineProperty(Br,"BaseSchema",{enumerable:!0,get:function(){return nGe.default}});var dre=Eu(Zee()),KF=Eu(ite()),Cre=Eu(ote()),mre=Eu(lte()),Ere=Eu(fte()),Ire=Eu(ure()),yre=Eu(fre()),$je=du(),eGe=hre(),tGe=jC(fu()),rGe=jC(QF()),wre=jC(Tf()),iGe=jC(pre()),nGe=jC(EA());function jC(r){return r&&r.__esModule?r:{default:r}}function Bre(){if(typeof WeakMap!="function")return null;var r=new WeakMap;return Bre=function(){return r},r}function Eu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!="object"&&typeof r!="function")return{default:r};var e=Bre();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function Zje(r,e,t){if(!r||!(0,wre.default)(r.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof t!="function")throw new TypeError("Method function must be provided");r.prototype[e]=t}});var xre=w((hft,YC)=>{"use strict";var aGe=process.env.TERM_PROGRAM==="Hyper",AGe=process.platform==="win32",Qre=process.platform==="linux",HF={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sre=Object.assign({},HF,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),vre=Object.assign({},HF,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:Qre?"\u25B8":"\u276F",pointerSmall:Qre?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});YC.exports=AGe&&!aGe?Sre:vre;Reflect.defineProperty(YC.exports,"common",{enumerable:!1,value:HF});Reflect.defineProperty(YC.exports,"windows",{enumerable:!1,value:Sre});Reflect.defineProperty(YC.exports,"other",{enumerable:!1,value:vre})});var Eo=w((pft,jF)=>{"use strict";var lGe=r=>r!==null&&typeof r=="object"&&!Array.isArray(r),cGe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,kre=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(r.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(r.enabled===!1)return s;if(r.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),r.ansiRegex=cGe,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o=="string"?r[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!lGe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias("unstyle",s=>typeof s=="string"&&s!==""?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,"")):""),r.alias("noop",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=xre(),r.define=n,r};jF.exports=kre();jF.exports.create=kre});var Xi=w(Lt=>{"use strict";var uGe=Object.prototype.toString,Ws=Eo(),Pre=!1,GF=[],Dre={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};Lt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Lt.hasColor=r=>!!r&&Ws.hasColor(r);var T0=Lt.isObject=r=>r!==null&&typeof r=="object"&&!Array.isArray(r);Lt.nativeType=r=>uGe.call(r).slice(8,-1).toLowerCase().replace(/\s/g,"");Lt.isAsyncFn=r=>Lt.nativeType(r)==="asyncfunction";Lt.isPrimitive=r=>r!=null&&typeof r!="object"&&typeof r!="function";Lt.resolve=(r,e,...t)=>typeof e=="function"?e.call(r,...t):e;Lt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Lt.scrollUp=(r=[])=>[r.pop(),...r];Lt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Lt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[0]),process.platform==="win32"?t-1:t};Lt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize=="function"&&(t=r.getWindowSize()[1]),t};Lt.wordWrap=(r,e={})=>{if(!r)return r;typeof e=="number"&&(e={width:e});let{indent:t="",newline:i=` -`+t,width:n=80}=e;n-=((i+t).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),t+c.join(i)};Lt.unmute=r=>{let e=r.stack.find(i=>Ws.keys.color.includes(i));return e?Ws[e]:r.stack.find(i=>i.slice(2)==="bg")?Ws[e.slice(2)]:i=>i};Lt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):"";Lt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i));if(e){let i=Ws["bg"+Lt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)==="bg");return t?Ws[t.slice(2).toLowerCase()]||r:Ws.none};Lt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ws.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)==="bg");if(e&&!t)return Ws[Dre[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=Dre[i];return n&&Ws["bg"+Lt.pascal(n)]||r}return Ws.none};Lt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=t<10?"0"+t:t;return n+":"+s+" "+i};Lt.set=(r={},e="",t)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Lt.isObject(a)&&s{let i=r[e]==null?e.split(".").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Lt.mixin=(r,e)=>{if(!T0(r))return e;if(!T0(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty("value"))if(r.hasOwnProperty(t)&&T0(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);T0(n.value)?r[t]=Lt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Lt.merge=(...r)=>{let e={};for(let t of r)Lt.mixin(e,t);return e};Lt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n=="function"?Lt.define(r,i,n.bind(e)):Lt.define(r,i,n)}};Lt.onExit=r=>{let e=(t,i)=>{Pre||(Pre=!0,GF.forEach(n=>n()),t===!0&&process.exit(128+i))};GF.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),GF.push(r)};Lt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Lt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var Rre=w(zf=>{"use strict";zf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};zf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};zf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};zf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};zf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Lre=w((mft,Fre)=>{"use strict";var Nre=require("readline"),gGe=Rre(),fGe=/^(?:\x1b)([a-zA-Z0-9])$/,hGe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,pGe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function dGe(r){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(r)}function CGe(r){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(r)}var O0=(r="",e={})=>{let t,i=N({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r},e);if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=""+String(r)):r=String(r):r!==void 0&&typeof r!="string"?r=String(r):r||(r=i.sequence||""),i.sequence=i.sequence||r||i.name,r==="\r")i.raw=void 0,i.name="return";else if(r===` -`)i.name="enter";else if(r===" ")i.name="tab";else if(r==="\b"||r==="\x7F"||r==="\x7F"||r==="\b")i.name="backspace",i.meta=r.charAt(0)==="";else if(r===""||r==="")i.name="escape",i.meta=r.length===2;else if(r===" "||r===" ")i.name="space",i.meta=r.length===2;else if(r<="")i.name=String.fromCharCode(r.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>="0"&&r<="9")i.name="number";else if(r.length===1&&r>="a"&&r<="z")i.name=r;else if(r.length===1&&r>="A"&&r<="Z")i.name=r.toLowerCase(),i.shift=!0;else if(t=fGe.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=hGe.exec(r)){let n=[...r];n[0]===""&&n[1]===""&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(""),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=pGe[s],i.shift=dGe(s)||i.shift,i.ctrl=CGe(s)||i.ctrl}return i};O0.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error("Invalid stream passed");let i=Nre.createInterface({terminal:!0,input:t});Nre.emitKeypressEvents(t,i);let n=(a,l)=>e(a,O0(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on("keypress",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener("keypress",n),i.pause(),i.close()}};O0.action=(r,e,t)=>{let i=N(N({},gGe),t);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};Fre.exports=O0});var Ore=w((Eft,Tre)=>{"use strict";Tre.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i=="number"&&(i={interval:i}),mGe(r,t,i)}};function mGe(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),r.once("close",()=>i.stop()),i.stop}});var Ure=w((Ift,Mre)=>{"use strict";var{define:EGe,width:IGe}=Xi(),Kre=class{constructor(e){let t=e.options;EGe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=IGe(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=N({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t=="function"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Mre.exports=Kre});var jre=w((yft,Hre)=>{"use strict";var YF=Xi(),Ni=Eo(),qF={default:Ni.noop,noop:Ni.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||YF.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||YF.complement(this.primary)},primary:Ni.cyan,success:Ni.green,danger:Ni.magenta,strong:Ni.bold,warning:Ni.yellow,muted:Ni.dim,disabled:Ni.gray,dark:Ni.dim.gray,underline:Ni.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};qF.merge=(r={})=>{r.styles&&typeof r.styles.enabled=="boolean"&&(Ni.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible=="boolean"&&(Ni.visible=r.styles.visible);let e=YF.merge({},qF,r.styles);delete e.merge;for(let t of Object.keys(Ni))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});for(let t of Object.keys(Ni.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Ni[t]});return e};Hre.exports=qF});var Yre=w((wft,Gre)=>{"use strict";var JF=process.platform==="win32",yA=Eo(),yGe=Xi(),WF=te(N({},yA.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:yA.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:yA.symbols.question,submitted:yA.symbols.check,cancelled:yA.symbols.cross},separator:{pending:yA.symbols.pointerSmall,submitted:yA.symbols.middot,cancelled:yA.symbols.middot},radio:{off:JF?"( )":"\u25EF",on:JF?"(*)":"\u25C9",disabled:JF?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});WF.merge=r=>{let e=yGe.merge({},yA.symbols,WF,r.symbols);return delete e.merge,e};Gre.exports=WF});var Jre=w((Bft,qre)=>{"use strict";var wGe=jre(),BGe=Yre(),bGe=Xi();qre.exports=r=>{r.options=bGe.merge({},r.options.theme,r.options),r.symbols=BGe.merge(r.options),r.styles=wGe.merge(r.options)}});var Xre=w((Wre,zre)=>{"use strict";var _re=process.env.TERM_PROGRAM==="Apple_Terminal",QGe=Eo(),zF=Xi(),Io=zre.exports=Wre,Lr="[",Vre="\x07",_F=!1,Fl=Io.code={bell:Vre,beep:Vre,beginning:`${Lr}G`,down:`${Lr}J`,esc:Lr,getPosition:`${Lr}6n`,hide:`${Lr}?25l`,line:`${Lr}2K`,lineEnd:`${Lr}K`,lineStart:`${Lr}1K`,restorePosition:Lr+(_re?"8":"u"),savePosition:Lr+(_re?"7":"s"),screen:`${Lr}2J`,show:`${Lr}?25h`,up:`${Lr}1J`},Iu=Io.cursor={get hidden(){return _F},hide(){return _F=!0,Fl.hide},show(){return _F=!1,Fl.show},forward:(r=1)=>`${Lr}${r}C`,backward:(r=1)=>`${Lr}${r}D`,nextLine:(r=1)=>`${Lr}E`.repeat(r),prevLine:(r=1)=>`${Lr}F`.repeat(r),up:(r=1)=>r?`${Lr}${r}A`:"",down:(r=1)=>r?`${Lr}${r}B`:"",right:(r=1)=>r?`${Lr}${r}C`:"",left:(r=1)=>r?`${Lr}${r}D`:"",to(r,e){return e?`${Lr}${e+1};${r+1}H`:`${Lr}${r+1}G`},move(r=0,e=0){let t="";return t+=r<0?Iu.left(-r):r>0?Iu.right(r):"",t+=e<0?Iu.up(-e):e>0?Iu.down(e):"",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=zF.isPrimitive(i)?String(i):"",n=zF.isPrimitive(n)?String(n):"",a=zF.isPrimitive(a)?String(a):"",o){let l=Io.cursor.up(o)+Io.cursor.to(s.length),c=n.length-t;return c>0&&(l+=Io.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Io.cursor.move(l)}}},VF=Io.erase={screen:Fl.screen,up:Fl.up,down:Fl.down,line:Fl.line,lineEnd:Fl.lineEnd,lineStart:Fl.lineStart,lines(r){let e="";for(let t=0;t{if(!e)return VF.line+Iu.to(0);let t=s=>[...QGe.unstyle(s)].length,i=r.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(VF.line+Iu.prevLine()).repeat(n-1)+VF.line+Iu.to(0)}});var _f=w((bft,Zre)=>{"use strict";var SGe=require("events"),$re=Eo(),XF=Lre(),vGe=Ore(),xGe=Ure(),kGe=Jre(),Tn=Xi(),yu=Xre(),M0=class extends SGe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,kGe(this),vGe(this),this.state=new xGe(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=DGe(this.options.margin),this.setMaxListeners(0),PGe(this)}async keypress(e,t={}){this.keypressed=!0;let i=XF.action(e,XF(e,t),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(yu.code.beep)}cursorHide(){this.stdout.write(yu.cursor.hide()),Tn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(yu.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer="",!(!t&&!e||this.options.show===!1)&&this.stdout.write(yu.cursor.down(e)+yu.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=yu.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=$re.unstyle(i);let n=$re.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],f=(i+(t?" "+t:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial=="function"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun=="function"&&await t.onRun.call(this,this),typeof t.onSubmit=="function"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,t)=>{if(this.once("submit",e),this.once("cancel",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,Tn.isObject(e)&&(e=e[i.status]||e.pending),Tn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Tn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Tn.isObject(s)&&(s=s[i.status]||s.pending),Tn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element("pointer",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Tn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,t){let i=await this.element("indicator",e,t);if(typeof i=="string"&&Tn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Tn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Tn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...t){return Tn.resolve(this,e,...t)}get base(){return M0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Tn.height(this.stdout,25)}get width(){return this.options.columns||Tn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function PGe(r){let e=n=>r[n]===void 0||typeof r[n]=="function",t=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s=="function"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!="function"&&(r[n]=s)}}function DGe(r){typeof r=="number"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}Zre.exports=M0});var rie=w((Qft,eie)=>{"use strict";var RGe=Xi(),tie={default(r,e){return e},checkbox(r,e){throw new Error("checkbox role is not implemented yet")},editable(r,e){throw new Error("editable role is not implemented yet")},expandable(r,e){throw new Error("expandable role is not implemented yet")},heading(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||"",e},input(r,e){throw new Error("input role is not implemented yet")},option(r,e){return tie.default(r,e)},radio(r,e){throw new Error("radio role is not implemented yet")},separator(r,e){return e.disabled="",e.indicator=[e.indicator," "].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};eie.exports=(r,e={})=>{let t=RGe.merge({},tie,e.roles);return t[r]||t.default}});var qC=w((Sft,iie)=>{"use strict";var FGe=Eo(),NGe=_f(),LGe=rie(),K0=Xi(),{reorder:ZF,scrollUp:TGe,scrollDown:OGe,isObject:nie,swap:MGe}=K0,sie=class extends NGe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");nie(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t=="string"&&(t=this.findIndex(t)),typeof t=="number"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=LGe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=t,e.cursor=0,K0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,FGe.unstyle(e.message).length));let o=N({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit("choice",e,t,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n=N({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!="boolean"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedt.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!="boolean"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return oie(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=ZF(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=ZF(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=ZF(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=TGe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=OGe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){MGe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(nie(e))return t?e[t]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=K0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t=="string"||typeof t=="number"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return oie(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function oie(r,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(K0.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}iie.exports=sie});var Nl=w((vft,aie)=>{"use strict";var KGe=qC(),$F=Xi(),Aie=class extends KGe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):""}indicator(e,t){return this.multiple?super.indicator(e,t):""}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role==="heading"&&!$F.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return":"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,t);o&&!$F.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?($F.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger("No matching choices"));let i=this.margin[0]+t.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};aie.exports=Aie});var uie=w((xft,lie)=>{"use strict";var UGe=Nl(),HGe=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cie=class extends UGe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=HGe(this.input,e),i=this.choices;this.choices=i.map(n=>te(N({},n),{message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};lie.exports=cie});var tN=w((kft,gie)=>{"use strict";var eN=Xi();gie.exports=(r,e={})=>{r.cursorHide();let{input:t="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=eN.inverse(r.styles.primary),c=m=>l(r.styles.black(m)),u=t,g=" ",f=c(g);if(r.blink&&r.blink.off===!0&&(c=m=>m,f=""),s&&n===0&&i===""&&t==="")return c(g);if(s&&n===0&&(t===i||t===""))return c(i[0])+a(i.slice(1));i=eN.isPrimitive(i)?`${i}`:"",t=eN.isPrimitive(t)?`${t}`:"";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=""),s===!1&&(p=""),h){let m=r.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var U0=w((Pft,fie)=>{"use strict";var jGe=Eo(),GGe=Nl(),YGe=tN(),hie=class extends GGe{constructor(e){super(te(N({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(t=>t!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,m=this.index===t,y=e.validate||(()=>!0),b=await this.choiceSeparator(e,t),v=e.message;this.align==="right"&&(v=v.padStart(this.longest+1," ")),this.align==="left"&&(v=v.padEnd(this.longest+1," "));let x=this.values[a]=c||o,T=c?"success":"dark";await y.call(e,x,this.state)!==!0&&(T="danger");let Y=n[T](await this.indicator(e,t))+(e.pad||""),$=this.indent(e),_=()=>[$,Y,v+b,c,p].filter(Boolean).join(" ");if(i.submitted)return v=jGe.unstyle(v),c=g(c),p="",_();if(e.format)c=await e.format.call(this,c,e,t);else{let ne=this.styles.muted;c=YGe(this,{input:c,initial:o,pos:s,showCursor:m,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,x,e,t)),m&&(v=f(v)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),_()}async submit(){return this.value=this.values,super.base.submit.call(this)}};fie.exports=hie});var rN=w((Dft,pie)=>{"use strict";var qGe=U0(),JGe=()=>{throw new Error("expected prompt to have a custom authenticate method")},die=(r=JGe)=>{class e extends qGe{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return die(i)}}return e};pie.exports=die()});var Eie=w((Rft,Cie)=>{"use strict";var WGe=rN();function zGe(r,e){return r.username===this.options.username&&r.password===this.options.password}var mie=(r=zGe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends WGe.create(r){constructor(n){super(te(N({},n),{choices:e}))}static create(n){return mie(n)}}return t};Cie.exports=mie()});var H0=w((Fft,Iie)=>{"use strict";var _Ge=_f(),{isPrimitive:VGe,hasColor:XGe}=Xi(),yie=class extends _Ge{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return VGe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return XGe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Iie.exports=yie});var bie=w((Nft,wie)=>{"use strict";var ZGe=H0(),Bie=class extends ZGe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};wie.exports=Bie});var vie=w((Lft,Qie)=>{"use strict";var $Ge=Nl(),eYe=U0(),Vf=eYe.prototype,Sie=class extends $Ge{constructor(e){super(te(N({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(t=>t!=null),this.emptyError="",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():Vf.dispatch.call(this,e,t)}append(e,t){return Vf.append.call(this,e,t)}delete(e,t){return Vf.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Vf.next.call(this):super.next()}prev(){return this.focused.editable?Vf.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||"",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,t){return e.indent="",e.editable?Vf.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!="function"||t.role==="heading")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||"":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Qie.exports=Sie});var wu=w((Tft,xie)=>{"use strict";var tYe=_f(),rYe=tN(),{isPrimitive:iYe}=Xi(),kie=class extends tYe{constructor(e){super(e);this.initial=iYe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name==="return"&&(!i||i.name!=="return")?this.append(` -`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):rYe(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};xie.exports=kie});var Die=w((Oft,Pie)=>{"use strict";var nYe=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),j0=r=>nYe(r).filter(Boolean);Pie.exports=(r,e={},t="")=>{let{past:i=[],present:n=""}=e,s,o;switch(r){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:j0([t,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:j0([...s,t]),present:o};case"save":return{past:j0([...i,t]),present:""};case"remove":return o=j0(i.filter(a=>a!==t)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${r}"`)}}});var iN=w((Mft,Rie)=>{"use strict";var sYe=wu(),Fie=Die(),Nie=class extends sYe{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=Fie(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=Fie("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Rie.exports=Nie});var Oie=w((Kft,Lie)=>{"use strict";var oYe=wu(),Tie=class extends oYe{format(){return""}};Lie.exports=Tie});var Uie=w((Uft,Mie)=>{"use strict";var aYe=wu(),Kie=class extends aYe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(", ")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Mie.exports=Kie});var Gie=w((Hft,Hie)=>{"use strict";var AYe=Nl(),jie=class extends AYe{constructor(e){super(te(N({},e),{multiple:!0}))}};Hie.exports=jie});var nN=w((jft,Yie)=>{"use strict";var lYe=wu(),qie=class extends lYe{constructor(e={}){super(N({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};Yie.exports=qie});var Wie=w((Gft,Jie)=>{Jie.exports=nN()});var Vie=w((Yft,zie)=>{"use strict";var cYe=wu(),_ie=class extends cYe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};zie.exports=_ie});var ene=w((qft,Xie)=>{"use strict";var uYe=Eo(),gYe=qC(),Zie=Xi(),$ie=class extends gYe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let t=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join("").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!Zie.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=uYe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=Zie.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Xie.exports=$ie});var nne=w((Jft,tne)=>{"use strict";var rne=Eo(),fYe=(r="")=>typeof r=="string"?r.replace(/^['"]|['"]$/g,""):"",ine=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=fYe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},hYe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uT.name===b.key);b.field=n.find(T=>T.name===b.key),x||(x=new ine(b),a.push(x)),x.lines.push(b.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};tne.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i=N(N({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await hYe(e,i),a=sN("result",r,e),l=sN("format",r,e),c=sN("validate",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output="";let p=async(v,x,T,q)=>{let Y=await c(v,x,T,q);return Y===!1?"Invalid field "+T.name:Y};for(let v of n){let x=v.value,T=v.key;if(v.type!=="template"){x&&(g.output+=x);continue}if(v.type==="template"){let q=s.find(ee=>ee.name===T);e.required===!0&&g.required.add(q.name);let Y=[q.input,g.values[q.value],q.value,x].find(u),_=(q.field||{}).message||v.inner;if(f){let ee=await p(g.values[T],g,q,h);if(ee&&typeof ee=="string"||ee===!1){g.invalid.set(T,ee);continue}g.invalid.delete(T);let A=await a(g.values[T],g,q,h);g.output+=rne.unstyle(A);continue}q.placeholder=!1;let ne=x;x=await l(x,g,q,h),Y!==x?(g.values[T]=Y,x=r.styles.typing(Y),g.missing.delete(_)):(g.values[T]=void 0,Y=`<${_}>`,x=r.styles.primary(Y),q.placeholder=!0,g.required.has(T)&&g.missing.add(_)),g.missing.has(_)&&g.validating&&(x=r.styles.warning(Y)),g.invalid.has(T)&&g.validating&&(x=r.styles.danger(Y)),h===g.index&&(ne!==x?x=r.styles.underline(x):x=r.styles.heading(rne.unstyle(x))),h++}x&&(g.output+=x)}let m=g.output.split(` -`).map(v=>" "+v),y=s.length,b=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(x=>{m[x][0]===" "&&(m[x]=g.styles.danger(g.symbols.bullet)+m[x].slice(1))}),r.isValue(g.values[v.name])&&b++;return g.completed=(b/y*100).toFixed(0),g.output=m.join(` -`),g.output}};function sN(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]=="function"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var ane=w((Wft,sne)=>{"use strict";var pYe=Eo(),dYe=nne(),CYe=_f(),one=class extends CYe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await dYe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=t[e]||"",m=await this.format(p),y=await this.footer();m&&(c+=" "+m),f&&!m&&this.state.completed===0&&(c+=" "+f),this.clear(n);let b=[u,c,h,y,g.trim()];this.write(b.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(t.size)return this.state.error="Required: "+[...t.keys()].join(", "),super.submit();let o=pYe.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};sne.exports=one});var cne=w((zft,Ane)=>{"use strict";var mYe="(Use + to sort)",EYe=Nl(),lne=class extends EYe{constructor(e){super(te(N({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,mYe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+" ",s=this.index===t&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Ane.exports=lne});var fne=w((_ft,une)=>{"use strict";var IYe=qC(),gne=class extends IYe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=yYe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=x=>(x?this.styles.success("\u25C9"):"\u25EF")+o,u=t+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((x,T)=>c(T===e.scaleIdx)).join(a),m=x=>x===e.scaleIdx?g(x):x,y=h+e.scale.map((x,T)=>m(T)).join(l),b=()=>[u,f].filter(Boolean).join(" "),v=()=>[b(),p,y," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger("No matching choices")),t.join(` -`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function yYe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>N({},i));let t=[];for(let i=1;i{hne.exports=iN()});var mne=w((Xft,dne)=>{"use strict";var wYe=H0(),Cne=class extends wYe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",t){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};dne.exports=Cne});var yne=w((Zft,Ene)=>{"use strict";var BYe=Nl(),Ine=class extends BYe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ene.exports=Ine});var Bne=w(oN=>{"use strict";var wne=Xi(),mi=(r,e)=>{wne.defineExport(oN,r,e),wne.defineExport(oN,r.toLowerCase(),e)};mi("AutoComplete",()=>uie());mi("BasicAuth",()=>Eie());mi("Confirm",()=>bie());mi("Editable",()=>vie());mi("Form",()=>U0());mi("Input",()=>iN());mi("Invisible",()=>Oie());mi("List",()=>Uie());mi("MultiSelect",()=>Gie());mi("Numeral",()=>Wie());mi("Password",()=>Vie());mi("Scale",()=>ene());mi("Select",()=>Nl());mi("Snippet",()=>ane());mi("Sort",()=>cne());mi("Survey",()=>fne());mi("Text",()=>pne());mi("Toggle",()=>mne());mi("Quiz",()=>yne())});var Qne=w((eht,bne)=>{bne.exports={ArrayPrompt:qC(),AuthPrompt:rN(),BooleanPrompt:H0(),NumberPrompt:nN(),StringPrompt:wu()}});var WC=w((tht,Sne)=>{"use strict";var vne=require("assert"),aN=require("events"),Ll=Xi(),ha=class extends aN{constructor(e,t){super();this.options=Ll.merge({},e),this.answers=N({},t)}register(e,t){if(Ll.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}vne.equal(typeof t,"function","expected a function");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t=="function"&&(t=await t.call(this)),await this.ask(Ll.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let t=Ll.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Ll;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];vne(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||_f()}static get prompts(){return Bne()}static get types(){return Qne()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return Ll.mixinEmitter(e,new aN),e}};Ll.mixinEmitter(ha,new aN);var AN=ha.prompts;for(let r of Object.keys(AN)){let e=r.toLowerCase(),t=i=>new AN[r](i).run();ha.prompt[e]=t,ha[e]=t,ha[r]||Reflect.defineProperty(ha,r,{get:()=>AN[r]})}var JC=r=>{Ll.defineExport(ha,r,()=>ha.types[r])};JC("ArrayPrompt");JC("AuthPrompt");JC("BooleanPrompt");JC("NumberPrompt");JC("StringPrompt");Sne.exports=ha});var Une=w((Yht,Kne)=>{function xYe(r,e){for(var t=-1,i=r==null?0:r.length;++t{var kYe=$B(),PYe=Nf();function DYe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s{var RYe=Zf(),FYe=Kf();function NYe(r,e){return r&&RYe(e,FYe(e),r)}jne.exports=NYe});var qne=w((Wht,Yne)=>{function LYe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Yne.exports=LYe});var Wne=w((zht,Jne)=>{var TYe=Rn(),OYe=f0(),MYe=qne(),KYe=Object.prototype,UYe=KYe.hasOwnProperty;function HYe(r){if(!TYe(r))return MYe(r);var e=OYe(r),t=[];for(var i in r)i=="constructor"&&(e||!UYe.call(r,i))||t.push(i);return t}Jne.exports=HYe});var $f=w((_ht,zne)=>{var jYe=$R(),GYe=Wne(),YYe=vC();function qYe(r){return YYe(r)?jYe(r,!0):GYe(r)}zne.exports=qYe});var Vne=w((Vht,_ne)=>{var JYe=Zf(),WYe=$f();function zYe(r,e){return r&&JYe(e,WYe(e),r)}_ne.exports=zYe});var hN=w((em,eh)=>{var _Ye=Ns(),Xne=typeof em=="object"&&em&&!em.nodeType&&em,Zne=Xne&&typeof eh=="object"&&eh&&!eh.nodeType&&eh,VYe=Zne&&Zne.exports===Xne,$ne=VYe?_Ye.Buffer:void 0,ese=$ne?$ne.allocUnsafe:void 0;function XYe(r,e){if(e)return r.slice();var t=r.length,i=ese?ese(t):new r.constructor(t);return r.copy(i),i}eh.exports=XYe});var pN=w((Xht,tse)=>{function ZYe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t{var $Ye=Zf(),eqe=p0();function tqe(r,e){return $Ye(r,eqe(r),e)}rse.exports=tqe});var G0=w(($ht,nse)=>{var rqe=eF(),iqe=rqe(Object.getPrototypeOf,Object);nse.exports=iqe});var dN=w((ept,sse)=>{var nqe=t0(),sqe=G0(),oqe=p0(),aqe=oF(),Aqe=Object.getOwnPropertySymbols,lqe=Aqe?function(r){for(var e=[];r;)nqe(e,oqe(r)),r=sqe(r);return e}:aqe;sse.exports=lqe});var ase=w((tpt,ose)=>{var cqe=Zf(),uqe=dN();function gqe(r,e){return cqe(r,uqe(r),e)}ose.exports=gqe});var lse=w((rpt,Ase)=>{var fqe=sF(),hqe=dN(),pqe=$f();function dqe(r){return fqe(r,pqe,hqe)}Ase.exports=dqe});var use=w((ipt,cse)=>{var Cqe=Object.prototype,mqe=Cqe.hasOwnProperty;function Eqe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]=="string"&&mqe.call(r,"index")&&(t.index=r.index,t.input=r.input),t}cse.exports=Eqe});var Y0=w((npt,gse)=>{var fse=iF();function Iqe(r){var e=new r.constructor(r.byteLength);return new fse(e).set(new fse(r)),e}gse.exports=Iqe});var pse=w((spt,hse)=>{var yqe=Y0();function wqe(r,e){var t=e?yqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}hse.exports=wqe});var Cse=w((opt,dse)=>{var Bqe=/\w*$/;function bqe(r){var e=new r.constructor(r.source,Bqe.exec(r));return e.lastIndex=r.lastIndex,e}dse.exports=bqe});var wse=w((apt,mse)=>{var Ese=Jc(),Ise=Ese?Ese.prototype:void 0,yse=Ise?Ise.valueOf:void 0;function Qqe(r){return yse?Object(yse.call(r)):{}}mse.exports=Qqe});var CN=w((Apt,Bse)=>{var Sqe=Y0();function vqe(r,e){var t=e?Sqe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Bse.exports=vqe});var Qse=w((lpt,bse)=>{var xqe=Y0(),kqe=pse(),Pqe=Cse(),Dqe=wse(),Rqe=CN(),Fqe="[object Boolean]",Nqe="[object Date]",Lqe="[object Map]",Tqe="[object Number]",Oqe="[object RegExp]",Mqe="[object Set]",Kqe="[object String]",Uqe="[object Symbol]",Hqe="[object ArrayBuffer]",jqe="[object DataView]",Gqe="[object Float32Array]",Yqe="[object Float64Array]",qqe="[object Int8Array]",Jqe="[object Int16Array]",Wqe="[object Int32Array]",zqe="[object Uint8Array]",_qe="[object Uint8ClampedArray]",Vqe="[object Uint16Array]",Xqe="[object Uint32Array]";function Zqe(r,e,t){var i=r.constructor;switch(e){case Hqe:return xqe(r);case Fqe:case Nqe:return new i(+r);case jqe:return kqe(r,t);case Gqe:case Yqe:case qqe:case Jqe:case Wqe:case zqe:case _qe:case Vqe:case Xqe:return Rqe(r,t);case Lqe:return new i;case Tqe:case Kqe:return new i(r);case Oqe:return Pqe(r);case Mqe:return new i;case Uqe:return Dqe(r)}}bse.exports=Zqe});var xse=w((cpt,Sse)=>{var $qe=Rn(),vse=Object.create,eJe=function(){function r(){}return function(e){if(!$qe(e))return{};if(vse)return vse(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Sse.exports=eJe});var mN=w((upt,kse)=>{var tJe=xse(),rJe=G0(),iJe=f0();function nJe(r){return typeof r.constructor=="function"&&!iJe(r)?tJe(rJe(r)):{}}kse.exports=nJe});var Dse=w((gpt,Pse)=>{var sJe=kC(),oJe=ta(),aJe="[object Map]";function AJe(r){return oJe(r)&&sJe(r)==aJe}Pse.exports=AJe});var Lse=w((fpt,Rse)=>{var lJe=Dse(),cJe=c0(),Fse=u0(),Nse=Fse&&Fse.isMap,uJe=Nse?cJe(Nse):lJe;Rse.exports=uJe});var Ose=w((hpt,Tse)=>{var gJe=kC(),fJe=ta(),hJe="[object Set]";function pJe(r){return fJe(r)&&gJe(r)==hJe}Tse.exports=pJe});var Hse=w((ppt,Mse)=>{var dJe=Ose(),CJe=c0(),Kse=u0(),Use=Kse&&Kse.isSet,mJe=Use?CJe(Use):dJe;Mse.exports=mJe});var Jse=w((dpt,jse)=>{var EJe=xC(),IJe=Une(),yJe=$B(),wJe=Gne(),BJe=Vne(),bJe=hN(),QJe=pN(),SJe=ise(),vJe=ase(),xJe=aF(),kJe=lse(),PJe=kC(),DJe=use(),RJe=Qse(),FJe=mN(),NJe=Ks(),LJe=bC(),TJe=Lse(),OJe=Rn(),MJe=Hse(),KJe=Kf(),UJe=$f(),HJe=1,jJe=2,GJe=4,Gse="[object Arguments]",YJe="[object Array]",qJe="[object Boolean]",JJe="[object Date]",WJe="[object Error]",Yse="[object Function]",zJe="[object GeneratorFunction]",_Je="[object Map]",VJe="[object Number]",qse="[object Object]",XJe="[object RegExp]",ZJe="[object Set]",$Je="[object String]",e3e="[object Symbol]",t3e="[object WeakMap]",r3e="[object ArrayBuffer]",i3e="[object DataView]",n3e="[object Float32Array]",s3e="[object Float64Array]",o3e="[object Int8Array]",a3e="[object Int16Array]",A3e="[object Int32Array]",l3e="[object Uint8Array]",c3e="[object Uint8ClampedArray]",u3e="[object Uint16Array]",g3e="[object Uint32Array]",dr={};dr[Gse]=dr[YJe]=dr[r3e]=dr[i3e]=dr[qJe]=dr[JJe]=dr[n3e]=dr[s3e]=dr[o3e]=dr[a3e]=dr[A3e]=dr[_Je]=dr[VJe]=dr[qse]=dr[XJe]=dr[ZJe]=dr[$Je]=dr[e3e]=dr[l3e]=dr[c3e]=dr[u3e]=dr[g3e]=!0;dr[WJe]=dr[Yse]=dr[t3e]=!1;function q0(r,e,t,i,n,s){var o,a=e&HJe,l=e&jJe,c=e&GJe;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!OJe(r))return r;var u=NJe(r);if(u){if(o=DJe(r),!a)return QJe(r,o)}else{var g=PJe(r),f=g==Yse||g==zJe;if(LJe(r))return bJe(r,a);if(g==qse||g==Gse||f&&!n){if(o=l||f?{}:FJe(r),!a)return l?vJe(r,BJe(o,r)):SJe(r,wJe(o,r))}else{if(!dr[g])return n?r:{};o=RJe(r,g,a)}}s||(s=new EJe);var h=s.get(r);if(h)return h;s.set(r,o),MJe(r)?r.forEach(function(y){o.add(q0(y,e,t,y,r,s))}):TJe(r)&&r.forEach(function(y,b){o.set(b,q0(y,e,t,b,r,s))});var p=c?l?kJe:xJe:l?UJe:KJe,m=u?void 0:p(r);return IJe(m||r,function(y,b){m&&(b=y,y=r[b]),yJe(o,b,q0(y,e,t,b,r,s))}),o}jse.exports=q0});var EN=w((Cpt,Wse)=>{var f3e=Jse(),h3e=1,p3e=4;function d3e(r){return f3e(r,h3e|p3e)}Wse.exports=d3e});var _se=w((mpt,zse)=>{var C3e=kR();function m3e(r,e,t){return r==null?r:C3e(r,e,t)}zse.exports=m3e});var toe=w((bpt,eoe)=>{function E3e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}eoe.exports=E3e});var ioe=w((Qpt,roe)=>{var I3e=hC(),y3e=VP();function w3e(r,e){return e.length<2?r:I3e(r,y3e(e,0,-1))}roe.exports=w3e});var soe=w((Spt,noe)=>{var B3e=Ff(),b3e=toe(),Q3e=ioe(),S3e=gu();function v3e(r,e){return e=B3e(e,r),r=Q3e(r,e),r==null||delete r[S3e(b3e(e))]}noe.exports=v3e});var aoe=w((vpt,ooe)=>{var x3e=soe();function k3e(r,e){return r==null?!0:x3e(r,e)}ooe.exports=k3e});var doe=w((idt,poe)=>{poe.exports={name:"@yarnpkg/cli",version:"3.2.2",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.2.0-rc.4",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var DN=w((LEt,rae)=>{"use strict";rae.exports=function(e,t){t===!0&&(t=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof t=="number"?n[t]:n}});var RN=w((TEt,iae)=>{"use strict";var V3e=DN();function nae(r){if(Array.isArray(r))return r.indexOf("ssh")!==-1||r.indexOf("rsync")!==-1;if(typeof r!="string")return!1;var e=V3e(r);return r=r.substring(r.indexOf("://")+3),nae(e)?!0:r.indexOf("@"){"use strict";var X3e=DN(),Z3e=RN(),$3e=require("querystring");function eWe(r){r=(r||"").trim();var e={protocols:X3e(r),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:r,query:Object.create(null)},t=r.indexOf("://"),i=-1,n=null,s=null;r.startsWith(".")&&(r.startsWith("./")&&(r=r.substring(2)),e.pathname=r,e.protocol="file");var o=r.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(Z3e(r)?e.protocol="ssh":((o==="/"||o==="~")&&(r=r.substring(2)),e.protocol="file"))),t!==-1&&(r=r.substring(t+3)),s=r.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=$3e.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}sae.exports=eWe});var lae=w((MEt,aae)=>{"use strict";var tWe="text/plain",rWe="us-ascii",Aae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),iWe=(r,{stripHash:e})=>{let t=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(";");s=e?"":s;let a=!1;o[o.length-1]==="base64"&&(o.pop(),a=!0);let l=(o.shift()||"").toLowerCase(),u=[...o.map(g=>{let[f,h=""]=g.split("=").map(p=>p.trim());return f==="charset"&&(h=h.toLowerCase(),h===rWe)?"":`${f}${h?`=${h}`:""}`}).filter(Boolean)];return a&&u.push("base64"),(u.length!==0||l&&l!==tWe)&&u.unshift(l),`data:${u.join(";")},${a?n.trim():n}${s?`#${s}`:""}`},nWe=(r,e)=>{if(e=N({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),r=r.trim(),/^data:/i.test(r))return iWe(r,e);if(/^view-source:/i.test(r))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let t=r.startsWith("//");!t&&/^\.*\//.test(r)||(r=r.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash?n.hash="":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,"")),n.pathname&&(n.pathname=n.pathname.replace(/(?0){let o=n.pathname.split("/"),a=o[o.length-1];Aae(a,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),n.pathname=o.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)(?:[a-z\-\d]{1,63})\.(?:[a-z.\-\d]{2,63})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])Aae(o,e.removeQueryParameters)&&n.searchParams.delete(o);e.removeQueryParameters===!0&&(n.search=""),e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,""));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname==="/"&&!s.endsWith("/")&&n.hash===""&&(r=r.replace(/\/$/,"")),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&e.removeSingleSlash&&(r=r.replace(/\/$/,"")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\/\//,"//")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\/\//,"")),r};aae.exports=nWe});var uae=w((KEt,cae)=>{"use strict";var sWe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},oWe=oae(),aWe=lae();function AWe(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof r!="string"||!r.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":sWe(e))!=="object"&&(e={stripHash:!1}),r=aWe(r,e));var t=oWe(r);return t}cae.exports=AWe});var hae=w((UEt,gae)=>{"use strict";var lWe=uae(),fae=RN();function cWe(r){var e=lWe(r);e.token="";var t=e.user.split(":");return t.length===2&&(t[1]==="x-oauth-basic"?e.token=t[0]:t[0]==="x-token-auth"&&(e.token=t[1])),fae(e.protocols)||fae(r)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}gae.exports=cWe});var dae=w((HEt,pae)=>{"use strict";var uWe=hae();function FN(r){if(typeof r!="string")throw new Error("The url must be a string.");var e=uWe(r),t=e.resource.split("."),i=null;switch(e.toString=function(l){return FN.stringify(this,l)},e.source=t.length>2?t.slice(1-t.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=t[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}FN.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join("+"):r.protocol);var t=r.port?":"+r.port:"",i=r.user||"git",n=r.git_suffix?".git":"";switch(e){case"ssh":return t?"ssh://"+i+"@"+r.resource+t+"/"+r.full_name+n:i+"@"+r.resource+":"+r.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+r.resource+t+"/"+r.full_name+n;case"http":case"https":var s=r.token?gWe(r):r.user&&(r.protocols.includes("http")||r.protocols.includes("https"))?r.user+"@":"";return e+"://"+s+r.resource+t+"/"+r.full_name+n;default:return r.href}};function gWe(r){switch(r.source){case"bitbucket.org":return"x-token-auth:"+r.token+"@";default:return r.token+"@"}}pae.exports=FN});var cL=w((Vwt,Mae)=>{var DWe=Nf(),RWe=Pf();function FWe(r,e,t){(t!==void 0&&!RWe(r[e],t)||t===void 0&&!(e in r))&&DWe(r,e,t)}Mae.exports=FWe});var Uae=w((Xwt,Kae)=>{var NWe=vC(),LWe=ta();function TWe(r){return LWe(r)&&NWe(r)}Kae.exports=TWe});var Gae=w((Zwt,Hae)=>{var OWe=Wc(),MWe=G0(),KWe=ta(),UWe="[object Object]",HWe=Function.prototype,jWe=Object.prototype,jae=HWe.toString,GWe=jWe.hasOwnProperty,YWe=jae.call(Object);function qWe(r){if(!KWe(r)||OWe(r)!=UWe)return!1;var e=MWe(r);if(e===null)return!0;var t=GWe.call(e,"constructor")&&e.constructor;return typeof t=="function"&&t instanceof t&&jae.call(t)==YWe}Hae.exports=qWe});var uL=w(($wt,Yae)=>{function JWe(r,e){if(!(e==="constructor"&&typeof r[e]=="function")&&e!="__proto__")return r[e]}Yae.exports=JWe});var Jae=w((eBt,qae)=>{var WWe=Zf(),zWe=$f();function _We(r){return WWe(r,zWe(r))}qae.exports=_We});var Zae=w((tBt,Wae)=>{var zae=cL(),VWe=hN(),XWe=CN(),ZWe=pN(),$We=mN(),_ae=dC(),Vae=Ks(),e4e=Uae(),t4e=bC(),r4e=VB(),i4e=Rn(),n4e=Gae(),s4e=g0(),Xae=uL(),o4e=Jae();function a4e(r,e,t,i,n,s,o){var a=Xae(r,t),l=Xae(e,t),c=o.get(l);if(c){zae(r,t,c);return}var u=s?s(a,l,t+"",r,e,o):void 0,g=u===void 0;if(g){var f=Vae(l),h=!f&&t4e(l),p=!f&&!h&&s4e(l);u=l,f||h||p?Vae(a)?u=a:e4e(a)?u=ZWe(a):h?(g=!1,u=VWe(l,!0)):p?(g=!1,u=XWe(l,!0)):u=[]:n4e(l)||_ae(l)?(u=a,_ae(a)?u=o4e(a):(!i4e(a)||r4e(a))&&(u=$We(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),zae(r,t,u)}Wae.exports=a4e});var tAe=w((rBt,$ae)=>{var A4e=xC(),l4e=cL(),c4e=XR(),u4e=Zae(),g4e=Rn(),f4e=$f(),h4e=uL();function eAe(r,e,t,i,n){r!==e&&c4e(e,function(s,o){if(n||(n=new A4e),g4e(s))u4e(r,e,o,t,eAe,i,n);else{var a=i?i(h4e(r,o),s,o+"",r,e,n):void 0;a===void 0&&(a=s),l4e(r,o,a)}},f4e)}$ae.exports=eAe});var iAe=w((iBt,rAe)=>{var p4e=r0(),d4e=RR(),C4e=FR();function m4e(r,e){return C4e(d4e(r,e,p4e),r+"")}rAe.exports=m4e});var sAe=w((nBt,nAe)=>{var E4e=Pf(),I4e=vC(),y4e=pC(),w4e=Rn();function B4e(r,e,t){if(!w4e(t))return!1;var i=typeof e;return(i=="number"?I4e(t)&&y4e(e,t.length):i=="string"&&e in t)?E4e(t[e],r):!1}nAe.exports=B4e});var aAe=w((sBt,oAe)=>{var b4e=iAe(),Q4e=sAe();function S4e(r){return b4e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s=="function"?(n--,s):void 0,o&&Q4e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var v4e=tAe(),x4e=aAe(),k4e=x4e(function(r,e,t){v4e(r,e,t)});AAe.exports=k4e});var QAe=w((u0t,bAe)=>{var QL;bAe.exports=()=>(typeof QL=="undefined"&&(QL=require("zlib").brotliDecompressSync(Buffer.from("W8aBWMM86xigdkIKKln3s6WtEQ8xBfvtGm6l6HpWsM0HlG2fJUSg2yACwxuWsoJiQVU1b2mMsbbD2jhAVbLq6wOxXSGkuAai1rhjCNmwktEatn0bh2yzFJ6DjhWTRsWjxW4OZpG5hevFO0Y4KH1xt2tGfiQqb0Ge/cqOg+eObuOoLKh8LvMs05MkvGyS8LZL9Vncf7R/hUSi/6j223sFG6nRVySV/u7AOBf/F0lYp0ki6SkgjpsHYYgoMdd2RLrULU/74nrZNP88vmnLRRMkjFXwVcaklPKSzqyo1wKuaYujlenq36aS8wnL94QsyE1pdubo4/Ts/77N/P/5+bqHblKjKBPS1e7mQOgwZfED0s3HxxhLNhpkSdUVi3OefH6/9Pv6BU7Gohy1y8p45S3L7nQsYkg5VcNJdGwbOu/V6q1av63G/zycE0vIQyyBFtCM/S82r09R5n+b6j2Xm38HUJmXvwRknzrWaSwyBLKVylNeXeSFQnb+Qgc0CCjxBZmmotNKePIDb4M8HpuV1qb0TVDSl9EN0uPj1aL8Lf54eB/QZV08Vvf0TCZfOpMQ4g1QhsgiIq4xDmw3R0OYgB9gS02zaomvEv9tX6nOIbUfKse52zG40pFjMOBBAfpby6/jFUyoao4wHf0yE6bBiAk3ly6IPhMquAQX813/v1y8n/nM5y0lWUncJgXF9UDZMT2DrDhtYMq5wYXnKfE6Hhx0qRXH92cmyaSdtr+kpDdSpqTUivWhkc4qW3guNwfO5An8o24k7aF9HOThl2Pr2Py+970OXE6vcM2goNElECq6sd+1OwPpAwdWbba05zeR9uJpuYsgM6EcxVL4NaE5Le+RE/yosf3x0MGtqI/HN8sAo4INSEU3glyMChV/K/nxP5z8/+fHvfcV1dOmn2vNHsgQQhwi2vQvpseB5rVoSLuxftRwPR0Pu7uf0YzjHF9VV0MRQIukY/AWcSwQTRyJogOPWc3+ePXvzHp8cjtBQ2cRzH5L8iuycHaoMYaHPlWtbC+k9u8IFGYVoUx1NmnP0n6ELsP/r7e0qrtHmf3vIgCQIJgFMpOnmGwhxNrdAVKPkHJdMHvP7qF/s/87I1x0Itw9uhDqdDIAnEMggBJkptl3D/B/R5DlEUR2ewSR1QGSmQ2yxAFZOX1YOUKRyUVWjZSr6c1aidUItVnOYskayRFC+NHeLKlDRobQvk0OicHb/tXzNkm6FNHagBigqX5V9STtaOSQIiE2wKT/yEHnkNBB/72pVun73Q2gScpRY1Za40wOUjrjfBB6vv9+/2L/30CpGyBPcJxpgNQeCEq1BCDWiuQMmprdBTjaO0qzRpqbgFrLOSudsZkIcgylM7JrOGeMi42xuXHhhRdNtCbILtwsudokuSS9JLg0M9b/vvfTeiUPgqyqlrF+MDIWZFXLGDv/McfbZ++zCvlMNhOZQBcAgl8kq6gusotSsfmNPWuvc+5zmShkAuwGQbZjVX/DL1P/+6Gcn2k2d3Y6SIAy1fqayc801WCmwWQsv5r2RnflEKGxATagmhk9Z/0qIxvBP+rZdpAcIwsJBRS7R9o8F3Ig4OBRcBheHbov/vk4fNM/56W9S4kFiLOl0scVXaDajZa4ky7//3GwtM6FP2EiCb+JIrI11NV/l7O8MCoRTnPNEZYbW55F+I584eEx3QLUVQNGHe8GcNP4v7TIDt1JC0FiDiEJmmBJEC1urU8ozLo+/3+Auf3/Xyrr3Ex97//OuWkO1hBEUNGdazS0pTkSmQKK44w39gS69f1DBfZA9O6+7oYSSANSKIEIXaQqRejSpVUb4Lrvv5uZoaQgzPNzVg9HZFY07u5dijUUK9gQG5YoYiugZkKxFdApH7/Y3x1U+z1j9+UPwgsnThjkgim4s/9//ne7Njj7b2QNivRhBkUjFgwSIYN6Cc/4iFAkaJEMCq7BHpzBGRz9r9t/D987M/a9/V1xBALRTRAIsqlAIMgGgUAgKhAV3aSiopsgxpqL/4fvzjn//49/4ojARkREhCUsERERYYmIiBiWsIyICEtEi4ZtUaLFwL928F/+X8AHDwoDA4VCoVC4UGiyE1/Y+Jn6Of9/sJ5ITG63gEpRqTawAGoUS02RVMvJabmvfvxUWNgFdZ7Zpfwi2Ab4ZSOfz1rMPwSqeAjsyhduE+jA50zDEH3PTuq5OCULJR+SkqhT1aAeggOT11Dn3l7Q8przxkFp8Dtfg9KIazYoKyk9CE4gnvuO+10dLpSv5yIZBhcEotxsTesd27vWGQeaHfIDoAEMTR7isvgcsVaiV0ekXqyJz2fIwecj+AKodl0iAHs+MXMPLg0b0qrg6M+B+aIpBQWYJPtTrmp4VTS4H5Sj7a8vLNOeJdgJ2GRCb5GGMgVdapyMXZ9MNGFIbng1fgnurmugeZHx/Bu6De01nQzrq5m/5m+Bf6X1ZMpcs0IfMTRlOQP9BbJynY9qtNtAQR0kZbKn8u4BqjCwfvaDnstYTXARLyvFvATNIg+dGH8lmzPvypqFBFma7FG5Sr7pfd1NtpqpCiS/TcX33+r5rt86Ilbp5CAJmO/Sr0TXMLCsWYl2C1Eg/1Zi97hITn16Pe7TL8fvMzfQ+OxayWAIiKHl4kWMxaDSPOuMaaQeYPszKX4KS2/2K26fwlHZ/ZX3ZdRJpCEUjOerRvfMyOqx1P8nPsTRK7txeixpkLo5EEVilpQ6Ynx1gtJbbBqOjX+WV2oWK+X70Vl9mOUA5NqdlROZ9eMO+wnsoK4O/qaW7eX7l29KOQfQnNZM1S/+eg4XzX7wV9aAh/4wTxO8sPc0ZSyINeS3kVQt+IGp0C2DtEH2eCqlDF4gnBcldxQ+X/r+fkhKrqoRFtNzx8OjYZS6Nrh4y0jl53NpE2m9wfgLmX0vQtamNU9H8O+guP1O2ao5yWD3XRKPVNOQmYiy50MHllWAvu2JdXMTclIz94NWwzHQnh06UOQt7kQe417kNQ7cfH+zjc+DYV5ufnXzq1tZ8TDrNwKETRgDAgrVg9Pph/NnK6DOUNDdPBcwFh7P+o1GZ7DnOLP2IF2PXP5szTNgeuU6ztY4J6ZnjmcratsqZ+toed3CjY0TDFtRR1TfHyGFUZUbMsdxsAPcQg3qIw52+K/uaGhib/cnj8Cmsz0OjlM4YDgPabM7bDFIvAClG0VkVdZ2m84lvCaVhbs53Nw34FtkXvU5GO4z1Yf3l2DjnTIB2UXhl/XF8vw8d7nCbB+UT0GpSePAjXukoiPhxIueluOdWM4vXdYluu4/yLfQSBfPy0RHBEWKBap1J5ymzKkHt0xEQkVVXA52ZXmY6Nyb/7+zU6j9PaYvu3/55stuuOIUoBojMi7gU+29q730V8668ud0TD8AsNLyKZ3zVX91DzWpQADOgAQg/YhQG/LLuNqPwCtGd/i/ux3bDZNnaxi0poCHtivdIf/4zoUB3cAfr4w1oBvIqnZHkoJ1I1QVPpACdBgx1weAEUGGkHm173hwvR+DNwMA+GU/gNIebvgZcHPlD2QcqB+j1w8ci13rh+TM+OX13lx0t/t0uze85p7FW9sCN/Th8KzlL39G6fZ99CpA53u1OewRr1aG19HjuqQADNeYv9z5Gv2X2cNUAQsCdGKiHXesaC2jFLa01nrrd6QHptQgi7F5xfWN88oBHPlPaSTZx355KoeuG6gLgquEAJ1I/CENxfYih5/4TMzV8XMghAAS/l32gDpkn1mlaIFvAqJmX4DyDahwcHQufL4hMSgUFikr3yO8Vfneg3wDnXb1uPppLfjyFYcza4y02Euq/f5m/GxCZNZ+82/tDfctnphonMFJUfhcNwX0m664j43BWXeff8IgtydH67KxHvnNY3S+r2/40OsILYdhi6Rvm/tYa+9u0wU7EY4V/9QEN25Zhe4HeHMVgL7lGGKxIFYj3P0X4txWcbRN4GGNyUFDciLlSdfMEV+t6Ku/OjJ3p4Tu8vfLWwpXoQPORjWzG6ReUStL9MEvvSk4LV7ns0T6YiGChKyre3hpitlKrfOAPdfe8VYRs6szJ4L7Ede8od4kAQqtxwkKc2tvxzlK6NJM3t6W85ZLqusghLEXbrNXb9oQeA2lq3Icrf/9vIAw9eLm1j6Jm1ssbJpCFuaeVo1AkdJ9cWETNVCma6ZhyXRAGqBCXhSsDX7Y1SbQiidHyZjV75zANSmFTD2I6trJM0WcFf9BfN2ZRZyBv3X3/wcuuPX3/7L7b+X9xGKtoL+n72UKDP+xnXKKO+mUeOb2+pl21Ideqr1o7u5MQ/kjtQ1/ouaOVIEpwAWMQp2kLaXbbx1/K/OEXypaVOs31QzgUZdjZvjUnWlysJoRc2jLJTE9QYoYGn7goFJMdr/kDbQKiQ9FDXLspPgqut1DjBAz8R/BI8cV+TsGIYO4h/oGZw020xiETzPm/k2nVMf42IEDNz/lo5LMI0nUX3QHyuKpGfMhEkvM38gtCC0cohBwTH9VGSCDhCE7xCmxIh0jZK0gzB8ugDdxWDZZPrglHByIVTlAU5LIZzIc5lWEb21ofriHLoMr5t6bCXtU3iScyyxdSP+oQZbqz/psvofPj4CJ6h1pyE+Cn8+s95VEezM8bkPjwNA9aa5weZvo+vKKjj0EUDVdUMDQ20VVvbao6JfAHF/MuV86eIfxcflWQX43Ksj0R/iAZbDLX3TmVr4+tJl4DlQStKF304T/tvvatkHKjp2tr9O8Ef9vxKJbyv1Vjn3hj992yy020FK4RH+uhbX7q8ybWvmyrI+jty+Rtnfv3ewZmgi3B5RjlG3f9qPyx/NboOGik93xgkXb8kXDPqWVdOEGxa1keDo7DbRaG3NHSTcKBTk4yxiYyhYmQi2Vo7G5azcK1Ay//4QETPO0+LA+gbqXE93oUbC42eMAN8+D3aJKO2yOU8eKqcpgbBcm20fJoZbrq/N9W40gS1ohP2izlRmprdE7ccMv57Kds3VjptrrVQdaIH+qqwsG11+NRu+mWPt1Hsjs5Y3kNkxJ4BS/z6Q/BFMarftvEd7zVc5KP8D0SwSzWWvaerTzO9OXroS7EXmUb3LM1iU9LBXEYaIiAc9BCrI7Gb/QF1E40D3nVfIkKiLhCBL5/TL9SSjvsHTJdhax1jTH7JtCu8/kfI4V8+GyZObT8iKtRzd+QnShkQZL3rNf09Mn38Oj8HbubBzG9GGCYcwCWRXNfW/eO00SepPF7yaLHNJzaDanV53J0wTayYqUnc1Y32u0zxYm+3u1ErdbLDupeRlQ8h+Pz9CsewjlOtCjjDCbRAk1tsxoNuL/cryvHckRoNyAacxwF+52lTlYg4KnNBfFOJvRPSwzIiGzsYWa/RKlnoCSSJkGfbAI2VtsmabFzWoQdc6cXm/hhCm5jIah5as2zGP2rl33tTIHXIWi0rRVNQ2apD/9xftNGO4K9BDa4nk+mzW8TnuabCrVW65dA7JxtTnsNbI3FRMD9xNEscA+z1w8NjCJoLMK679/noga6VpEKT4f5vzaLConvfy6+zEvTbGBWFvV9gRnRL2Mfnw0criX0RUKKrWY3wIvPMBYHLRE8EAtyduxX6k4QXPvpWGPCt8xMWUek2ICp8A2/oKRH4byFdbXLK/ho/C3ie/LA3wQt9GCbZLqZKq8yiE182GHJrZFBN1aYiHzX6ev3Dsyxn/oyjRovxhZif9qc0xyRyaWptUtICq68C+qNyo77vY1FoToYqkz9YDUC6OHSyqHeeIplp1gTroYEBXcPLu62LmWGvAFav33myEgShuaNWI07OmNy8aTenkAdRlyukykKviKD2Wt8b4HCh+kzYPRapgNJoXL2LqT1Uhu8Mj12zxEpKXw6a23a5U/oK/qv5tZhA0ad8t7uydHCWDPy+y9gPMXX9ER82lIN8+cBb/bk2ktnbkLTZ9YOiYaTFb/haCq1mQbf2y3Gl2bk5r3Uweqke1JbX0qJUxN8bapZltMqyUkZQvUEN3OoTDrpVhrq6Ov7WtLqVhNnL89tIALLB4MKJACEEUmNmeIdGiH08H8FZUfyLoPnY+AK57ILs4Z5ZjnqCRdWdFec1VQ0rEjM7yZb/5dIh8uxIW2nS6WXO785R1OdmvkVt5lfx/vZbJDxO8s4W7eeE6oNSxxlt4XrZ0EO0qIzZvuIO62zgwektPo2DOEJ4WfKbcyJHqmZ6nn6tbAbYg9Ufr/pXL/zWUST5PVIDZpEuz0Itoi98sgSZWUrgUycUtjr9A2fml+pEBoRT2WfuJPxN1o1YRYjM5Sb3yu2HIxnkCvK0SPkH/e1H/1QhWjzFMVxviip7MpyPdE/gs4Z7liwrLuRXybKXbaU/M09/u22+hKGmfLqww4IbfLkLMOGykY2QlLaB5qrzGUiggJKM241Knf3RRbv0IrSV2nflZb/tx7dZa0bv2cbTbDrCW6fKEFXkRKdOFh2MKdedK+tgvXrq/fCjBifZZCyGcAoKe4pouJ9fbjZKR9CfOOMdAr7rMR1ZIGyUm0ZONeKMVVrld17w2OwNC0RlGIn8lBLXg/Z2Thwfaqbp8uMFGqm6Y29DS7teoETgZE7XBvVJWkbla6De98btqDn2MbCI+HZHN7fXngTdLVeMQIyY/Ge7fwvhuHELBkVs1v13Madl7IMU9zhNp48jJOr5tU54LdabMTucPPpg3k90fk43guioPc7yTPN6gXIg5lwM1LszdI3Y+7l9IvjCAXSwlnjpOyHrQ9bOd4SFqIpZ8esjsdypxHvd1t3EneXvtd1vvtv0DPpFaHc+dPP4Cm9eG9WU4Us8Shcfjy4uOUfcBmDHAoA4rMYps2P7yl1/4Lq6UYUMKZy4gc3O+5ZGRj36H+BClfPHvMjrDmxg/oUA6u6aV5XPU6/hm7E5DmxDfJgImHbtn9BI081/gP5Ln3Tw5ptDEw6tv83puBD9l1or4M/H3v/PCmHN7YAtuvpqvBoV+sGIuqpxzSXwPyhl+fFr9Aek5hcx/c20sFd+2TDhZ9+6VHTJ0lM/s+GGLCLk0F6jNEaK26wcVMZmIReB4GIG3DOPpCpAVzBcbgbDAfLaa783bif4uU0i0SeBw6T14uNaOxdJzY9x64AEfzkIHuWV9S5La0Dx5vtpFawH/XEgsOhp6xwqNlrTqZg7pFfPTe4FIL3NzyiwOTudesVVQqVqH7UX+gg3ZgEJy9tZ2mwcTdDTfNyjD1L3BjY+aYk4PznEKgDP9R8mMhPWCcU/DB2pOkLBNIVemQYHZZINqtctYpaL+AGT8sGs9X6BfVxwy9BYWc8Cbtg4HqGRP0+W4fe+dpQUHvPOkz2yvr/UJ5EupTLdgLcwxYiqlYlGW5thg7BGGtTcVYvqiMkH0L2R8HqNnq5pxHo3TRz4PS3Tftr3UhgwVraKLQmO9hAopxDR9IoeXw0IE9Oq8Y77AevGBq95OhBJOsngCjTR07UuPzbZ00u1pvJ4dOgT0xxgaNTNTicDua3ror2J26OU1JMzSxnDr0UgnYLrtJV2PbjbjDUNxyX//WYND0aCf1hZ9imBDMRw+ICMaLMjfsjVwIvxinOe3Y6hcuvN8QFVZS1Voy1GiPwSzrrju9oGHjY13Dy37CKmyoCg59JaBKKe40Gt8rem77uVp65fOEv/UTtw3lvXmkOlFyWVLuTCu0AjaY4twre2jtALYt4HV6io/YRVNLBLFa8AqpIFPoEedqh3LWmw5HhrPUOFZaeXHipRkvShZ4YcHEEpSBTG/JOR+3tJidHy7ypJ8R5+4mMkBK+wVfnKa38eydzsTXGeAFGq1jG7rNQVHrJ7RaA8ReHQ9DEXHCB0FLVqxRXOayLinVbh8Zn1niYDvl+vG05nYkhUi3pNT5eYN05kQW9vRQSjBZaCcspG0OdRLPWQ9salydXSFwRYBStYnhafJWq/2Qo4g4JS6ghCnGXGoAZajxmJmBnMTxyqUgeG3rSzN6mV0swL4o0UtvCLq7HrJ404eGRezdnKE+Rknc1Sz2SkWCOSiMywvTlfSFndPB1r7Xp527msO97ThsunTIWPf5Lkp2tCztYy1WpJbgPkhRJB8Ezk51WbJIBrimN16nw5yYFdweTxinKQwZfGDLE6UZHhEB98gAKyRF0kAqabJiPgVVYIHJgJsMWFbjcq0G9q54caicRAlka7Zx7fEpJzqRvq3GvXvbGCFLR95BhoB1nPXKAuZeMohPi+wbfaV2i8hpHsKLDtP2/77E05gLYPg86mmNBGQ3uYcKHBBfEsOAYsFoTeLRfF7+ogDNBl4Rp8dqFzRnOES+zQwl4oYu7wFAEGvaAkjGkN2GRomYqUyMOivMrbPZcg03MUiMJQytYh9ZIVwc08tDd3e4hmChdXhpTmm1uxlxcqxXeORxuEbrKKHfJYBe1uqJe+KDd9RyU7euGeeIK3OwQ9Hl6vBMx2Csf3YjEqlNHk/dvGWEWMQhWdwCWIQJYNOx0iFywLils8avJQ973POHZW6cCScoYZGDUNPAPiQ8b8p5xmLBH3zEFnReJIBx/OIiT5KWloySGJuXHeIJN+/4PkqxisdGtn06+6t6EKqrHtn3+xr2ZS1eeeMHKwnqMW/2cRsUE9vd7ths+nBbVtVxwmPOJ0y3P0oSTWtZpgwiR7mKJ05c6FXptf9rScIjgyR9Qg1Bh+6iyi3VEdT2/BtDNo70IFO+1EB0U8Q9OU9ACbayfNnsUMr1MkDm/W2Q99ig4q4o9fhd9QUt8O/73+7QbWcnFcywHuiMAakd/bF+SA9+ubvi9bHlhmT5k4soPTDyOw13of3hlxTFsvfDidHMI/AQKDh7rBJ/Ptt9KPVVdg0laA1V4iQnP3EcMU6dVB5P0OeXOseC5to8QNrrkYxczjzK6uakL3HO1GVxd5aUMdpfCNEoXlth1LJ6/udDnRiEqb9opKGMsvPQQdxhSC6EYGNmrTSBZfLu66/HGW+WnC63bI5tvh2bk1U85lF74Ddd4P4PNN36FUTSQfh1e3TLQEhENTXXFxPIJOVgzArU+6z5jXZ9yBffxBV470K2GY6E4m7s7daa1Jard1E8wH44P19yOO4FL7sQemfYviHsn2vslXR9n1jzMo17mOlhGLHw1d3f3btIl8fcKNg9ZXX9Z35s1lRx3dFjp7zaCvIwphF8r4AjrUgld9il005o9JdLSjCaC55COwlvrk+z5OdFBCZhWrCk2DQIkpjNPWFpFeAXir9ve4WN98uhA+ZseJzzTanke2Q4j+O2v/9PRWljbIViUx9Eoy9NnBzrfaDWO9mJrEVOVQzoG7vyBFRfN18FeFWh9qLBG/q2yuUeJkt+nFjXlyrNevMGFsZXOp3S2nVzEqb9SLDnK/ETEf+WagfSZhvLy3tYQ+LBMZgwL1bUjDtg0ovvWsYC4bjKDRUKXRSnRdEyQVMfyXStC60kl2+RbkddA8dI++WlN4ww3xB6Cbsb9u6ClpF1vUh7JBRsliZL+3V/7bnCGtKt5Ff2HjATVcTwbO8AyZrOLJ8bwmKl6LdSUTE6b6DABar9qmM4HVawS/sFXoaC20A25nR8bBHCuy5PXDzKrOMKPYaewhkv3j1CA8qp4NeBe2n/FVEQv83Nu4LNzWuC9Bnh6UMPo53yrCsDkJLCr8eMaKFfOp4b/safBl07n5nQZGeJlrX7QLlCqo/nxLT7nqmdPNXelT4LHUu/yorhxYh1O8BDzdPAjjWerFDFhYzaX+/YrX91/UP3iXcNiy4Yr8T2yyF/sepvWP4pU3VrAoH/dXi8m/e6j3Dc732pb7n1uyGmdwARn/vNNyHF0Hwc6ygPypgLhdSU4F4/8iwJPbiteojxsPl2z+tESEDZhqoyhyGgbcbnFMMWnZT7xAeJlBUSV6lsapXLyyg1YzPJAjTdGlD8Wlqm2nAoDXnl0hUGShFlMFsO4zRpUXMIHKL6Ua2YWMPRhk/0wY0mMkQ1e/Osy5L6aWlh23h6RYCpTpnfV1JH8Kxd8QcG1I6mZjqeqSZwe7vCJ4xLfzS4Y4kYwSWRLy9WMGcyFgxUmVccHcQcb73DgDUjZhnQHyemEBAmoFKJkMZx+hPGdYmP83MB31F4laCdtt5AgT+VkNEorIOECXFH2to26MvnOsynEKxeHtvC32GQrjf3CdqHyA9tuXzz/pij4j1xmrl4w2wVvjPFHgmPhDZU4Bz1A85gOUuXlWf5AIgGfvNyWNodxrwHenOY5Q/VAoT/h8DUdEmzYlwpfiovDR9L1sKYed+YQeL+NSCC/CfnIjlD7uXe+IIZ6F8QZNNXoHVk5VU6UlFzVod35HI38Xl8cxR1RtjqR9b28WaOib3wzjwC81ZKmEun3tz5NmNdmiiSKbeFGfAdAAFSGgnekRr22Rh1WfGwkFic1XUIrBsEb2NiCA4kNvWsFXz7ai2BsqOh3MzTdluJxAz7i8hWHdGkGPOwoWacjHhdniJ0PVYwEXeiXHmg6aIZNU1ZYZTCVe83ivaqgwZKw0+d9A5IFnqkeZCDH2SLYx1GFOjikT2P8rc5T8WuWKwbgbCroxzLxJ5Vw2y5pjpCR928kW6I4JiqXWPUgm5Vi8YkTdMMiZOMpEYKQvffNJ0Wh3YotcbA9O2TvEdWcTdKpHNAYoQnHJBlJOMrZCEBXgk/sHi2gOnTxMIBaOuT3tPRxfNxawXDdU6PLR+nHBNPurdWl3ffQtp6XbX18rT1emnrpWjrZrMYnP8nP4GnKs3ogVB96WU4FyDAsGeBhR9VWF4G1ypZzBJLFJVSYAkIQdhKZTiuqM+1V/NgN/PkbdK5UNZCMgqAg3qFLeQ6ANRhpQE+y+JIcYPFb4/XWuTjH9ckvzCSEefCwt0tAr6wVq/QrZlsREh6sQWvYn2olXzbzUe59SgfOG8DgZPEfucg5jaOot6FUwzqlydE58jcFTIYiwSEerFGqeRO8jy8gkIYR5unELJ7hjfutnrFz/peqWy3Qr6WshXBM4QLRFJTT1HQ1zmNGDIETamppM5s3AYm+SVr/Ghw70an61wZtBgCTu4A9RkdoLV2hxdf7ADmagemFE7VnWmEoq7yqsyI5PqYAFUEjOdU+VtYzSEloxoFPB8ChWH6Bo0WYRDhK5gcxSSZX8K5QEHr8F8NMMWFTINBeDaVDNMn+57Id+14VrdlFk//8jptz9QN4gd7sy+PdrM8FXHccdu2iduR+o9lUvmUtqaljoux5AHKpA/3jAngKIqUOVxadJ1Oi1h8DC7kpF1MPIGxt0hACMJWundnpChszbaOLrmFhRUA8MwILLQq4gywlYBDHa3xxvrEuR75oy0zyJjvoR/tcpxTzzhgKJkfiX2kccB2euT5ZeztTSJ4IxoLGBPO5IZXJ0zh04pxhysjuz5N3IoNcT6M2AKU6VgbSYosKtmYVX8g7qH4+3r2yA1O6jPPzUohYpmKRV4QHE0RTpk0p2x16JLV7ba2t0uN7mbbTbBxMkrjUw486P7hoL69AkW1vlO5rQ+dih4k2YYZceJTCZgXGGCtFbUf3GrRbqCPs+iMj7mGK+xb5RgdY1IAAFocGLWxLXN/xDR1qMeXaXSTiH5DLAgsJNTfeTshACQuI8oQOUPdSGTnWs9/UhAeYDRcCvGcaT0GOe7lsQF9Mbm1CRmmlwW8FivGY0PmsSy1SxYTYtZg+/Kzudi5AnCaODlVncTTx6NepnQfsRlyozYSuirJVO9Y64QWxd0dQ9qU+FnY71JsxyWLQMoNMR/d/3B8HliH69Z9zCtgNjehzQkkP7+xebjdH+XWos3dT2OtH4UBN2RLXg8SXr8edoW0X+xLGzw2bB0Xfj3xhUPfQaufeMCjFK9/Ay9mpsWRk3hwyFepG+JwykmhyhXKp3pm/PKN+izDM/9r/tzSa/A9TMDZ85T6h2+Pu0SnECKI+pMWT1HSsdNiwFw2P8TOkiK/bS+9CkF6b6rPY0Hm1SkdEXpO2wpFGdqJSwq2t3vB8W2L35LeREDXJsxQV175AORvIHgh2WD5tTOlmoHAkp+0Qe/rGk0VBCmtARi3M9wnB7OY5CuEja34nUshFYXQhUDgPDkSIzV0O6j1aMEQZ9c2Y7bZWX/GeRHqyxRSCEHKTkYkyPJ3/Yqmf0KKu2l//i3Zq1B3LPh+FCXpmP4xreWelJlkP7R1/GPRdPuiZmmeqIpkEZqYyDpoAcLx9/MY7KYCK8xxTgb7SokBpY5YDhfVwFZSpE4dVzrgUlFdjthGkTyNMgfyYmQ2YhL1qQ/4KnNtc1s3SIbhSr0KUGsZNeVsRPU7ra4qOFa1Vpo9yJ1UGpK1KBKxHQzqoyi1KOj6C2CBu7McdZMQfPXqqe4xG1dHHrIxJX1DJe+h/OaX42fjZVud1i3VbE9agBOyuMY1qrNyvxYiWhanCuaUtGUpurWBzqOIPNJ2/UaYdUp5xavBgM5/mvq/bicUJwBah4+PkrpG7k4ut8YbvyuxfEqm9QTMPmKhQgVpAY3azBcXqysMJX9WsT/+CGQMeVQy4ibomiaqJk/uaxOE5O4C/G8PNIon8jzOmSkS7WUiwXEIH7rweV/kHj5PBQW96zXAQIY7KHi8cks10Hvyr2ttgCAgO66QV3i9OF64t/Sacdq1GQmzXZLeJxaitvRk1kNsQtmz1c4O60aQOGsfuDchZkm+UaS+xPQFblY+nB1EMvdTxl9JCTNCOPMfDcgN5Y7j6Z3Zd5BBk6caxZdwi4XhPn3xZBRnZ4VUy3+9V11rTuAoorcdn/Hpexr0ZpixLyCzSN0q4Bpr3jbI0eqaC5wM0aenJU/4KQRzgucRKPaXNxegAwLi65eoJpjpzhzLl2fg7Ras25NwdEr6KI0/qBAI2RSFh1H540Wex9DwylV9kPF3Mq1/X6LnmUt1bq/KYzTBEw27zrZIsLD9Lj3nw3ab7Er+HBFn8XY3WqSuLf1t5VUAFqgoW8BCLERJZDbItztpPo/jILfniHd7v523a2M0Z0fxC+JjahaVVfPSy9pizDAMFCwMBAtevqLuX7m1itddaSgGMt4yKkjM7okLl/u5xFu0jNiDY2Wg/S/kggL0zxOTlnkdy04Ts8C2QwF/57PQ4r14X1jGUrYUGrt1wYbRQ0a5/XCf8/bL8Q/aCTv+Pv5/nOVl/Xdr8f1vqzBbqmP/HP+YkyumxhM2qslnsHf1eRtLDJ3Gxim6Rl2huVQHNz0bjqovwj7zQqP2ztla+8sQPnX1cZubYaMCC61f3tW2x9ceumnIYuMiQrN7ceACH0pQTA8pZB+pGKeUdYPjdom1hrXihpW8tgfZO38CgJj5aihIOFQceRr4CnXXN3usaNngoSGA8Gt+K4+cBxPi7sDRnFOFS4xSsqlL+RR4OzEwTRhByURi4pFOhRWk01NPR7EWFW4wdmrVOUkhHkQATzGnrGRfu7Y3CW2cEvjY4IChP8r7AKAtkse8VwdxbfX7PywgO/ORpl2ixLnD3xFoeutf6vH3NX13uPHHXAcnnc5yQV2DlOrGd6T5oOcdoayueBX06QouoHv1RqR0KxR0DFj455Lqeu2LNEX7EL4iyc+qg3w1rrL77aJiQMqDHNi2eQNuJd5Ft2q44B+vlEyOx6M4FQJKgHtYBjgyEey6rpFUrA4zE4S31HMecnNbpDmc1yDWZTNzhs114JDjxpHudgw/+JgLz9b0YfbSVgJgDUPbrS0XwbcRSx4Iv/OQ02p37Dj4E5J8ac4Fe18zE51a1uBftrK0E5y+tRr9S28DYoduAal1vAVvBoKvOX7cBle0T6KX+Jb735HmucXP97a49l21HH5YLZCsNCp5ZKCpgcTzIn+lZeTRFyOlsZDZzN1FYlOQ8c/dZ2+qs1kHm0yLu/IWDuVzsY3RpAf1QQTYeUscni0KYZYifhNwuoe7f2zKWwodZT8rhlaGOooiQn/0X3fFAi7roBTnRbTerJBsdGRGf4vorqD2MDS3saCwPmCiE7GcnCkopfV5DTX+TsOcataAN3/84toGSP43QK3ZVQ7H8CKYMbyIF8mc3xXnPbVRTpEu53vj134fvtGw+wNzNJkGEzxqRPoyLw5giHxGFaAiphLjpNQjIW2c17bRnRskCzi1URKUmm5ZxBiFy4DiwrbfX0pOexUZ+/NEcN0nVb8XPGqlAcM2pWQutxkMc3jXf2z7pZZNmEkSWNur+XPYu5kRa/tIrB6JbUZdndQz0I+2eYCDcJnSe2wg+UtPuBehW277cX+ZDM4KBMEVIaJ+oXpqzRegQDDs3TIG1kEOMHjNw94xqv4hkPJ0l8H/Q+H/P3SLuAdyphjlOlx2UeDMoa3eVHZQzy2e/l/d0H/zkq3vr4rIEjsGPDLo69ajE31830KnO9jlRTS9QI9q/5axpelOgEYxKjPsFwYXQrxsF/5qp+JeFDR1W0TSbMbUOIMvg/xllubyO8OEKF3cmTi/7weEPr78FDHlR9ALPob/IhAeOZzpRBBD9OjFheOdbDAAKaC25VLc/8ilI+snfPwEmRqjrPEEJPaGaVxL55yhHxFl+f8hnfxtmvnRWpsTadQ0Kq+9A9kcjRINNIZwTrEc+UFsRvFO6/gDdo215/3NMz9zyEbPgiDimU2Ty3UYG0uLZQDx7pp8aYLBM6O6sZ8dbfGJZgtlMZM4oQuFVuBBIGdMOpa0yD5OVE9UYbGoC0DOMdJ3Qt3r4IHbD97WCcFTo2B+RC8CBARlayScQCgHjLqo+jllyHjnkeIb4FiEGvtkajz0vfZajHo4Yz0aNMY1bKDw/JA1eq9x/s68BPFhE1v8sms4EJmiKyDyJAYjK/tir1jvOGm8vgdP+YDkhFJcXqKmVtNRkEn1D72qIZRJBCGli0RuZ0p1e+OEOKR1hYcqPVS9uDv4QA4o5jd2tvLTpyxMcnf2UfecuH/ptI4gQfl36BiI6RQSMwIr3/q9zcu0T22zLEPx6NKFC/kRVNoa2BJUYaUVm0mVrkGL5a9yPgwOYi0OwNvaZbUcUPYaxliTVofp9TkAyphODr/5gBuqWC6gax0dvMYoVOI/jHfidZyH7V/9xC3XW7ruYiqLHgyBvmhWrNXlEPHS0K2Z8trkNsgohMo7ZVpToUOLkhhh7Xv3ziTA1CZfn4AQMrMHLSCxly0f6HEjuP8AEx+g4itDGRjaJB8WT0165tNDAuRxjkewNWgDWb9aCq1KApiG5juvUxXFhOCelTKiLXhoHb/0SEOGNJh32ngF3fTscAs8Pu5vyKDGalCcwPPovJxwcRgW5EgDsys1LHDg8rt9ToK1S/rNr/JcCGdmMfnZZpSUJoM3BllUz8eOjyU3LsVNMQpOWrvRmmEWA/5ug6ziV+7rafNwK7B0vAtrTXOLdes1lCBp4t+rQAOtxgvVjHXu4hb7BdFOJJQkaCQk5hfVb0dMswbIolJ1xKgurbwhWKM7t4GPKlpEtLdQRQ3riIZgLTYteO73AoFS4TJeMnhAzAFfS6R3y+jL+svUB0w6mxNurGGspP0wz/0nKINrOOEcp9WC6Qo1Oh1Fq/mF7Q62HMCCJO02zb+agZJxfCnHA+BcsIBzMfo1WJvsj/UHaoI4IjTx+wOP1QwXHcR6422IK5n39mPJiEzNCunyuV9CI4cOAZdAQ+xYJ6oFmdURnnJun14byXEMlfNxzUeeIomRoB79QZM+hhZVBM/GFWNPeAVYk6kpYrOBOJnopnU9N22RgouBMQB4ZqfS5azLBxHwI96dmbJcRh/7gNWSLWF1A0KKN46D2Sc7W8ZRTTK7WrSKvVbugregpfDUsexfSMbFNHQ2sVEoh670VHVqsCpqi1szkn+DzkL20upYngVvir9reN3QlThfI3rpL9nz0KjOFFVR3QbMoA+5Gfk6jj30PlqESOULoGLZrL7wWr+TJm/FzFm9udJ4pcDGGb62ClYSm+BEGo2XIL/pUmQhnlSsGDWmnFd+KS50HkwbCK4lnvA/0hDJMV2PmR8uvyJfj0IKwipblNWAMwmBCEaCp9KgBXzKMFSv1qnL/TAOGpIu+bs7f8GF/0Gn+fry11siZZ/l/PPArDH4A9WVfQ9Og/s0+ItCgzs70H37XGT4RdMZHkwHPoAOBAJPtOfU4u2XqL+QKl6HnSqdXYNKeTgdY1ktKMaQd72oLpHKgfU0k5ydlPioqaC8zO+vQa1vAbkdCzAjkgjXXF3phsaUMY+KQ1TG4V1cPinxIESNy8hPtYaQ7iqwv6d4q6HSE9BWOZiMs2YLyafJaTtYRiDvYtlNkyD9kg4MSWg4WNkZ5QzmJN8QclBwCoqao+KmPPpOc7LfR7tm/7LL2G2wvOLbgHZ15UZ1fECS2t1RsneN9kdX3uEWNRMMBR0+ucUpaJ20/jUmRXRc5JbAmaMWhD9oWaG3xboG2+nZYthW1Mo3Fh+Kqso59ya1OT+dl8LSzwmh7KpMZoE2unJAcFGIlyyvQ/0BUvmjjNcnEVkFEfz6yl97aRmGfI3F2uxiymlvq+8S21Zxzlb9OX8psrYunXzTEkOmFRSdl8vUTK5HToG5nKkPZPnx8A/GhH3Z/jlcZCBbIvteDTLL/V4m5ig9rFFew4H1xjVDqlTM+VEk/OU893XVO8pKbzOS9dU2Na/9qW2EOBk1m/q356xMeN/f/N19wjd+RU1l7TZ8oot7OCAgVtZprr/h3A+/mhtg17Fa/S5dFvpt0u20+P7akoY8KZvqrUOsQVG+5C84u0WZsGITGMdnvfdF75wnrr9m8JlIGbhjoackzaimzHo3cftCwY6Scdm+fh6yTGuEM1m0CsLYaOiWLLpXcTMi4DZDGyyVr5uNqtVQ8LMSdW5lXEEwJw7i4/QgpIIDhs50E4esJeMeeWsADgFmZLQ5WogHdimhcTncIWO/YG6yPiaoj97uAjQKQqLT15h1cfX6zAvuywFkpyXSJ5CJ2Dy1DbnjT422NMJOdt1uiJb1m1BnOwLaOWzhiGi8ekz7aCLQuia++Ms0iCGk8Yks3YsTPRvwdL6kED+1fmnBqwyt56JqyT0cRYgP6UCSK6xzWO8qNWRSdUEA6iue+xQtpsNZ/mjxNC9QGuKkpWBfGuHkYL3UKqh5RlStNWNPvQLUYl48njWPMl5iRk1tRoUS0ehkHwkHknmvIOwBwTViP48A3dYO6PT5cO9J4lcY4/QoMCDrOUnruQOu9En5hnoUtV3ZXalNouZcgUDSQ5gh6i3kEWFPOlRU5ExiQ+ZFDMmq0fKw8cGhSDo3AWyqjZkFX6fXFtlgL55rfAex6YjdgCsWukunBx1z+6ljTkfMT5mjRd6VYqGw9k6vwCbH5AVLufToewnTsIVvOpsGt8QdX65Z4du554GJl26uywa2vn7N2jWK3/fdTPjh5cZCtekQ6w3D0cVxIVHqoBQLSIHDHV7g2Zfg3oxJpPeTofiachsVQEvmVhFdj2boBfN6NeNDthchkArq1tl1A++itMnuiEM/dG+zAizj27iIfOGEU4+Q+7OhRMfU6rXei2ljEEta199c7ZftNhaHH58iN8xCl6G5jSs982VIGGMUq/XoVLoapd2HOGmtEFOk0MpG3TTr/imd1iZ+6wMhsf477xZ5f6khN9Rvb5ErLxC9pDs1YLs+7L0pKjw/2ZUXAAg8E14sSrS7qcVbY7JXBnw7Y6lbiQ0NoF3B9mTtGgkjJUo2cWY3mQUi6w7bumWqZ73K1m+pJBr2OWeiQNXgA4vmxrfp6n++Sd28cUv/PEY9BY/6zP9vFzz2gTojz3tvv7QhSfA3/UAoSG5yEr2nGPIoQN22Gekv01hem7LJr8liFYxDlIZBgzQixFnmSue0RJ9Tjq3/E//k0I5/mqkDE9qQngFc8oH5/uH+ojsx5E942teT5md014/UYeCe7qAVXXZa8qfmwtZ/dMlYVpfYH/Y8ZqfTgtFaq/T793fZORbK+tQKS8mWLrFPHnu/Q2OrEQTzhXrPdi4/IGPrL/KxlVdy6W1dWOYq3VMjubeyDjWkDVxkZCxY/kR/mBKWmUXgEPwEcVznKP4Ee0mTbDoQO5v/ltzgauGr9xekGsuxz5T6LRbUQw3DSQrKyNevHTPpVOFr3E6AJhMFBtK4J8W08AzxtXzkiDwwym6GVhecPEabkElkEPlnUMbQ6Ike+K3HRCi10ZSYaHy0031VgbNwkE/2BcQp1/eESJ24fDLy1BY/KawI12d+04SfShZ4ibdANbdVMQljio9gAT4DJnh7B3xTvqkbVYB573OWCH3v0ZqjVG12Dc/cuAZDF12oYOO+Fsteh5wg1u4zz058de2gAuKvFpHHEzMJfD9bOu7iy0Ce6tnbR1+9YOr/BUUBlK//JrPbyvFrG6kG11A1Opd3YhOpQKY2OwqADr4GYHxtUdlTvVK112cy5brNF27eIRxMYdXnfFDY5Kh7MOpRP3x2rt8PgCIxqMJk/b5hp2TIjeOyjMy0hdehxUtP8AABtbJyiqNCRO6dbI1Tz2JmjKTEc0/cQ/xAYMLWzDLxhdYCcfnGBWX5bUGVfEaz4FixuK/fPVx/Xd5jw0zrWMiBcfG1caLSrJiRVB7sPASoptZTra+91USSMxzYBBNrC053U+wRRHvMyPqb5dj6ZydPTpl5kK0mudJijizG6FCoJT+YEllwTpF7fgiPDz+FnBWe9jCqGgpPTYXrZuZPBuCdXSClKitCMA+qDyR6MZ7YtrL1Kudgs497ch2e3pmk3kk4vaccA3+BEHKZuvyNHAq3Z6MXxQEHM0BpblRt85Z2LDrSyzt1C3vYijLMWfrvAySjeQ4/P/TFGBTeZmWqdgruVKYLXbv2cmCnKyoOd3QBbNDHCcUq8FPanYYEYUme+Lg9nnWiesl7Pau/iJFsSUxh4WlrqCq5JPtRfV3dozTy9fq3uOcTOb2fzAG5M2doe7Sdndn9eoHL6htCUDDeLxiLrzCNBgim7ssd5inX7z8j7cFx7w2wTdpsiUC/624EnpxVlxa0fb4pcF257XNhtsqebo0UpL50d/hcV9LRK7GLADxMZxCxRN9aOjDTrn7b8WWihc++ZWNGTGOZkZP83AUb13V3q0NZJSG1SLkbBF2lCT4yfp6RiUsiF0PKToLaUtXZ3URptHo5Z06Hn6f94aQvTP3gjsC8nXt8c458zXlVWc8g1fsQ0PsIbZXpxB8o84NJTokRdrMjAPRWQ2Wb33IatIAvu06+wnQ3pBIA4Dzg4tWXM+iQsxb45Xl2Ue25FtpzbToPXkyUCo7GYNwlV9xIy++wSzD72nEK9/XgAN64uF1KfMnSw/tPDZIzSdPvLmxZBPq2Yqzz2vh6V1zJy4m82X+Ge6eTXHwX1DRKPIT3Zi9vG0rla9/hTqd6BujmLB8lW8iq67ssSAVeIGJelUI6+oyLMZ0vCvk+JZlzUmrdINxz5bnCIAJI5YR8Jn6iTeZuA3MXqnZOel7yOQH0AFiN3oQgP4bwYK/JACmc+IVvVZ0YkBK/JDN6gwXfMj88f+g7CPcfaWenj2/hG947zzTdj8+RBjU0XLCbh6xuIRSWMBr2kG2JefMTwSu3wftj13kFCIzUNyR2mTYrkdLPTTFMWGlYWAt1mM1nl4hPbWsSA68foKSw5Vsu3jLV8eXibqjFoFbleu3YEEOaBo7zpZQehf1vCU4QUZ/zBe9t2ek9kjmPvpZGyMGwBBnWwNWJ+uaE33Ii+wrpZfb75z27pykPKM6OkkaADeE9j9Og1ILHNScHF4OYWw8/9xG+esRPNnQ3v5aquZf69FhldTHEu657UORBMtRuWCxnlduWiUIf6vazW2sVIP+3bLX6MxBfHQByBADQl603c/RY3dH6QuS3Rt9SyV/yYx2gckSP9t1tOOLvd3MAF2S7O0kLM3kFwxuvow2MYY1s+zgTKyfBdst9yk/twFSRGaOOMkBgV1a0TTzIqN+8FQ5MHLTaHINVwsEKq3ZIhy+TVMaJL+0XHuwLxURDaQdh/uEFT0v5GN38h7kQ3LnCZdfFHtAnobZAQLBbKzYOCCjclNKrSJrFJDVThsTHMyF8sYmpQIOowTk1gN8CDW6tiaguVhyjfVqTMx2VWiAXMzOOXyAUXp0PrpBlEDgC6Dn743aIq914q+JwgYsxCqwJLoznVKyJt0CO+lE/abc2iQ66o6hKfXzbN6psIaOB/jxTkm2EwpVQA0vp4ecpMwZBaWzNr4hHvdI30A5cRF9u0ipYPU04Zb4F9WC/RNqizZ92U1JsKjFsyQfwe8PiPPrQeHfjjiBcOuTNApz2lyjSodkg2YR7bqdzgxu3pCOPzSNRqQoHCgdmyMG+b3SIc7SAQPwaZ/z4gw8ackcLwHKOcWRNXd8d3zpenpwBHUBU59droibJUopCv605kDQzoFdtzIWYocTrOdZB1+s91vMFcZBtMQ5gZwU4ehcxpTIZSASbguPMEBjOFbfRncEsUC/d7hunAggE3rR2S95S8arHwxyTcwEaw8w3iw4SxVipmRJEfETiZQYrs/AjZOc30OYxAGCAZuNsHGU/zQbyG1Ebm6KWaZ6Zbr88noCYZOrgAJDYXC9cEnZcv9wetWD3pj370p4Lak+9Igt4CYjalSsAXu+IFrE5JCbmqPKKPCp2InQSy/sAgyckuypBHiVLkNiBK48XMGjc+janRsEWDMXOVYEEAGm/3JkqzhQQMkEABwt4Z6Kkjk6BPg8o/ILZuNxHwHWNnaeX+VIw+zRHByCl/YJPFWP9aUUS+OeptWQIEp+feQLUiJjpgtlVDsAlA4QzLIDTIyEBwcKLMG7GntgZHE8U0dP9iuWqAsBlDCif2IwrRE8nAlOe86hSJ6pxnMAaLAkAm2uHkP+L6AAMgb/OlRg45/2yc+/B3Ol4QiVspXNmCxohBFgCQR5PXujZ6Ex1ms/32YaCh7szQj89CpDY4dLgI0qGeoByvHcg+ACahwbBzh3iOuDG6Mgmn6ORiIx8qLvqjAdlV1w/BBf3109l9R9x2iEBxJ8uAk+4V7O58sONc3ljU1b1bINAuV9/KZhK6IhXtbMWvcTnLvM+TO1SPaMEzDRgUYsBQCKAZNMwDt8IBAkYSDpGpQgdS4huQy8eLYMhGG8BFJrNtwAqAMKH2k23AAMAjiX/lp0/6MSJnPKnvrZIjUUntduF/J2KZqYkwmcv7e04d3GFl/jKxGePb2LZ83JlVXmnFcdOApVM9dq+x6JcoHOYYA1X424HsfMB/rcim/b49vtU+u7rtT8M3Ph7yU1R/qW4y/kjuYv8cj99LT5R9x95i0PscfDm/486+GsxGz0LV8/70/i58veB4CIOWb5cia9rj/lqlnw2SdJ7UCnH31UV9xB4xMHTdPGDnB4fNoZiM2oiakkuS7FD9oP4P7xXlsx0aJbICypDruV+sqVxg5GbYA9uMr4bs7KL/psMyzabxJmRhjgs6b4hZMJ70DONINAEyt/tiQ9qA9e81T9QhB2C/hn3OnRYFRnEWUROiOphCc8Whxv711T3FNcvyjHsVx3U0BfowS4syJ4R344i/7yIEVODb2dZ+jksXxgF8lxG9uGWQkB1Q3BOnNmxncdvc1gViPfJ8/zm47Idru8WMZPAPeUUV+bkTEzjiTDpx9y7+p3OTYo45bVyuy0o96/uFHIlp/s+1l6se3U2QLo7rCvEaB1XG9ipXoef7NLI18y5V1x/+XH9B0JGW6L3xgEFys1yZ4SIYZYr2S9qUHLPcX71F9SPcwJ2PepFB/4Zu3GsxiAJd6qdr1IQ+QYD1srIihFCt4zbJPMBu8Kpoz/7SE2VflpafuIYHyvGX7krc3j0Hn2A1UFKl4INtLtL1Rv/SAEZtU+oSC9JCToRCRVTIfTCy02bkIkxiW1mnjpUYwvfvqK7Yiv9XAiuDCTrAb5Isv1QJzsCiuMfn7r6swgFOgOzDg/hP6NZC08sXMDIJUkp1F3h7Msu31kt2nr+jfMEbCy2J3ej32qasCf0Tg4vPN8KCH42nZi8HJtdORE3S+ub7wwNYeHugoVbFatO87HDBVQzKfObk1T7OXQjYDd6d6SAe6EMFkXMh0AwGj2Vmr08IZsFDO+xePLbDnkJt1cAxXBhxhNDUGydHpJmi7FRSwwwY3fgKJL1F0R8/nojJVxeGRV7BJZR81B54wXFAs/pNl8QJlU/mmkw/Zfgxqp9t3Cz8tNi3nl7bteAfn9gZDh49qM95bl/QLmTnthVt6Os+/au/f+EckOaQh2oe53v+ufV2hJuQwZ/XfnnovBfdxYYfEKjcHM9DIPTIPbyfT8gefo28uU8j5+cChs18FAlT/Cu/fpiggi+lNe6eydkw3y1tcJuhxQ2FDsX4pRaSNuvtUGzjKdv20iqECQhODLygl9rg+b5Irkh6dir8fGPDGX+8/K+jNQMRZkpc3iHdjXmdVsIyL4AIuzgtvnm+wcSGbuHDN+g0CBNOxXY66gq64ntFKVwnhcdW23ZcK85xBBnXgkqErbqfFm5yGPJ9fUWE2nAoGLxHdZ5jtTuSWlZCoVbNKQRnE3UfQ7FHeSuN9BvHa/uUrUDHOsJHVhZLAdGutM+S/IXXbtn9uuekIeOUdZ8uJ7wBsnrTEtouyw3rXd9x2zC21JskbDplEP3E70MRF0DFMHdctifsX0RpePKRO1klOuMP5DyqWCU7dwJRNOjc4Hw+UWhpBCJYPGCWILz/OylWXMEJ16fG5D2BA8CHh1A9l//4tF2uKUrvknuwIk+VzAihTkCSQCkIr9+RhdUtzQta1Z90X2f0n/uxZdQwF1yOjuBcaddNo/5pVauX47nTZ9AQyD7jE2fHvFFbutPBaOvOCWWKFvcWdT1zN3jaaFIfdYoquV93j6jHU2jqbVjYbjIk5c6zb1QDHfyNYQS3MLlk/NrpWxzpbcL7OvOhGB30ozYMDu55NNgHqN+xaq0ch9hn7wkcZ8ywJHCcz6LynZEzzv5Sl1RtQy080sP5KeRoFPcVhqtWZ3MnwiZX8YQ79u19DwtXlfvL7RkzW/eaB997zYLIkKSNuGPAA0+vxWfG8Tn/VIurQM4fjHgLiJdy61NMqCe0OmJqW6mKHreqkoNv07aciaUaYc5nUFtSKvhP5WF/UqAIYLF3GxjZl+BgeCMfRUGApmMMmfnXOD6KfAsI00G8SBxmo1GmM5joeJ7uqPkYIKhMGZP3kZbSAYUkGkOqrbERDygaoI0Av2bGOrnSh/mrmFGqKVP4YDcX8YPEkdfBByK4rbAgyTxSMqlmFRaHL803YDFAwNC0WU+9GlI8FRL0cPlXCWVfUwqSYZeeeUJZLorLeJcQ9dAI/MDLPen5Z2I7rc4/MkfuhY6JCObPgEWPbSMizrJgHhVftnwL0DCSxc6r6c6uHbasyftuX7ac/nas0ft4TJ3VF6OfHKvMaHxgg14s4qHVF6AX5fAZFUDIMIrkKs0DUCxSwGg8YDHFVTypD8hWMoBQA0lKC9XalJJhihQSxOoABB8KUVXaqlyTPWSBeRw4vLytfLSBQIWyCNqmCkQzyIxDjC8QHGg6gvuNPjD5/v2+HD5iS8f3f8Mdu0v0Dx+YjTsPviLCRhf8vQ/I4F8emrteTFx7Zu/jsk3P6eMwxutPnplbVLnyTIm2UBZQVsFK/zFKK8izlvntY3UThi31DY8zV4cQdqISusO7msYBkByaTpedFZcZtLFJZ00KywdV4hK4UsEWpQiv1CeIebwdgdlto7+cnjo7y/kC8IXZw3xySJ45dp28pnCzrrZO/7kqzG+M4unfe1TD2eIW+bsA3i0xT9oQsZPgzsd36jFovJhMmcHkh5m8cmZp0OH195w9JX/YrbYmUGP5KHVGzPxbRjlBWAGbJ5uyTG71/oNdgdQbPwOzVOFjAZ7vK9EF3Z/DIIpD4CaYm++vIe6EjeavmMapAW1hPtE8mWGjI4FiFPdsxtt37Gdkpdgp5MDGs5EEXdR6viIVucjtu+ZVlJKRFzZuTp/W2BACARQaJKtjF+Otrh5ueq2K8NtFR3s1oQ0JGDxMPp9+wGO0n5fezle5B83gDXvTZZTd4erbQ/UTUG8DVALR1Pbz3enn6uGN7he6rKqPb+S99SviuKMqN8bcZwdUgS1YKlxxRPIGEHJKyZCIM++X/ixwrwBWia8BMbiSyCZ9NLhlF8CR+UlX/p90gIwRC1NcyCPf4BlkWYBgEIAACQFRKvdzyK1OB3SdAQ2DwQIZmXx69M4iE8gbcBPcxtXATBpqlPsQkkDTX7SxhJ1LgBYdACg5oH/mk2WoseuB4AmDyxR5wKARQd8BnzOq4CQvSuMp2mYCV3KBgl1eKJ97aJvg7KZHCJWnt4An41rXt/FpBU2wYQ21Tk+CuT0QOgrcpRYtdQ5cgbUH7pXWWZDVfsQNnymW+BoOQ/nkLxbrF79uh7DpcZWAgQHAWCu3PeveNbTp0fcCEM8FaSg9xxzvkeT4rfP/qvpgID4RD6PR79sjWGYDAARHQCkkwFreJh3uNU+YEj6LNY8PuCQ+ACT+/KaQybNuABxofTGeAB4dGFtJvq0ZETqM9Mj5azltaeoliIKYZh88jkoEVwyTgxG2DCMXniAvza/brw+wCIQ130jLzoeQ3GZAcQea4A0rmZHnxBceSYIIm4TxwhKENBTT7AkAMSGD1DYnYg1Du4TSj0X7K9G+o6hC8E/DoHWJrRFZfXIJiBw+oqh6cG9C3toshXdy9Kit1tbMe+4EUcd0iBj+fsReYQp+CjhbuQkQC553vWTM+Zx1W3qUUcF0jX5Ky76vJ7b05LifurpU4tcZROZS4XsUqfrMy7NS5OWWoKUfkXA0k+pNpJZNd5sDIEUamMNTf7HooZl5tcrztdpNLNgIQ17az+yqa93wjGH33OXRcZW0V/R/BTJFTn9VJCVcIjBQPKWsZQybt4tetInkBkX2EcovMO4pYN37+Wf6R8t5PYtnEua1nNhmKofnLdQCR90CIwcPg7xkWDjPM/wTTjXq2nU0OcYFJRZjUJ7s6IKIDap02LZGBXIuk9hgHS9G+80hQtcdyx4BQb13TW4nxj6O9RCgDj7BhxmBy4tcIaB5AMd3TJOVK73x+uaTgiNiUEqVdVKJ/0VdEXGErlziX6Bn0eWuPmVzH+tcCqp3fdcj/ceGjvibwzMQVbELOKWWLEfXl/Ore7DzIymHV7AkWkQqW4C50Ea06F2LVluFTZosj7zvEU7iRxzNCFb7TbxTkLoqcrDqAgPZ0X9C8YeXDWWgNFLpRx+CwS8TA2rjVFJaWFcNwjdMEtDdp7aYO206ZbV+uM7fq7PeX1P3Vo0mu9BDgnHDT15blFmAYv8BdpKXKEf3ee5YV0f3VET9/8vikqdg7TkLemOl2m5k0l3c5U6gzymOsLhSJj4adAq93g1vp2Mf/SQoZkiAL8eANR57E/0fQBi+fukO6ToZXET5wmMGtzSdF3JdqbEuEzDY8uUVNCSucEA3NxshdSCeVYk5eapeOm1a/QMGllvldyi5Gj2lOwN6+epQiM3fzSBoNWAmoMqU7Xwcyxb44NU8fzuMPZQpT5dgS8BSrKK0BTkkAvKVVZSKUk8VQ54KGVam0F5z+0wwljipP88WjQDL6Td3+YG0qGnA05tnR4fEKMzGAVtzPVDOpoO0hRFzrNmaPRuS8+kjtE5vN+WJ/wV9Xq1DbbnfraGmvcWzgnz2HTZ65LlK9wa+//W38dqM0v//a9xu7r6ZjQc2fZbNP8U/qq1M2FgpW0+Y+Px9sCzoC9ORO3ByI9fGhKYdx+DFa+7UZGytuSPlRcBKFBQWkAhurvEiR14PYvvRmv1Ug1p0vYeoL2bD8UKRbtLHEh/X0Ds+WKBZ79YwOLHnd03Y1IoCpZCzze9xhmASwVYdkkcCNQ6PvLINlrFNwmcWdrLj74Yf+F+zO1GvOkrSHV3mUiE/oapfre40yXqhAC52uAphRHoFZiXbyO+LKgzQYCPIz4cjJfKvdkzNbSHmF2fdsXm1RbrtjPZBMrusVZER27iXZT9CIDOtpyPqUm+cZTDsbbLijnbqVWEWsqvlBm1CAlTkJMfO29zbBey6j2zgLtsS7IU9yRq1oncHt4IMHapgXSsnsN2lo/1fiTXY85fubt0ZZFx63DVTu7xPdCGvNmRlCuRz0h5lS2jBz4VopPzIV/Bn/IeaMvIysG4wdmstkx/hMgXxYmVwH1ryRv+R0bK7p+WRkC5RN5SAA/wsWZNuWRt8HiSWLgtd7L2HeohVTqoPawFOlg8o3cSQ83vpJyMCKK3upsyyRFXP24WtCkqctduCVLefKwENcxYGn7BfYUh4kdgLd8HfdtH5BJV6N2vNZAOMXwovXD0so0HZ+CFRpwPD1xIwkLkZU0Nw+4XTPl33xieYxX40/ZqCA5a1c+hVBQkUm2ArX6W8l/pWbsFGN+9SU/s8FHHROaG/ypaT5tbHxOP0qlF1XPX+K2GtAiwgXXYYJtKT8v58N8R0hhwhM9VF6KRu0BrPQou3Vb+QOnRctpCjzssZO4oZKcD9EJTy0/DzFf4cQGqJxfCiE/uiHOjpvWRayv9sKp93bVi4H3eOHRiQQDdFF5/vigU7VvBvqd9J+HhWOX+1/JZsNEksF/RuiGnnye7nWE5VORa+8mw7UoR8RHSnBLy69fxuqTDCaF0VW4IA6ZbNwIkNyBcZZAolcHTxLIbMedJXqk18X+5YqyL8BSC+Qv4N9Fbo2ouL/XJDWRxmky6fam5snL0sf+BZP716PTcpxDfvMGzw3GyeKR2bL7LlYbjiCxOpSXPaDzfJjs2HaK1xYMSjkA8CK+PZvASy2Gdwp4pzgmqqrQ3mutqlJUamcqoayrpdjenP4YeIfpkFP3fuSCj4u6+9BlVVBjHhnz187A8pCQQiGrv6vyJMICVdIGZQAATzABZFFX5vTWXPb7EQg+JPCtbxTGLdWKa6lPmAiF6SQsQOPanUAWrO+wKWF6bwJpmdyjw3624M4X6OMyi+HJ5RVOsX8F8KOTM8pIBGwa81IL7OUN5QvPNmzu1LxT5ie39kPdU8MoBcfgBIR22/aFTl76ZSwK9gxMZmW3OTzkTgfRrgMOWZZ3bexE70B/O8+XPX/1ZKY7pWWWEfdIguPnZZD7j64FTvD9oG/ayJeUoMzf2D6q6uR/7ote2CZIOFMLN/XXhxIMT/Poua/X9+HFRpNAA2FMNXl/Fh6sxGyGc17D4PFnVje1C/NIfPYEcHBjLBhkE3AEYQ4IH6gGwTNo6tjPGRCissa9A7eS1chABcGgRPFjH4s5UViUwrlFY3q8KAYL47aMc5XlAj9Ut1Dz1ciBPOxwgsSAzAYCXgfDCC29C3bwJhADhw5BaFcNF9eYOCgUtEkHobpyJCo6i4yW6lPEQAF52ZGJDBQGQN4lFAQZNZI+KybRNrDMaTmN07jX0ZiP/PJJiyjKdXKv7ePrzaSDt+bTiJc3eCGc3a0FgrwqLrU32frXk3wLl22uvukc7OyjgvVgnEHO2OPPNiwvuFF0LFmyjeK2lcxczr6l2eBO4T8f2DNHvRvnhcEG0LTvsmhMMxZH8F26b2jv7scU+6GfIHx79c66BkwOFQyalF8E+Fl9uAy/bkx3RCnAyiZuKuOfuLJXzTxfglvoTUvnTqNh/vFAJnGuPurVoHIW3B8owHAKHNbiT5+WDGjr9ZnWT+zzgnzoZvJCbK/uA1vHZqx/WBezxgENobRtXNoX9CwKKu9ejNhoVLFmMOAv27ej1W0AW4Xtx//VYn5cvxknkONELyu2bCNb9yt/UDXor5upCMP3qMSrx7Pvq6xyROVsYehnOA6zQGEddoRpJVcUNhBSqSkG4+SzkJsud0z9WSeRfjNcMSQAhpSTq14fvQ+qBSYmjeZxfYeWq2HTDiS+iIioIlkDVnHJ8SC1OOl71h6FIWRVod5ZL6EdeQ2eJJ/sEOzjl7EXB1p6SOmAnpRlvVckpYOzWX8Gsz8728VwHxZRfjSdOqtdI1jQsPqG+dKgvj6/VdvxszTo01y2yGkJmXLF44/4FhMQdw/3/kYj2Iai3s8eaGt4+seYGC6vnELucxT21p/5GyMbLZOd0neXyZFUx0jHcKAv9vYtqy8FJT6rvGSq3suRA2GmrFlaHtTwPTn9RPb3luWuOu3UAsPv3Sh8tqxFzYMlCJkEGJ7NA0rWjQI93cegQJndDgjkn8DI0f/IXrJUFS7W+vxuHlQUEC7Lh8OhhBs1eGj0okFNPsaJbfmtoTqzL3s/0oGZr+7h9Oru2A6GTMTzeE9OHQWcNRJ6ziIH/Fo8LP8mWMDhBOFra0cxtRmol+rEiaaTtdQmgd/fISdkBPyTp8+VrY4QFEvj1GzUyFmOubOyx0tugo59Pzjlkd+rko4KARL2d4NhE8xumJjdXZxE9Jh4dqlJ6+zvmG6Mx0oZJxcOwO+bCuWIMfTaLwP8OgWLU9TI6g9yUTkzCjnixIsnXHsbPgLEc/lsS/prhIbQjfjFX/lvHjDBXaMH2lq327aUBs9sNPXrY//zUsSTDJyfmSxr8rqzg+8r2pUpPTt2PprFRul3XP+zuC/RL8OKIUbb/tjpbg6l9cUgwRcziZ7VjfxcJfFEPdGEgaHDOoVPvRbgKvi1xm1YvByvG+hJ/GPYMRm4WEHznaOQVEU5HYPFBERcuwUzrclsTHdeicvwaN5XI7CTskzcc6oC+aSuEStYbeZBsTZkh4OlPGfFYohUEytWsrQHGoC74OUOPgcEiT/h5u5gO5BWDbq9x0YR61CjbO9LtjxqastSzE0t6GW9IRKQCp6NFpTbf59lN7YckmA/PrJn4rnKMiAAioiR1clc/j+9vEwgCOWPceWmz+S8P2yS1rk4fxLv65z2XkBnE8E/ANR/eoKlfP8MpQv26ITxZ/WgW1reRcmI3QeE/kH/Vx9qzIx5Q4JKiBoqD3J5g9LJdDaoiUxyxlZH+RU8AY/vdFAPJrQL2BrO0kksBAjujXujreGCL4JBJxCc57kiwy/Pum96GNsNQAjZgh2OnTjqPf8DgzG9YapYcXibl8SdOtmc2igTDa9nfILjzWLK/Z+LyGwfxeyig9t1llC+dyicsk4V72tFcvzsI03zKpRJNvHgq7tCHIuBhZf5TirhuRPnHIr3Fqhf/5cCV1B/xG6tvsl6a+/3AlUq5vMl8pWcifhnS97S6zmP4ac21T/VgXE958f7PeBfThZWL8dQQJ/oy8z9k1F9chj5PSXVdpHD5p2SvIuPt7cMULhHK5nHEW0rT7S6/bzEOHlL+V/u6h7QHVNr418+SVCzlbV/y/8tF+Rms+K9jJvtE2eEPSnLfcwBqWZMwPfE2EFq+uJJq0lszsM/7IrJNUIgc8FGEyJBJzeRXNXq5qbAZZtjZM5kZjHxSltTo55/D7/aKmkuUDQojCX1EfbA+EDCCng3FBL9rQ19sGcKqKRgIjDjA6dOMUvc/lchdK23RGjkNxg04xfUI3A85EG51MvcDnwUfr687Xh1IaqIB8g1wT0Abfka9/H3434q5xxvbP8wrhv7lTN3Dcd2gEADJE/7DLT2m9XtY4zwDPacnnHyPM/Cf5d+R3mrLiey7Llb6xdZMZj35iUImvHsB0qC5R6p6izWNZv3CBBDjUD1NN5ijtPC5Lmj0x7ceo6g/CnDq8WoQ752bvWk2mQvgHozFSZ/K3aNRkBIg89Crky/310kUZ2IUApRQrTE4qEgUKEg4omEh32Lg6VnpWi9IvC9HIAxk1rj007y19weofLeS3gJtczp33nT2PzB0PRpLFvrebrqBG/tXjADFiiEW9KOjJgfW+H/Z0E0FPiPgpYbRxrgrHqlkofktNQjfuLkl9zYScbt/csqCFsMSf3QBvGF2V0IMrcY/nvUq+4yRcFPEvm2n1135QmHO0NASJNKMtJm1NR6exbXyamza2Ppb1Hli1qBCQGal9H8cZBSOd8ox5nK+EbKTy7QumP7qMeYbNF4uGKZ0N9Am7bh+9xgMA8+MmExX328uwG4n6t/eRlbL2lgXTwICrYwwbFl+THPspi3fMO99d36hAPMUSZdp0IokOgyk+V0PtUNjM+LiO5PoNdb9lfvc1+RH3rtfxJIjsABYxhr+nWcarsJHEdD/eWuL+fm4LFIwFmYbaB6TLsjQgC2jCxzD+9wi3UdN37uMY9j4Yf/e46F61NMBVsg1aPEXb3Chh3EcrD4d5tFGjQcA1o0IdhtwzepISfoqh+csVdoDXPlvMqnykjZ9sPAd2cV/N9Xch5zSnG9iss1nmzTL0kUDb8UtsWwHTkNo5k3kK1m197bixksgtEJORdt1xcjgt9xTexLtZ2gNf2IQ0TrSFGZJ2v3JqkdEpZCMIjf0mR0H1ztMFLenDT94Hkw+3mn+DlWSTy6NeOn0DHJHavvj8+6TH6G9UF4Uwedl8ix56JPykV57aNDxnfBP8R3Q85QpOyomQ2tkcExD5mylKhKOwG9y8c9tgnJOZOOk9c83Q8Xrpu81hODx3O+BUxSdr07vc4piZrGL70xx+SrlHrM/UkQI/Z2R66PPpaTUT/C4PEn1UYKfq7hRW0aDsxaP74rnpHL+yLLM4FmG/HDRgE3CZeWTqP9eXkkgh0eun6DxcSpxHwKUCqzoJBhcIljB66sZlxkhTltbKg30tfHE/E+JoijLuZRvfIRnBhjPP6Q5LdskFESnJD9fDltoAyNY4FP78Cbd7BpAQVChr7fCV3UZv9BLYsryiutXfrMudBMjvuIfBcq0+StbevSGc3Gac3Nu0EwGfq8tl6LSutp2zL1lTQ2ckYOTwH6MBXKmDdfNjn0wsE4zK1YpIBfBTnCVtgl0481EbL9D7y86ZLGbAIhlk/KfmgUSf3Bp09OmElbs+jfz/Z4tp2PmYiX1Gg+tppjHM+ORiJwb6uQ56liX1YN0DdQXll4nlA2grrC2VOm/W4EXUsNRvJZX8kXQoP/JWGm1VtlamChG1aRgOe0MVcg/DA2Dohh3RZ82nD8sXHRrBT4UwQoRwf8aBO0T7IdL/ijqV6JnPZyXWAkwoDkWs6XbuIRyDlOjMqbrvJib9Qf5P7VxA70+E+lFbidW7XCzVOAqY0Gfez1+MaJ5m0pvSb0HI6aLL7dFDXez22Avi55ks4NV0k3hk4VfIbiGiBBXVFbV5tIAXu+cTkh/xV86wTFgxZ3lfXdnm45JXdh6M+P8y80Wjh59vD0s+5nsap0l09RwnWI89SmHyQlhWOdbr478jW8pWVJTuH8b/gL1JkKrxQe35IH/cymB7Ym3XbctSGcXkkJ+9UF9/+cf/h6HxXr+E1uJ9W2u8F9hE14ZfXlH4mwnBvemO5ulo52FpeIqV2KUd/XaUhCnOJzr4vRrjfP6NOD8w97DLxvgb8UT/rDxxQEaiR65cLYBPcTuYlgBP8TlZoneYbH+Al/Mtsb0h31i+BDwR31HqDNhi/8iXhfxH9urj9R9gLKqMHqJ0Yvybss1ln/Nun7sXVEHR/Q4ckCjo132jkSlSJo1pb8DqtwMQxbYuH9aXMNjiSnUAfpNghR3w+ZhjbU0yO7s3KdhomLKHrr1jhBrk18IBP5GC/S8ijmsF4lh07oS5hwSyXcYpNvOTLRmitygQ7Jfmz1RaDHqhrnzwl4haX4J0hvCGf7Rz9rBJRK9x/VHe2Ff/Dp4vxNw40544YS/ficg+p0OMIb1pjByhnayat32q5uz4t1sMgxZiE6kpgXsQlKOuyCP1IsIaS+aAG8MM+V6+3elaZR8tabwv9l+uDcb+v3owhyOjLXNDWYbsAN7KVHfNSTVwHgbqnZsYBOVHAJ2NdIDw6n+Ck+miYbvY/JMAWAgT7gZpvlVx2HeP0Cr+jQKai31a4Rc9tn/3cizsfdXbu/v8fsyp6FqmH9ydhbKIlFjRP17+JPqYNruWJOFSYDcvyNMU8H8HYPoUsaeOQyJeQJ1Cg2wzCCG+4/BgFwRN+P+1ksezT5L5f3b8Dga6mqUj/2D5Lfvdp6P+p+8EUFzcpbcjPnBP8Skmg68mxznX6obFu2sTv9FgFpkzM9W8qu5+sC6CTLcP0u67e7+1O+4F+PudLNDRUu2+qW3g4eZOSWdD2XzKqdZcEVVOrzVApcrfx9UAOSAf+tQnrK5yvy6On162tl9tsM9nS/l6ez90XRsTp26Wt9aAE0UJbk6abvUemSzD3+LceGd9NAd3vjFkuG0KL7CNAmeOnSav215WxjFdQCEIjx1gcYK6omj8YjApKXadMlbe6rROEJ2iBivbIS9nX6LS7TNk2HU3lzQKEHDetz39h3vm8K5p+5xrdJpuQfxHZ4N4MVIMBgdHIwArwbeWw2OBt572/t3xT68ERL7hP9G6329PCve9x1+DLzfCyb/QhifcwZyz8gKNDgypTANYpHZWy42QclkB0ieWNfZFDkaLDJKhD5aaYNk4CE4sod2kCNJ5lCOgbDY8MxKcrRBU8l3JiYKUIuGDjleQyNiauI6RH6igyBYQrR2R9AaHTfQhGgKMHkoxwkJzJ0l4zFgJI0mgXwPDU40CTkZ6GuyyOR4DjpGZgysxwYZAMBQgrYUDRXWOcltkNwR6ygQG8mQzxBa4DSESoeGFSAFl48EjQpADgZD0GMJpjgliJZGXTyJ9oIOlyOc5IEOZmky80Iek6/sl9y1DsozIsJdz8k8PWJe0PKCVRDujsw1iKpXtHSkQmgTv1lojU9oWZJGQdvxoyJrc4FceprgaAdezdN1dhm5zFkOgtZY5EA36vdoucSbNOaXaKmsBsEmcIJIm/2IljesjoKNMiXIRtmw6ago70i9YJP5UZFb9U9oeU85FTYF5xqkwQ9os+/U92jz3Kl/QJuXTv092gyd+i3aHDr1Hdq8durv0OatU/8PbY6duh5t3jv1t2jzr1O/QZuPTn2LNmOnfHH+c4RGt3sV/GThhzPhmsY6DfBWHnG9278KJha4PxP+EtyuEiY58O5WuLLAu1fBVQ68OxOuNLjHSriwwI+3wkUO/PgquNDQqAZUw7weM53IFhyn/EI256OnQbPIsedjzixH5WwZcwycyU85TOlUvWTzNcFToiLXX7xM6VLrkZeR+P+JbodTgjz9FNC1fMSYIqZz3uEj4YycIyZ4kaNE0pFoog4/I6bSLd8jE5kym+KG5j8rzr4KQ6ifLIWf5AVAQXGkcLDoYZgXEFEyTSiMFIPT3uMQpcEERRJqfQ5FJFyWcaTsqPBrKNTLD9OWlvXEDIqNGgrgeBorCEH34x2iE0ivYkG6X3GnBbAf0IiBqvmdeUe47OizHrlth62CjvmRFCpcB/vY7pCK4VfWBSXtR/jxTi/gGLDMAQNzZ4NAHNOBLRZh5LmdWG3VIiBAHkk9vXpVN8WeNJCh5S1satdrUZxMjdC/ewUZFA1xPgbmAhYJSgRmiiAVMjisdAI7kCQdQmkNhbqXYJAWdDIRR3QiLBIUleCRCLUF5uCp38FWUNQONSSxwqor42/lB09jCDuBdGwWopALOBRiqB9xh1SMlAbQNfGkooU6Di7CCEV/fYdtlFIDnwMRee7sQMvOKGkHqmVmcLswRFMHR3RvQ29kcBb2IRoSSEx/5JKEtudQ+AL2MV4QgcYZKJIjxZt211uyCAIi7OUC7hGE0ETr5x38HKhodr5AB1AtNUApJhznEcPZFiGNy3bERIvVRI/6Dk4K64m6FyGbGDiEYkH9OBZqf0akndMiW0+/cslqTIrgNg/XjWBHN+KjpATZh/ADjkY21lQHRTvG6yW5aH4GLKgWC6SMfToKe7lJQjcqm+bG6/mEp2PlDhAplsOOjedSLOkBd5a9BsGkW3q/eGglEH+jYHDiLOeYoAwIUE+WCTGqzWyFdb+n9bpNR4UJ7SG+A+9+MaAS9su+DO6DxwH2HklJaQ/8CtpZlJMUjXhFX3BWUqLpDCB9feC9GMuNoPBkgAEb9QKihY9LYjhYqjhybT8dlAv92HKiR7DjWQ88z02RXHxo5myvzcBCngFrqPKsJIDjemBrwTNsyIEK0HOs3sR1o0U4wPDqcIcBCi4Wi9MiscOjiWxas7hRHd083b1RijeyKY9o+w2irW5tEJx3CUNusAg2jj8ikhQU3R8cIrgd4f7XPJKEOgEUkeKX461rfD2d9XiMQnaG5wT5iotSp211jPJqwqwogYn0yIVba/UNuBNftH0SY6mqSkbBgph7tY0jmvweJ4LIvaAk7N/OBiWl5vD+Q4QFckKRITkUMgo7IVZEuXWFNDf7WveIYNXYmImTQarF9RjaaUEn1EB3M1GTnlxhYdMMJ2CBDcSOmBqcV8dViSxkCMROpxBA4SIGujValy1SzkfM6fsKd9MIx4UAHtpowP4qsHghK4nzaSQqFOI0SLVcE2PmFWMNfANqDp+bJ9Q11qleI+zsrIaz1ECl3pPyViCgCTGxMCgU2iatRijMhXEMTFe9vss3/1EZdfV1NcBHLFEHQD6fIcJdAul7nQVs737TOqddUQvUWKqmMZ1jeqndbMF7wvre3Ku0+lHudflPzNCgPF3r4tIPpLw6ojnJF9hksgegMIcSU261wDlU2cYbgebetDRZJGXJzggeAmCnNytBH0DQBqoMUqSVeiwtzwgaoqE/s9c7NRSIGEqYiuPsAyxQ0Pk0goLSnPYepnC0l8U1PptCwVJ3Z5V277kbFVWf71z7xRSKsykiUGMrVgScBAq6espDK0YanZqIzt+/EfY80sHu59cUOA2deNhbSYuspNhoCCHf1GFyYugjWtPGXcG0NwLpXugMYOyHzj2L6CEKKMyJkARhAxihlEkwOLJUfH+EWL7hVMRiLUZb6cBjUTonuTZmwXEVbIUE0ZiX353iD1P0DNa9zWFajTEPiCgENmdEoDFj5jh1LS9ymBhLnzk8IGv0I9j35cXcewIjb87K2a9HgOn11gu6ip2lV22fSmBe3rF0dLxZvMfVAGw/almo7u/Mgnb0sRIXNw2oQDEJihIKPZFhcBKz4DU0qdNGypUAkPyIqb/e4c4jGUqqwhuLvglht6k8WtwYeZJ2auQV5hgEg7SVHWXhkFLbuIhWFKODeATw+mXbNvQlic/Isv3q8IEbqt+3KA+coIS22KkAFTilVRAYiVUgA8/oVCH0FVh/5eFDg4Lo9+5rE6mi3PDElf1i0hsu8/9LT5sBPQz1yguOXyv3bTW4VIN80DeDgbOX6WLmFjR29Ogj9q7qHhafmotKd9Ywe09qN+zgiXGCbjC4ZdSAR+XbTimzZwOaj8PAfkfCAyy75nn+P8949vr6LpM17kd0WbkCFqihhl0IZigGC8d28Z1LfwOFPEoI8RnXnQJu1Vqm2dRxMu+wKNG8AbAkniFg6INME+S+rh7HIpqRNzjsDOD8ngcQaJRt3FULsJ8DBOnxn4MFO2POfzsChzNz2fAIpwbf0Oom3ohjR1/1gk24gBk8A1o1lHShiUEslyVz7+oVlMzqBXDyjTER2iHFIiPxfoTn4tgB09NtmGhzS6os7vIg/Q6G2tpu3OaRspOdOMtRYDceC8BLUxa5MJ5vp0k72NDAroDTssC8sq3CSCl2Q54skdbFMhj2iEFwoqW2KfDSAtq/zIAJCiMchqEW9ERM9M+/+ZplNys8aifLEpAUTTMQW9JSK7GQzZL1ZOHKdQplxyUwrZxF13guaFwkWJpR2/bSl5dMMshnRPhssUT348mUGn5Ms9DzeulQo+5gVZzxe7N+1fxuiqyrhb5/vMIb0MLa/Y3G2nJ8KO//nVyUc7gNw41AUcXOw8tSTSJ108rx1Hf16fp85SYU7DB1GCiu5LHqBJWsgdX1icCgZljX7ofNa40e+VYvNZpzMWORwOcxKqgJRUGTR05xubLxRWNN5X5n/QQQUcoN6cJILNwtlA2VDGhChSKaAe1EV3KvUjI6NBwsc/FYvg2tUUgIRlJcFK6oLDLWFsD0nQ6qB0W8Ul6AXCp10g3cYvir2BnNYLcOLKkb7U/QUO0vV5jAm+ANwdjVKVzRUseq7SbStvFI9nRAuOQ0Uq4t5mBA3gx07d5H3X9ZguOlL8qmRhk9DA+OlR0rkcHxMqR9cZhgv9ruVrDLIyW6spmrKgGxmd4YLjvTkUFNKhZQrDkY8T/6ulwvEh+RxGYEGCDeyCgUu7P64DgjVQJQBl8XwTaArPUS0DeqAKToInyVSKXSJh+Q+O9cUE8WOZQP5HexOLWuMcqOjP8SiQmE/xGBs0xztNrw4goUQiKrkFlyrKiKSTqJWFR2uihJXr9q4Enl7mlAuVNRiDjYKS468Al94MSmUwTEuCQDkcf+X0egXXEJCNYSSRC1HOcjVg8b6s8obk/LRzS0/2eI98uY+6r7TlfJK4ssZhTFB9+f7nBV9oPpcup4N+sY5FnIgXIlpSOEwnZGLTfZ0kcGNUmLtmcoItnkSLrXB1N+dBA5CtwRJSeVLPY3Xeaz1bZFKjImMjDNARkEFo3qU7XjfI5DhcfWkHR5WggknW4ehb664P2VdF8SGIVq/+7aLdVkcAj1eRx3Wir8LykORuAwomeSUv+F3j24W3hHrh6prWpHQq3YlAHXkGYVuxK7EczzyZE2SlicVzLZky9uDUtb+IODjBG0sjOgUtSq/dKpoTUixnvNGoxrGMJQRypFKO58Ocy4y1CnqJoSqndNEXmf6Ri6EQxGnF7KhaE80+Zi/5gVDYemXdt9vpv2KoyyCW2boSRIzvmBjYvwV1bl64Ehhf+VSwpnNorSgo/kANylgDoo7zlPnAbLE/kS1BHeZJd6sF37WMlAnYogKAMvRcjg8gDIdDqrGd1xctQgnHIxUMYOV4JDnJgkeyOIXYDWk4y1EXezUjttOKbXVL/e+ZpJKnhhfyum4cpvS3g/48yUVD+lDtXWlgW9blguO41YXRxEy56T/Dp5RmjVIIRD39768IgCNycMIHgy0pgeKSXHgGZ2sIIotlCMGdglyd0EwynQsmz2WwwR9MkSMdw1Jf35BHOdWUR36C2PLRCdV3XeT5UBLHh0WYfDKPH+AnlS2W+0BmFNBmOzDISBahLrBnSA2LOpMQJ4mDpfAWb3cA5QqpOhLrHRJ5tjJBRb5YdOALv70AmAZ2BQJMGCCSYDD0oMoDXx8+XJoPEmApLlBIVjsdEyJBP1UwExu4/GAY6VMYoTYKBtpzKGFCcLj4Kjap6BpQVGLtojOoerGirGkOKWqoxhcIbV0+0wb6bteBpI8QEf5DGRBZDEzyGO2zdmUY5zmD/pj9tgJkWOBq2W8Z45plLzsLxYBw/gc/b1NFL0d1eupDNYKzO8Jx1zwRrr0erg6H4TLx1vxnZR8g8EFpNkNFWFiP62FlouDexgkTg4KU6ZaFdgdIxOU4dNkaLBCt7Po9gZWJsYadkAtYTCAXQpzKQfhIuXMZjDDQTSLNhsPaHReAMmhXKNOEh4NMvUtJS1bTY3EoqBPMb2eq85D8Z7I/HuOHCBjCYngtBKRQEF1FjESlXTMAG1N2yi9SKwYgikNX7NAZan7nidViEE8eijO6LodrE0sjz+GAtOOaO924WRKJ2F2NgLYmBO6JEy5Rz6MDLVczE6snuqNqaVp2qd7spV0TtEkqdgvUVaWjIpBVoFqPmTKK6fQLG+7ew0cx0qkrUQNewGQdM4fbnDnwGGEbZ2QCItwt7l4Ib1Rt8Tj0AWeLNiACziA3PjSMFqIXYevEYW48Rwp2DgNRtvoLKLQHnS3pdbeNOOWCTttyuU0r1HFC+GY1orOsEAU4i1JCF1C4ZtHJylvZMT5SQZXfpXgRGiCBbpc7cnAYbEbGKoaa5Q6NKOLITR+9PemHYKeUcMvyRa8zWRx4e45IPu1y45xTu8i8SD1xMmqOYxnlrkWltIISDcU4/pxdyxMpmTaG8bU3sF4InIQkKS7YYItsiM9w7b417uuhZKbkCqK1t5IiCWeJ712Bqlh6fOM9xLikdLEtbHU8SJY71VmbGPJibA5pyM90aWm3a0JJtpASYJ9a25KuKoinKmJRe9WI0tC41Jh8TJk0vBnvfhqNgMYBLTFIVoqLfIKwmWWUyuqLVcT2BQ0wAPwKBlhmdPo0nor537agjgYMuwfCFQksP4pNE5AjV7nTxz4suzVrHW8HqVp39Z4t070HzQhAKD61dUYwErVglVdftbSXM0QBgJwORPqoQZTeCs4S6H4guWq5fhae/FWsBGDXQ9SsQhtCl9ERpa/ZEiPNIyyZMUMhUtVscHJnG2s28bnHXxA0viqW1sG2FTvLAssWY93tkSX1kZz+0ptj0Hu4aftUiaTLnHYyo6mwZtRomIHLpuYfl4BqIcLwyuCNpVqCNlzSCeVOzGGQSsYRfnV67LORL+85wBcgXIrTYK3jqoxf7d/jeWke+2MwhWYwgKBwhfUI1DQYkTnTJ84beyM8InHSTnOMxPIEj2sY1cNIdNnseLjGFaBcu8oMARaJSGMhLqyYANDgLXCqOEJH5ni1gE+kgrE0mlnIhMWYrWsljt6KWqdkIBtPZfTwgATcIBAwDVTNrfuWkBXlVVTpSGLe3iziRa/0QhGvaioex3LHQLO/GWquzeYKOAovzzw4ptb8IDrurG2F4nIvr4G2GrAjdHREYCI3ZGdYOBxCxZSTpRuBq8JkrGGETbqjNQ/+hc9n/hXXfGmmXdeT3Dc2yeZWO2JyAPWOp79y00fG2TROI01f52qLnJ8+dE9W0j4KIepUJlKgH5IPG1mu7zmkdTkqsD2hRXF3CJAYXAG/jyPgvqNKW26nSQ+RSbvhXz/W5F/nf6Z6PHdETJ5HkKRT2u8XAxmoz+ILUQGOLIXEZSyL4urWIJWrZlAbWlFMPnkJ8akibHgyNAT6Mo/qS8S/XMa3V0g7viJsbK/ppuXXP85/Jv1744RlsMPK3rqssYiXwdMlQs2gVljCBdS4L0pSoq1T1e2hFGh3zorARvJi8FzK0FwOC2IDro7p1wbfJTCyfZBvLrNKfIJd3TXwkBisztbT8gP1hN/7rONfJFdMrlCS4QMeuguygE5GVoe4n9Ehufhp2Ibx61WIFCGbmawp3HkSCygomYFRc0dLLsQQaxTG7WOeR+ApVONdJp23BtqP5BCcfVT7BYMwxXQPqfxXRQwRRXnFaWraHLcUUI5U8cCLej6A8sx00AJHw/Cx1PW8s8v05X3jZ05hCQA5xLhbTcOsmxwo3i5BMjSesjzGebVoxalc0HBtqOYvTcWTsRWEydLnUD6nZNXTH2+TrNIBiQ5PZ7Ewt31QVEOIslewmAFK1YUdT9+12zUHM6cIHkUbZyuqiV9TOtj18IUZhWJjQS2gOchv4KQBJ/iz+Z+2mBcJSxRHND1KQtAUGWaXzOv8AQi4CSpK3YTFEHmbkQYCVtPbCvx8wMJdtzYSTVovrlcFeMEnKFGJDD6WoriuT1B0ASWxpdgJsrnExXRlejF3x8F1mPqdDRir+LjPnM8I028B0Iex7xMJ1ZmSmQlbFBFJznREKYaJz3i+7iJwCXDmTn1cfq8hkWNAL5hAQKsIoGwOcb5Dj2vlkZG/r9Vp/yDV/IiEklJGJBHJBLfCVvwt0rBpBjMhe6qJn6N4LXU9CQpLg+G20Xh8RqFc0hK3P57PYQXsuqRtIOjpAO7IM7oezxVgYxNWxXZAIhefkY9zQuBi3OlvMIgVGQBAKciDqBoqrMY3s/3JlR2S7a5g4RpgYYW1Bl4hlEKML2Nf2E1KNJOVXeeG0NEO4cCOhF0PMY1IBX5Br9dzgYsqxX2LTU6uikxwNCOffbvgrXVHyim2v2jq9BsNlym98P27lFe136hqLkyIQFQuoo5SL328sM0bNNZqk473gC5zNjrPMMWSsCTki25xDxDUKbNrsIpKVDc8jOuQEuwQ27MXTaQEVsZOe3nufOmphjs9HQqEbTIokUkDOx3LSuwIAuEHMDieBF1HgeX6/JFBajUj8eJJcY4FaIkPScM0ehd0RtUvNNZSG80FK2OQEfv+IB1DBTwYpTIjiYvcYtzbmmnwfGmSujjPD9pZwZg3QrME0bBYJEO+zIpmIlhJvFL6h0EgidQv3cLoD4piC6luTjGbT7/A0MVApYSdsXv36ZAVLwIY9XP7hSRu085WgnW4ljHl5kLFEtuS1bfLELT0tFtJf3f860sicJoosaJzNVHR/w81c/qXwa6UtxSKiiiGN3Q+8uxOX88oZV3lwLc6z8ZRBAoyjt0z7tzMcwY3/a5p7a+J85DpuzaV+EaWjJbSE59WPV4TJEFd2eVxpv55FS4Th+AXBZCiVXXA1i7Ls8NZ1yCCYNTNnQKb1yi6KOa1ATn4NtDrxODfDZmcXYGVsz2KObNRWP7yrFd+vBE1dQv+HUB30NbzGy9+QZSfrkjlCDhJ9sYO0Fetc4iZTzwoU5CICzrfN6RaC/fVy71mY1L6iPqLjDgsnBFHY4Hs80ft2HZqJaq4giLR2AspPbyQ5qOu9SU7M5bnS6lL659y62GNxHhouyBCG13rn90aosgJ7WEoKu1+kTi5EqrbVVza0TvHMaSzv4ryfuC2Eu0SIwi5/7lW5E5juKad0AMsutQqV/4h4tPLdh4F80pxvPPGvXZlSoe2QnOgCKBi2jHoeE6zufZdLiDfPYhvwPN60ZWvlqCYyD8RfHyIInwJS1gINMF3FxPiQHplCBjtub0hrScO/aFwItvrV9n1Q6pwQSnoi5A4bcUSX9FPgbTKzmH3nm00m7sUXVeb61rql84ElOZRYnF9ARb5TcCd8ZQkqZs27Lozxgcyf8GQsHKU8LpPkjnqUa5aKyOue+PE/2EoAV+QSdggXfg8iiRf8N+9w3aKWRe1ky5X8QaUjAyN301CTdrHyu1fH1uAQO0zWfvI5Py794kjlzygC5yhwvsQcXxDgsbGXdJNaoCukTOPTIfHU9vrvmMonLjEzCaaio8KVLhkyZ0adiEwoQyp/E2YcAqdyakkM7txOqnDZq6pZ5mXtQpQl5VU+hpSDjAw0dn0Ec7MyyTuhGWtrT5Uj2V9ewguSXeROo6q6rk4iiqUYDN/pq0ZQQfoc+LbhTlLW+5K44/Zz5L88rO0L+JwN40pIJgOhQdauXD39YAzEdNHje0AlwzaZ1Dxw9H008Ka4o0EzFClitXkpnzuzYjwDPBjQ3WxT7fYeR+XqOZ/0vPMSVwCPWWIeuTQiR878y14FAWQEFPiE1Iby+9Ql0Dlz2Wsw7msXZlIPTOfQXIJIz72/KnyIHzvXRYf+7prD8xCEFIA4Z8tDlekiTB3sSGo/BsV857ZA5f7eKWF+AzEGCM6I5rmBQ0xhgdbqyfnzIJKKW4cOc03HrmAfPn+9u+bfXZEqXH49CSgKcNZVVB0p+eW/jZtmoUSWbMVAIUX6a1BeR5UP7sfbEwekUonhNXRLkOuWJlTMF0iflV162EHjdbUzar8mY1lNL6ilXSTwzx5NYlYUkqG4YXdQ1Wy46w2H1so8dFmt9JTnhdTY+3ptXVkggkgASJsGyiEq0aCtUUlmHjkXzIyRZQNitOUmwKECA2KRrHcL3pNLb6JQoD0aEiBiiUYrpJdFiFRDgItDK8FpTRSweyd1faQFCCp9GU2d2Z0OzuDLI3UJq8VwyHBQDYamiOesQ+0O4pw2w0wDNpNfZcqh3RkmvLD2Sg94FySZSgvDOS0Y5UBKTOfzlckNWRPdF4CovYs1El6xLKHcRQRtIksVONpZEfZUrhUDX6LR3QpDrSbnjgAkwg+469SI6U8SfZGL/JZ5/ecLtE5DbxevVJand6KKiK8tllsDaBg3Yut5DXr5kumNMML8W+eKKi7CM59fm1mBVXVcHYvM48V5dLV3gRq/slFBeWWn0FV4CLaaAAJczYvwMFqZlSMWJ0+UrHmhaRa9y1OmZhMD2KDAtdqMEZvpoXuGONrfS6fhRfqOHWq0rRk0b2C/Y/5k4OOIw3Dm8HCxuocjF5Gap3iMq2gdsT8BmK5TOZ2y3d5RuIbGduUlgMmsu7NuUPjOtG8rK8aggMM89TaIQ3ihvim4kfsuQq5HdKFmPpaKHRsIe1DPgd+hweVIUdSRInkHHTDkAe9wUD0Foq5hvLUloE9v2J3O4w1e4UdwueArGWmu0fijcB5YHpCR/f6XvY4vYS/n41jaC3rSXVQqu1zVk0+K0Vaq2VYjoaMhC5XX6WGGJS5ZtdfaQU3KD2NP9rO7wHbKBEomT0pnqOTmuFn+kWmDnihaG8ZTHplGP0DTYBHbHKWWyfqBR/Mia2lw0b93eHCwRAujhX2/D+jZimwMh30GMmnJR0lSoIG4I7sVntA9zsXBE7eMq8naMBt2P5KMrm7DsA+AnS4uY9dLoGl8hVF3HR9D1CZgcrHVsUG86Suvg4a5rykJbh2OJUNUB9gsv8qEBPjdxTn2NJKCqS8Xzs767Q69DpKVJx4OI5aU3rPMoD4njDVlMjeGoET0zcDVRi4BiZukSgwxaYm9C/mBiJQShAp0ZiWjAknTUeeqHS7XAIQuV4Jlt6jzqRpXfFd2/DNj8Qor6TSCzDjLziXkCGDym3QE+SL39kN8XtEnrwWLSMkj33j5HoWK2hOpQybF0zp/ONh0MD50tPXscoMEB4hdRHKnQI1a163NiYiUn0WvW6fOef+nlop3htU5sj3w59S38kPGflY0jRSVoHIC1vOVopwfwlXoGyAB0dURNVDxOMAR+k+gsDwfaBXoWW3USSjGbg+X9KI7LFhS1Y6d614pNpciJIdqzsSF8vJqShQgz49DbV9Q/bg2F8JIQr5CeRGG2Keja7Az05APHp71/BxPwgWRFDmNWEeF+Cm21kqL635Z7H8nGwP7PgAjtc/kfco+SBV3VsSX8CdDU4UBA662ysEEkZvB+u74492E1jHeZry3D7wz9MDag5j9Zy33Y/bH4BGwuPmS3F4AMTd0C/jazyBfiqFTVXrQkJFp9Q/1i/XuCREWkhiaRC1KMPebbUHKaSmHcvpYy1rmLbfDQuqbKO95Q2XFxzsDcOu/kx4RMkkE3fqtysUXdsL3qVtR3tRd9ZqiRJJo/PXnO8My1dzfFKoXEqu6oP7ed45avQoTrNSNMWZSXjJBqV5v9ZbqU6Lvyxc9YlWbOm3YH9EFEysSURuY58U/Jv6M63YWHtYycpiB14fnBpq2m1k2Oe0iw/EhnZoojWud6aeixlRdXG4RhJwdPpWojL/JAoyQJR3U2JQ2FNui5N2te9x8fEKzWJIJ+Jd77LTn7d7cPB4alMxAO2+yHpEt8RSAi5h/XirNpE1eTBcn5MY1suFb0bV8ONtuelJiTsWCrLjpY31U96yVFybOXBGpms1wnMC1Op0RBEtKyIlPROtuJrbA1HobJ3EIYZyu329dQFHTuPDWr9VPE8+IYM7TG+ZUw7VBN5ulQZIduP4DtY8+wlTvIGkpQE/YwFWNtPDPpRkReqdQFKCJlcPBto+iXeb6sYORzfEpWOs9z3uTOb6mZU2KqOC95MvH8Cs3EdKIROUGxe5BIeE5KIIWWcmKxgJq4R8H0+YS22mVqA86P2CdVU/mcFCr0VOXIGyXXbbeaev6R1oljLXxjAPOSDKwQlRlCUZOt5zSvCoMW66HxZjxgX3VYJCCnWa1JGifIPviEOd38o5mFrRHhFwA+UWOqvdx1mwQbtHc7TFV1kfazfa5EizdYqteLfQ7EV0IToucnS7xEa3xwuVK3Dhc6799cqGtW0aFprZMy4Ns0pyRG+3c1FyJEwFRQ34dFA0zr+/qNV976olYxL9ZDJED0Z8jZDPmwZDwAiBya1e43pnoxqroc3s3U7btvqeeB43tPlYUDVeyIY7p+QIB49T2wrZvmwfku/BWFjS+P4zm6aTxU/2nLJkp6ibDoQJOgcYyQHx9ntZkFPRwh7CGhQYg9wbYLagAKInrnW6Dzk759nJ7rF1iYzC4ARpwUtPVjiHRux8rPOozsFZfZw/zN7GLCXeoI04nvlaaap5GOjYgaYqBeM3Gbahn5XykiVLiC8CztglJmKO543dnL/aSj0D3JJyuwi+SsOb3au19oUa7CRU88XZdjDqWAN8SHJxZ/+Ct+YSvVp7eESz2GzpmXZM19VkP1iNDUpMGUaPG16UoKEWk2td51RoYlFQ1aRJq9mcGWe9eirk9XVqSuIZhallMJMnd+DprWx7KMTWPtxnGvEvRwy1eQutVKymhyhR3OALA1/y7AXhUGtdmCtbUEz2hFM6yMA1e2rEz9Q98KlcfqYs8fwLXwJTL2HsjI6COMidK4v0WU/P6kJ8sMtNl1mrg0fUaxyFcM/OyW2CkTUsuQ3oZWJxWI9psT2iuCWHM2Dr5grlwOYMLAPRfQeTVr1ECiEkszo7k2IGa2SPErgJn+yHqouPeQg8Fq5xFR3dGHZy58Etl+5FRN81HF0kZB4yRjQ9pT1Am167YWBTGemZljsnf2K4XRSZPBa8vXVXpWGuMHOC6un3z+0fA8M0z36Uat8JD5K+p+PcPtnDVwU71UkDn99ENC7LeafXENO4p5upHh+bpNu6/gEo08oF5mETeh0SEWyUnLmWpjRtW7+4fAeDvqdNKhOFq9gzTJZ89F03f8HXQB1s1yzAVkw3Y+BIS2/BMgdX2MyGIMb1ild/SrrDXAWFdQkYxlfVIKDRhwVh6VwBzXl8cWWAJPuBlY47LywgF0e60jRtrotZ7ogzproaKU1bQbX0Dnipr2nwhaIDslBs3xnaao6OBQHjavI7PC1eWRfR0jGrDDzUDFTeXxAVjhlvJCCbwBXV9lsVLH0/l3W1ZbdesdIs5wMHfwwNE2PoQbG2L71mYcv3Ko9zramlAHltA09VqaDZTZohrPc2QvSeHwIbqIEgQwQTawC1QS2hNIqPQ8y2vY/CJwCgZvI8eNSYWPUXtVgxYkwQ4zKTMCJclSAizXjYp4ZCUKSvuylkVggB7BhJXVDKJ9IKWqf6++oF7CpnBGWJ+ZUjmhdatb+AwgEmiymyNilBDEQYpoFX4/KfxM++cW7LkUhmC2kCMqP82QZN2R0uK0gcr2jtiaWhnC3+32YGbiB0a6Ayyxck+4LXxw0f6E0CIp1e3l6P0y6wJMw1GzqOmcq04Xo2Gn55fvCNsR5NikDMWPw/kvJKbQI2fCDFTcZTt3+CN8x9UTdOIhsCe7ZMYlIZeEmOpxpa8GKvuNr0bX9sNmxM07wjyMRD9sX+sbNFdXrf8EffkyJhpcSYDqX9KGXaEWEf5oEBbnFbGSWXnIIa3K+lCTdbYICA0BtkFenB16diTqsQMZvS9cE4mgkJPRyeFMmrIS0PK3p37Sbg/q4g5f/EX1q1Yu/Jn7Es68j+A13AgSVZ0YVZow8NrSo/zTm3tH8Ce2P//5+lbocuLfFu13g/j4kyf8qnsYjRiURtu4vR/RtTVIQsTrH0sdRbfvo3rV43wE63PPNkeJ5rtZB3mIVE9yrtnNVYb4G1JPJspTQCG5c/f03C5NT51Qrq0l9w3+sDOpRKDZJIe7NlDoTL1HJH+ON2vMnRYqYgyd1SOM4NcShKvKGWso6QqRHNhzEBhrx8QRQ9jRgWTusSmyJq0vslBytQ7OqUxIb8cERJa92F/QPPDg1GqXjbrWtJhwhQiIlA1rpXTifm06PhnkP0HODyPx3BKQwSSlwqTWIqEElhNO+3AdMHVv0+MQUXb+gRZiuC9ZDSq5t9oWwbq1fL5oQTxNQi1TkqcilvGI52gJOCeTv8qAZaWMwwSHJlsiSwYwH5PE2QdeZhSaHd4VD2VclnwKXIl9QaOsBUDwgqXpWE2GQyR38m77xoE01CWov6s/ojvr26nvgD2DG8znlbvl4j1oFE5tQFOEt3nfnMMxZtJWzud1VX2hUColXkw/3+npvhxjZ5YyzLj+X1u1+cg2burKiy1uuk9xBn3no+MyhWUmf86Sdlc3K+Ln5oH62/m3vs7lnZGjb+ppZmYbNyKfSrskP0bAlgexpDYcMJ/TmGBWEx38cAwzH6NURrHAD51+qXK/WRrTgh0lHocij9a4ycYh3PwfPi7Oq6KVwz89kIQNsiLJNLNvr/qXbSEa1unlbA3WLNSOxjPs/9FRL/OQJTvTMwaKBzLH3twUiQX6lnQC+A2qpNb/zCxzl0KFTBy9ko/iBmmKtSiTSb4HzJGgVpgsjZQ/ADaJSkhNjssIIzuB1i84lsxjRWc4x16XwONFo5pWFRkqPx5OYl9151xJyB/HFC80COD9bihz8jjaKQ+cgd/IQ0mh0wF3uNAAn9mkGucwkwtlStHB9U6SgfZbr73RRd7H5WGBjQYWzCex1WmB0J1bx/u1AQiWc7+VweODSIoSLKxuhEqNWUBYnSvwmfuMRUvJldplCX3hp5VVbzfw8Ze2wMGKTjru+57jYb8d041FXoy/LKUQEP5AHLcYjdUCI1p60o9cFXGHfyEt01nrej3LdkZoU2FjZDjmR8ifyxlXmc7f8GlaUr+tP/pKJSayhE4sftyixFtsLSXsYOuVZlDFUErykxGH3oXSiijKqR9MoMgiCa3gtZPpQ2cINtTssPXks3RCIzylKD/nol2v6hlOw6S4KsQEQ7PrWL9LU5CCBkcVcdGaEILid3W1UgFyqIQO2VWgOmKD3CgAaWYK/BQkLHNd0gobsBsrTmUt866dYHhD1ZXaI06ww/l74iu4Dg0qSiYKvaTr29mAyoC6NJ8a5mbN0M3X7EiSXCiWQXuSiTHba0rzaMRh/FD+0IWq4z3DdGAJ//Wzycc/pLpjakWBYXht+UFXQmUV5XCQc06SG9prH7KBXT7B1jGi8+BoY3/IswJ93K319UwLOJJTQYUSNSJu2WQaRVtmS7O5LpmWxorvbArnqQKmc4thcvL2HdgS8m3SAIMV92ezMO2nba6FX2kxSdhy+4K0ojbqnihlkpvR1gpaRVKcLJ+/8vrsujKOrCXn2W7gWUiS3tifYwFbr/UaMn557jPiGyVl+y/PI09Fi5FG8ELs2flWE452C3fD7nKoryU5s6yUaAxOZKpUfUVlnjz3gLukY2P75DG6qyvaUo2QM41AEiGZ9CmL+c3WZlKiczWAHY1ygZAF3xvudqOiAWpXU9LaHYGZVTEQZ0v2hN3B7dlM0/AjUKRXnrW6JmWHaxR+VAFbdV+lL8PI03XAZFXShVVHu9vBnY1K/iXAVr8X7n3gDGZeISSZOZnV9RM6a9iLqU/MYGoVpvei5mOfcIzjqrku8mOWx2LDLH2YOmGLE802mUNvTgPCdgzY9PdbMMBvkXmfTFZh+haRhwujSu6TPeYD+mSNhfRg6ZLNHvjGxMaOYgyChGZv3iNvz0rdhqjuGfxlSSQE2NvpprAR2B0ECwe7A4kidC52dSXZZLzhGcjkRmmTGIv3CaDLlS8ZMC3OFU6rCZf6ACl8rGwyWe+ubZNc8ZIcAKHKqZcEyxfiAhGUw84AjHJY3c2fHLGhxaBMRb/VuS3adg0O/e3cDPV2hrdBTrCYKH68fqGtX/Mvxrd5uXNMoIETdcqj7qjgSJqstTmHSpfDc+J5TdnuxpIRrpDpREsUjY8FNHNjzyMN7BV6gJTCKtydIfJLIXUchboqK9wEknOTebcY4kDgpK8RQUbGdANpL5fK69N2UT7QmJUkCJ81FKWvk6nHecbv31S3kzaF66D1bBPhoiYwbOKTqZyT61zJLBtMO4/eLPrgZNMthyQFaDJL/d+0yP35BpeTZkRpRxRDNnNNhFtvG3zvKAgTW/o1ZZiBLVWUTc+PM28p06pcj2sLGj7DFTcasohzlWn8vdaEj+KzaA7Pv+fFxaY3WCD1sbo0snHPk4hkWGwuaUyZ4iugi83MF/Q5k4GfbPwMG09ZdGB3Ozh5++B8+OmhLSdiQhiOPJ1rRRF45/Mn6eeNE/UXUltc2I/71tWS3hFY4aU7lDmuDJ+Dz/jcSwfUu7VfeYpm1PHNhXhUlv466QL1KIBh3dKeesR+tuyzrcCX0Pn56wGFVV+PhHHCW3AwbdS6v2gI0wxju1YjCekD+duqyMEKYaHqKpGLvoazlIPhLI8VvIrvYGXXNB20hj2jEHRFZBU6qHuWK2c3hWkfbzQ2h8VnaWj5X7A0vVTY6yoaVkTDIaCtR23d30yDWrNHAMBZanDr83Je6pMxcbuElsAVzF/qKrLNGe019BZTIAicSOmlFs8iTv4MnhQeEWEyeIvaZpe4xRvQ+h4LJJWQ1QRfGJHxexsR1mEvv2DCjyhBZeDi25t7HHq8kKMZqzukHPxTksP7mvD6tajXGlWulAm+JFTJRhjJ61bCvMYSdAxZnBrzrPWJXytyuXbW/AOcp47mUkWA9I6Q/CgJ4c0O/ONlKVxWkDpSFP6c5QQ2+a55RKtGs0vFYXPVNrYWP5ByA8zFIXnx61R/ewglMgjtdXYk4SLhLFU5pWe8oUI2+rtILuI1WmIB+b93J7Z8Du3FkHBwGOWqBwXNxvO4VKxe+hnNx+J2pxyv+SiCgswvkemdDkhSk2zW1meZlouwaSSOUneosSRyHhCDzpMOjSRRfbBIuWuKdcUoCh3N0dPf6MdwvFdEmJC8uX4TH5suAnw889pe1bqujDjo8662n+ACecJd0cLSOQpLgbsTW9Tb5hl+ozZ2TqJwd6e7plnHPNxiQHKnIql8/OHog2F5s4gwU/iq5kudtELv6Fgga0J7qH1FUEFIW3S4YljVEyyPy7a7FyPVFsuLKlDPdTEMTCc+uMWNLQrl8yaqe2xF9R9hrciPkvd4j03f0CkHSsV+PxourlrW9zqq4A8AR/3tqqplJSuVs9RY1tXk0kJLU8pvYMbGa2BDmSaZKVlrVqx8KvRMNWate8hW6vDUloqsiPfESAcvCIm8TQy51ScQTwnSK1+jmR3tYnekM03fAjbxDj5b5RGwW3LY9wsUktHoZl/tMeLpFNsiuHDcr09aXNd050z5zSgLQRgw58P9ExlYVhG/lemk4D9/ZxMOru+ICya+UbiYFE4EoMyRe1sG0KCFwwIfyNPq/c9oKt3xGSPAOqyyc/d7QBdtYgF8l8jcyt0hGvAVNaE1CUiyqV2me4AAjV4RJBFD21GIzWMjpmltu9joIlqNr77vkEp4gr+juIrRe+65nI0reqUzNz/d4pzinnFsfQe/w/MO7iW9TKqC4RWsljcZ82HUYdQcgvIGYY7FduK2ivMydejtFbcZHIF0IaUNmbNz9jWbG8RTDFYncylAZYXI41JBNsa5eDyc1jIrOA8IeV6rusyaqGOmBG1f5DSb8TqXTBRy4eNEBKywcrcyi/n+j24J4k5OcK2iOE0eubLvdDLRlSp8vfJ4OgFu4wZEix6b6A41V0sJ+xiBR60PY5hInOTB+TEjwRBMREUtUuviRFPkwW6J01zIhOcYHBHDgXA2U8IFwIhmYJVYCRiKWtUA7km4P+uqRaEC13J4sIBxgq1J5bWexSnkv4ukK0iJSlVM09DCzCf2hIwoEs6dszcLSvLZYnJ6slJCJqCrRuwXtF5aISuOxNWr1tm9zC9hTI6FLD27gnHuvIEny4PNiIh1E69H+4XIhOVKYoCZv7/gBBMdJIvnxwn2rsX9TwphhrwCbk9mgwKrkoqfMJyIXpp/LOU9NqFB3/FFwX+4QAOlLO+TONXMOD7ZOfbIdVr+XOR9x1G/1eKfq/dokUKL2E8iuzeio1v8J1Ovb8btRU11/QVVjlOEzsdpzizwTjSpu4Y+74opuXX8WZBgbM7I9gDqkglueR07gKjIl/yNZTWW4aJ/UOAV47jimE/bGbxPjlZTmbKPhWHp3XRSBgo6yZkf1/UcGlsouG1h/OA3XV7baVE3eYuF2k6pOkORe4+TcfRaP5N8iNOhGqOSNx1RTlZPZqz1rqsMQ5SL4JYx4kPJPEBQVY+KefJAHAf7/JB5pLNcny59rTTpJJ1bebGicjSgx0OpzJINiMNQYkYp/2sUMUWO5QlvN1Xn8DhZmip5LlxdNrswc7brbiJf4mv/gpCjZjWtpy4Waxt9YGrZ9S1sSDMcjvrBINCvMHAR+ayuHo88wvbTL8Cw8uFvLUKWiO4G85RlEyDq1KSAUT8CondJCLL8whDZCFcHlXDRXBT7+boHIEDFks69ydvM6+T9TTkESKMoiG1qZdRWhR7h99BsVKmZx4OOr5afxvzHLbdLjyQMs1cUAbM2ClY3WTTVpCbK/c4/SYflPkcKjJIUfpHYqMxJdjieNlnjOIYgbXxfbwAjXhT6xJkzISZt/dyA83vBVUicDlCKULtOHW4UgS4YzF9jb8hi7VqnY2gIlMYtcYBjXYSquAJbNPm6vbnDEogXxWtL46fPPxuVRZdO/d/z6/DfF5uN1tpCmbOIDIsWIB/lgLBfwdcIUWOqFkRFm0Z+LsO9byu2Jv9dCpWZVCI8+3mIVKFmyrqBiTsV7BulWcQTChtmau7uuVR+In8C9bsXhVqsKgHVusl4w1yFTrhIW8d/tqXReF4UKcJx9jMs5MyWmYLUwAnBqLCmqRepIj+HXcEpuZC1oNQZEkcxGrFFw/nFLfK6gKbO2WakNdZpGKXUa+6n3249YJ5Ag5SiWaM5ixsmhzgpYwRiNQcXyzcLEV7uIuktNHVZvoA0wfMDSHt6Cs6tWJETxOYArU/pAa7370ugoOkEPaktKa6vMsBGgj+GjZ9hBOY2cY+IqvtDXkFN/9uxMu89IKLsaO1ks8EbATqM9AJaOXcfr6XTYoX13i4byD3wl3lf22Z6ezjyZFKownb16fD6lyIrNpmMj3EiYM9BIentC88Dp2wePA3zuWDLcAFIKkAB8ZWyFxpxnAr3ivtIOLKf+0LsGgmvhlfBbPnLoK2/Q1AupvYww9eSxtJy2fBC57aLajVoKTnSZxUbZl/WpUN+BaeeiVhh9dFAPy8inEhg2b6whwRYNRxXX2eTSID383eSySfxbsxfYMoLWOsrcXAG1kuyfpa3pqc44YsUQFuan9G8rfdjgFNo62R8M5FZdEWvd3Twt7I2zcuRyFY5Hjjl859yJ3d1CNtrhCJFz5UJAO4/e1TNUseRZ6aUZ3UoTncH3J6keQ/VAlmmrtGc0oWkywK8XyJ+oUuLvxhRKHPEKGjCYplG35niBKu7DS1XElPlHCrWpXTTWPFErc3E8EvMPuNaUygwkw535d0/M1TPFFYfPw2eIlV0ocqv1DbBdNa3DyRsGbuCUqoEp9wBnxOwMsr8dVsrnqqn1sx5SB2DCtX4OZWWPChF5vRwMuSuWS0shK9FcuGJiFQ+29Xu5xAfSMjgoR1XPcPsNLA3jMmlOjtNKwQBaybqGg9c8JnRy1PMeN7i7rIfyyFZccovQk80ciPWifAv0h9Jt8gkdtYfaqwQ/SYZODjETFQl1Z0eT7xIqoP3EowStAP5yYxwORs78ahl6M3MhiFbns/2lpq+2pqE6efyp+a9p2xcoFwn5Wb1OxRDrxDQM6TJcJaIXSxnpoQCgiQOoMwtFL5JdmmQnTpONriwwWqK4PP7OzX4VKt5ZDku2vNsqlUzhOv9iqZDmORO+ApSdVBZnlRmzL4TP87UniolAanK3ooHjaBkrsj6MGfcg2kfVV8BJBbxq/Gm8NGRS1IDD+codM7mGlDuUsAJKjU81Yy39vJh6NkGUrvI8jTmUYldlFJ/hUtkcDnlt4vYkzz4C+wRIbNRjZj4xk/8p927IPihRKaQWNnza8077VvKcEiVwVrKao6MwUGlkhfp9YVYw05dPJcGRjC9Tw8EeoqIvbHGkw5al0kTOkpLIleioUEWvAoaUu/Vadm/q4f8ZpXi304ZqYD6kJzjVETrIM2XEy8N/A1Sv6AqszqZKw3oWTEcYlIbRQsm/0izQMh9KAqGoyuxxUWbODZx849uYAVcCJkhZzUudZly346FWHXyU+y1B7SxiHKFIrRSoi0zyJIxQMU3eg12BhFQU/94cDuW00mR1LIAtCjEdcnOYS0NJtJIo7eV23g1LaNBlZUibh6Z2NRBBMOXdtAXPSiOGYZ8Owhte1p3U2rRaI2HFBrCkYq+1zoQhOMRmNoHauYZAymMalICZKaoNvQhhtME/nIih/ALm9qBSyjN8dJq4BP+2RKk/wyaAix/LAQBMsgNhU7zdvk3+mT1kYkFKsWDa3ytHhaiLSHI+agukLCGuHKh8L0zFjGtE1/6b29AFH1PsGUiu1mkE6OmnvTkCvUrCZn26CirZvDZT6OSd6jQrXGs3eu/nLo+lEbPCJKHMiO/SaR+DnNYlZyMNOClO1emzgYhl+u4GzJNciQBY1A1zCxXhdD6dnWC83+YN+ra+FdArKidaszXdf/5akA/gSqo1nw9ZO8Kcevh2sYnBzw6YML4g5OWR0D8i0aPRP2dkMfe3bPRgSYhz0UicJiwEyfaR80vswC9YPvZauBsyyNT/NAnaLRr9whxvHr0YABpM0SKJxHbdVBUVSnuQJBlPOVJr2EwKMwFAbFTckAeOppOWGTt+WJu66fxkNWfYhY44za92P3p/4lBx+jFWVgZZAXGJ6oIqZs0TpwXqhLS2vldR52AjQ6J8lOwapcu+79rHefF6T42hbQBaUNMORuAS8dGLFEos3qMKOVF3TmRmDIge4ku9GEEXG2nR9VC6kNQJlSax+Bs51B5gbHVki69qKz0dPBTSWONVeb8e6yjmINhLJvJmF0KDvNsNj8F3bq3udsZPEI6i2OxdKZaMjwrp2FLGKkKBUQLA1nTKfRnYKUW91FqKVhSeYTpqeCZTqPmXhOrIRWQ3F1WvoeOFktMvr3uMjVFHYtgUrtTZgHt1ijESSSVKFyEte2isYfLEyWoP6a/NnxIG9BF1pmLaIHp9WE2pLWIG69xTbt0QtB30aR5inyhIIWGIbkbFOCpiZ3anaLrBU+9x+dMYH4nLkIPuIbFRUVe0zfsmAtR+xEJkVi2X59Iadl/z8hQSw1x4eNpYncKNIGeUKXRVFZpBOKo57gwkrwbjZQNSb4NQUkek/Shz02Q/Nyua8ZWZOb/MEe+H4Mu+1nWYvaK7SOHDGi0YKOT0TkzdOBFqHKJUa0Vv7ewkH/yddYwF3kLT/aIEw1rQ/ph49uZHzQWMZrv/kUENvbYwBon9pymPt2IFenqNqe5X6e/Fe+bOOw2ikxYmvvfyRodbLkA/OSHfKzfWYZe5Da9bBAMdpxtOSRONpfzBX6VSr6K18/mwgS28EMu374l+cl3+FHYdnHrxtbWAUWYyz2x/SjkmH3yEh+YiylsZXi4/jnDuNFk4xuugvY9P/xFEsKQNX9Fc8huswgcRTV3xS7AfGIYJ690fyYVutgLq5rQhAROB6xL/U2k8rotkTk9nUEOst77wDs99LyMkkjBjzoprGZRB6Gjre2ooxATEG9wK13hszz8hqrYFeR5SLNRGafd9dHaQiHjYlxA5jRgUvT/nmciTTuVxejZtE/csFQKMCQVfDYCszK1qfp8Z63VWPvu4+po88rwd0emZUVirSNdye49QrMJz4nUZaQszL8UL90Zltf6P0F7C757u7qTxX9IGZyB5i62OHzVV84O6aBvK/XuhQEeyIMLEJNxdHML2xbhAV47VGMIDJM2m5Sc1rWbqwaH+Iw61Aaikrl7gvelS1ZY6NKykn5BWxkqQ8cqQKFwkcRbCIfsFFEY1YRLEEsmqpSLsbWtjAxNFIHWS2ZLmoi2qIyXHwnmP4TZK1CK1KZUSmNPG61BHx7ZshZHokKlEd6kT51iTy2fpt2xF58FEFdAcI3VdpPP3MowVpFqO7yypiFPLGL9HSQrWDyKF4QWHD9aXqg6pDH64E9PojY0C8t+B9L5Y5f4Qm2Q1myOlhJ7zVdtOCP8WXm6OWsl6f+Qbo0EDm2sOlOxcqVrvNdTlroHI8bTd3cwvF0dAVmD+ua9UzuNLHSPiHMP79x0yPITEYBx3ANdgQgMCNIIAVZcKjcbULrkpb7RgPVJwI6A+Zh/YXgSxmf0UCQPVKrYSFNuYtu/+FwzkzjuotVwhwN03xQB4N6uu2tlPqmOnfKFrIVCHX2mATAHnKJsR+aV55oHo9lQX+wc44hW9F5fh3umJ+u7GTwef+GlQCp7dyaOK+EPSnlprYmezVxzSkyg0d/OzWDeQ2dSMhYVtsKHKUMO3MQ7b0Pr8hICjagqb0AjB6LQb5zoTHweWbXdC5KUgN7S809w7vDUbtXKk+HJjrQE8d/UeJZLJ2ny8eYu6zQ1qtWZkPf8wfOL6UHZpaGpkDwuQ/rgAItq7OzkZaDeplhfG7BpClY6L5ih/ZdMrnjYCim2Mm3ITFMd4BCQwytHV5I1UWtYsL1T4NDXeVCB1qrEqT4VWJ+Xi+CLG64mTg7VeEuEU7hwRnN6v86AhsdZ1A6Us1IogseEE5E8iORLWZ12yugEjQ0JKROCu1FMwWMDc4Ht52cdg/wAmBLxokUVDqCHSILMLnIW5Nxxdjc90tjQFBVIYKqoJKI848oVPWciqYJ3ouU4c0hi9v6sicBQwdFwCiONO2Hew79NLB0cTJIAwJ7tpuuue7cxA8AqU8Rvn0xyKokr5Qy2H89HJ4Ifl8koxDQw1+nOTOw/dKd1mErdWNN2/8o3VgoxvtJSUSS+JKV7LQkpk0WQXN2Kpt+XRobztNo9rar+htKo1czYIS2f08hRAD9kVSElanpyQHsVcgbokAaCGns66cyPTXKga04cD3zt2n1gxJgnYKSmFNZ/nNOJkmdApCy5kIdVi2/gRsFaFmmkmUP0gCTLceijKg8aQar5KcE2Lga50LC9UMbrZaDjNf/nsxObApCZUhxHuiJsmJDBySDLlCAGqqZxLzamuROaNh9Mugnjy1rfsyKcFjZKSUMAu0UtgWdYAPJosM9mlwsdFsn7PLaongVqTupoAKC+TLQwqG5kys43H+RUpcaL3SH46VRM1Hm5ICxOTyCJP9p4fm8kX9GRMnzieOB2qEIu5gH8FEnkbxdl0xaR+vKMeHbNcf0ElLTabwXaAMs3Z2hPvgc2Sde5M1gel+4wPhmxO2/+x7vH3zPb4GIaomtRMWaKQZNAbXRAa4N9BFgoBbd/shI7086YN2ux1tflJtKYwFg3Q7eCgXEL9GMJnbiiHf0BT7pt6f2NEG/pUDJnXBm2JLoykGdoI3WK3hw8VsSo0eVwf7jr8cEo+ostHdpt4UompU4gh7YG7i7kzwMjBGY5NJUeofHl9srWMzGQc+w+8d/LFagLSga5SY9RMi5vsVJqgwTE7tUW4nXCJE4A0STq+iptkSEf7T0rQOJ4CsXA2IZdr0VkPZU6hxSE/MIqzWiylUnzzyqo1S4xk6BzWvT7S/XOP/dGTSSAJVeNz659bRSV4J44O+QYaQs1leA3ISs1C1H85nCFR3Q+IATgkoSLTIuByKK5rFKuIqSqA00GaoJ47QYoMyQ9nX5sisoKr4YItGqUZ7A05UfUceyc9lxjdxt4UlC78B06pAki5gZ56T4P9B0eVzeH3Ho89X2ypNd73WtcPX2z5kmSUEgeqmvegc5pKCyDxT+rPoivqsjd78QPgZvhve+8DbtGdr93cT+RvNM5xdOOfd63Nw/MgVTsIF1u1Xc8o1lrDm0LOkK3hO/26JpRRlW2v8ANAwTfSvR9G9Pdslo0ijabao65AE12UfWUyGcouJgtektJIz0Tkx6/gdlnADV7ShLrrTzjsZv5uRQvZJ5fTAZD9YQ+1H1A3h6hwgRcQGsHwTAktZKSJJeA4JFr8QIT0luht23fYsglI7mpnx87BSgVNro99ImRzO29tuoS5o7Dm2M0+EZLgHTyVN/4jY7I7yZLYix9hDpbFhH/FzV0WqjFIE/lj6P9aEM5GPVyMndbOIaIXExGWX+BNcQlwASPF1sO9+2uK2kaRJvuZLhy3t+cVCyiOmiZmPHctElZqNW0jWaeKkjBEmKO734MjUzwVlBYJX6ewdpJCVZYLuyMtju2093MC59LjmFCDQ4FmyVqYIqhRHdrt+zmkICUuBRdPqmKS+ucS1vWdmxGSLvYe8iD6Q+CUfJ6ondVOmWvjsmsQbEaOICIJmEKjGiYpTan3zzFImwU+z3vBsxlJWeulbFCN1wQpDLlKBA7ucGO9OlqWmre5j2xeOu7RLwNH+W6H6VR5gpcVdjGvV9DTeaKjZWboCiBiwtNf6WKgZSMVRilQJz3U5BmVZx77Yd+atWSTgV49VhKDumqT5w97ZDOJyZbAtgaXmyTj7y+p4Iiru+RyHDZjwwvJay/pxb3aJ6uWkdAkenqwJYX9bGWEcDK+wNFeoeDy8BGgP442XM7cFlO9KTuFrh0naCuW7E20lDaCDrD7shIcjSjVZQpnEPYO217eMBTSMDNhqZxdmNkxlrgIafpzlRVGN2PIuFWMLsfAdvBEaGKe3IG0i84GRBlFrXgJ0F4NYBzwoOwZGDSimF1l0Ee/YBAuNzKKbrQpMRdtsFiVQxC4++TOixhc1CvGp8NmnmnzFwlSqq9vT7v1L3ZixIXhufntQitkAUXrY9bLMF5wwf1tNemVFFF+mtPDNs1ayU2F178G015i5v9lQSdzYtAG9Bm0rwZnEgdF0S9VRCJ03SDxrEhg1aumxMa6kDdvcTdqNbuCnJ1OPrOsBg1kGlQPa7CSeo+Kr2ZPdK18SNZeAazCcFejp1W2HROepZBP2W6c0inkAloDqTTOILMtP0tifOdMn27Itp+fzHWE2+d77ly2reIgjhsvHt8MeVuyP5hdTpfdv9OCTGWhyoOz4aZEHha/LjgY0XKiZw+JaeR8lOU/Tg4Yfp3SZvyjCLul9W8D+mXiOfwxOFSK3dFidk0gv9yGefAeDXUOB55gy4DxLAZBEpMJhVRKbIXafb0PBgKe3pEepoOVZZRCk50ZqRlzOqnbxa8J4jekyLq5U4qlbEmQNJVl0d72hzqR0VkfXQvX4HFPj7cGcq+NiyMFZojYbQjUb23vaQpS2qKc2IFrhnpfRYQlxrdw0tPjis7VGZznKVOAhG7iRQyAVMlLC06D+uOOB6wFjzzLNCSlZD7cKrrfRR5/6ow3jzUwwZFaxIixf31cTtlWRm6JUDVbEJeBg4OqEdYZqSbybTneiSx30bRY1NZy/IdvpoYETNB0Wcuh3Pilioqxl4M5grB0gmrRz3ZEye+cTD6C7wBYn/Ckiu9SMfefHBPUD5tBbXIdSarcluakhdyLWnp6I8iobmkY4uKTgzutNtUndtE9yWuOHUiQyR5zaI1JSxPtu/Dvw4M38EREnlWm1EhNQ2FnqBjd6MC67wu81xSPTROnC05D5dCSSi5EP1F/XmUGPQZFktWNa+dVI9wwRCF7m7AyKPbz23cCIwdEYOL+cVxZUOc0TEjoUkFh+NYLevvGEaeLHJVvkIcgkg75RbzWqZ3akDjW6DtrAAv6gKv4cw6hLrWWkQ5U/mahEcfdHrSu+duE1zAgIksGV1wVeIvEzcdKh+Q9Zw4VKwJqisOlRVCPTWpHgjWA+EbQQt8xaDrotYIXjw6HdJDzlmO5s0sW9yLpRFko3X1HHrT56aqE6CWKq1HYIEp3qsf075ETcVgzuCRqE3vUFZY63OcdKXI6s20VecA7cUwEWPJ7hv6QJ0ZROZrO9AhZaHL6nieAvze5x/a2qC/q+jURdoek3TQBMXf5QExhxv+iqwnjJsunJCSXkEChzvK6kh+0TFBD0JbdVE7XHfL6m6KnmHrM/KvHJFAAGHA6N1JP0e3NBZrpa/2SVvSE+XCyx7+OB7k2r6i3RdrZk99ZSvuQWDWf6MiAVitTx2o3Qgntz7ZNse80/aqQfY8IF8AV7Vl9yM3ZukVjTeR5ztMW4A7O/WsvGTppPggUz1VdOVeu4qGeeKpnaRwpaS8XlZ6fwZvVdAHlFeQQXxubg+Op4kn7e2WEGC8kgen/Tgl1hnYGK4QZCtM7FzaMlmDZjYnW68G2/DPKukgPVFYCckFb+PG2UOemJa0a0S4PgCuEJ2OleLBSbwTn8Xhwks2HVVK1x7WeodXV9NvObRx42E57NPQ9nhg5Fu7AhNgzWUnLPi769pXtI+8A502EDROoTkqATwojl5ddo0kvzrblZ6ooj5vWq3v8OrqsFFvC3XgtEf4wukxewfZqCv7uNctmucwfr433Si4qyhPeraTmr/CcjgtkgP4xJcWUyrjQk/jpYRweooY605NEdNc27YfnUydD87L4sC4WJo7wvIHlzvYdRbfS7LdvENBMHOaVTvkJDuDVz12DzI7esrBk3eudwJxx67eDba0xQiC8wEv24PbnTVUO3Sh4V4ZPVkG2Vax0Ad7+fCQ5udRd6Vnjac+/s04WXPFj9cCzWiB8AH3RhvruGiGGbSxpNIh8Fr+DGSiK6FcG699Xlfn5Oxldm3HV0396mP/AybVBFLGcHmNq/ORnfKJhitoweuflo4yKteqnJGzsk+nd3ZuZcIB6lNvcxvu9oddBfX0nQX7mxLV5J74HMP6BIzOvMisGCFeL9+A/HRFz9mC1mNKRn71rU12SFVHzpmsoXb/znMFFY0twmkCrK1KRkYSHG128uQBz371jO5gdDMrMUJTJBzX8NhgNLz6wCF9VX8HX549vnFA2S+0IiiEmdu4QiwJezBRm5Lx8Qptd6+XwjhnI4Q1LUUGN4hwp1A+QI1BWm2EM0a9tteI5ecoe7a7w65OkdViBbmr50EP7WZAnvkht76eehvPd2rS22dpjj1xFce4zpKu1Hxb78/5eSv6BcqcjD88oh3P2wedIpF5fS795hqPr6ES+bpPLN9j0cp8Nc97tnUsz5Nbbhj9IhctUxNpSMLv/z63rkuigdel/Mh171zw7dT3bXnhvfSKj3y09RrB1Zhun8y6c+tItUtQZuzFbGWHtyGPiclwxy++nTRGoetuT1zJheKZeN3yeEycHdGMlF/TpcxugRTBbr12+PmWN65AgFTfE7mbuGSuXjuNG3pCF+7FTpLo6vHodtk67ExbvBArF3NZRyrbZbPRy9qdxkTC6hFAZDNlkcb4OC0NCCY5z7Ta6NrCfsfsu0Jn1PqarAq3dcxFQwYHKlM6NJTlF47PuKZSLaLSs2zqXTQaqBEZuXRr2Ih5+gLuXF6qO3nbMGRCG5Nr2RVrAj5O3GQWhEy5j503qHTNwiVaryYnbwOKhOx5TpRHxD3urGDEVWqgKswMCdV1en2+E9uJ1ndnnYYwWFIP3c64+EyQ07CwQz3ayPLUBHjsBfXXVBBx5uWlI/LE7UTLgK79rusVNMA/SivFGxS70xE91FE/mQTXqxiDxEVXcmM4DUG/YLF21XrRaTXENDhjCfOttJGApmIQsK6N4L/55Mr2sQVfO/EvT7lzYNI8UpCj5heEz99J358NStTls18yHTl6xC1ANrPultsSefHcgbNqoxQjOEH/ggqOWhamSqFPgMuH7zCcV/3CeBIwP/Sjoi0xADT34yFLqAjS6yoyw63tjptFKVxzRN4cFeqNzBGat4gLngSKu0jXiIuhPC2AVWK63+EcUIJ8ImqXp84z7k2Z/qkPYI1qOrt362VBMcu9YNnjIHuW9IurEc8uEH4kldcg/YdmIAcmLVV+tU5w6f4uUzVOpKfD8luKHiIZoAeosgGdyUHUdHoxxnD2u02rLiNC8DTna/f2ofGdjpQsme/Qp6SU5cpcB7LVwLEAbaUQpcx7OSlkNaL8+wp9ntPQOXrpeQl03ncsj2hdaIGz/WV6dpmlBhNellsC4Nz0GDGUMpeVvba54HAgwowiHAP1BD3PxTUabRUCjjtMcpy9t7O8DCDN037WcZcFKs6+B0K61AxiRYILbIVUCc/CkNFksQs+ah4I0d5WHXZioikJPIGtnVe60WoQqBUN4biqmocawwHWWqZ13+VnRojPKjkF7Tm+OkPc2SMn1WHJr+RYcYKfvPw5rx0yVxOvxlnhuzta3jUqSBsmJI2LtJQUiO0CsbRpUK1zlOdNEmI4+h7/CHStbrnYLhi+2ExfXkMtzAmHfYICJX8dePXa8+rqoRrwUWqZdcGH6rrFwk7UtToWHsc4EnzSo670LtU4BM9Rk44aOqy6NviiI4IrHcGQ5jEWGGg4T8T+mUqWsL0F6iAtA3YUCHJUkESzB8xBfvDGh87ETMmHUQDUUYz5zM6HErJwvRvrZNdENSQ/RpMyyLL6U3oR0qYjuKNOqrT8wokv3/0xDzOv0w8Dq+hcA45ymh/K5l7TQHZCPKQL7dnBmCc005smGUuG0m+vKHsB3iY+d1qUWq8tldVj9/gKlVKQKElaj0fesIb6Wlqp4FF0YJnX3S5dv3F0bAjzLfpxMwWxs9rBJt2CHRUN30E1/ntR1sefM2VMWTsD+gjdi2n/XcwppCeGoZKtytvtpGPp0Z9KhJbTkmGP1X+4RrV7d2VLhntHoYTrCjfKy4FzpwiYzvIRJ+9f5LQHPCw6wYUYXyYlNyCyHvJqbQ4ZE2I2wteW5R1lxE6eX4PYj+Vhv/UtaLwp3VrliLGwGu+Ub64eahJsrRs//I+nJEF6HvkkQsJDaAh7ugkM+TNHPMQ38Mt5L0NRjI34EpAqJTD4hq5DE7sXfRVDGU7DoFv66bSz5NgsVnlEAbhfMMD+Qh6Hg5q8vLHgbuEdNXroKQsjUF8ZxqoK6cv+4bnau8Xzm1S+DNtF67aBXgTx5U/A3fKPfvDnzP17cYcFfSpcBMqS2Pd7LFDDCx5b+auDHOpeXC80+58WNgqJD+OLQX55HdUfh/GljucVOQO5+25LHvSncObjev8ikxGTu6Yecac4G+lEbu4yDBhsn/1wVFiA9mYkeCmh3UhNlqpS++63djfBBATFH7ceyznnsk80ojYIzaiCn+A5mYFboOyxa2/CX+a1dcgMgGJq1mhITrtCrejIyml25yblr+IxHJ3eYkvovA6miNzflDIRxQXqJNyX9Esh1iQN41/qxrHUN20mjnpMJPDgG28hCfWLpUhtcF/7yM4VavjR0YEb6gv1jRSyVohvyTWL1sj6M9EZnAmJPQT2HnrS5YH1gp+afwrcn8tn2xFjbNUTsbsxSh7OhKBV00MQPau9rFv0ZzVK1xyfQy/noacSPmd3kHPz5fdnAnhhSN6hKlK5vJBFEwvM1NftkDXQ5WaHkMFe/Yu9eGHyWw/wbTlsc8ms6jZrcSQyh3oeQ/qH5d0Cvi3qC4l9JdCqCL1YS6XXZfVV9b1X/17+gpQX9bXS6bW4UVbB29XQPEeqsdBhdJY7N1dC7ijnxcort8qpkwiAefdsPNVVWwEXRH6Xw/PuCb1aURzq8XuJKREIB7y5t2w8R2WjPtQZEtpePC4tI3tY9n/Oik6PXuIf/sz47Xri/QezvtKz1fkZn7R5FugCbV4JRRxx1lqbk/xbrbkyNZ+uXxY7WAxgerO5IRVseAdPV4RE4iXcqZGmhHXFIs6cAzdGKP/Od7Fj6jVr3V4UI1Ddm1lxp8V2UY+DYhcWD4tROtuOOgtBZgPW2fMiefpI3NSCTGbhf0l/oZXqLwhbxzhLw+ufyOGsnk5vnwRtsDq0Zog+J7YWUFA2pV2NvcQ74xHN3koibWpWYeUhrzVPYftVHaPk6TaJUfDFgZ9m0kv/bGNzdMHvE+WudAIOabeht+0yilR95KT2W7rtVlD2q/p0k8/PnZgezPzZExVabig9Ykm1ey0NCpLXxkUZhEnzwfUvxgdSNZ3EW/gEkOKUWRMOafhWeip8PfsubRpM/b0s2Ve0o4FqgUc+na/yZFNslgAb9RlwHZYH5Zu3Nvae0of35E9eIYuOmrqPVNZRuOAES+m0EEcqY7Y+7opYIwk9VP1kQzO3nH6v7jfJgTvFY607cYRK+nTwF1wnXgczjSRTf+fJldKt4x+DHaWD/tub4+2l/cCS5oKiZtjWdsQyZqM4PDXoHaeOOBsQ2XbrzcBoiNvLFBfe94ifBdHnClc9KOSmugAjGYe/fyLRNT0UsL1G3R/CP7obULIRUJp544llO0gbG8Wj+YoyXM5u3ZyKEeycXWeIpNk4RjB4NHmWnoV1LARI0p0jt8WYo+k2x1pSMgDHPTqDGvrlMAwiQqB3203MD28au9V/VXi03Mb5tSkjiAD13Fp4rZ7KzGCarlU2vZGgO2huGiQNpQm02B+8YSm781rhq/m5yuvFPvuKMbX14ytPp0dXx6s/ER9o7+8rMyj+V+zOber82wfFLtH/SAyEMgVddZeHMI0Rr9FY8UrNHVyu67f+vSyqOSn08Vw6XU3qKl0+/6j5zXar2nvwh6Ipjg6YleFEn4WdjyiB3CIcWqQfV8Q09iybTm7JZfMFG6Sz5SIoiaQxLTxZ4inZARnGl9/behs0xyZ5MAQnYiZdMzyYOFHL+MlOKele1Iecjd0YUo4mRlu43AKwEjLdE/U1FnMRtH9im7S34QhC/hYIk/tHWEfd6YAlUnpMmCpWptGXj5LVo/whuvVKOS8lzq9v+9Ep75aPuASpooqm3Y3hj8N06RlDSFkxSJQr8dnX4orQmLsHDRNbQK4chFvFkWnWuYxKBM97Q2FFnNQbV+kGSziMNF1e+a7PWdaXjFja5yrIdcOJg0pu2s7bI1JnbuqaC9TGkRBTncM/piWHRJ8LC6R2h4kQGF3Xig+gw4YcpOe97tamYXaMGg5ulGZmIcerLudHaBg/TmeD2z5fjiDvuEdCSBmHoEH3tatBLGzrcKtcr2itT/6K+kqeIGjsm0IOfeAMGnL9oM/7jlKR3RSnzcSRwFdAqCkz0swJzqPKDCxwuKjss5T8QmkR1cvm5nE7uH3yOx7+rNIlkIrnQsartSIYm+rNzls2CRbIu0scdFSMPetsCCiJZuMqYY7Bd2GIAau68Hu3ByMZaKZb1JUkuxBhOrbyLhA+c1wQdF2EvY7b4YJFlUyjSu7NkXb43kwIX3M+ijJ1DijRhB3CFlqPTiTXczzjDnj35XGajQS8ZiyP/Rs3HexvcSOag3h4v4QbET4CClysMrxWaRVPPv7Uq/1zMW0gGQ8GhjSaBFJFxya5AxAnUjO3Pmoqf+njEq33oYZJ2Djj0in/HVk2TatoipocXgg95VPB89v+QZ8YV0RmRS5OgKq7BC1dovAxmmUCLK0v3qahH2IZ1oIO2HZLD+VOUb/Es7vEZA28tAM3yNNx1uWiu0NZERyuCc4bdwCW62Qm7R8tGPBnGQHWVplfvIWutdgbWWRG6XG0iSKDv7nMfcUChG/LXeXc/4J5N70UnFs8z6SmXgCrs6On5XyEqZaQj4C4k+RVSed00u031LKT0sR6DQ3IV6aPBzbqwidEfZDSg9Wcxggxx2G+aJvMCVExZe9YAAeTnHZ7c3Eo2d00pflaOWF+IU1O16kR/ZK5rHs5lI+4VnCDHMnPO7ivYby+WvzKKnytsaEmB7X1YbdqyA78nifiUFNmOmjatynJAFbTrBaEaGR8wEC/ijCxSpI+wF/yDKfre3oWoLuYpepgQtJnK7bxSEhu2RRfEfvGHGxN5OQTMeYJyIz20kj2jf8arTicPevMEq+apTnKVGhmbrzg8G7Sy+nqchvYpVtk/xYEHV2j1r74rVN8u2ufVSQQnhoHiWj8qabxD4rgMabxqXUuTcn2T5y3zRMuO8h72Qnh7HRTQkZu5cTn11d1AWH8fJs894ZsIRu6HgznYiv6Aikb3zYV1XoqbgBWLvs4+vd4VzMclHsvquEuCYMac0A22VJGJrM3Ulm1ZdeLfVynkvrEL9BbwwlRBquJ/eGY0DdX4Ffle7WvKBTgGyw1ETXNMCy6dpnvg5R7oFSvQYFqKHOo5K2E2avidJuEWrFcdGUL7F6Cg/9r2XzLaoyzCUey1N4gKbgNdd8SfPcgiFUdHdv80FO+XJGiz9Ga9XrXCRUq0ryMlMDtrZDgWvkGS3Ubcqd26dyMrmtcae1PFt4KIeuJMeNENQbbiWWHmkyI7hD2x2Fu2/h/OOEpIPoxnd59DI5wuS5CsSJ/arImT9eWsYQ3s83kcRWH0jFS6EoXcv7Lp8LzwS5iLHPwe3ZktfdABVjrEN/R5ZJj52lyh08SiabVNxl4ALmN6onjNfSjbPbbzmM1hyjoAh+eJiCdvgwqwNudYl+D+5vv+tDRmctu4hzlrSzRNjT1vlbfHJoTeMZ76GWd93SEXItzr69GwG2LmcLZmdnKGpgWUhBqT/jvaeK7qyNeIrjMoLjltDEIKVfeVaTCP6n0oCbjeVLZfv4XtvUxW1kXzs/9o2uKuP6JfbMEiBwG+70x05MRBZxpVkkxiVL52+5ZzAZ+0z31k+uknizF48V4zplM1Hi/tn7XVZdYGMsRBrcsZkG0XunJ3MK5hhofzHU9zvRo4v969YainogPFGf4+YLod+TEoQdJf+b1AVYxQ79OGC5RgVHyO/ItRjRmSZ+hMJ6rM9Ybvo6mROkG5sB1WB6iDW8+VtWmB/9YnK1ZoQNzrKOja6Y93p3DK43pj/Ap2eaXExUcEZ6VadEj8vZwh6Gex106WvDAl2yA0ZYIjrudatYK0/O13IR884s3Nz2EigYps2c4LsgwF59rLvPe3v0UI/8VfAAxyGBdMv6yyRBXZRx7R2I4peMZ6HN/QYZEFKfz0T+uP2yFY9jnJzSrqgfqsNAAAkCJgOgiscbZbxNXX4CIk4qQdwvqxI0yhIRO5kK2cjiwV132LAT8wXwB24QX6L6a2xVztDKCJY4OgvbCVs3GXO+xuGOntuLdw13nr/rWL9idJf1lj3hvr34q413lDLhmdhbuuQu6e12PFUxYfOycsumfYyenjjg5Mi9j7qx1c4hU3uU98p2Kv8isl98bSp8VSRyM1hDe2jA+2c1t9p9j2uy/jwGepNnncGk737VG1tLNXeHHiLDNYBQrZH79EvZUuLqKKducdwLrObeIZmuwZ/H6GohTOHB2pIe2jCyCqh6Dw2CCzpNs7g3lbHQupWYh//MakwQu9YIp7AO8VHJe90VGzG59c+KwjhQVLd7KFhZjKDRxrTdMPjUkz2/TBogv9MRcvLjezKggdPqMB9vnVZ5jejYeOM5aJQjYwsc0YM5Jy+TeaS/FmPFW7VznbREuKwRvzIlWMafuik1/c3A85/xH+4B66M+s8yjVBogDNSYJ/sER7y36mjbw1/PxSGhpT/ttXDlwaiuuTSKFMoxz/KH9r33VHebandQ2vNLQqOpLLWLJAHs9GQlGzZ4sw5tOgIPmP9gFxX8gPTmtM9iFWObPwBzU1SKCs4KoW1KSWuNA2ZYzS4flQKbz0j6IQe84V5SGRuFEfqMjNmULrCScJyRzhukXRTDgva9AIUstDTSy6PGMnxMYxrypDU4OlP3c0W4PRY4Qirv9HpMDM7nGfJoLKVpigDlwPjjxspzHBDCmExkGEtoPDYNG7sN9UDekq7VecIIT9bbY11z5LWlcLadpYWchroXijgu7v3hg0TyULzLnV6Ufcm+qs2JGaNoz+fxJac4YbKvHMWD4jquHtT40HikXlXDUOEGQmpxSCAL3KgrzSHcZlmaGcpSm7s9R0UlI9nwWJRlT2gXybZGxv/oo+WHyzR7AweMfQv3PWTBH5ch63HDT0XWRNS44qr84fYBCSsXFejEEaXocO+WFqnmHqCxdFcyeRN4pnTulY/aWpoIhGNa4HpK2dwTmT5h/WZkdDDNwuMIJ2gGcpF2dxXr+dsTZRBaFvOllJpUjIuqUHxwNkqZZhBhTURm3VbnDBoF2YCTN665rDAyiphKeMGU7azdyj7kf7/uCFU07OhC3KVe1Cs4aYhjbnFMRSGMp9hivAKitR9QOodIt4kpVjosgeR5zCrME32u93ng44Sozs+JnaGYtzC5Zoz7jd/44yKG+5/eRJQqeb7lS9TlyDJZB/Ow5KGz2WE6pesbs1dUvCPf0S2y0xHmqIyiZ89EEXqBa/PxEO3lNHRsoOIC+75OHyEo9QaNfPcYkngQnXWQPXxneyxMmA/JJZ+zeGqkWaiK44IAJ9d+ekfcF19ARBxuctyK4Dqcx8c8khfUIZfW+vShqmd4kdeAkRivQcxQDEnb2I3+ilTPwXquEnSb8uC6MOOlr8TEPlDvCjhyoImhtKgmgbv5bdZoZ2xlKuBXjpxlcXqvZvgVoD4qCpT3uchHiCBiDR6QgqZMbWN7CPaWZL6Eb7Tm3SXHgTlkI542wJnE4FsqtBPiABFsGycajnDIYgLmbvAaJy9/RmVLGDyptChb2/IaAHHCA1BiVmwj0/YyUGhOmmVkPaz+gpDE3kFUHH+ogMyWRdtHsnuzn/eLw6i7f9eC5c4Xg2698znFXppoNtWvjXYiQJscySyOYQRp+bIpbcHUKXOd3acJU70RJvh/MrXKTCdLWZGEaisly5a1jKbUsXF66I5N/O7TfDgWZ6AabEmv4BPa76nPqkDMhlpNZ2qmwqGryaKpOMU5HJxc+arHZPCeGWfPfsIBzoaNCTtVO59h4/sJW3fzHEJzqRZMY568FC2EXrgSxoSp0d0tg9OtHUnTvoZP8Le6TsIbyV3jsv7F+/1a4lwL2AUjO9br23H1BcWH9ubPFLa9RGkso5D9kdw41AslaYZ7j+VfpCnLMvzTukJGCerwDN//ztZP1yeka/klRew6PSR4H8RyTZIIuqv6pDjJPm6Qd6iSPKL22AZNNdFmIonhtx63xGZHyZf4StyRRvcGSlXcJsnNuVYISI78xXHeqFlcfbfv6S2FXj0+h71jb21N+z4upvJkuNCz2mGS0w/xZ69qeRR6u4FmSioIuXAaPlQqLasCq1crVySOmqIsfE6qDeqJv4u+62FAj7g2SLO3rV2hOQ9dtGmn12elNEcN3jVhme0xGDjg02t2S40MtynmsThl74FTgz8EOKwu6nN3Mk5W9Emp+to7TQcfoBRVSrc+oXxrCHwJwdMD5AK4aTS4qfG52wL0PenNvVgj7HME9qLS4GE6a64HnGHaWIVNzU6QPua1ac/+rd+uoF+5Z5UfROQXrcqDim79O3HfK0V1HF45uzKdcZpJGo78si1g9SrMa7sNWLIQL6fpjn9JecNoOIyKwKeRTaN+R4Sq0nlSCHfG3KH2Zkgotthm2jcx5gPvPebGBlHTh+RS//KLpDj9wreaq/ff2PLfd5irvuZDqS1u/yEDo1Te0pwne0epOXJKqqG91EIXgY2U9gLkT4LoivSUG5x7/dBXqZj3qcc+4W8hH4IS/iYiu3lkk1v9Sg+TAF0nP9XI8HJYFStuIDUXSMZbWN2GKlHNLylJK9yf3spuprFJOENsvnvFlhoWwHb2SAFpW1kbUo6zsjUKiW9QpstoCSFXgSHmJLmIJc6VJKkmVJizQ/hO1vF/365d8deQPR8Lix/rx7UMbJjhKSlOdSRfPUZiq28545zxbz+1YL1f8+oJLME/jRW04xDZ6Qe0gJ5M73r2babJr1g1WMjovT0mHdt0Vn5WvFW89jctfyDyJ2+saC2R29knpdun+xZvawmwJ3/3Zs0BOZ45hS1b15ELFXHLYLwTn716pyWdcffqF0rSps+UdvWkvExafzgdgslPF2bclKe8387n5RFgGQZBYl7c3kOJXitJ98283AUSmbn4WzDrLspqXadhACjRnLTKY8zRkynB7NnWqoL5m+GPPGwDWSff9eCQn6dMWHRy7R9QC9nQtyjFh2aSGbnaWy/BC9ngSVersXXAb67B5Po+IXNDPn+7wMx4Up/36ShVqmiB6EdN35q4tTFqmM0Xb6/yWnOTaYT+54nFlwMhQ04oeG3qaR/tLWRq9iDev3H6c2EIuFBT33GSEEzJDtunqVUB3odtvJOyBwFoyIIGvSMlgBbpGkFqgq1e3K66DVIVP+yacwbwfMaa8hT3AeXWXnVAR0AXMNQ2g47rakPcx5QmdVxgBgZeCMy8SXI0Lc/BB/Qy1sLj41S1Z8f4207vvYmKAyMtzb9vU+vt3cIAU+vV2zt349Rifi3IGdi1BnfYOHljBUsH1Mst2bSpQgoWToZ1xcwOOFFcx2PXfDZdeO4Zs5YRGFpNIo2zERegTNoTzfExjifDnYgCjKf+EC8rQz9/57t0BhyZNzPDmK7pferFCQseXLZw0RaaVXbU1T/v0lcBtuLyiXCWnX+FA82skNm7PfKGiA7Gb2xERuN498CW++5rE+k7UsF6F8wlIfqZ/2LMDF3gnQRZobhK91pHrCUyTxXgcznVKGqYTd3jnG+5Bf99x5fIZdUBmCmvMBZjx4eF5w9WT62DYciflZUWOT5ydB6XjX9/Vbi14LSUy6SAGVf8YC9YPH1EYXNMstr21io1Ey5ONK3FMR8UrMeIESbMSmJj+0lFzCxmScBZG/qUJkWOfmzwmeIFkSjXdaZ6Vc6bD1J5FVRuydsPjoYfmtZthcnv2c2bT7dB9WQkvWO+eh3xmGgaskNz3gpbDDU9PTU7TVyiYma7gYjydoxrizfA1TgLhb6PvqESoPux3TocuonNMvR8fsnhoJufGH1rw2STrQ3ItXR63ZEqI2tnzQvsFr0iidbuv9nPKXx6x3KVvIOfmgqe7IFO/r66643ZrjpLEoq3yYSZb98blt99/1MOqN1Mj2u98hqu1BIn3egAiGHn4h05KcYBSrJeira2ALivL+CnAhKWCoqonAZE6L2i7m88Ax3s+twfrrOmpCxzS2g/bNL+tWQpB6YjWB1rnJkDz6fV5YVd2BFlhrjJgmn4+hdwNFLk4rqEyi460yA0H3Ydx/JM9p9FBoSX1OMyZKt0Ln0hX192Itey6SgULEv5qVL6s3p+I+w5zd7RKSVeZ0yF1qBiU6SjgGblWB92JGU3ru2fIqtwb3WU+sxhtp2Jw+vGYnB/cmxokXi2D8OTwqh53WjSqeQ+i6rSWTps2Yg6ORdFmLxso90hjPbvdatDQoHCxEj4v9saEPbJZnyMztMIzy1D4bLbgy3xsavNh5cxmC2Rt2gx6ZDLsYjtXCjlktA5d+lUtG1TsyboswPL/XP7lJeW5qGMG7cVQ8kFZOrnnFevcmQm8h7R+ZlsHqahvjon+mEc4meEluhWJmakrx2+pseqlITtRG4HM3ebKkNWlAoyAq53XHKdTWDsd91zRGtkMRKmim0MLO7rtA6L8ndyiOoe/KDu1YDPcfZ5r18l35oS7ZnZnFGTHql4GfqYS9PiolwMXkLrS6kvOBKMhGCXkMbzELdjDyOUM0QyLU3jcDczVQrHzXfIglyHlrlU7qs0IzfdGcxNCbTfH4yisBYu+78N9Kayzw69ajB0PNHZsIrEEqIJTdZBCbkeXuiHYSN2yjdor8AiNi2MPsM0NMWgih4n2DSsvSgV67Mzou6CePK+t85NUwJogduqAUFjSFLEKIDOv5YiCeJaY9UB4GTVLebTfTSok1EzVjnL7fgqbyWPWt4vSQFglv6cWC86dNcoF3f3zgNarnjefJhECAMn1QBo3IL+ESz/AkkNfuYyKuQQnup7w6ViIs6H0IpPa0zFgNzzENHvboXE0fKNdyndtJfjHfOVTN4IrGGFX03KI6mDaXVujiG0/Wqylcc+BidN9plp3owF0pnARzQ50uIzYxVNpd/Z7czRqfNeyEimtOP2mxPWALvN6JQhzS+vVUeE/bL9KN59byVQRP3BKzAbchH96PPKlnTJWC+6ZcTvXv2ONMZ8cAu7y3mXuvQYgFzL7cvWKVkDfevLSHG6EP+WS+H5rCzcMlCiOLBgZMTaZh9LuOpn3y1P0dI/f5RUG4vvWxd3pJ/is9H4ugnw5X/MDV7Rmcn9FitzTp5d1UTAUBwMPhwiIFqKuQcb+dXIxNj6AQ0FzYvktC/z+kvnieyhJG9aK+Co+ykh165tTc65pRNu8361yBSLTkXn1/qATtclTnHXCFzVT1f7k8UxdTIXopBitC9d/LOpPXTUG5Ko7XhoPei5bmeSBQmZ+4ipQbcAkE0sCHRUduG+cXycGQlbu9ch3GztCPwDb/7Veg/0GMI0tZNz8E3CvxgFoPC042PcPW/K4M5C8zTzNAWlSzSzkOSb6gPPlDcCBd/lz03tIiHaRpHz23LVoYEKc+TKa3u9lsh+kkSOljLyY5YizITcb/wN1kxSX8mTWMFcm85b2WRQ4DmrgmYbOTKxGNnUYz+kaMrg1BhCQufbhMfdtSz5uut1XqTWegQM0gW+1+7is5wNk4kf7C9oQk6DcWBY0yqVgzGi8mOXbB83q05gJmr+/UREEf+Uh/x2gSglfO5QLFJBy/qMGbgDIWqhQvjbV8wgBfl365mohN6IFrVEAc14wV7T4ZxBpfZWBtPsraU8ZuGm2N2h7Y1lYJxpAih7cl5s4biiBtYMqjKyQ1tD1hxv6Jhzyh8Suw66yTMGa/eStSQ7NbKo16b7w/B0yB0oFPm6kepvPZdI317beBoDakYNC0byEwv0YcL47jeMLD4AJ5e3W+VwvaDFu4giN0yhoLV+4Cib0hQ/XQohZwQ4BR27TFn30eRAVOaQONkif4zyXFnmNCq3OTHaEkOxxxakl8KJKuhVkRUfin8TsutQ20szBQOiy7CHnaxCYlG2KpyiE//Bn1OEIgt/oclm8t+SmzWIF7jWmmh+wtv9zynfbA8ScOwCBk6SECrZM1AS8U/oFUzg95r4kZ3rNFimFyR/j9gkQp/AOCreTQrYbudaVttTzgXAQaMcizOOCGIEOaMdUkvj5cI8WM32lcU2iHSD3VMWOYCQNLzj0L2A+oCiKZQ6s7ryI7vUL+bAaWRLUJzy/sJVhjhP+BaqXjDjo29gQlctF4NKn0UzJ//3rt5FDD+biPowFNUkM6eL2zEkeqJX+LZrKF2yMjX++AXJ0GSCXwmXROJ8oH8M7PisCzzLsEkYE8CfKdt9sOEawODn6HD5AAgbWE8/bPeZeAXPTLur3q+4VuACIpcwJdX6FYR3AHARwlCHkARcHz3a09hBsbCrxpynWuPadBwiXENIb/98NoMF3pI2/bejOZPnjoWz6/QYQxuKW3MlIx4W5LI3zibsIXH969voBaNMeqoJIIajJfHsf4JUckvsrKXS9vJnlAwgAv3SisMkcRM7zD2wK9tdPW7OLCvRmxFk2rp8588vFtH6fWFPquaNPJYEgjeqrtxLJwbfTGg/mGO0RkR+u/JhDL8FogPCeKLjuYmhr+DvPMH3h7b7ld6w+4L9+8xWIgMrDLLiXpVBoD0oB2kUT/fqojJRZOddvlxOKRX6YcjzpzW225GyR7hAcm2p5BBcSXlbg6oIf7SWXZ4Gp1ITZeWLG7omn8Zfc0pjcFqG4XsvLGu0otQLB1cgFoltlmcuRsGyc61FrC0rEtcZnOy3sEauufZ9QrO58b/JR5JzJadHau4eQ8df2yBZDc0w8EeygMANKYZIre5PJn9H4GOsHnB9GyFFoOafhD/FANK1/GKXLMYpHCsdoB4pHgiN9cZzrZ03ZsRIhg5BQRJ+u25KbzD+IBGQd2oDQfhj36B5bwWHjCFHqImSQzV28YLReiBZxDVoOeODBSlGXYv4j61Gcb9KVwPkoOxzAyNxpStvRvyo54r90TJZHfoKN4UM7Gs/FAUXp92DzHxXZ2LG0ODJcVFkHPLeYTDqWdsLpcAgFzm0mp/UktuxLE1mPCNzjsTRE7IZZVSWFG8lx7Kh0CRVmMmIG3BzuTbDDN3Ojgc/0zzXCZzXUBbiZ4F2lhESSL0F1hCyE6mrNMLHA0zX/TjvwNokfZL494or/sDP4I8m5jI9c4iriFB1/hVbR+F0SVWxLPxG29KRhQXxuHcCJae4C7wyMZPcTjNpAtyeNuerX9AYqnYP/aDQdlhxItIRCfvDhZB5ESnqy1Kxc0YowHeZslNp3ksW+UiH6meBKnM5lQvNgWEpnEX/VcZ9wIdtHfhjsaAaetHtoewg/YwJstiSt09J64EWSnzUQSmLSBkr8kqd+pDBwTJR3b1DpwUK5+2VSGMlGhx2qWTXsUAelZvyXk23I0oj0OrcITncozya23wSyFVjD0j7b0t60S0FNjNKvYHXjTOLEiC2TFFfuJL48bnz54ErpdcXnRwgQ0SIhddU/1kdhtP5K7PkKYuoERBeEEk64uEjKB310O7UG0pJDoBQzH71XKJMZCaur0s+6O0s/dMOqznAc+Nwg2Ds4PE1XxPfQshfGPiFbZouQ1Xi1n2zZpfoS5hcEqQUkd9vo4y2IiXMBXIlZ+mU7ew9cYjFRpVJkyI7qXUf0qsm1LHK9vzTaZrZZS29yH1+tILXD1IdHmmF6OSG7ooUVsdEWAoYwfWqvIbSFN/awkajEy5WHPnv3k5Nnfz601peQPiPOLVnGjMJ0VrqAP9cb+1ldGuiG+5IP1yt1RockgOGrBX5oYRAa8yEsawiJLCAHpeEjgVgeyGzpaI7DVXGydt4HQJdu9zlqLUuAbDhq/mn8NFH8iIpO0LBd6j1LhzvY5IjHLeRrITyD0ouGdG7cdxO0eMiO6gAJSG4E0VakmFCfx9T0jL1fdfZHE3EjcPEvgDhCXP+7NcCWFOgm3JMAO1ZtKiE1UIHbZnyI5YVW3S0FaVDzVG18HMe8X3T23uf7xbhJhBwVmQts54yYmWFRCAq2saCnM6m3WHTlqXeoTXl1QAHkjtzQVrN9GgIzPETvcOgGET2TNtt/kOpkQrz3hO3MPNv3OxpBcDYwWAfOvT2y9Hw6TbIhYahS/q5lSN2UQheAe7Mb4rhv5NE8Or6WAj6xj5wl0mfGFLR9OnvOOtmBdboCvapHWX2INv64Go8JcAneOImOkFOIrM0hqiTysGxK+WwIjdXGNJDgwhMqcxzS7Hp7RP2hNBDpXyk2Qz4S604hOVUvXrMa7q/48SOuWrROgAy7ITyXhx88Flk44tM19e3+0U6a1rr+EPyYZpSfTjnlnb/tTL7hzo7/cGwXHl7V5aRCfx7xzGTOFroDjkCPiel0bpWFDKGOD6bukTiWes3eE1ZaNb0JSRnmbHMF31AGcKsCUdgyYF926VCc9A10cfn1oZqVtaU9vrfx9p7t34Q/YN284xZ/B0zLJDQBi9kVXH8FgoNOrLmKcnhkxJcAwbLXNpRsETnQYETczXFR+Bha+HfuQj6dSDt5UrI4uH8liI2hxr8qyUfqFKnvlTzIzSvQxl3y7i2O0TDJUdj4gjovdVe2B2CvpzVF531aslfEcmrPXZvgxAN/kB6eTG7fOp4F+tzJtBSfFwvWUHpzqu7MTotlpcERqhMuU8kXTbv9Rvw8U8Nv0+tMYiTQCX0IvRwNB3O4g5hudrPSoHlyvDmOPyeWnphIPGygQjnKpN0OPs84HPo4L7+vEubFztBBOEsGrWBA+i68Djk81DdgcCpDbYRZMb7BTkHlpo7kj2HPIWeqjfvaihJ7kWXkffJC3Qq1MHbQX9VnUOR2zJO1m8AOgmt4xRQS0hHyDnuTyZE1H25U7g02cKTqq8uoRynr9uqNjVo2DKxI1o6s3MtzFJYH34HyOOL9h+MD5XSVHXmMWr4KPll2vz7nPMHrVfiMBprnL7Upbk/yThh+w3thtpuA50b6YTNNp7Eovp0tqfBSFLYpZRHo6CuapzqJ5Quru2brwT8cOl1uQyqJGR12PC8eE0HPh3YxCqd6J85XRVXWXKoUeKrHut5hCWwOj9dPi8KqN578IWNPFf/BuTQdpXGhUZD6A5L4cs6SaH2TVqd+UoPH0SM2FkJ2N2X/kRyKp62US30LGm0Ns+shZ5hYo7qC5llfTGFW+Jq3/EaGGlbiS+jwPRx8G3J3CT0aEP3q/j9h1xwL9RroUo8cYqpVEw35kUbJ5QKlTPP4Vm7xOgfwWJVWfB8bRJtsycJoGI/EfQn75f4xFpIMO6rdiITlkjFY2BBp3g7902I8kd2VXVtoeRGTsUm7LCyd1Ocbpe9mAWzBrSJBrGWCvSWpN3NulNE07hn/iU04JAsbhY61IrpDHszG/nGspjVOsHaIFPFtdn+txCYNicFpjXMkWF+kC+ll0nKqPT+FGcEOLCgbW1Juy861fmS0vm3r7zfi8qSBTcx+I9klxOfxRpW2luIQhVOkZIPeZ2RVKZecsN3u2j8Ba1R6okvNHnbDxQSb6s/tgRgV9w+arGAABWabbYi4P/AAfy5cKDTHBVx+nyv+L4rMrl9Hx08fThC+6z32ydF9zOVd4WgcHJsZAnRwPoYXPZFNep7n1ZYlNNOUkqG+e46ZOpzPHX3kZc64vjmHu+0jgBD1mHRG7NPfhulBMs1jwyr1l0uQr4N0CsY3W7l35yUkA6nCbiVALhZPaJbgQLpwu4ObtCh5njHaHHvJQbZ7hgsVaJbiFZYVYrVv6M9DnMefzy5pyjY3kA4Hn1yQV8LyhIYKEoPfKI8+jh0IAWtmklJOqeIW0FKzx0tjefn5Ptjs5IXMVpbL5XRMq3Yzy+vizlGp5abvxSlMVZjJk8vt+J3Jvn3tm1a4rD/YgcnUoSa6TjLHj8ZpTktxip1k+tf3TdW4bIGIbrecDtOJynQfSi343JSqOYk+2ss4HW9Mp/sTXM72U25PzuFQHHOd2WmP+C193S1mfMq967AgLWWYoQU+6EXz7ZejpeeCwttLwLaDmAgbtQ0yrefBrvo88CFqSehFQfd0pWd98zmd9wjyVhhBaSmH0NxquumtZKWqlIXIdVNxOF7X/8Wn62qVHVWbTMRTaseMPGeOp3FGuIjTUidyEXJSCexjG2l8mWeyNxNaRTp4UL0xMX/Bpxsi5hR6b4N4JLaY/EXwnPY4Aipq7aKpbfxLH83MrP3AMQMi6UXAEApGyOE5zwOILTx8bq5FJLYsU3Rzk6EW07tR0OhTN2Uvcd+JRAwloHUEw4SC+hORGhrnoSo8l0SG+GGDwlijge+PpW7hzvnRERN3KWWwKURdBTBwEthQD9PpehHdUwo6FJooDhX9LIFvEz4G3kMt1lUKp0Hk5gHXJpe7yHArzFEBy7ST0WPm3EYswPzLcp8B1Ms+5kbP470mFQXPofaUWGLtzezX/76n1QRUAXc7hW89jffM8yML9geXI+17Zu/5poZOSfIH5Ld8M732DM6/aF+YvZ8X1iI9yboXXs8EiTMsezkebGtDktytqCqwQnX9vVqPYlEhMSoxOx2McOeHR4f9qd9t/Xy/x0toox3DWLIyA0+yV7dTXNayNxZrCWWF0aOM+zLuFstqYrxKIicydWWDYcUB7ISHSptG8Gg+9nzgIj1hl9LH1dfkbiJw0AAIVH8yFfmEFy42hBdduNgj9evsBM64eMNFF5knBofBh110kAwfjnuAsSuE5YsSjF4URF0dk1W+h3otZvJrgTANZfOkaAkwrL4SFFVBaPHkW6Ot3kxf1PoEUEnm2aGcF+2n28wOdnMYhtdjXUNIuE/jvK6S5twiGJhH1JDdVPNVV0iXrkbM571cAyQx0Cm5VEEuTcM3BNOXSiBcw2C+piAMjto52fZKsS/5xYFNuVloe3urwlzt+81Y/SeORV2aYFPJ9myZklW/v4u/0nUpWnKSr7Gsuq2s8Iwujb1xhVTtznrEOPcspKwz6/HsD34C5L9RVfNzQ40wMONytaM7Mji/zXFbpa1rTllVz5xuXcNFetz/wR2THvQa9nSQuQwO2SXpcfcH7/53yZ89q+pkLiWumsVm4sI9Ln9wA9nCYreD1sXNmlUutsf5D64YA7qYFQhReHAbUz5Jd2JhznN4oXnJVWts7+YoCzrR1daK20fzG7q/sCCLU65LcV6wn25qTtXV4v0HT67cDIZF8yRqtcbRAhgW+LbBKqfLHKTiWHdOyVFr0UGPRhJfoSaNV5k5jrpKXurdwlql91a2Ue7ZSJr147zGp/scDNXMoJtEBAC50AS/zxbc3m0b9jzqgY9GAD4B/watqmlcqlsCgO4MueLhFdcoiA6DiHqPU1ELhmsL9lteErlchcTKL9fyBe2dI5c0/CWSHXJw+tyDC8SXUZJjpcevKlTsHtb6uokA899sC1036aJ08tyDq6JNuW5NtubNVvVVOfW+WHRcKRTs5yfrolbKqeju6e0lT3zg81ihEAw9/7xPPZ7afg3zwntkUsRsBTq38ByszEY0Jdz9s8oTFk9h2YrJFaq+TZyzJtyoajZavzZmucxWbCVfMJml5BpQSWjuFFtWPDOXWvIeLOuPHRPjWcA4Bz/K9ilrkJVmAag8f9qR87SV+H6xlzHcBiFF8u9x/wd3RNqeLPvGB9jGzJaOnHfBsaNht/BmlyXo7NJTc9fWHW7n/K4+eA4Wf6K7eURJRs+D+f7EBNgYbLG5q8lTWuI+okYeZpuY70DNTPaZbqn4zuMPp8KXSsCXcC1crvaabFqNV3ljz/k3hQ29mSQog+G2w2bV7Se0EU4Nk+TfK0vRnSvgdTpgR2+WkBbca5+qVCccwOB75259nctcuMflD24Au55hXVKahpvyTOHmYyY7db36zWIEzMG6A7/CLzRR+Tncd87ZJY1uO3P2H14CuALMHO46W+PcUIPrMVnvj624x69VvtqypFDvbyK2Z0hBtj2OPziKEic5bq8biRve//jnN1wZtQlPe5PhDCXbvBDSmQ3BRnvipPBll/CSWK3ZPGk344MtCBUDOxE8xhC4/dVNdFF9UaJGKxoXxxyQT3jJEBG7cD48DLhSFADdrcRKL3UiROKpxamNHPKC10/BiHklkwuuVyYJKqdfmD8PpfUP0Tx0iH/gpztgQaK39LvCmPKRTyNat7dAiA0FQlVno8fTXwbecqMLJvPHQRsBGczlP+5/cdbusXn7F9k+95zSe9B2qVrGq9r7N1djyinRvWNj/bHhUyYTeJmxJcLCPo9OMwbIM/GkpP2huLeen2JIJyQ6QQelmQmIl9nAHBvX7/tAh9WIieuRvp1Coor8nFcwqp/dcpoBg8VjzDlAzHEqJN/j3cnYzz5MPsro2/+O7aAPimqVpwcmp6AsEb2t/HAizn99fQY7bSHCCYKOeFRyxO4ZOmbDCrZcgQb2JcoCqXt2BMRbZeF5fVlFEbBhNq1iOqUvuEQq9lmC/Jjh8wI5vE3rc/LwkFq6WACoEp7aghns1/wikxyem2xrrb9VcgNDuB6Hzj+5htC/n7w5sJzz2MpjGosJsyZWefBmbnHEY/iTRqyVuWz0kVcEmHgTwOAAFX7gLTJ+K9dDhoGzvwAHgO15iDfdTIivAVc4ilQQ6OxKDO/YkFfRINmJTZVJ+qxovsW58WR/jxg2DF2hrjyyd8WWsUtvokaoEWXBI1xjrYm7qQoKSLyPbD2UsItB34mrcPzj9cbnCXT6qNAk4zlEOX7D6UCtleL4lCMS/hzxMWtu7INjOmZ1l8IizYcLNm6TRr6lc4Vck6XIEVVABohqEQoCuYX3Jm8LfG0wb2FvCzWKM1TJ902ywpwRw6IeesAB5k3bJbST1qTULQJIN5twAQEvro4zFz6uX9rGVfMupw99LMB2bAzCfO3loHWrVHSrhfr/LF28rpvOegcjBKoI9XZKdw7UxwluaiM5CRfXLeSDesF9HKkwVstcHkX/EAfgWwBaf1ytMeiNS3rUZyjN3StEirsKYn8MjcxEHb9WEJkIUtmfrgrI2kl6qgiNrr48Y8drjSjD7NSq4TJSKUk8q3a/1SqEetVssrwurhHqcMZHRTQwTAd3tNDSFX3cFJrBItxkr6MtKOr5SPMfcwetatnNzyIeh+YB5MmgpKra7L9grJOqpjXiaiE2QcgVpT5TS+VdQipli3KSfDZtU1nk0hf5whcXricu7c8W587GK/ZnRCOr0QnhRq7xs6ICYCt7xa/W+oxsm/jxxIbmTNjlXJQ5BornVwol2kyOoukqLLfqMDSuPTzrq5weS/UiE+Z9oVhPu9t7CUpjXus/GmHgWGPKVsQdBlroNP2AWACG6gdFXikhCoB4Ucke74RHk2p/y2x+hf8+l+9ekyK8kW5u6ltRXOn22uZgq7p67rq8zawhEce5PsHN7FVZU754Pmn7W+dbSmkyVugsQA7HjlKRF3Sd0HQ1IpJUR3tBiLUP6wMekOi3IsVKvFwvTjN8sGrMIohZwFulsv9FxcXR/ChHvdalVftUTBQYej0zKFkuh+Dn0EvIxir5gIgPjFJziUhwpwJJZKO/+An+5DCXwSg1Ondo9p5Rlu9RUyhz/OiaOGDNfs/ivlipTvF/QnWJHiuvgnznG7GMgY7g/ca6af3PNpxW7ObT13s89Iplc9p41QD5MDAQU7iXrfUJRhRZ0/oQdMMJO7GR9XtFzcetcHlbCA/dofg5qFnt/Y9WGU23v/BzQECjnMz5/oR6kfOzpttOqZgcJEEEFNDkiLOWwta1N+I0sgBTfQYvOptUeHwopyVTEUHpVg78u9krBRRCTkdc03BIW7QIGYRPkAx5i+8/5Vu/xQJ8ofRB3Bb4sItxXkzMD0fI1LH32am41Cd63+9SwNazeZGrC9SyMCnjckCoTT1untesWEiEC1wMeNgbp9CucHWUmR+MREkYyU4kFsSnG8MrkSOh6WwMTVxN+BlUPk4mu0vma1r/AIOrw0Kh7IX1NTL4wz2KNBE0pGiOq8c7KyPsCzbC3IR0d3HED4eaNBuUtnX8zOSrS+SEH5ObWk34wVy1o0yXjLzZ3eQTuQl8bgOFyUSsOr3OZSnGIT+JyvPkw6IxSMYLllWZsSUoEKXA59Sf+z3AIwfxk17weGWUwB1yuo001kc7Aj9MQR/4WYXFLCGJix6HtbeJOihjeheqoihmGQnxN2KQzTMlzEX+6HvFgIpGP2YARuXbWh8QjSkiWsygY46nxguSdHuiVP7CHPMab19P+fu8aqVu3LreWX+6vTznfyTGuYTk7lcuUzw3GutGbZQG/Nwi+BUt/Jr2Me6D/xA578HnPvgwWUQFSxE0vCjuR0BkGknq43rvYNAxz09gQJFfDNYXH7LrBUFgeoWHqg4Nbszq+jGY5uwqbvBhrynwcSOihzINpukOq0Yj76BnwvsYKoWLB2WVdnriE3wa25bpDLFh5/zR9a5U04YI4g233UyB4/QyyGHBQWEMQ5sygExIM53CGBjMjfoAQ1l46JqHetfwJckTn0jBw2nkbdpGq2f/WJsg5swgkbCmEmoKscHxXe0bidE+1pJyO8HCl0g1tfOSDA7lzr4NRFD7DcFBw6RaP3BncqheJNuCH5M+m/EFO/+x7Edgiqum1aQmX7ie1AW1+OXU2lH9x/q3BaC4Ocr3yhzW5p8m8W7asej4rABn1jYfoRLc+0YNYl5Lda52HhQvmVIy21j+ZeY4uxyXAZekn4bslp5ptnwkJWskwQDbvcxPFTw6ihKGPNRsDQp7ZJzQ+Tx7OXff9LFlXsZ1RTYIoeiA7hZOqicGB5Dk5Y8i8L1VoGVjxXJiZWPAUDKBYa/Y4rbTM2Q8o7dgaXEUnOMBtTBHKoWNV2egpKwhYcYhENtDtBrlGroca/0dlsEVALusUDJG+cu0hD35OyD+xvYYA8Sy4ZOmdGL7NhqvmHSUg84wwkxRwKMAkkwwqLdl//DHRqPs/Q7vqK9EEWcK1cB3250WJQQ++Fj4Fp6MsEfR8cUFPfEcXUW3Xkg73VRiuKveXOkmliHJfq7WoR4hoI8QE3nxAPOa27AlVgzkm3IYE2uooQW1kjPJGbvGtIFs3VBoXI8D8TMlzTktX/aO6atTHeO9b/TIgnA6rfnsMbTtUKzkFmI/fv4QKZJ9u1Ts5uUvnNXc3LA2Kk8qWH2lKAk+YOzhaoeDpSRNXrJnVR5I6ppt2LfrcfIsR1pNMTatiKM/5yQ0dfMzB3alPHNtD0AnHssF1OY01OjAy+ti0sSwu16HA2WJ5e8RVwqkUYA+thCft3WAyOcuBJsQ9dM48ZjMDfCM+nBA2O9bukIbmjWjy6mQOTTJjHDF+PCN8Q8AKJZLlAThb2IyZB+N5loBjxIZp4CaBTf9sJi5a+la3T75MzGry7JCUqE3iFKR4kYhHIhaTh29A+CvcMmR+d/EeTxgy9IjoGeAgAaiCmVSD1Y+EOqNgMuhKBfKhb29jSNcHC4pfEE8QL8N4PiPMOHBUU3cdMS3y8mZD39m12+QPy4MLw3eRb7BhytHXYTNP0dHFdV2Q4MtkXEnN4puGffMb+fSkVqf9DT8MYzIehK+XwEH7JxY4K0UArHg64wLGUUWwbULD67bWPrviTWKIiD8tnVreP7/rx8DzyDgkEp/2nuUgAPmCgyUQEXAM+Ajo3VuLIpzKNymo9ZFNDGi3Q6uymqGye1yEeAPX/XptWZJSxYyd1cUK2IWkG5mCY9SXOfoEquVquGw285ALjNweunEqiGMzyFrBI6Bh7aSO8dhJbajGLPj0CPTNsAujK9HM7UxQBzC49ibZ2Q4aew4ZU3x6iUNC6bLkjD7fQ+fFePey4sxkf3oAfDF7bAHwJfnx0G+bB4/2CFAQZbnwRbtyKsQt+JbWUloub1dR+vnDByd7/GtnwoP2ESEPE46BDoeiz8jph5s9XVMlAEMhE+DdXMxuQF5uBiiAzUS2elM0FmgiYh47RLnzRti0NGZM0E7wZTDcVYYOJ3fBykeDjkJviQMaMaU0uomOOMEZx3LKnscZk2SYGL2haZvbJoJoJRI9wVhNk0iq5y4boh2LgJ7XX7DlZ01ZG6HP07UmA2kHzqAYfRcjpVlrlYMEbtU33jpD0z9Xq5h+OqzZsDsDcUbqB1mtkY6zINVbO+RmaClNp451bpdbnBFtNuN2dlQHZtYuMBvNS4AwIUYp7sXB67Z8X7AH+pi5lodFzukCdrCbcmFua/xAvrtnwpW2RrUZZuFlyID+dIzypIXN02ShSMzsxtUWm1woVnANrRu7jbVAGuSwZrBy8fDe2x1RgGSmPvKNRw2t5hB/pnfkhIGx62N975nYVz/k626tgjcDxMX622DGDkjh2o1sbMiTtXI5Lp9hznhthuZaWD9yCf+vUKb9WFRvIAT7+9VefP+Dl9aALVRQelznWttpZiE7F1Lh1hZqg0srxbAboUeMn4HS7nkXsuoHeeBEd0Cl6ASEoWO86jE4Fo+RBG7M9xYCE4U8I462PJ5dCq5nqp/dsND1+MhFfg2ZInw7rELPndaC4B/1VhqCna4u//PwKTDhURdkz9hUkD7jCR/JqXBUmHX/OahEGW1eAm414JofT+HyYE5bGyFiJ93VoyiqvK43hlqFkjq9XnfaEI7JrV4Q+ZC+UBqi7nfgrFQiaeTjokmsJkSUn3FFscaWEiZjASGwBoDh9Rob1IUNu3yUMP+xx4hhvHzSsVj9K5PDUWbcECgIzDUZ7XqpVdTaSkD92CASeluGoWHUPABu0bAC3intDUUHjBCF8YC89kH/TJ354rG7s7eiFflov7fT331A+XRfNyZDGNauT3yBX7XkOTbPQr282fDuNu1U5ajqua93vGFb/hmZWKESjt+Skvkrj3ji3CtxvYrjfDb+wEfGMXdoYhh8PaQsVPrEuY/y45wYtfJaqHKDr8WI0N+SIQyW9j8GjRNJs7CpJ8bIXf2kQIodPIZYoCI4QAhzH4Ggyz/FpWiyjnmkf9GSQg0zIMNBBkCLWMaptq2yirrXC6sQ04YV/MZs8o4GT889GqlwBQM7tG7UCmE5hzioXOJeNS9JevhgVUQnO3FY/eFCGuQLBnjvskQhtoCezs78Gei2AOF6cs60DXBN5+pOrm8q06b2cCkhL/cR4F8ksXzpXQXW9jWYNefJD4AlVfhhqed4CmN55tSfGU/d1mIBj50zRIlwCJGMNAnaWfo8CGNBIVrEwV6QbQG47eJBAWbq9KCa4NKN465XnerKqHQ8RqXGbUtCgfB41VD9nlLBCNV4EiOuTGw9JFXWp4i6rhE1oDIzLAUvWDQhmmK7gSuihKdEMjtXqxKwh74XWwiCXpoLS+lYOFOHyeqDVLlxHk1Ytjueq1vxBkL5q2CbaGq8kCn1qBmXSTZ1WMDwH0K/2XSSWaAnHrMPwU+7qbqoF0L88azZ4qoFDbS8Bs8tNVPoeA15ugNOGfZvxCf5RWHqyB7JlUbi1df90YwZ9awyyMoqvioNffkGqB259CKoHSB3HInPkWmBFoAXACYj0WYeuWFJ1Sh66pkT5pHPOZR+55DL9Ig16r4DRoMVXnlYDQ4F3J17YMG4ZN7IbClYDu2eIxeFfgIursDzmsRLd9LSsJHJm59yDnOb2ADoyyPcs0Hw/cPSTNFMOmcK91eaea9eIMGWNCW3Y2J561YX5tFwtaIGQYJGsLlS1IsBMvW/CN1YQs18qPW1fLn+0/6OSXh+PpIG6/99LB8yP1WG41lwdSGHsHcHlZTTXPNcjfv0tkfcypZx6llSlnk2l63C9igGKZhaWHNLy5K1XGjR57n4p4EASzD1w+lJUmSCg8vGvlO4w4a/oBjUHGBLIUcQBhF+vkkTOTYRX8ksJVuHRZuzUAnyF2qQrmnbZ2zSl4N2WA5cAbBF78e1BXBQkzH5JGOm4Km0/VKMc7JKwfThJhZh0zGWX3rMYXtH9cfcSBqa/TQkad6T78GmFraKE0CAobmTya/Sq/NtiI8egoAuC8gM0KZhzxSamD0yIXkcBdhH8PuiX3KuFzlo6yXKMsPRRDO4dJaFJ1TKdA0cpL06rJVKNaxZ6CbRVadups9OdwzkcUtYrVqUH0YH+QF5zfwYKpnur/3alIPqTCxJQG/D5UKvKxc5n5Q5dMLZH8RE2xax6cFUw/Oyz6bQyxsxmu/jmX2A5altCOxqozv9xO/MHDgnarVFf5udTbQFRuod4HQeLL5Vb8qKIgnWPu721HjVhji6mF/2XJ29dujuOZcR5EOoEUjMtS87qugjiNVLvWTHvK8Qi6QV/qDAug8zodqjDzbItg5f5awGfeDsc5S6xkkZxRfDfzIzneef/MwLCjO6H2ARlh72XQpw2QLA96evx2TieOVtFRJs8Z12fR/VTmNBDmAwYwudmABjyW/0LnFO82favxw54sQ6SAwQwu7jPB+odymQ+VhgXYdRmn8RKBpI/Srzg+J+EghZ3O4wMcNcGBT9//WZVv+/VObVtcTe4Phjtb4zlLE9n4qtF3WJLnC4ZF6SbscNnYW1E4x4pnlM4TAWU4+SLnI1T3GvyinB+U68gr90mZIR2q4wVIRZObgmL0kqw2TDyPAGq2Ob2tbx+MWlo0nfvS5apbAcrUX10cSi7eAHavjUEtDYifRBBkwvVx1JrPkzYMVhPSELH8Ht9cXD51eQBTOq9Ceye/tsP3Pxc2J59drbFV/p7/k8QVXGrfb74NSTgyx4094c8jfQ/1vGSI6Mhgz0rwBY0V5BoZ1IF4djL+kx2ilVAyH7d+jQwUmbm7uktBJPmVJu5u7Y3Z7cRm84e4J8b0RzRLrEe17UQfd/9Yclpj/PSUhktR7Kzm8Mf0T6xntrFwHpkPP2SMon66GCSpWomnt/77D1qcPkqjdiDt2uF7L4AtspNy9yUZRSaHdcyGIvmYndqmbnDAP9OvEjj6B/udkoZ8N2Ecs2vDIdSarFWZl+DB7ShWTXnsCY/IG0Supr5X3cR09Jrm88YOsXjDTZ9u38sJdkV9aCGn0c77JptW8MzuozOJdnELgB7c0eg9PoZzi0/lPuq+BeKMZ/rAGXBFg5lRXQBJbE5qaphtrigSnWFTa6JWKKmLWHSdtgTkWkYJZJVqCacR76NO2UZzS5ckXuuDRGWNvhqcZptx0tHFimH8YwQ+PSiiVosFwPHfh88SQ+1YUnk/p06Ns/tZ0M37EgpMjQOUbkeYc+UtdvU7NT+cNFkA0TfHfvUQZo4nlAUQPIPNxLUZmwAS4WFE4ewHUwhKBTPgizdp4fqvaCkuWPsYtLdCo1PvHeBNOzsq7umRKcTOngelRDKUyCuZAvmz3O+5XeMMZmN2Qg/dEroZ6ULMRqYisYlo4KfPx3iIXFOio5jG3d9tTlgeEH4NrDqRdlivHQGxsBkCkIzqcOMAhHg1/zOjdibUimTqARiRY1vf+9Q5d9ygxL3K1n7o2jUbYh0/pHz8M1Hm1hyiliWdu2q/HIrem2xPqffxArvzpAR/iOLzypFAwgYhPgwtXquU+IsPdyMYrwKYCTSSsKRSV9CNBpYwnJlponr2uXoilPVDD+CTzxkfjZ/2TZ7UDv4LTnvUpWWco6gWXcqMLjdSqOJAhvvYKo0jK4wi3eEJf2ZoBxFv8Y2Of0meLrVJ+MJ99m8fX4OV+j/fNv+p7ZszPX18wns5/PQqTjc5543tQMDJMMeZGnPExNJcSPMmhAS/i4lCK/hH+vVsgzO5URuJR8oNfo2xik+PjmZITd/YVlm8leUi+S+U3E1lKxDcxVYLxy3Mzlbdz08vsZ44ff+B0h7GR9epRkiXHHZnabeZbytazuTRc1Dy4sgFQJErLcin4XXJhkucUDPbu8N2pzKq6/glR/tHsHMlfGDkfmBf14wQTUQs8rMA7m98oqDkYX8jK/JHg4p/xtfIKzgSymy1rq3pmbuQVA35gjc/o7u8LmDgVr052M+0xQxP/zIekfgtj0iA3JVfTI7+BblfAZhnx43BHBG1c5qfjQwahgW7KvQHYigllSMb04J65WaqQ2NBMgQfPhDqUMisbWwplXRJNOnZNylSQaZuVx9n9E+gAOaLhebOHqjbCRUi9MCbWfjJ23fp4YTU8FmM0FjH98HBNZRDuVNdSAIM9z03r7YR32Pfcm8sinEfJMV8NVcGgW5MG+sMWlYl7ofuV7EcNmg87K0U5u/u7HJzqYWfDSNoNWOUebS0Ca+nQl3JLYBbwRxUjlNV/USUsuxANBHR1xBzWhHm90u/GYBRS4AckBhtfDxUFwckJOVLVrcx/fPXq5RZWfPCMppuD6emjdQ2qenY+PGQnzBiWGOd5TuRZ7tEIrt6tpYFmoRY5BTmo2Py7Duyvq78dBNjQ2vEssdaxw9kYiJczafuhM1itvS2B8APBJxn5qvXOm9klk/tHSndWT+wyxodQXRvPxK7N3E+jwokSV+cKsppktrZt2ubQ58rs8r12zKl3gPfAB2xrobmuieS39zRPlQVSZjZs7QmhNstsoj65XUiJCwWXYSMo9HUghIW4dvwlcePbT/tySSf10UfvuDtd5JgwqbyOPWkrznIpbRvmMz+xzw9jF6ixn//gBIaguo168BAw6d4wIAruLDp0G9LfAVriSrWc9b++tpS7E6kz/jX7iyJfelr8+U2VM67Zfk40M1cPOHw5MfVjQFnMi3+b9omON7XCbH+WG4To5RFA8cgGGcSZjhCBpUcWZDCPVVYO/1GRa6zFS/ooHLpR6U63WvJ4OHmES1HgxwZftmnoet4NOREbYIjHyeAcAYRFSjEEXtrRdak5atpwf0k0nAZOaPZ5rgK/053+JTGW2wqrcmdswqRzUQdEQUEzxz+AgyvJCfPDeFaEjWcb1MIXEdnv+xGqvgJhVKSiSPb3ryxn7QQygFAo7z4fKQPPMfKJ+Yejc8JAmnlkL254x0XJ/CxY33PJ3+sOdHJ9Xj+poSiO+u3jEHeDWv4Ic9xiqmSNmT1gy+0gtJiScwlx+R50KtT4xufoRvOxCebCJ7RlkzAOL1s7Gsvt8lwnazhmGoBkbTIYl24HdvP8pvpi3AsdiSjwpvUkte6udjXab26cNb+7osO6Akt/Gn3tRThi0DpZjzuKGhw72H1XUAD3jhb/UKmi0tv4DV4g8QuRaCgoTJqKJm+6OYz6rlJzuhtuIV06XN5MN56irDKsdkyTre6FYc+02krGI/x5swo83fFoDFc82BPkbVe1X4BdeO2lWj98SiGdlJZ+oaw4giNvevnpYG7n/7JQ0b9Gr2Q5JPCsqOM1WLZizA9GXSeG9nRC/Ihl5ETRdCnYnbDiKsslOtuNtoUSESIEG0n3sQ85xvn6HJ4PGrbZ046wIvWzGdGlpcBH+wWPufTu0G1Nq7g0EZExOzH3OrSPnz0IZDiGf9BZDeQ8/KbPJIof3SkPnMQ+0+I+YXJQKLx5JCN8qJSCAE8I6kP2Xn1QTv4HI7EeIEUN6bRV06doWD50GZ2cDnhnbMvjVA6XrOMgeJLUe9WiBHskbP/TTgmUEvwjKZpIB7x+eCOnJyccSXg4wIRhC2lSUQXSXCuZFbgJ167Wi3b0JMtosEzL0Cnngt084QAFNil0B4kdW4rI+xUpOvL4+KteHPFlG7yHxA34WGJOMs0VEJ0bRPLoa3/D8cp7xGSd5KGKO5pQhE6SlG4XitoKz7NYx9axQCCHtY+xdvwLA6CfM2MfFIu7naOTJyQJqjkBCN26ys3wWiyr5GUTesJJnPh6GVttkGkN4m3A5msxoCigXY5HwT30zvdAac+vX54e2jJeNOcDigfB3o8U03FeCBj5YcHjDhHu5JyOOC+NgJWWGPM5YCLN9YmhuOOJKvpNwz6m06/DQh+0fbgHnWAzJ9q9D/GRR9q4idDjGiHcsBV9/wjvVpVu+Kw6kkyBoTH4OYxWtmpFH62DAzDQ9ls6HXavvtGEfd1jfd8Md6Q5odI9ljnOUzw+M+gePmRww6+9d6gVo11VFn6nqIL6N1nXjK7L/75qBpxZ8DezcXn9CizEYqY1q/5DodIwxE2w3/SiB20jsxzM7TQR1HXpHoy+slOT/MT46Ib8VNQA9i5eC65rRNnIym/aQD5s+I4K1yOuopqv9amozDNxjRGaG6ENEVfsdVpWpv5kXlvpWb4t5i4H1jyh/qHGbFMcdXSMaF8Ii4hyH70u3l28RXlTGe3TufF/MGk8mowmd3S9qUgAf0p+617byWOVLtVguNMoVZ3EfaJtdntvcUeRfVvrNsBm5qkeq+fTNWjLHLa+cxvRRdvZunBrvu4nIzOIBF39gPEKqWPP0ya7pbwFzVXKud9Md9P9KI0DzCz8/ERyOFvBPdNIPVTtz751zhkLtQcNv3agxS505AaiWE/LlbOo+mNVWm4Qrs61lvV3IhUZ+3Fp/Lk9BdsSopfEJUh0BmG1e9M2cHgbzjLxEQbPs80cLsS5MjjxcFv3VnNXBDoJqpF02LWJqmbscUJ3EaoricSKscwZK9ulZnBXTaN4dsJOd6tFICw51mmPBvpCyGTJ+UCyxC/A2VT9lgu7PKTt/1t+WHbPyCNzU8qQ5RpIuShHL2vy0lWYuYziEJM5XAt7T8/AXurnD6idmiUZrS9Yb3hWH8b75PlRxmO0BRf3/UN2xW6Inw3ug/3TzAMVAe3JI8nzwNuHxrejHgc36lzo0Jp6/AOmwLNcQWppTLIviPrTh3kp+Xr521CJQpAckVV6a34xVdYnVx0sUI4YiVJh6fnhZTIZEiPAc/ph4qdGRpaZsagnUlELencNw0GRInSBavO1CpNWRPfGfmyRIvlusrlfezGz4b+s8NtFLS6FF8sbMaRndfLm06eBMMJfcyTS3PJQ95oO7bL6+G5ivxibYchkHgGtUgzEhtcW+5gyo6vL254q1XWe76qN4p9NbNhicaN/L+Tr29UPSBga7EpMmz+F3Zs5okurns1dadMJT2dVg0zjCn4TekkOrZ/TyMp4N6ShI6ckVzQXWBnBrVXY8RnpAegI9Yaza4Wog5vVV831QVglQAnLaY85qj4koW6A2RIpgEKjd9IOcQeSH5+J/MRQJCPju2zXbUbiJmDHcz+nEyLhjnME/ahXMNtMjc8OmNO72IxBY7/fuiJoMPeSAI6WyZFv8ZarOSMPrktHMKJgf0zUCA1T8vKIQAwbbl579sYHVBrknpNGl2FkLy69Ul9ORghQiA5wqz6YI7vvN0QUdXEu4xPeV1K9gzPGT8UK+RCqbV+7tCUqU8io0wchh1RRbWWn/ISDaxTGEGhhCfgKCW9xFFGFzzxVZ69Bb+t7fhTIwTmpruGvz58rjOKwSbditRG3Ycs4zvuwsviBDXG2ySl0trVyvnIqupUBFqlfEp0g6o9G69rPk/IGQQl286cxC+nYlH3K3pp4Fmxu+8nPJz9T/V64dCwcmXBFrgzrdoTQpaFrsaID8xayxwVtRM9H27X120hS/dKVScKdSk1HjT/C/rOXwquBuJ/wYF8Gzu8/YhTloLXOPARq45bl/TGxiOOnPT6KFF2ZJUCGOtfJ/cG+VqTqAUKUYitIjIQPoq5cTDuCcOUbeSA9W4wExkLRbsyhfuZokQDQbsV7O3AVxITlivZpSfflQNkMDdp9eYeCqUB/1Y3AuO+ZxsRFfjBqoP0uS75Tc2uv5VbioBKwQVmTJmaWLYzvXFQdXgOc3kaVeeMDveg4UphnOp+gLKZ2ZEOQs4j9pABVn68DwtZbNccOrpZ18opyuzwTxtLpxzP8sVDkS6a1IzFiN1ynUB8EU1qTGHzWPkOymuiSsJQLWeqLY/Cf96EJN8dx6c7v83AFnMfrZcoRgZqPWPfPq2pVNem6xNDDia51qT2bVCWgrYHqXj3OIyP40v3Z9FQK4Ru82fB81d6dVYNCrMymvMqS4mRjxix9brkkHiIwlOjmHdTq2JfmyoXjzhTybtp9yESj2/fWwI8RefX4ATxfHXyAqNOKl+z/HNlIE0ZiUDjqKP9TDawL+YNwau5cifxzRBdPwrfduzOwFf6lqYbnIBYrHMe9X4hGnsAT2h4N+3DPPda3nXDfKSchYRxS7zOldgQv/2cgF+SgSzwmKHEipERrW47P6f/MciJhaKOcG7aiYVJcsGLADHeW71jn3I1cGeo8u27dCTOUoER/+6N/lw5+d41TOUZ6vQZnfjyBgv7Ac9eLlkF4ulEhdB6E4spESH1tce42cceGoeBHzxxXyShbIN33G7vvyFNj1Gaeg90ockXJmFsfIon5conysrFx9UwmMJD427YZlBpnKG7fKS4dcfFrx28RKQ/0O0RQbzmx3Gns7IkYtgX+064f1ecBbr3Xsn7Q0ehGGhdHCVXABS/9cpTzG/uwKV4fPwWr4CBXdK8Z+v9T3LcX0p3zQ57/QWJdDsOBqjiY1VGoNalDFcvNzU3Nl0jfTqvP3BP93HM/QQr95aK7N+7XNqkspBHhssrMHgcNtBnPXEUQwHHOimg91AfRpPdxbh6evr8aWgmLbcvDLEIBoXPhZDzo/t6fH5ZFRN6CVizXfpjX8QJOjjUOBoarF2BoJsMBIQQtKOpO5pTWbx52jnZLXK0z2Fxl9m/tcKJGQ/sL/uzWaPgE5jWn9lJGaT2K6UQ4o/bzCcFq2Roq/J+nEKhpukyenJ4WhW7hsjnkj/up3HkG9pbeQzTLIiB+WlbMnPk2Qu0ggekcdZzTMnOWGfPANy65J63odDn0Pef25g9CFlUVZIIL694JSvIAx9P/w6jUwGEQb7GUs5J7elA3S5RzugEcy9IBkcOIfmEiTU7XMUtQh0z1nPSGIU9okSiHBvN1IwSExuRYfKDGKy9g/zsaZrWOa8TG5TwNhrPrEsCMSk25r7FwP+28Rzir6+qDnai37A6Maxz0zq3jMnufG7rQkjEXMC87uy0FRnkqgjJMpn0Qb13kHgX7+/B+J595/g8W9Odun+S4kn2US1tIE8az6fkMQqkK/pe59Lv3nf58/Xb+dBW80eaDaZs5vIzB72IgH/xtthrWeg1THrRU38K8jSCVvru35ospWsKex5LnQStiUfLe+hpKfUnZ6yLNrxBoC6wszpyomp9Mi5feKJ5/LtC4D98KSf2H5freRzIIXt2/rnzNN/y/8Y6vDp1T91fiC1Y39TL6tN6PPAGsQF61q8vYPm3Mnk7KVJcVjTAvRzXGQEYBCjKeSwcVWti0ht5Tb7mjwGkMkovNlVejiRRI8tkUNo33lL5MYwbbaAnxFamIxijosGseZCB8ptwL5z5rw/nXL/5iej9wbKHo5fDhCrcd9W8NwP1P32RPubsINI4vtoBweoC1m9X0Q+xfX3vXaqNGkgXLSrNhxO3dEF+mGTX3Awce9EijOQ0lKGaJn1xD6TTGi1vLNYYpauK9QmsFQ20UnjIzVK1CW5dwQL9dt3Bo1deuSvx4weh0zO3V15yi+J/w8Lv4nxa9GgeK7n8vEVPV7FwKtj3EXanKWn0fWq1eaCYrzEkbJjMKPr5wTp8OlylDNe0W3KQeyrGSi7W7GyF70kVO+tI03bzvbw0xmepikXZ+E6UU3+CuLzWH6ddjELn7rx0p8yk3EKJyxurI0z293Zkt7Rk8dXhwto4XxoCKoNYmtSgENWHSl7otOnVoNMVXg9/zkxbE1s67h2EOPUQqBCw8ns8ayKeIJIpi3VNTeQFVmB7OV0PTIJhDAso1dDZ8O21zOPDyLal6MD1FajE8f3hoBY8X19Wt4ccmmbUVNATxFpgbVQwcayg6J5K1YNwoBnvo+jWTzwhHXk31WBslegAKh0L34Q584asxS6ep9btIANdDVhOg6DP5dr0fB5J93GM8sFWltH2+jVS0gp8Bhq7CZY+J/x8cbhvxGjqqfl1NF+LoUVpZjk25H9lo59wEvSpJfvfGKHQ2uaU9FI8JqhG16td8HDaodps4xlctZhHFydSNhJC1Ikynx/73VyvEjtv7cWaE9+o2znMlwQ9SMkae0Bb9tTR6qngAq7T8Sb7O/U8UMhruPWpQqYXq4zvza+UWf/N+N8msrxv8j2YIRQXww6P83NvzgwmzWuwjhWstAJFzNxZQOh11HB0vY4VMkQJawe+L6XwLhyLi8JJBtRooskBF30RTrdGQq5vzHZoncoRqeowawGp6bhoq9knDAjlYZwmeIkLuOxcPK2/z+LhNhXsPVHs+6wRKnfeCNp/TlsU0MM4N5/ssuTfChuoqSvrQONSbHKPTS3DuHq/9Xm7Voz6Lx+w/sFVfjmnuW0ZXHuj09bLZ731IZrRNlK2+LrkfuUND5JJuNuVxHgvYa0uAxr9CEUi8gol4qxqqaNH+4G1R1DWNXsZK7fh23+hEuoBB3Zc2w9i4OrVV0NoSyVpRG/lt/O+KqBOiNnZVwpDhTUCGhN4QR3EHButkg6VrbOQRGRGW4ZY/8apdE7Ta5YrjPN0+qr7O4N031eAGtN5W8PvDlVJpYZq1hpq+97W2B+QfPOc8owhR9r1quz7gRyb3/cjt5LjbnQ1hhZW8SUo7tEC2lIExXXe4AgDBeoFLdANwmLL7lyAJ+xFJzx6mIP4ITS77dk27yUBsgrF5emuGUwJkBElg5WcxdoK2ZbVY+OI3CRs1xQxCpvghVH8kv8rA8n/7PIRxs7nOowRWZHAxFYNRsBghXMtu3svdhtujQ1ey2Pu+ZpbmtmbpXOgcudBVmVSFXKAgCowobfEI6xaIv4dws1UDNgq12mlKDUbAukNQZZORoDg/GGWXk2KJjBFwGmrzZifHMGbVYqaLYoRv5HJeuS9r8fA++TINHMaCcaqT+arFt0VtCp0fypYuPoJZpWdqDYielcnFgIPnF5MqF7ZJ9JC2djlUqh8+h8s3Rf17nphFNRwEdU/ffCE4apDR8KfZvmTRaXwa4KMdrO8bjXfjz/uNkCXS99yC0095WuU5eG4dte3ow07xoiQ66rztiGShG3GuyTceiqnbBfrzxFqL1U4OXrvCywATej4r3dAZGUoS2C6WuyHHzwS0O6Hbpw5KwX70z8rf8yCxRmP1mtms+oIzJWfYgR+ngqGKLZSOhutr5oOOY3o0iOwJH5xgBz7+oJA3iqdh+napAsnn6RQVRtDGfaDIKmUsyPkpfCMJwuSlLv8M/YyN6vLdpN4IrQhHy2kYTz1pv8mwX7jVu6k10A+uuG3wtiMkhtPP3zp69Yaofsr28hOgxyk3VMKof9Vq7/jte/KLC+ddkF8+l6kxtDUvBanUGP7T9QApSAot9oMAHeZGJq134tlS2NGGkASRre7INS68OMT0760kFdBMGm8MsyPpJguPmNrVaTt6chfidSqLpuLfbPD1bmcPB59Hbpv047cWrLIGzVkMQl3x07wWe0NFI4QbYMbt28WVio0+djKzxMH1+lQ5FuDfIWlzz5tdZUH+Elz2c0OOFNQhrT/Auo9XyFRBiuqYtU+guO2VKU7UW9BX9vqmoGRAYhallxdCkQNQGwvym4OiUxZlvsxFnCteuHByQryGMB4oWvoXKp37xSs2Gxksx3VeCnl9GGmrcEh62NZilatg4ft7C9RRwMxX3XB+ceHZ2UImEXQu5skvsTI8HoTWPxY6Hh4CDcwaeLaNsPhp+/Mn2zudvT7W7m5uBhgzZgy+z4QC9DvfrUHSMQoc+HyO154PxAkWGOrC3gc+BT6v2qzuMIE85wpWNRyr8fMXeMuDUzqZpVQKl6bpr3PjYVT/rVfwTYCa+oFC2hrpUL9tkDs3AjdEkkghcjVYEIp+IF5EAUnA6RLzNLJlxXGdSNWFXQwxHh7O03zvugdVcCA9Cfg54Hpxz5jWPRrgf43GE/ML1BQGSb47ahs4VCMbXymlwA1u2HVXQYNMqGo1sPqRLn8QdABdauBFP+jaEdkvX8F1JFPVzoPmpqmQSVIhzq/yNXRGYc4N4ipIULTpzCPsRz/tJZzIS+NnOYtr40RJq+QwVUjKEw7LEU1rMdk9Bfh5/6nX6jbkp/NP1/cOCf9LjAF7tovEwvIkTsG7bK4P3ha8qsQirF1ciQSks+Jz1UskxZucyLnNdM1BQwfKLDwCKlDs/Xh2m9MBi7nw0doEP1A6yx106KwMC8nrKAbxz63iy+zkebsIxMLYg0VXC2HQdYuD65IjwkdBqgkHvccCwjxdfXKXkxMd2WStZNWwpSieKCEjVN45FgHjyFXlTQuvfigqQ8a4cdWy0wp1bQMISBT63msolSMtScOLkCkejarmdCv16R1ZEeXQRvWnUUWynMtFXyK4enWxAMZwGwVwguVBCs0ViFmcWF8mBG6bTAOIgtUexSQLszOoF1HPZBet0IyaJE9HPTLYpzG2sybMUlZU7oLjWuDInDsqbkzCEDufBeDR3YKcvoIBSPxL6s0P1mkLqT4qqgipREYFfNhvtRox/Mb43gkwjH5/o14BJoG0/r9NtnpDeGIewFQ1nr8CMHC5nY32T3a+GJ6BLpYlkqyzyLMgoHFD7JRTuqPtGFDvdIImi5gVfkiSvgWXgcmEisdqLs04PuLRha3rfrSXCaoWOJAq+FOXUoWcMlepZ8WX8Qn4saJS7fsRzhWwVZTc4DfcyfV9ublDFZHydNBH3e0pCcmsF6EZznspYZwXMeYnzmtVIkGbhRKrjBD97Cr1Cvk3+uwLg40fo5GdIhjFp5OsFa+rNECA62AOigWpSaxEVDNJ7ne12b5mEAZ5LMTxUhg+G7WRk3sM4XlTWSXS2X9lnYzmA27dPt/T5chhPqGTBMcJsF1IcJwJwgeAM2Sb99Cf5MptAUMLgXEEC18uFYSX/ajV4a6FjwU/dtip9EwMzOMkMg7G4xAjJMjlgTulyo5cZnQKRU75QZDqYUOSkgn7bgYal5cBcOgYonYcgaQqNp9L9jEnDT4xffSifrXlhccK0KrFiONzCbhOHr0uYSCSHdZ9eP2zBzGpwEOZgxn2WcYWsqiahBjeB5OKEGw00V3ue+EbtfdtL1mCj8qIc+FIXIG4D6xWPW5ATocpumUJvhXeZ0fSR9QvTpdatHnn/Wji1B56vYvfvmDryTWx0QebfvXnIwDLgG0Jg6iwplH0F3g7GlNjnCsIEnka/HBiYkB1G+4+nuhxEniHxuRmX5PcLBXKnEk9tVk/fhuzP9WAf7iCQrcAfswZe3plnHYSkfoHRJGnqMntqN9cgghlgj3xIH0MnDUy//wfJvFxpxbtcGC6XNTQw8Bcb11vniBB9pfzCxZMYcS1i0TWgHOrzguff98yCx8BU/ZnHJCrABv1uQDaxh1aY0au+89Pn0qzPhh1MkjI1Tn5HfgGzUI6fzU8RQGWqH7LalICoY23UnNUoGxUREHHiPIXxdIV0LgrRpGJvOG9JrtAaY/vrGcK9Jhb3SUwRjAHhCQMvthINMQbMjBtmXFtjtzaE/DkN4j2P6F04FcylJxpX/anfJx4Kf2yCfNbPCMQhWCxJYTsWXi8VXhivTNTsp5BcWu2sKAjCT/le1CnXOrvZdn010vLX7svyFaC60vEp7tjLC9xSnhJiI3w1oEBrFhV/iX6JETsF7Sj70BWwbeRLvn7v+/QRKNGnXidwrygH8JL6p9jwSKP2gXIL+RU7zC6KEIYYPA5IXbQLDJ7pnu56GLpalgcvQMGHQiXLF03o7SLnLeW4rm6YgKzWtgBqhSJbpz/6SbeCFs6ifK3a0RUgwIVRemTsZPcc/uX13hBG+5hDjhTTrFRgm958ZruVGaTOc28VPorwUsxLJmKp2srM2J2xtwXlFLOWQpAu+/iggh0UNjnGf0MJfRsDDcwyBW+mkUTYqqniB70OrzRLr1+evWA4J0pmiGKDVHGzzQNXnFwG5fwYhXNiLgBpfBB03/8cUF9ZLk1U5XYHTBKOcUlvBrHBtG7QXdrQiD3Wjgp3GxgCL3hZZnRzGWei+tx2puulHxTj2/kEwSvNLqDLu9i1VUSRhWaynBGxFJOpv0v4rd8B03h+Lc1ocu71yQmOxUaudWymtwy+a0g4FyWt6NoNjHX/KwFsfravQPLK5wpk/7wziufEk7gd2fR34ZFl/wB2arjp0KZKpE8k6GLaPPNVagwOE3+d/EgUw6fniWDwwRtWT89nd/vWcuiGU9B/Uo5RlLQN36fjesl11ec+bG5E0/s+5yO6xYxC1FQLJ4SPE9AfobxmVMXw1Afb8wd4WxF48gzkHvX5TLeYhgjkCTy26+7Ng3cnJ9nrJNqCmCkmLtyH+e4IaoU6OIHvGTDu7gUuhvwRYuS7ZIfj3iVXoyrFVul/GSSTlv1+e2NbOT9tIIUBUnNdudaIObc+AQrSRi+kkTpaIwSjgoZxNIgFfd4TVLag36MUuji7KzEGc7V7YocFn7OtDpTX0rlrFmGxwtHEd7pJbfAe7ryDphWlBWpo1is7W7aYZhynKMVobcjEh1zq0Vy8tsFp9Leb1HcEouSUWDyJwUZgNC8mdLzQQo39cWMVfp49SpiLdY5MTpWKMz5+8zJo26283d5laeSe0uK9mENVjo8N5MXbAIVKFKb6/3rMskbZXEJX8WhF9hNsA9j80gYix9uFCLab2gMkt+uQVFV6yB02bcuDoZLYftte8hytsg2vsiilm6iY3mmKcMby2HBCU19VJwU8N7Wek33RubJIqCTy9wvlWa28TJs2ijIe0UGbTG98TktngEuZlq1fAbkDVGvAzh5kO8iEZE3mvdxQmMArAJ04FJ4RrV5y46jN5US3IhI50r2mralI7glJ059YaGu3mk5RxaPmSgfcu9CbYNLvgMBh1a+9zAIs3qrOGeDIpGrPvBpWlda3S6AOlW6fp2ASLScYq0wTPa1Xy1w12fcK4VWONn8p/2G1rm7vBATvl1In0R0zjPJSZ4qtwypfhbHVW/DSPmR6BrD2EtG8AwY3M5Ri5ddTAphO5sgQMfuLA8YkWF9y8tPqL5nbeOQDCZ3SeIuyyJt2Dk5fIQJhOqlK1ZBsT/27NkUsD2foYds6w9MyQntA+7zIMTy5apHSVj/uP7E/wr0/v/d2jUa4UlDDQD6D14sp8F6UOa8YOp8IE/MUHHTSyY17YTGowt4Z5lXlbZgLs4bLuoykY2MqK1/nKn/hrliptgrU9IoDLoCV0+jsLUCTat9B8jOX5aaYwggeBcrY/fYUMqxA1+JKzQz8qhjp+C9g+7HJDbq2BOki3pa1ysisUEKNCon99E8zqrG2ncoJurKMn3Ju1pBDOlJ3TUpOyfM7g/BD7Ig0K3T6LdHNRUwU9ieN2If0Ovx/FeJIRja8Eja6GUVQTpShCUjt137Il2hLmLRFTjLa+KZ28ZmKqMLarPes4R3IgsNW81pgus++oXWviicW4om4aZyLVr6ozEk/yS0UWzFsq+oM0ZdXL/k+QgEQT1l7Q3amDmenPWR9HCmRCFAo205mdZA24sWZ1k5Y+5CXOyg2dXpVGLlE6PEA/l5F/3mXm3zIt3TnnRLSRNDx7bIYm0wZNQ9sWthRo48KNC5aCXuBs9BqYc62oiuCk+JddSkVnhMBBpOAKXoWVlwRaizbAdBuAbqtgoWiJStPwL4MvoHyc8Iuko/8aKU1GbVYhNah8HP4ntGWzp3Nyu+fP5PzTmtM8kdpChFzDz3DDqx5akhO9Opfmpt8amFNWWtDb3C6xNyIFqkm/PHi6lfJGHnUS7C4NzGEzOsixEk9kMi4PZNciFaRPAbXeN9wX0OQg56FgBvRSwj+Kz3ProEWX7yIjxpVEOxoY1pq8s1wVczj0gb9ynlc2exfv8uizgvq9jKwyBbAxTeY9tWLiBOoP4t5Q1h35tHDgixC90+kz2/fTA5XoQBFd67t/iXL185bYyjCJY9zCAsKQUCEtQrfPHgdMnCDdetFoXNkijF9KjCkQ2BEEOcVZJYZI4HwaKrl/xGKSVXXCt9rCKp5EI+O0Bj7iHZB9ocrf3myOQFCfAlqWXHQdTv689tuEo6sGUiiBm+ccsHpLx8BD6hAHcKKZwUcn/mtkjDTiH7t5shr//yrv/+LNfl8dm1T9EIhfTOkcLgMD01HaNl/nDM7dp7ekQ0YCxkLmeuz+m9gomlT11VGzJAunWs64nac3e5+zFrvEXNAtumaja7lkxzsISlN4m6l7mK+wayWcHU3JuiryaadWRKm1jfRdwfbooVi3B9bCm2QBn0J9N0mGkw/b7Cz1jMbMEj9hWf2p5cC2K/0g9YWf33gzngKTX9ZOTxV7sOFHzx0lA3PmRuvyPj1xtoYiXKr8vz5G47iQ9UPSg33vTCM9xaZ2EDeUtRsLiXttbknjJ/YbgklC/HTFu8iK62LnVLQKZ0fg/WOSIsC59W76udrZykviD2/unmecaGTW3Tfx5s8ATaA1ylmLUXWN+iCQ5SaiJbuao/Cchy8jky3lOw5HspUwoxbmPyyv8bJiMeN9tp1+0ifx/UqcW0YZ9b41bOrWxjqu7ia3x3/Xxa18ErZFOo5ljMA/+wwLwUto8MG7FnpeW60tmo5CR4YkV6w8ZKvXt1YbCrW8usMtXXTalXgKSo6IZaHFyLNuHvHrau/e3mZfZBlKZTEg1SLOm8h8uJGVkaIMk7HfiQyLXbWUl4gSi7BXp2HS+VjDR4TRel20Le//6ttwxpM1skIvZShKc1Yn//T8s68qGLk+R3ohraVH8/UPTx1xuT+1ffW5sHnt+Bg3zXpSgWO14p7LJ12/astwA7PMe8QlKd4i46irEsh1MCUPCwZO43dWHslYxTVfn0Ua8qTd6XLMvtLsvQJcvuE9Ed20VpkvazdWvL7p1UJyusKPOKwHXnhyUnsJAvLxP9fgqiXYgYrx8+ZTQkkP/bvU8WFfl04g+xuJlcnA70nN6QnCU49cSeDWiOVpP8c3AiAv52snOx/TopgUlZc6Euu8gdB6ARGIoKG8ZuvO3xyn7554QvA9iefevIkRgegZVWHMfkZtphePl7vxbK2pRZeFlgoeQF85r3ok8mk1HJ4xAo7FpEP7r4Wlv9qC4h+JepbYR7tZMEKeQnIzmUORFNDIVVnZOi6c70eCbOmnGNOphS3Z/fT1iJ/14XwZ9h8UTSZKWVHa0BYPMTO+TAUeNmSS9l2MLIg6s3P+JbL+GksyxbmdBritxEuudWMfdG5eeYgFoz14Rp/xcjbBxR7KjM/4VP1b+9BCmKulghNOdQ+x22InN3+2NPOI9wl6dPdB5ujoBLjdlVkVaZC1aY8O59i8LAlZT9Oi12CFdZSeHSC8xRh9XPweRYZ+Yr1J45dF6D38vkGy+JqwUahAtHrmNbBEmxJWxWZ25Kvu6UQzvBdjORnp9w1vNMhmXic4P2Q2r56P/YNu2T+u2umlOTsPHNJ7Xgjziod/WqqGV/NSnjSo/gYRYDL9d2npYCY5rcnSdmtKpbFIZRD2tlboZiqsj3xnUwmozT4bwmaDOyVLh8bB+Xu1FfUvR+KNb244cv87hz5tSQ9eKs/goPGhE6AUcXuCacYQrZF4Zj4HmZHktmCYpwYTrT09xnS24ZTY5lO0+PgdHZBHCi1FalxbQPz++OhsbJ9Po/gQao7ddnkR0b96mjnflfRAWMshby6Tz+3Zqva5GtYuF9ikZJpOP4L7/4l6KbHntp4vGHTIf6dTOay5eaiG05u2N3fsuki5Evkl7SJA6WtGpEpOo6+UPhpglSL6t3G9NjlccIMcUEt+CDetj5FFTXuuS+MFfj6gyrxuubReRJh9T0L2UryO0Z14UCeG07kwJbSVgEq38uw0F62SNyEhhJssp0+prPW5fhn3VPJdfrV+2Iqi6P712ZviVR0Yn7a2hPEdWdRfutL7+p2B10X57voerfgUDVgG8R/gtQDUzLHJ/CpvhMQ6yOa5xw9kLZ1NcMWj9j6WG+dWt0CJb5ZKFxvsC5X7WyF/AUUZ6s+6WbqRtM21+1iWavM2Pl1c9M1w0hp67mkpjXsHzj0wx2rTziMXNFWeseu0UT53efeVV1JNbyGK9I2R8nDePBbvmRTyEKdOz5trtojU9z/AeBTdyt9u2RRscMlM6fb1O2/UAVCZ2puBPdr/cX1uDS3ZUXrtjnkz20SjAAuKmZKSUcYFleAraVZaCVaG7Ceqema6m8vv6dNRz7GV7+OGuFSFz5NRiz4XcGSyL3v3/as3STydPN8Knu/kxBXpzcl+Q81U/99GYssWscS8XO6aNhsVya67W9OEUaFY2xtcSJP9KWykFQsKij9x2ngckwaf4FKJZS6xijzZS4GM8u6LzCLkDb6XzCdv+Uyh/n1qX7J58a8i57xyFunBY7VRTGduN1NKOVNu7u9fF3fCbar+WlyDHsGlpx6klWWoSq0Unq46zdSelQOHJMZRY9A7n2F2HsuV/4XrXFdYAI4U433RNGn/lpvLvXEruTdtW+qYBZ98//mM8x406u3epX3gqMKVJxKO3K++OoqZID5PS3Z0iGJX331KsmkuI2DJq8BZp/VFPIT/SzaCOkTFMZHCWmDX1IgakByIUKw1n06PSgjtunlRMlPSUW11sOaA0NKyzdnQP/N0nCTaN+Svs/OFCQMUNxdAaNRFSpUD4BnkvxFCk7eMUyCsHds3ouNKrMZf5Uu7TkE3jFkcfLKq9mdZwQGoIIb0K4eBssn87yDw4cJGfgcdHME+wwUyRxxq51qF/kR29J/6Vi/3DHSbgK9wUt3prijvy9VmI8jvHtVNw/tHbz04Sz8LeEecB6vMFc80pXfr+5eeokUpV17vIozr02fj0npzH757/v+wdwzXfh54x8T3uP6B4CqOrV6pbZpUXKqWwa5GO62VP3CJh+PtYFOulu21TeaX7ygv+F/9ibZZaY3rMdLqKWL9M4ceSadIsx7xeZOh9F3Rrbexi+jPZMYy3ag/JsHsTDhPfaSqRmcuzPD9Mx6jWi4TyrJVB9jkmtEGi94VQgsGfAvCCzJpB1RBi3LtcDn8IKn5p5zuc+gPtVRPTSAQ8LGvJus4TJnvnuRcZtuwi6PNNWR/Ry6VrfTZpauacEv7I+Sug0U9uwe10WM/1cLxczDZO5wiu+XHUYnN4HSNdcz4HDsSmaIK+bLlKb1gsznjqaK08cZiMZ0np1L9MZVffuJm3SbBCKXTuZLluXk8RDAOkqxL6edwLUrAjtssu7Muw/bGWgO87TA5+c+lyONv7yVVi2ENaW32Qv96Or2L6YZBJHk2vXtYFDp+7amd2ls9K43uguVWNVF7wdKYxboXpw9TleZ+LUkDxZdy65P+g1ymAmlje4bR/xn1z2G2h3z9rJfrbWWJYH4XfLCfPj8TU7OvgaZWfyT0z2i5cFUreuG8t1HpyIu2TyH1UlaaJ1By1RAwPJ4sakAJcoTJb3WTCcPwEJfuI8+piLc7b0RJFxjwI/cT3ZZuepEQd/aOgn0zTJadrV8OHWG138V33WN1x0TwhJjdXGhv0csri8XtRxKREghltlrAWk2VAxJa1myjbNVps1pgKeag7S93Z/tQKYAF7ckzOU8T/gOeiihNKhM15EGtcaFldy7TSaums2CiND/Di7MvGf+bH7EzJoXTLTNOL4zT3vkXJFm6RoSuw07y+FEVJ48Yzq4qUAagNcmJzO78UQvukURTEFdpeEvMQtP/B+xscoNgLOjqsVkjTfEzTPO9xaO9OV6gTewY9CQV9amA/9/PchCy1P+UgnvR7vCwMxgfKBSVYUFh7fvDS7qioVCzDhk4BCMQbztb67dcK36sTXLjMZQ72wNkMnd6TErdb76vbuktLYJcYhwq5GQTLS76S2k7VZmGkgPXzdGQoEK9GcwjLZtJ5g//t+P8FbzCsPHrzYQGl9a1tzZEEVpebSosUPUZ4QmArzWHNQmRPeKAd0uAw+kZlyOINRMo3iVk6aEZfvGXJHM0Uzbjad+KE4r2JUEOer2vxCejnsKFHY5bJcoHWEa+99UcY3LEzsvjFcvCf2r1aE0VgRS+cTA9x6gKjQQjFin57tEWRuCmk1yE6ivHOQXvOiPq5xw0vd9XY/oR513XuOO/G5fUpowydvIv7vq5o/DsFrntVK4QCI3grvWvpQU4KZHPOLVTGH0hh39Qwc3Ad5coyc7D0O3ne/al/SCbiblzOa1i6MGfi/ELu/M+ZPw6+uEUvJqbgrlG/cnPbNpI4l3xrOoJp/7JSe39vY+GYGJLwUpbCck7/bqd4pCTm7Qljx3dFKXDgriXPtrMgH0+Gf/4MHWbRMY5eBLpfC8VSE5zvKUc5maaz9ysv16Y3+wqXkmBreVxbt2egw5867iEoTLx7FaI6kaa6tSpq7qSE4nXAduzLnuxTzn07wzKqnXrYxuLbDwipxmTiRUlahT2nzh6ZgIgU7Xo64QIujjZTs+lmRvkZEndQ1xP69u7iO5beOLkst3VApUo+MUv2MmPyfFb+m3peDWy0sxg1+NqF1Wg3kxqwNmKUxlnKvxvlASFk5sMjAcnSvaXELVDbBoricH3Uov+PrE16+cJWRheeRX0V/miiVnjDnpo/a52aAK7ftsQ4rP7TfXWjVrIlJZNCPlWA1mxb28WgeY5pNpuU8xkdheewUMHcIirvxE39xy1WYzU6npy7PNzFTA+qLYsNmbTpgkUGEC4rhSp/OcZobycXL4w1rnrcCpWavWghtaGXkjrEHPpl6qHoNZPSXO7vXVU+h0SKIMdW35dUkjkfQrVYvgivCzninpwfGztFYsif3qTKbrUzFKvZOA5ALj8F8r7mAvsp1Hbvj+pTbyOJ89ALIDHMQnILXh9DGVm3k39YI6Xo7mThBg53H4Yl4re/E6j68epLQqbCf8aopCvr3R0/4LfM6tdzvl2+KxfT4oKCnvJILYC/3PXlZYJ+NnLW9obaftgRT6qW8Xv9Ptob87zPNf17Ikm83//xvPr4e+T2Zt4KtKgT+IPHSeTUiNYlv6yuhqJmWk70SQfDYlNI0SK1wXMuyx+EgeSpvyMpPz1ARvOpFJn3rBDv25zfq8voxoUT2o5VBbkUaI1kfXxohwAhmneZqlkjuOBh+LNYM5YNVo32wJEejUxNQi2Tia4NZfUU4jG1byJ7Tb+aJCcys/Qtbwlq2OvuMt1KCN1i8X8x4SJNkhJ0QU2837sVnChZyz/GB2s2BisnsLj/AKxvjV8hBPZWpfhIw8zQfR4VLNtk6oYGzPUhob3Y8BNyHH2+hGMTsDhc+Q/JQBZlRkKrtNONfld+yxYTCE8KPpXTpw2PwOVJFk7JLMo/SULr5jBXZiBy2xuLkXtN8mldUPdCl9eXXqqlIIq7IHFvf1feZv7ryTcmXPunNMS2r+5i69E+Hi29FPDL4wRoaK0WUKnErjXwX0jVkI5nCwqKxw61RsZ/McvsuZ6M0k/PhCLdN5zj+fRP1ptmVwic8tC90g85BoRHaqM2fvRzoQYaEth1L5HhN7sCGML0da18ZSBEG2WSdxE9Sjc9iP6Emmj1S6tvUfDhhYxkmJnwVhEHSMI1X8NkI4NiFaIB1YXLctx5VLIW5w6KrnVUfbY3X6E0gSUA9h4GwKMncRgStWz3NDHiqWgsKAkB+1syeMnLibp8lncuzYpfx6ne4HYi8+mPEx28YKOWYF46qRA/lez2EUgGqFAhBGL9vCyIbUIqIPqeZ3Mapr452eAOuYx9tN4RLFmBrW27FQLgL7UsQJZtVFniRYf3hd98dI10XqqOydDDExL+mocLAdub3WoGxmJkOMQCODL+Z2ysJYMogoCfC40rxMimmu3HqnUoBJSLkqZfRuUQQUodAu8yPYlSQ+JqjUaTyWVGYJLeNTeqvDVAWFSqpDSpKfhn1T0Bb3SMzy06K2njFbeYGTZXNXmpbr177mCSvK/G6Ab+DyNNDBLmKBgWeQluszEa1zUC+H3CzvUcF4DULLi2spDtzmvIoETdTyzKFpj4x/Pt6enkUNi7QrirzprjVy65+xGZaH1aKTCy1cWVMxZHWjDfmMwLNqRizi+AzWx8yZqqIIUQv1XT5BAFWvJr69Us61a/NphfR1ETuM9tEX1+K9CFssGCbk9VJpJMkwh6QjXMHLVNIFGP4Fza3m+xNSrIsHtXNUDZ/jVRwVe5RgZ1Fpk0hqvxAVLMJ98MRZvnLJUF2SdWEu4WsnJJyIjQBBZT6heXHprrx2iQ53m/Q0YlMXLc2y3U9XmrLXbXUX2BPFNynk/9faXKCaDFCZvRM1zDCMPjT/U1WmWWZz4LOTky4HQRJ0FApaFXKp9CFMbcxSJl7amnRkZd5LikV9zx9v30178K+mY54fP68P9lilCBTibJN1Bwja+TD4tAmVm8fYRAp4yB0fI8XYM305CrSQq/WZp7zgHRKhp8A2QDtWNSKej7Dddu83LGeg4Z//dOGUFPYuhjer6e/RZoyCHv251OED+qwzndwhOBdEaIa1ZC18Ps4xsYYxzhoSpnkncUPdjMQACaXHWxYVgJkLleH5M3Ta1tyn/LRYCTsAM3C3oesvmmZmAh88ueBv35wGMSLaOScurAXjfqihoNUqke9lbg0WEqrmsnq+lC1iqek2iSnK7LVvMJd1umz6NDL522Ixm1iKSZkTI8MUp5qpwv68f3QPzyz//JnaZ9vo3S6PoiL4C7jFu+ewJBpNFu60fsDQlaoQMOnJnWMaxZ0WUHTI9+NuQwv0ZR796ozdqS4Wet1Ui7dgsN1uCyUbpyNX2AEvnnn1IwGd+cG2IRiyugV19n76Hejx+q2cyeIf7c6oqEouTLufuIQX0hRbQdwANHuqZc3eukdm7P0Mqs016OLzI2S6wvxXKodn/YaRf/OlDqjkB3yQQJyNADVo5FT97haF7WDTKoi7pbiddjlsCp47WuFe/08ZHwv9C8D2d/1Q0J+NKRZJ2SZZwpegqHg3qKKjaK6b4QlH4yLeXsZ9BPJAnYDTjQAl2MyD0R/WvNvDwRskXyg80BubWr3Fg3J9uIjTc8n7c57Xq0lMoG+NCMn3L/mIeo4H0PtmcVGLlJyT/W5EE1wY6nau25dn090o2FHmYAT/9JTtDc4lyRP3/A/pVsH65LJo537JTrOYpoKc94A1J1c5l2kE6hnrqxw55Er5nq6yDIVa12Xnld5wMlimwsnPoRq4nGouq1GvhjGFKo+K0GC73nMm8REvy+DcF6aAjRyM/95GFRXJy7Y0Hkqx6pB2ypJSdR5FdmgYhFQRoPCsgXdL6xCqYRactYVpUPI0srlqc8ZuqbIQDs1zcbqWgfSN8Bm1pUAL7EdXNPeiBXPmPe6eCpDr0J7ZsULiRwqN9EE6lCQQGkdF7Hs1Q/nhGpG20BjWR1q7AzLBDgI/Ja3mH6yBuxZWD3/VNCnsOs3cM4bjt70/U2YvJEWKqKC4OsE2P5OVpVWhuIzCPN7PdBNuwPN1Lc8Zzggqi+HNoKpALot/zkBKuCxm0UfqpbFDGXgEfOmrheg4n49nxTorZpzlshZj+qJLHoAPabuElZxIolWkuMUl+gIV1weFijTxi4b1/zJzzNllVN/Cv/1nTLrPYahEByW6259ZJJ5p6cUwNbVDGwUxnrdL0WbOOlBlgDV5NwO7FX3fQK7J7sDhKlzROvGj4Lxhzeh7s2iJ5LuK1qT5yIkCgf136U8euJfBnKdOkfvWEMj8/VJ3wNyCc2GFP4IfIfr88ZrMNBIFYWWhTy9GSd9demPqYIeD0OpMtOkpkjR0oGWBh/fyIE49NCxnHqQoujuxdzacNLnFqQv12lIJwCXCqRfW0V9zOTY89xXTF1soHMPKd/TQd4jgWZFuzjzi1c7kBfrDF+ea8BgZ1foG+bisP6uLe3SM16GjJRRv9GTq5XkkwO9dCO9qcDAK79PdbdAcE2horYi/xfo/ju588UXIn3Ri18+Elvw+n1qCP8EBCYRmSwoh4IkrxpMYwov93LYtPnBDimKmO3QDXrixAru8f8K0zZBVyg96GunRuijsdB4KF1eom9anTIoV3la4HoOiJkhdUly1MEYXkLjjAi4wqbiiy++YPSvmMUgiUcwbG+yZURF79PV4vJOiWmou/Y1Hbni+2cXQB+p1UagJQlttNZWGnD2QTdtaQ16Jqtba46tBTeoVzaHZCkBzhgmd17giONOcixu21tS4ZL4PgDZNTSBBAuiKsqWhCfsvCoE+dIOKp3f+HydCVKFZtHKl8geIqABuW8shiZ2/BHQCjeoIXmuMNGVqpGdQRpF3lrXx4IyTyElI8zWtDXV7UzcQC21wi20yc6gTaWpbKBPXIQnC+EV0aTqxv7vlZ9GB/HYYQvw4dxu2pT8Ug9RdrmLq5rEYDEs/VG5cCLjvoZfe6GwbOygXNxXjlZ1XQGptBnCKlayqDK28yWCQJUa+UFCqKBVZ77K3Es3PV9jxhs7eB+hT5FeWJMVdlb2z4OAnfdf2AH8iy8/qMaM+ssLWPoSBITkcOxEvTh9PTUa9BDC3nQ9eoqnN99BYSsRXgh+U4wjvPrO+NLj6o6Uxbwlgepq4Dp3y+AObx43GIytXBwn7H3OnY3wKQHc1R+byGhMY4MQ66XktfXN3Y437YEBIzz46GE40RDkEfiEdE8+PamP44fQRAX+HzOZxnsFHDoctWLHdyfC0JBN/SV9pBJI8CdtFD9+gjGg/IsyfrYyEKKM64O8P3ERngSMf5HOKagEshEGyOcnFDLD/PYyj+Nf+u4oE3Zvk/haftbDCY6vv02UeHd2FN6X7vsZXPdPfrJG/JTW+ovpKJg4yei4agf8gI/NKa7WU/Knf/qeIPUcK66tb++kIqS9E4pCPC9PCNx+4DGDGjGcRMhXd2L2agfwinTGgCgtGltqbYinwZtIzZ7p4l/b1OkV9sEU7b1WCfLAm5t1i4i+J60O3SovP38XzmiyHUn3fNhyd2g3N6n/lzIW3hIEPvMD9QjN+ydQUqr0VIfEJfNsusBNaHTjPkDeMs8kcaulBbdew3cA8J3UFzzEWjs2YOhkpU6P02MdyRwC4FB7Ws/fZlfLKhld/6KNvJIFx5sR1XfgbNOGnhW9z9DCyBr9SA53j4d/ZsxtUdzRaq3Ir2inqhKxFXLcXVIM52iZg8bKkOYz6KlDkbdQSvGof2UN5MRUrrqVVZW43u7LBSpxftyCvQn4nWcmginaH5PSRpeg3rUi1RFS98nFZa9HNgszncByavwUwWhHCVbIDvBuxgGeU/jXkNhfZfwgsf24L74zaZr9yo4O9//z/B2mQvIHE+ca/vg1Ug52sWpk1z+IKvx4dWXbK2YesAQfQJQ3gaD6onmYHAEnpuuceHx8fYvn6XsFZbVTpVbfX6KqMkARgXz6Iaiom9rt990aq57cSQwstm4FLOeOr3hgEmIv9tYozJGg02sky/CD1wEMUIPExTFZQEvpKgDneN9AolTafp9Dg1s5214+4mYHJXkizsvK/X2nFNXQfpf27d0XPRw9mhNlbHejN1w35OoHLnmk6EBYdX8EDrvCiUoLUdU8MjNZ2XNNPLh5c5TkQVGV8HgnEaU362y2joTmiynUwJ+j6pAhOqJ+Ygvr7ZNfrf7QJyeRM15DH4T06LyHeWOV0IGgXxWXnVjRlILZY1AKZnDvodwT7zMFRBNBUcFGTj29y3fdoLwJreA53v0nJWEr4n5Ig8DXbojyF3Jdbu3NpuxW3R5fnIWLzl5SNmXIJiWMbRzn8wCFfoClOzYDcHWQGLJb0kHKG1aujBYBRfUK1kzhktbtBELUoYKNGBK+g7ABu46SUF9ZVEhcomuyksW5cB3X4PUdw9XBx/Oek7gM91Sj+Q3SmqkRyxkHgDFGxVunXMQQCzzMW1vJ0mbOu7A8iXEu6wQfFmQf8n4EH4GmwgKUEJJMB/Hx+sR6bgO2Lw5fvyvWA9LgdzTlNNBau6gwJYFaO2gxfFhzIJgxHg4VuWp1lsq+AhyIcELS7yMbf6JFdEL44khohemubRb5CCK7DY9+YYa4K9fMuW9/J2GFU9h6T7TZ7t4DnIZC8wtLkNJ9SX52HPx4b2zmGs84AJ9wCnZZeSonH5VBsSFZjEKttmdFRo5N9eR40HN4TpWEEdy0xUm08CQtld/H6rjNSt1yerjC4ytum3qjTgvsxlSUebYCW6RetfXVPaE+HHCtZjo3TmRe5RK/bC+o5OprS7y7qZ6i1y3CwlPsniulJbbZ2udXOuEWU6RBD32lyFaaeC1KhOK+cF8uZAb3KDnagfWYjXyvkH2NqxbqiFbFPiOlBXJBGwIxx2vfGTZKUjTngqve7t93t2T/EKwUpBSrrDZX+DQ3EPaOzkqj2Lw1BVzvkFlhHGz6ZLG8f+ISbxMSF6NlQj1FDDpCSTpp04q0xf9HluNGqYgU9tSuAtAq0bo/qmhQ8Bg5buTvtEhjmnLSUpWlU7vGZX0dDgP05tWEET/L2nTDYuurkr0C2pPiSNdN/ILm8qRC4SvLJ0e3QV9VYIYJOWEIPbWsICxMjQ2zDUJ0h1UDI0yVTVMh5Pni9iuX67hbRFR1JMaTXFtJ1kww55AFlvRVglrJtO+RilRqNkDNpNeepfWbHa8XV6+kzjuxCCXVjdAX+yIqvLVCk+sInRin2QJS8K7r7DuJLXnHVkAn2VmrYfB6It5If2ENx9gTbOWRz4F56HMexC97a95H7hEw3bzYTgWTkcvMNQrDN4ZXliU+jhXwKOsOAqu3Da27Bhzvf8ltGLzuE+lC7QbNB6m7cUijXMpnvO2617ctC1tHzy2x9XzIBd3XW5IC/caBogqWYw63s+CRsJmVRS3+w8WOnIIilgOyU2gKQBbGgVHMqwvcJCWtJPKihqOPZ2YliiYfxV91cwsFO3dhydReNeaKlVW31W1DWF2/FHwNSBN3SD/bDOxddotZMr1f+X8BE3kbwx6m+1BgHguP8TpR2azWb5vg1ee2TuK9e3F65g6Cjko+g2DRAmqLi7bSpFRr368mb7ai0Jl6eZrCyVtqJ5CqJYusf5LGaOHn//+CemODKscmg9VQDrSWq+34/bAMc0kVIASVBQZKlnpDK8RMgQ6JOhCIV7q4u4pX5bJ9fONn9g/aRx+34tk+erR3f91+ebd3N22pc6liLI4ntuKBVj2Yqr9CDUyNqxqSPZrv4+C5l43Lbgyr3QSm4UiOdyXfx5FDStk3Ww4rUL810QxVrOV99ffDSNAQfKetjYt2uXYCg9iPWQvIZji74uDBJgU2pgyHUgleVwd+cZ5WRd/BZ2njYr6VoQBx8HZTtONrKsmjLNOK6WpQf/tkR1NvPHRLISTyb+spbTrRpbRCj4aM6PjRZfkkfA8OWI+WX0saJ9SbLFwCEQnyk/ntZeJ+BU1hbghsZ0SdKCqtHjrQe7f/utbZxQpSkIOKRCyZKUykt7/uVXffRtl3b1zbh23MJzBJlqXWYf+pLXzPwAZyf+/W+S0/Kz7J8eb4JO3Nv5cpLH6bf/HAegN0EeeoHVcRHc/sXRwl2dogngf3gk3238mkFDIRUPf7XLQEOAhloO0OgzV8ETp/kXrCedFJFs729IbkE7R0CX7aQLz/ukeiSBCJWjWOxWGsp9hvRmkVE5UD5+hRmUfXo6O9b+n07eLUEpBHMYZPB+zN1Tt06XC4vX+Hx621D080l/6dXDt+u9VCILF35GXVn9IBWshmTz4Mjztv8fOkgOI+6vtFonZ8vZTAutQcaLh8NN+XLVwd7OIvi5DQhLRou4Wa9EPP9GF6x1G3p7Pw85t7Zw6LOEupgpQq7p+pLF9XqByRA09kU2DwWxNK/Mjc1WDTdWi46udwS9W4n/tudrDgJR7GiRasSP9cLFU7nl+/QDchIjLPdxcYDiPna0LtEuiEhuNuvt23OKxL5EalBJXinjzAYD6m3TA8cknLaRSiQJb7bnDBuFu24YvoIIhXXxafJXlK8I+jhTnodb+HlXaiQLZR7HbiKXoRcRT7LdINGZXic+S42Z7oBtVvgnK0DFX9E65f0qbURjj+uzvBuyzMguP95t19O/WO3qlXl/avV88FhZFDdl1qjyXfR1ogq3v/GPIjkJEoI/YP2aGLvRRiO9cLuJjB8co2xFPiepgWC9vgXHwMEtHc8TkFXvJdZPmf7KwKgJwHDa+3Nt7izu79mSoPA03wfJdl2THa4ftA322y06a/2M7FxJqpKZ7N8pOHxWS4rLS6jrnPj7fEXQi/ucXqNqVTdc2u1Tl9OZ//bannu378ghLImw3289H2zP4tCO6G5+NwDOaYYWUuuUcbxoqy6LW1ztiJaVpm7r+dip4y/j+j34qBDyJoQgTnROGdFuKkBF+KwoNFwGsN/l0ADT0g1eC+RGGqHaQxAs4doNqD8hiAu5AMemtBCAHkTgzckoH0Ebg3iWCaM7DqI/Cn8oEf60GVS+BFDEREXkXnQQOAAKAAAUAIVVEyNgC4nvoI8q+DlciztHM0oPdx7f6uw/K5+9O8tuftsH1tzpzj4PumH//eh41rBs73w9NH82rnf8NGmm27X7E7Y9bz4bpjfAr7YXIhbtnX06yND/HvF7cZDsTMK6w0yivck8E7fCQzbvCEeeYLA0n5wSQW8AffsTAW+IEq8wdvrJQTTIEiQoioiRBa1lkSQiaozAgjDbIgTLkxUcpAm6WhVDYqt5Q9HbKlPNKZ7LET7rIccNCpPOMSW+SA69iaXHAD20wfOGOn9B9X0EPfJJHeaE7dssv0izrzovSXeuQAXVFP4XmVsDIe1D9TKVP8garnIfsPqswf8/+ojG9MSRr4nb1jpVxlP7Ea+Y9ep5Qd57hnssS78ltMo0zVf7JKnOS3b8rAv8wPzAuCW47kE77gPdnIP+O62cbDMLXcXOuhC5vnZt0dNmHz0qzDYTNtnpu1Hbqp1WathwW3Y1PbAdwWzWZ6uJs222ath/uwfm06Di1vxqbrD1teD03XHm7Dpms28dBOm4+mOx4ct6np8uHIXWq2HDJ33zwWDLYCf5M3q+5I6t9z1fN38J8Uj/HWmU8t3uM5DKPSIZ51iJz2cda74GYGDc+fI7bxrYhj5NhsAQBNZ/KrH3u9h5rI6xoFdXJnIXcqm5bWx8zCnsisMFWxrzMPa9X7onLJFa44BSm1WIM+hMth6ogxWc/7eXARcJAc53zRT9HZzZMlnKJx9l5cGjaXjAD8Mg8lGLZ9uS0tPlzbQ6C4JUNcAoh0mjTGsRvognH9NGfSPvkhG7gDk1NQRZEwMm7Z1bdcNjHDr4iqDqoc3hbqgBVuunVQLyMDba235fTDY9JVDj4mEoF4/Nb+Pjebrwz/2i0oEz7f1C6lfef5VO0XBh0lJihrRZxk5yZj6OSE/tXNaEoj4n+A8c676mKUhVMaMSb1lDeSgXCut0XfW39FIxO7XY5k1vbg6VxZFpUTqSgP9uZ4b+IWB64Atc3FVyYjhN3i4capH9b7ZTkGueJ9nGEAa2OmSFIbC8sPM5up044gZUTeYXDEIgFyKIjOPZnEQzabJ01Ci5H0j0wDKZevkXFvlmY6LqQcmy7y9JBCh8gLj9g7oEM/5ar/Wi7hzvPQTKxNCsLe0Td9MpKkzy9w9/RXiNG/Hus5EhakEYX2eCwbOi98d7VvCD7NjYhGHjTHyxQyJSVQ55L4rPggwbWCkvnN2me27YsfE/Xflw25zXGUWWAZ/V6ShjeG8Yza+MDCW2HmIN2nGpdki7/nKl57FfGGbjK559T6+H0L+oAnls+dy4I/+iTg4zqYpiH789wtcGr+7mysDNpFyArqkNhoFFqhUD0PoXnzongVPQEswUK8wJ7Wk8/aLJsX/X/IYa4pdfiqi2G2d25K2lUNmzK1nlPKhWqECjwUKQvhOLlrPUUipvDTQ6oKKUNwRKJ9AONuvwtXAml5wzvhOacBHKjn+15w/t6LGE6IJ7G6Hj5TYKCl9jX0xBL1D4XANyVvN4Uraj0h6fRp3dxVBekOExGenNtAxGsMJJEXwSnsOzHpEEWqhcTwy4gnIAsy40BkXVrM6dZ4L/8CBJtab4wL42dMmSMvXGyUTv8SMcwx8jqChSORbxg3SHvc7YC/GaRrzihA50yuCvGecj/x/DDUYfryLwG+YkFWmFvNk9kGiUsf0GzIvY0KuWjNmGEiztuBUJQ3DNuw/YgPTCITY8JIb2gQAK4ilKRfSinBnKN9D8JSDjv9F9DtMpMIHmlBU9wJNvoynL5E9JBo1CWLBB8XpZPZjQdBzXrSKWYOVqiBKk3odZ90DALpPQliO2dTDGu2hjwVE4Y9nhVI7ngMPPHSeQWLKDFZ00VGFUHLyx7WDcrIIjrzNG3u2rEZEuFLf9+/9U0JEp1B+xjqFSSDR7Y1+k527jqWZyBNf90sSGUCBNI3nz1rUwvrKtTpGfGMq5qy/xLW9mWUPBORQEOozSQx/dQkizeMHH3CrK8oTncYhmFY1nCPtJkUxDhMX/cO4Y3ewa1dtE6yORpzeRxEm1P29BMm8jkljbBA4qNnCHte+8xes94IuO8Qfj6oYlJKVzhUTeDsNKDNh5Y7z6noNiyrS2/96fTr+EybYlw8ng2nRMKUZHO4HAGX81B33dzGMo7rSZbeA6Qp0Cm9ih93c+k8YayMcMaext21OYmr9d7ylrDlGbLtRVXs6kGi7y23bR/hksBpyeV6I0PoFYxZZJ+O16roTOuYg3MKPfebQrgNxD2Bj4VRqQjdh/TZMQN9lPo28jyUd5kjV1YGaGEqByC/WiQ3s2VwHN2G0bKAz7ZpnEItwLParXZv0fGfDR0b0Ufnx5XxjkiK06d0SRb9nEmWcBQ4kl8QnuCs6TkH7H5QceFbg9aPtieqiDuIqHcNlTHewuPl2E3ODphILQBENBQR8mrDY9HsyMYQZXyIaAi5BKYxdyt+Gbr3llRtHbjDAkbUT65SPKMJOBS4uhXoNGIVS2yHXnTArOCbYYKE3s7KHYziKbpSSnVmPUQcDBKIfl8FFlsBTeJkY/3NBsyfbQeEYa9Ixyads3m1OtcVtd2OwTPmTQxtRwtSAEBaNK10pPKp+4SawZydnHMhWGsVgdpf3yMt0xPVB51C3KhoILHJH78q8LlRoFZlB/aR5qN+wlw2/noqd5rb4NYFPM2qxcM73nq2deJ0FdgDtTOuSxDokoQpK7dd6ffBNE8e65ldXhj3n+lMljjEJzckxonrxKULZHzySU9I8XS4sVWc/GY3zYnF/ILXZbJa1KHnNBeXyv+gMEYxhFefU/rqUmYYQGi45AqNtyE4J9kIHQoteGhzkTbhmLZAYdRqjqSjCKnz9Waqa1Og4kTuykifjfw2kYzH/dtepTDNW4JRTO9WCasEBJ2yhqVCMIH9JeTUkYLQkSIVbjW0VUIqt+WZaVGp9dJIEbenGr0h4rftqALR5SfffUt4Otq11G6m+pgprNWuR2Wfg3ID2fRVSWvxv/wF+bTEx7NjJ4MFpIFSoiTVMoHIGDgOG79k79djA0gQAQZYTVizm/ss8zzaZ1ER1ckvwR2hnnnKw2J3wX6Dt3UwSxO0xEcKfgtd4LFXPExkPRme+vU7Nr6dflKRmd/tYmyjTXrYAA+X1we/NJn0GBFN/G9LGwvGqL5XZ/TQuKKd4pcUv1ugM9ivyFTl5XpBB8kYibRNIN5QLg3KawjaQydYv6waROi3lX2GPhudgePO0X7locqqaA06qkeSfMicWVs2GtN/ndokE7LODr1RRgHACcnR9mZ9CtIK08YsTZ2Jb/ABXDXZB2BjPfNPCR9UogTh/IzOEbXdrD4ClAvtq+xbhSali8v7Z3611qAesJt1WlUNhmEYxkR2jonIoGXM9B4SDtUalQVu7nuyr1YgoXVTm81bV3gI26IFG16imK/kO3TeAXAXNcDthGOWc24W2oUfvdCMSRZqFWehqiSUWnPhRt4eXX+vPKmg7DmBXbIjOHNnheoDD8R7VCCS6XAl15cNRxQXSvSMB2xdot+byK9cQgRYyff7WFcovF911SJnjPsXihwckMM8yR4V4uHfMWAUOmLLypxoeuYL5KEXmMmGxFQ8MPylH06Dh5hu3zghVvAtB4+OYcWAVa2xl/xqNfqgyRfgTkGPeeGUbqqSRqyNQfE6qOKWGt2X3Z14SosFze56SJaF80GzX1d3hfaIc+mL+1GQrLDrOZKlK3Lxf/LtomifcUCL3YdFpLiFuBSiHI5DDFVGwCdTvX4ThY+hNjloapU9pkqNypl7bWFcAix2qSKZ65Y+2ZXxE70XLAcmB5jwo93DPQJeNGtUz4ga2LLNlZOBO+mpMI/MafvONijkNTH9eJ3i/o7c4WqMLl3gFZOK5qNLRSSE0AuwOoBOvExFDZTsyqcOVRYI74RXYy2RxE+77BWym2JSmR5wxi2EoRlcwThgtoAb2+H2yQuUsldOPpD6N5QKzoAD4JbDmCszNFx+BhAtcutXD2tdKjBD4B7lxarUDIWNJsLyMx2ntyXcxFTlPXZsUgvfzI3oKveAM8aY3KwktKjrhjyAFzunsQDM4vj/KaNnAP/V+bICkY/3wRKWiXyoBrfwaN70I6ndhqz8Tgd6v7PQteuznSDhIqv252Jt+qV1F1TxYwSJlR1jUGeZDGhPArFP7lVJvMzwAhD6lbFNsKH0T+0RgWLF2L2lwHFmaPluna63sK9rE4RAJBFhDAkL9Dobq6v/zKoMACF/uCgJfSbtGupkGK1C3aT/hJfumESyFd7zhKQ99ujQkNXcDuJtazHFrbByP3aXAWp5ID6CeVR/oe727B1GRjJqIxxrDvi/8CE0DqKkkGBlZtNo88NBsad2qaJmhXIF/Ysd2TVePk9yUzpt5v8QnDlwZtwAtwTfc+BwTsOVVLMmf+aJadzOIFXrj+i08E34ZrR7+VZBe4+JamwNbNZEHFihISejRHhCdAo20khPGqqtzOAjtXfK2sPeCnMQK0tuuwe+slH2nIY0vRkGocuD/l06JVU3/n7wpLmyR154Fzk/NjQ+v5WsKUgCQmIrmY/1sN14B9um+Oq45W/cabvHa9VOqrKuy3uVdX+1Iyeg8d2QQ1Lkd/3A3SBSJIyjwfEBdC2cFdD43/m3drthasGR+N50p6A8GH8H6dSJ2dEz9U80lDdv8+ivlyfNjoemN4wi/ZCaDibP2mMjgr1T/+KlYsgnqDsJqgGY4i7XKtrB01Q7gGEYhpHC+dY7/WOmjdwAWBirOFmojzIxFBXpXc0HDMbRW9N9sRsopY785o4otn3k+NLByDvRJLuVv6TBJmzZPlLpWAp5wtDiRVQpB5hlbBd05ZHves9qOYUMpZiDKadIs5CBc3SDRPBQ8iQccD6ZpP3q5X9Xrketbud46TBGuWoaYP+1JqI6S9LD2Xp2h1GqL/NbR3/emlTrjhInscXr0S4luZ0iCOP3MhoA+/+pxUArSbD8DUPLJGjQhAzY5YZlbKmbnTK8eoSazeDUzIerCrvT24sBn7Njuc5KBnZ7BpRgC1IpWCOLvi+CZFyBpv6WWQpq+pqfxnE0rwcdhwZaZePhRFTPxCaa/lyZ0ihtdEnG7UeTgCd6bbcEuSYJITEMCZq5Jt6LWLbS9NJmyDap0Ffi+TnlppHxle9AvUJOpaSsjn9Q/UW6t/hmmZVEY9H7lE7b21V5EAJfIJDyS/rrLByg+XKwxWEi5L2AZ9UshWef7DAvtqbL2UpFDOpuSEYInwGLyUIyZ1osxf4Alww7XwvdxtWdlwUbAyVaU953m8ryA8V1oMuby52KeIIdruDq44L6pyix2zeGp7HnPKxKMcG/xkZu/MVsX0Qa5IkVu5tn3YTRYR/5NhZ4MBSwcbJ6pMA6fW/z23xzzFEUYfYK4OacmvBEthKjdKfrpqO2J+YN8hznMz7lMcxZIBDqUKp+MOcEMmlGqaX3mfB1pVkIqzC9ivS6FwglJ4bzoemXN+I3nkuAGZ+wX356tm3gc+03eLVE5i4kCWSCWwuG2BtIeAdNROm1SEgJrdKxfWLRdPxY/atdTN9w5TEYFiy1MR3ETRaJiEYHXBuAeFzpkrqFHneCNIPgpj5ruD/FDgcuBB1pr29mzgQmuDpHiZE6Ssl/h+jlulPoKPnZFiiTjlXxbdqR6Xbq5HEk0JwIaA8NlWOjzJ+VEvxma3UlqSJLCCsK+y8HZ9g6YOdWSXAHTEGzsZHD6T0bh4nXBtxIu1hvtaCWjsrc2MWThCQGfK9RI25Fkb1ws5wslSoIUx38ghBkLBVFXAcHSF5NFtmFKSDBaLru9b2nv9dEkUMUi2IHOQu+9h6l3DYPRMUceEq1KLCxS18nPORyCr26SpjFspeLCPN9S++zdYMmTQjiyX6MpkksslzlBnttJBZvOqpGdeLxkPIEqZleIfHJYDsI/T2A1UQxzInBKPZyPt8ttZz/iDx2IaeTMnK2d6nkQW79v4mnxaPL9Xutj5+rPdZk7vJnqW4kBtymAk+HUGUOZOHTK3A/a33TqT3UF+mxA52ow8tnf7Q5lmWmEN+7t4IGc3mx63BPxT5VXg/HC6BsBAGmaYhKVyam55d3i5e9IMnHiXISEW0YhmFYlP25iGzwVlcHNcgXOS+ctJB2qAfGfvWjKlWjnj8vxZjn4tL8Bq6GaqT1tGMmxOdO4Ig/Giebk8U5UE6F8nzZIduZhrotvAg64R7kSjr3oI7QErduCNZDt6Et8X3NYxLTISN6Box0vFrW8auegAlfO3nSA6kX244sk2NQ2EKw5hPeVRDJMBHkYZnKt+gfHjdFnTVdGWoQEcwC7YwO+Mx6wtm1JDcv8iuz47ZHxjjbA4PiOpbjAm5Qe6MFOvLy1NBeF20Y4jNLt9FBJ3GT9rQ9ONxtQaEAYkwn7M4CW2M0bB4psWN6iTen73DuVeXou1bKJBMe94mEciPTSfdhBBUkhynPl117T9H/G3aZrcglsXMy5HSB+ga8kdD7wEAb+csUm7EHaGympb8Ea2JbMGsQkpMgWk/FIVfrKYEfNkNOl2bfI4k0MfX5hJoUxp8eaaygnMlCsml66KkD+xXL8TBnSdjrNVAu4LJ26kpaKjmhEn3jTA8mA0L/H6BdIw2QLwkb4gxlayEfpjQ90rBUDSVC1i67ECZ895VQH7590kHmNevdC6m/M8VaCZk4DBIcQY+Nn3nRcWtWI6YhszZGh40FSn1UdtsxXWB5lec4KUQ6WPXYu80tPD0d9Z/kYYbJCnCwFSmm5DC5RDnqeNPd9PihWN8ds8krOuZv5pq+k8w7XlE38CAT/rwUo9Rlb7r20P2nEpqrmzWPSYztQlzsPnkOb5QcsmXgM+txIhu3BWdIm8MNFcQhjdGwuXaq6qgZe4A8mdNsT27kL5MG6blJNBnLspHC+XvHw5zFK3vyGTydvFxmXwMYB5nXLKVh7bcnHEUA675AXCQrwEG4pz/jCN7sZSklv+775DlcGwVVD8rPmcoyKkQK8HTy0tMVxKMbU6O3m2tPw2xMjR4EoZr4OrFAfpPqOvTFq79oKctx/EOkv9ffqXmXMae1Jpj6zjweo8QjkoMKXmmU6AoDUe1A8eov4NghXeMuKFrV4kAW4TlrcCVj5/+FA0kJPaKJS07P4dn5IwGVqYy2fmbUc3i2gnOylXgwxEYVOcUCkRELf8xprbk0rGpd8vCui9eT3FJ1r1/vEc4xszb/+3zuHP0kCaL1gCr9zpn68gCbGlnMq8mx6K8zXB3P+5DrVtJLucQaJbpykEfWJ20S8msFloM/O01JEJC0K4vEHaSNKDdocWH2rjILE7pwi1XMwHKs/9nKWZ1kJ2Fz1ItG2ffxq6SvC4pWDSnTDBX4mkMSFOHvZ8u/K6AJcj5C+Tho0NBjkMgRmmp/7To0LSAt3+A8aCEyAuIT8S8LaYD9KvyGHokq8EBSQj/c1tvbMmMPTpuofdQd/e5rnleINmriWvogjsQghmEYRnKP1/EVJFmUXQ9tPpV+kZVhlBbCKNoqyYek6KX6tGt699lPFbjApbtsCCmu4wwo48xwwE8JXk8IeWJ/2zsULwjtVHlZjJZ5P6loduiIC4YD9KySQFY7GH4ivlUzTsLbdHq4VdKZEziv1TyuDJ/LMq7pI2f/wPHB+g8Xa14jQdU0Y37jfiVVSdGJtUTkl7CkibBtB6fsqvn87M3VMQ6RaxtcaQbOO6OepZx5OvOHNyOwRhv3m3sKVWeVwpLQ2u3z/x0h+bjgJ5RlKEOC5/r2nyaU99kzVVZFeGCqxmSr+rYPq1UQQs3mqvK/j/zbn0JnMLta5R5kUULhBO0WipJHm63Grh58zv8QGYGd4l2dsGskk99PZu3spSEpDCkUbDECU8lvyGe2aMUov09zKzYehgvi2AjaC5g0vQRE/9s3Mg69fpGesFMgEF6liF/rCsZb56W+Vaj+Fjh1GDguv5j0OJZOHG9hJtTjKgoAYX4TSxgbW/SMVOXbB+mh3knPEYyuubbSDB9rnfNCC+LbgUmla3k7bQaUf6WeVtt/OtGgAcsAyKb5a341Xk8S9Zh+1eO8HRKNkLhPwO3mLo3LRf9pnO6TwdOLknNPiGWVzQxO/7ZVz1OQv4riqpBYgPzlGb9tALxR7qZjZ4h/4yMYusEWBFg3lyWv9xZdbNPK0fIvfhKObtIGjctj4nO568PamoRh273dg5/Q1KZg6GkIg4IXzwFWVnl0Npd5FpFLtlELBIYqS68SaXU4+M2fvFXc10mWLBM3MoJMlFDbLDfnVPRgW24epB6pWfqQwm6YAs2nhGG1pvlFvyPwblA1OKDlkjaC6LVAKARAbsV9BEnzcG8qisiLos+6wijxvfX2WzvWvapQvxC6AxChPAdESevwCe3ztqYCeRH9JZRMk0KCjtn1H3ev9dmcp1XFWUuBRr18cd97Gl1BHL5twzrABYwvZosuasrVDMy1mvOJveVbUGef4eADWayFShuSj/1FtIDaB8tdN6N5uBoy3pzM8phrHThLC7rkiQdn4yz+BsY8c8cTz9szU3mucpF5pdVPtnOMPg6SzJIe2XAD8OUai1/C2cdbrh69lYFDHDhYIzkutvF7UcabnhaJn9+qcmujCLXCgGFvyv/FDEbUbipwPKBbFQuoOLBXIJzvWE/D7mf/QE8QTfi96IKV+gI6l934FBJxgAJeOS20Mxc6N59Df+EoQujzRXkGeXOaIZQW10aCfdxKHFcAytOiYXDP6U6WTQV1/bb4HVKQ9rHRKjnnifyM4LYkms9qB+QyrfkpcMhVoDCZ4YpmXaxbDh8SMgJhtDrfMSNjsR53iBwN1QRLxZIzjMuId3G1mlIW8OctX7Xhj2EYhmFkLusLvjXdixkyIHIKdTMf6aP0nVVg6mhCW1wCS4AljKcFsn+QuC0TI6zAlnN3PGX6ZIANbe4gjYNf2XafaUGZEjdGWSZUVG7xRvaGXH+uQ7rgdnq7HaWUNMtjWOjj72NtdLIp9/CySZBNY3ADKmqdAOyZXtw7q2pLAhcgzA/yxkqoA/5vdVgwggM73Ib8y+YJqWUO6uFXz3ZUJ/XTSoQbdJbh2yx33uydZHOENyQBwVDj8Ph1PwOWX3DkUpXuceCitSeKmfxlQO3g/PPMzg+ebuFKUrGyVOmEgXqDrdKdRSP3Sv5mKhGSxW7WV4+Fgua+vzyMiy66TP+rbo+5rC/YN7JqtHjxdJ/1wsBHdPiCohxFW0OdmIpVGE5PsV7mopJp/RxomneaqDboToknptRczGkJv2q85ptv6bvh4+aIJ49xoUUoDDjxC1j5NSMjKZdWlBTPxQgVLqsNzIy0u37aPncDMPGuPZ349QnFcT3rIJU8GkOSjiHXGZMm0zNrXRGGcHFLPXhpy1tFuArAKgFfS2Zm3Rc3dBiQBM1C6VW3xH3yZ4dCxr9Toel81imgzxUYO5JNzquSzcEuQw79NxPZ0HjUOUQjyh4zFG5GHzA4I+i37YJZSrRU957JMLoUnBCPJqDpNL0QKdI8+QjRffDdQqsPPp5oMRqBU0fQ1nQvBrPL9wS09wfIviDiFO+/P7ZqAInu8ZKKD5cXk62oyev7C+cYm9S0KrzghpbkRQf0gagQBQKu3Vz2LQs/GnQtjLJ/FzpqYES+CoQDaauXTOB+EpGXHEhJwbnbYp/jn7FGhTo0vgY5wfby1x0Ll2ZGdrRjXSNstE9jgh5A8C9HLI745OrLGLk/lT8PAPvnqqgjCiWtuqNRWCn1woTuEUYOAzGzNb3AgKQ7BPaQrynZbmV8dzGwHwLSJzuVQRpRMb4x51W/QKXyTJtJWRJY9RnL6Des0LZvFsK07mHlZSxOcyd6raei+jNG8j0GXahlw2VK6E/S06FABnp3i9mHc8iAyFHZE5QrT4OUawCGRUqzyV6/OBW9ffT0jVr9pjGi+jZqbJ6J88cfTMCzEpindtLDW1VHlHWt3MhPbbptt04Q1fQ5w4MpuW/QNl5Au0MmrVHRo4N0FMEGwUs05e0suMHXoVPUhN8BRt75qSn/DEo8/xc9McjSvn2LxFrysGiQFTu5ZuM4YiTWiTWIfZVIfL9OrNaoVRiuMyceb9dQSc3qt3G7yQCOe5XDsNwi1IakBuBmYfFXniJMCsy27l6r8izcH9IdSaoqxNEq4MR0s8t1E3m+nycF8ggGO9k5PQ0jEv7U5WpDJSZbn24yfEif9zYJ7dShAlMsMBrJ7F4biHQYhmE47JbKcWtmpXs1eAcIO1nL2KTJx+jCPaa/Ev47/M2dhUQhxcfW+67YAX4kmQn26Cb7Lzv7EjNp1IDbXhBTRwqrmtCCB7gXZ35dbrfbF0Vv5pNqeSVguGha/i/wW12js0aZU3Cb0CY8FMCKBFKx7AeaeZkt29l5SdEepRpqdeG122476xMPzUIq+FgKBuJox5KmmBQpow3nB+vRccTKsV1qF/X35jQA24dX1PgakLgcpx3VpARMhiwbExAlMLOZHdBEZcRBIeqUR7u0KoRo0ItA5AUDZaBDZkXhEzSYxExBx1+g/vyuemx7Uf1WcNF32n0HzvFYSrA9e9hahbCrXBQbWiEaMOKFctAzdalrX5RzO9t+bWMAoH7qlj3MphWJpjD1SWYrlNYmLAqeEP1/97kqMYsJBpNvXX9IvoTa/Xsge5mtNzPKljWKFcm7xhfce7JjCgIBh5xSpx7zzHwP6/JK82xCRtO8h6SSgle6vimvR+rHGUapHZo7d0CwmuaPiX4sflrZafAosOMmP7IQyJXYgLcb2XBxczOBiSoAAlz1mhSS61LGYHrLmeTKh5nlx9Nv1efACgEnxpBMEYfD3Sa4AsJsGSgEJGNLvGvoDxch9IP/NtBwK7Rphr66RM0IvZONyASoiFVUBtAfQMWhlnCpYQpDzEnuBiaoP9Z5jQwnxILjEQpxOZCJBwSeFI4UUon+rIUS9eP1FUc5q1+UhUzJYBBl/Ej0IRwpIuIFYsUotXmpP78Ssz0E5fS3Kc9hBsscEVRyVoSGVSdA2B+WT5nzv1sxd1yb/Z6bZqSHsrJ91aNYZe9ID3RkJhvEaa2rKG5fW+tHPE6BaASCnqpVM3sHkS5LILHKDkrwGt3z/WkmK5g3mPDLhRHyFNKf9lb62qiWJ4EzWzlzPEnXbW4c+c4y+n5kFtEQKO+TkGNGX45Va9piS6sBtMISl6fqtlQVBymgbdeJxWIH1124sezs5J1SOJEXVpB1e79JraCmPCT8V7moZBxqeven1XXF6pdTk2xyi0rGHhWcqY98zKl6XEdH10mNyhSN6Sj3fToz8ABniXBOcUmelGLwbgnelf2/PMgJQf3zfFy11PSwCxyZKdSndL76ClTesnAVCHNTdPOT628lzcsO3gZS8cIsVrHsZojTPLYT36vGFKzF0F7bo2mSFubx1jUy/d9WwCRmG55p1pJIXh1hqlym/zX2Cx6HEp7AdskFjXqdCheupUoE/0PmeEML69hnbgkftj4SfNZmoOGccKoCZOETvW9fN1/SSdwKAJllTpfASld9/woGlVXk58j7acwM04uP/PCwyqEVwLPPK/LQFQFzPogqdz2+Z3NpiDdwIt3HdjQxWFHKV2gF+Mx7oD42wG1F4dZaMD+WAARYawupKEH+OhWZ7AbwZado9IKWol0luUvE+oTJkcmRyQ3r8I+P/Tjj/LHnbOMnhsHSJ8bC6ORda7r0+Y93rZW34o8qoOH/i1Ge7Du1peiOdbvB9QYCuOG732A8HAX4MNbD9hPjeO+OHxnf405sN/dgAv5p1ZPdHx36wvI6a6dvo0ZZqSV1x4Og/xhdB5t859JwDZx08xK8IkXyixTJc8HicI0WWV7CInkfpTzoZfieMS2A4FsgCPCIgjdAwwScLpQ/6Jcp21Y8QjijPxjbei7SQyQajCTI/ICIu79750Y7y+i9KcdbmSeF2RJzbjVL8eyiGk80ybU5n/uxt4qZYcNxvMws+eeB5O51FvHXP/V4tLFLKt9c7tWTZdz6qxyvNE/OPC7T3FIjxX8fqvESTfLoF587cbAK2agbwnjeLNlbkNxaaxHfburxR9bLoGlSg/e2arDtrIZbRWWeXPjPkbYoq1Xr0LtqbxVWk2zc8bk/nq1i4XXDZLzcLPn0h+R2NhZx5Us9/ufFSJEkTt0NDJxMUsqEU7lBB+Z1i/hVmOd+7dXjLZcx5oaNYzIXpPEyLvfhqko+PFjGA6fJPeiU493zcemfeXLpxWo8Wvpc7bihT2rfUrxJzXJvnlTj/SZx568mubO2GK/kc+c+1cm5R6tYMRuL3EqzoRjvh4svH2bJl53leAnJPXlTJk9+WcSplXnu1EE93uwpQEy0e/BPaqorVMsnI96Q42JLkl6lDlEfnV5ObKWaez6S5sCvWik9etExk25eN3/pW5Loob0poVo+MW5DjqN7knSW6gjW6zQZlMqY2C2WJHNV9O6u9cFfLz8XOPDck6P4yJXzPJ6dp3u/ybO/6eOWxvCI/qt7/3F+uNf3YvjzYA+7MtU96z7TcqYNmlx2NP+eMyFuXf7nBN35Gxhf+Hm7rub/fR0yXmxwnNtcMG80LtEC7W4+wee70p4V430t37LZ+PdNhX1fFk5mlu8LEnmrloCjdPA/lipcZvLHrGRGv0Tlr/ocTeHGi/7adRfYUPwRUsVLI3/QfYR1llgPfwlA+bafPxQSsHsAQLJ8zBowSC10cDnMRxUTRgBzUcXsVAUNYKdsbPrHYe+84b+Db9Kww55mNL4zZRb84MJYaYmdcRCF3DgpibtNCrvE3uSi3fBhpXB3gwoACw3TP59i4YEWxOemcguA1L8xKLubDV6w0ONFE57Uz8hAOPzz6sK9xQ+Xf38OSrCo7GmTTTX2obHExhbS0oljuuGBVjEVg6bsMuBX8Cn5E3zBq9spBfZNZireaQM18yJGqvEmjLtyRI5/QuAkvaou83vCzME/PHPDDRfP/SV85p4X0a4ttp5z4fr2vYb+QU48R52Yqv8gDxAerGjMLiMqUBn9mMmd3rnw//dHTA4V8hVCMpxVS/VyQ9QZaoo+4UG+A8YReQXxACoiTxChYDXBLBClQrVam79sDPkZMSbIW4g+y6VfIN8hnML5iGwQcYER0P+yiGWMHjlDbDMzxxvkVwhvsHZanEtDVAY1ov+HYINTQj5BPGXp4JHPhZBop88vItVxQ9QR9YP+jQexEeMZmYW4V5RDViZCYh0EsxiiPELdox/w3CY3MP4i7wqxU1P1A/kpE+4I5wkyMiJ+wJihX7GItRi3yF0WAdPWX8hjJnwHa9LC7A1RdVCv6B8Q7OFUIR8y4tGkQ4N8ywiZ4twLrTtD1FPUCfo5j/I9YvxHXmfEg6GWyG+ZCL9gLVwygygDaq21WWaT7wLjG3mjiD6aHGbIvSJcwPkZaUHECUPQp0UX6zC2yEtFbKNp62/IL0r4AdZrLcxhQVQD1Dv6mAm+w6lBPiriKZocAvJFEdKalPOQ6pkh6hb1B/0nW8UmGAdkV8T9EVUihxLhGes/wewgyglqh/6aPdqfGxhXyHtF7I6y+h35WQk3wfkv8kIR8QeMBfqJ62IJ4wY5bTxdSkxb/0MejPAJ1koLszNElaBe0N8zwQ2cPHIxxGNncqiRr4aQEc63mtZqiHqEukT/U2zynTA+kFeGeOhQc+TJiPAPrGcasyii7KHuTBJP8pswzpG3huinpqVfId8N4Xo4/0c2Q8QDjBr9suhiA8YTcjbEdmrH8QX51QhfYH0Uca4MURWoL/SvTPAHTivkkyGepvYcQD4jBDvGr4hzbYgalKGbWsSOGBmZiPuAAlkQAda9YJaMKDNUhz6oJ/kdMabIO8QumJZ+jfwE4TKcv5EBEQtGRC8WFjHFaJE7vLjlDdPWn8gjhFdYGy3MXhGVQg3o/5RggVNAPkA8DtIhIt8gxOC81bRuN0RtUAX62cKjfPcYI/Ia4mFAJeQ3iLDBeqExsyHKiLrW2vwwQ34Sxg/yJiP61rT0c+Q+I1zE+YBUiJgYDv1iYRHrMe6Rlxmxbe04euSXTPgjrBstzmFDVEeof+ifSvABpxnyMSOeWpNDiXzJCOlYKLRUJ0PUHdQZ+q96ECswXpE9I+4nqAo5MhH2sH4KZqeIcop6RH9Tz+3sBsYJ8j4jdhNT9QfycybcFOcr5EVGxF8wluinxix/MNbIaYG127jYHKDCeKE9ExI6iRrmxtDFWe9UqqGG+dU+Nh8iOfSHzki1fVBt5Vk7OiM1mQeTPplJCzoje6afFy/1e9YL0+eZNG/GHs66ZNMzY+fM2Pysu2/G9LPS98b01WwKppgnRadnfTFFK6Zwg3fbpxAlyp1okGBtjYwl1qxFWyptRaQtVdmJlgRaj+QSGlu5DtS0EiWWTrkXDbHMt0SgBFQ0UtotsU5lpTyIhi5oWyNDCe02chuotZVOKAU60eBL2m/IStxwLTqhyi156UpTQhSCMkPCOig3qDUA5xuf/xgCayhmYR3W2DEBAafjHNBIHgFGaB8ArMM6oF0V0HHPIzai3ef2bAZu6zA35/cTqss9MkcN7R+d120MRloBQ8LL+qeWCPWfM0yv66rS0K26iC3ZEpa7q6+92mt6H/7vfDTjVlYx9fSDXbv8dxIS6p8r5f+eClyHT/oHohqql32MgnHn/UnVy5lnx9kGj6h3+9j/+Or2/u0tA0tN/F2Y9mzxm39r2/h12FSEarK3PBj6d/+TVEmV353qvfPo551bN2FpcTZP365ukrnj6Orh05Z2lfrjdMOE3coNH+XxKpuvTbxr36PmZNfd8/zIYpXHebHeD8/J+mw+Cc3T76n2k/Sjl9dssFaa5/xmwvGx7K12w3MjF9cbQsWzyvw5L3C+i254TQPkMRBkGHonMF9LWBNqpgu6pAAo47hvDppoTysJHgdvyDfdB0bMNfx/68Wz42hYXtrZlCgRwA1f7FgCmXueHSqW0rbLbf7ohGYsT/rKJTTxQuSIQ8Pt3sva02yp3iFPBAnCK9O8zYfO9b43ijUz88XV0jtztgXf652NscRuOtElVXsiKPw+94yvkRxme4p/CrUhoc4YRAAlGL3Iyt7lZl2N6PjTWhF2gfVYbbUUnuYwhZLA0FxHIzRcgB4O0cZKmyyfSl7vyh+zpnK6M19vbBddsOZ5wEA96a2fs0PTMpBH74trcjvaOOOL0JUFr3v00bVCgIICYOR490aQ6hiRQ39/cj6frCZv4hqKyUP2FfjhAC2bldWBUPW1UDy0Kx9JxA+DYlVBD3sKmuhCHNYufrND5UrXzvI9QfKxOH+Se6YaPXHA/on+Xv2yP6mZeq0eBWYNeRD3rKroH4lR1NjEJmvHSslkPqEQGm5S8+7BSREtX4Oi27vcSVC5kDRb9AsaU7W9+yP2uLrL9G/uDeV/hzDqOs2W3qhUssppeQKaZZYl7PKFIBYrCaXn3Wxt584JXjf2KZasWx850ZVA95aAqbCmYNqJ1mnk1cpaa3SHnDXcrFdXwxeCySAsFUSGDf5FSRRBRbsprQ8Cx4THfKtrEMhUSqh7U87yObX949U0TsVqSzCHnuQfjXLZ1XtiWRG8qVTxQsPr7uSXo+Rr7yiWfP/oSe9JvvxUdw08hZBqPf+bSVQVhBc8uG84AsUhQ4tZo7Vk9UmTT0KSVQEJFLJSVq48DeMTweUkPXVzWMlRNqQkQlUEk/ssHpE9rRuoFCEYmFr02HNDLmX40XMxnO0ilXMRt0PDhS3Mao7zp4QUaVMwIq31Cn39ShQcuTWxphx5RifFVlOX6cH510EmzP0Z/hdxH2wXxzq0aKJpSxW9spuiCNGcnKEWZnjy8kTU2wiNgwkBMvOOXNSo06zuqb1Wh15221VcnF58LDCIXTTgaGBpOWjOyd6FV8uxW8NAg/zFWlEJznIRULP6R2zmbCTsVyOKOajwjI7PxNIbSRJlI5oit0clo+5NYBGqXOLRGBY4S2j0KPA04igPdnHb9+LFKbK3qqXgsOeFgyY9f/aOgD4Z6k7kxjK3hQauR80Lb/O/BQ49rqbFfnoIuBg3O7vuyuhK78xZ0ZMBB8xeofrUvREfplqw74CxJ88uRYQK8e4Jao9By3eMLqO5cktYpuV751egaqKZyIqaSHNFmRzQFhJY5KQLtMbf1jbXp/vYIik4Et76moBgen41/EZPJBYre681hR/DkD+j2BvC1rC9onlPH28riT5NtTnu3gzZbM6PzABk4PtPguG4U7nUrNR13g2ig2WxglZkjWGePQSGrn8gmla7hcdC1TkAfp20mJ2PN18tB1hMgf98Me9NmWkaTRv1jI9C8hXPjlE4KrqrM/8i6qBPex1GkJUUn3PZ5PnBL+O/XFkWVweWwx5Wr103MgDjKFiJ3mNd8wX+fdy84DkorqGmkgF9OttUC9nFU6Z9hRM+twH0TxoQlitII6K+sCUC13rKSWwaicC2m5dbj72IfSmTCzG+7N6HhrhR18o7hKRlm/16EduBgXb55V9/3+haYpzwqMxTU7Kd1zzQAfk1UAQ8fFPPBH9yCtUL+RTQkCRFGFzzLbGpt8aFDXNHeyN32kwI+wA86XkcXaY0AFEZVqtSAR6OogwSNJqpTeg1uXPbkwMA90r2PsBqOhvwespGFM+alQtKcMfMDmpNdggx5ONYF8z12j/I0ByV6XylvzUAQCIZMIceQJn7ZcAFGAVuuY2svo6/Sp/Q/++gB2btYdk3DXfTt6LfaQUB28KKKP7vrp5sR+a5zZccItJ/7ps4L+VRLqO6e+zgkp6p2xnrAvb7l8oJb8PrWX1KNK21ab8tB7Fj7L6eW+Ms6DjRHaEhqfGikrUIZXdzruiqN6ABMRVeA3RglBKV3O2G3E+dV3HnFBSdsEW6Q/AL6G1wHwttKVwd+JTGMtP4GdN40aUFnBi6HsDbC2qPJHkCaa085+bIfEAqZ+WuBnjeGUQxd6htb4IoRQRzi+p71BMH53t30gE2Tk1nuRLE678pe4w33f1ykccXZLBYRICxtMIF1tBPtBEsarHkx1PGw2idltK6tRX5k8EgEPlS9eac1LGCtROMwsfQzsYk9O4uhwFcVee3QHSX/ddIG87B+6nAnvSQm6313EGvJuhAdPOnZ76zs8nw9f7onrkgqUaGG5HefxIEmbogaGQHYDePsHfQO1BBjhZMl7OV818/f/WsQNoNcsCGpQCWJ2zgT5T3sEO0tbm9LN9XL9Cw17ah1w5nYJ3lkODQa83c/C/O0tcNqjZ4YdzH8qAZwE7Wvgp8laAvvXKgGtQuwC4eadxFz48puvBSfzbmsCjaRWC1TU4CXlrTuSBbeSTjZ67XTvdWgS0KgbjDM5fCM7iq92OCYTsl2D13vUENEL+V/10NwXb9kFH4zWBpg3vIDwQNljb3BwrsZn89flXO1YBrAeBHsWKyMlr+Dniq5C1IW5eghETICapP1r7zTEAgzXqxwxSzcdlL0ZNwkA7zMBGKxBreJXkDyFHBiWN6aXOnXmXtea3aXqPC5ma2M0nY2x7DLlrYWqcVdhyo3OMsgrjQDnx+QdWU8trrLv1/I6KDwscKolTitGz4q/ayjfku/s7YIwlRq3Jn6GWznASGXaG/WVZD+P03/2HtIVL2e6JRpXcK8n26IfLXkVNhnmsDdgQJ9xH/7q+eLjIUu8id089fwq1F9c6d1TNpsIIfRlyUpZlHRryRI3t1H7Ovycd7IAr5UhsnBqw1jPmth9+bL0QPaUylvwAAQMUbsJ7uQTPRkpJxNqSX8P70htuo479M937rHq9ALSfJpgQ7PSJXYFJQ8D4c5D3K7QPVKQre2hAJXf4lVIibddufn36Co53LPzPbmX0e//WNf9CyX2euf76a4XXHHxNiHuxlgTiXZCptS7Pl10OyEQsehyz3dndwSNRdGdg7SwAe9JXyUXZY5TxVNtTu1uSMWLl3o9EkF9G9cXAHZf63xfuSNuIG1e1BB+DcbIzNsvuEsiubS5ZQsinDFqsfx9D8kFKdKopF5+PcGS4/yZOj/je+L3s2C2RncOO/87eDS5lrkeDChaUB+gWAZjmtTsNhvbkwHLWk8WYr1VeohG2VHuPqiLs5Y2ig/2sp0233Go+FwjnkXyflAQ4ZwmdS2dktnWhx4SuQ3mVWsKLeKbbhu/nEUNu39KWFF7jbGMkS3kXY6GdgVw0A3jM5SoPURW+7nv5UhqwQldwSCdlum7zhD1TBYguXW9RpXKkzw61b+y+x1o6GxwjjBe3UP7gNa+kDldOkuYgu9Vnhgs1Csl266y5l4GXbz6vuzFEcstfTTuV5VQ4EBVIUgLs+gqMlQ1d306qNdl8vJSezJCEnp0U2wRAxXlL/ac8NGKW7yK/g/YttFl2lC2W3LB8lyFzyieUt1CM4aMN6+nF2XVkvbK9SQ1161FkpZqCxI3Sf7NzpbhGsDZXdWMvm2cC+jyhLtzmO3ltEOtpfzmLhOLGz4+4tvGLmVnA/7yYySEo/Czz4f8DUwQXrUcZbFHVfQFoYxgDAQTkJDvEgPPdS3n2ewc0U5yY4IvBk0r9RwLc+I0LB8usihGI2Rg0pV2OvR7ELQGpKry7Bu7jEcH2bsSzN3AVLhFzcQNPSBY4NtDLkpUX0rHpiBDBa9vCIomwN9OM49SrC4DiYCOjAIhsZPR3RFfe1b9UBPPEWZBztUSXBFBE8tEycFD9yIYV5sEeXzjNGpUlJ28FYYqAQ4b6UxdiaQpp+FNO5eKA8a19EVPa9KwnQAz89szhX51wIcyXGqHrcXuECKDGOCsCvjtfeUzu/5F3R0Z6mz0cF5X7kXjHwYuc+qXQLVdzNXozH+jUIHyqIo6gGAYCHSn3BuM2LkzfEE5iKR+3UH4D7LH2aFg5KSstnvbT8DjdyLtmMnvQS7FwRB2WRYMVP+DHsNulMFp/xnNkBi9R7ekzUcrPOmn+RQ/ext52laQdAtuA4P4r8MfeKAejE8AaB4BzX1j0pNQu/uUUv46sF7dCNfkdVlXaqClVDoJtF7CxLxB+ztlXCLCMvg03LCvezayHiaM+0NikPXjlWoK5lW154az7c1aUx5o3ZBKRlReOEbmU87qZjFzGEiVOrm1DLk9/25wR9J/TBa39vXPrlq0erMF3DzL2B6RyO0azuXED4sBa7M+HFxlXbyAHwd/BKpBsFfVCKWQJ4lvEY1YyUhx2ua2wcDG6xOjNORt1PFbqDqtx8fG4INxORPmKdrJmT5aOm1d1shvSez4JGTUG0dOE+qLOubwlgFZqNx8YuAz6R+hqZgmsRxiSiQoEZeibGi7L0Gc0OAfZfVltzvsOtQ2ItM+om3X5aVMl16TDbXpEnAARPDWBk5Ql8m1ILCtlkgr3RMVTLl0ma7o+qVE5nAK4wZtepTSbf7p8tRS1fbAr0VFWrXd8dDNfJH8WTxdEGlUdyr1k0FPtTs/EWmIo7fEtALtLYcmADBE4siSvQwMUZeQ8EieWmSveCAkWk8tNIAsTKZz8nMOAGtCgpH0QA7+ylxv92d4O1fOL+g7jml2+EvaxdtaH1D5TxmNYPr83lutrpFhzAAKTcT632fZgD63DRGg1mr3RSKyfqTSyEOk2XchfNLbhG/n/2k1SMviE+hSMxgGk0s0nr86D+uCQMwwd5BiEygUO3qR4aZbeAQYA8GEB6hq9E/xZ2oQzI0stzvuBr/qJ+INqYkaEFaGdYe1jrM16kPNCsOdYnqwafqd6/JDROj2q07UFOSKaQBuFrGnMIGYtTzN64x2lQIk3rGuiMzBMLGkUVNAQX9LLEjVC2s8zDIwpzYf+Qz0uDrQ3391swxpYQOZTP7KKXuvv0i746o3gGrKmb1GG4/9hD7PTVRPQFtz2OzdqoSY87p+6OA48raiu3mrXfJ1nluIjhRaYerlCSvcQgrtimc6lVMz4WLx+jl7TTsdvr8x4G1VxiTL8xeK/Ptctsa5V3B7mdqt6TYgvU1dztiAN0tBT6O/ruW3Y1FyCc2jhcLZADMsABhcMzsj3qzrixq5WdPsr/6Htusa9bhxXkAhCygJUzWqxp0pIq3sI487BPfTtqMQvV8rbZESjfoRELr4bIaBo67bUfLzT2kqtCl9hTJ7y8Frz5wmBJ/sZJdBfktwFV0r01+14kBhYDS9pTus0qe2WhsKSILD1U3L44hblg+1VOMmEh97U6BPBSLJ+NNktOtJtReCX4ivC3Wcuezi7i2UTi1f4UyBMlU54ICBPJw54txwPaMHLMwykW0F2RJ0omTsDaIJNBpOr20bMXLkLAoM3ynuXXSwzdjlIy9URJelrommRq24ae0a4zTZXzokZU0NFaSX4kkk+4BVa5C1GOY2ubuo6s6tpGekXBsily+4qPxI0ow/o73zXwmcQ62intFUhOh/cr4ahJFtbnnObPilz0jarZOy0MXa+CFoObvvNs2Tfb7XHEECm7bCioyc2IUN0LAXOToTdQyb4zZQEZe5JBkiZrIASCE6fy8hI1sC8ArAc3szghDiY9uJ0lQGVLBRZLUk66NdXJf3wWbk42mCbEwIQwzet8YrRrSYbeT5oEJZHE7wYtYQzPekk1nADtBTdjh9RciMrNpOjcmQbW7dAAn0Zn75weZbidY6fYo2tM0rXpNtWus9Evwe5ChTAzOMqwZKtJzUqTaD+4dQmUyJAqxY/fDLuI474kq5MDxr4G+Il8x9j9Ki+EtYnQ83apGsER+Xeggpjqw+Ujd6Umfs1dzx3Wf6fIMtZKvEWDY8KRfDBPfgkKxIUQFrLNtoPJuCuR9DQF938jRVgkuscICCPsrDAewqcS0zZds2f831hrMan7awDXYihMdIXCiQzZ+GoV7MLcj5ZDuH7DlXeKfgxvjGjk9vbBXPN9C5EqPWJKkQ+OGTsydYzPO7z5MmnTjcdhRaBQWxoqNm2rYZtJlJp3ovCj2n11FAw7XnCAAaxryWJQjsVcv0aWLVPmkC58qH/HvFlN05ESN23KKLysf+TIMwdUlYF+ToITFyDNiDMvIL18Jd3Cy4X9CYgMLh2ZrQ2uOOcDwHDS9RwzztodxQwsp8Yxq8+YKkQ5vdT2oY6CTMD5f7Jy2ENbfVIKX9Hm4w77qZOQXaHqYVP97Zyh3H1suH47sR/72pxREFZb9AGFhIA8AkQ/QWFuHVkMGmqkJF7wJbS6OUJ1neXFOjeffaKOQHNsAxzWNv1UU25MnryIx+VhiX02Fsqr9bAxN92GKVtrJ70fBQYrHy5t8jisZmNzUXD/DaqsTRXo5OYAI7pRtRxj22SQ08d5b4Yiq+Bx/ICMfuZYiwUutzTcdoY/TLEIje4z+ENtjD8L5RQP3A9o5PT2CWmtUf66ZcpgdKsCs74NqG+KREs0PFmauIMDRUWBxOkUtbc2twCMhT5j03m0j0LBacPmdTquRvCFR9lDCQwKqevMAMUK7RSaObFW/oBHFcFiP7bQI5gTe5Nxxr4+ur+sk+/9hsP4Qt+5SycJX46jo3Agzb8Pyf2FqbEd2kkQFESd4QWFNuSbvJpyuzHwfog0KD0RME33m3e2DsE77DwHx5I2ikZ2saGiOxu1kThap2u5OL5P60ytcFSrTQ7vJJ5+x+qByinap72bi7C6+1PuQL9VFqb7MHwStg+du40yHug049uQ1qJWLL+3DDirOGje1osNq6zlQlnlPjMnR1WbxquIvlfVq74GNXqY0Bj6JWLd+z0xtEEoSzugW85x7Xs0GZD+38Wsr6aX1EZtPNGPv/mPNFkzBFPaMY542v9cokGdwqjCXRI5hjZ7dfXIgbDTUdle5Pc8EpVjuqpLbT1JBVmRjoGGqF6gn2Y096ZCkZRe3hKn1AO57KAZnmGaysWhvGfvqu1DAGx+VuJIrcpIMU0ntePsZDLIGwJ3frB0ZxjXVI+MLBsbdyoj6uUSxtBM69tuDSn1+AgN5NF0sO51F8Tj7CRjfzPoDoc55t0ICg/llg9j7mmWmm1vjLxp8zulMlCvRW0lMF7WLKLDUvrX4swSF0mxPOoXJ1HzeKtxDwdEta5/FVZLkW2IAxu9SRxOH+vNrL6B4RGkXV1Vk2gOLCcOlAgZI3idyMWAfUSBfBAft1OwMSvWujsJK+/xLjf959uwzzFbVqD1fwpFuko+pB4J5hyvlSktmjpWSxBIXi9hb2bD/M0Z5FoHxswvD6bw9xpqwmw4KSMH5d6VNi5IhcOY6ML6SpfY/2MflssT0/EhzJRsNtuFLxPtnlxRJD4ShMfZw/r9Yus4O6o1am+CDQ2HN3aRDSbj7jh+YF/ZZHcRVh/LOsZXw8ez0dNRpguDwag/RnEaF+nZzicUsNLKozEAP2qyeIrpz0ez8wtgVZZIknH78/yXHbUt0ptHoJDagQWZ4SbTdIXtZbuIXd8balhUYnw+sO2pu969oq3DOO4/MGEidq2QS7oxHnjVhirSCL0QNiBu0xnhZ9YaPxXVRCbBaX/DBpLxk72ElNBkhCCkdIiI8LjL17ovNY3mhp0ZZFggs0waIQFBM0sr2PLQcfSSdmTStlBvQBbqcHz/DWqf6BdyoYrddprVOh3f52eXmNAPX+XYXlSlLZYC0f3WU07CPs86dYSE7lIptiSHn92VeE+QEtuTn5ulwXbrUIG3HK013C3NtsT4lLVxKagH/cpbm3bui9Z3H+3kRCVH+P5D9ULtddn31ZLaY/qJCQeD6/fJZiplLhmF240P4tZqjOWMkA0mYnj9Ne0dqdcuMunwDIYmWD3KqDUaMaIcsPDeSTb+YyKIslYm5mB6Aknx8lqEC0V0PmeukYgawgwO0UTmnZpMHUWJY5FODRjrq31C/X3fWgcKnQTFSBDhi7rVdlYO8q1AAnnTVpPt8DBJa3irPuZUfMRJBD8t2s58lb7w7KJ5z0I9OvRwo4zIU/XB9BiPtqwq41FHVXBnum6tBlelFVIiGDD9K+T34brTEg+wnQ2OAaCRstN6fr+dJvNJSKIbopIiBw2DYZsrvaDd+4oSJSUg4WUOy030eC8sR0cxpm2fzphkVjQtiGixv45RYzvRATQXidYL/BxCElXoSiKtyaUg0AUXpbPzGvPFdh2e5R7fSxWTAzSySusb2IuyEg8znyH5L4RV1H1Vvxh9sCIME8yJsxEPpC4MlC9mGWuh2K1cxUQtIxPK8XW7RxzE285J9eTzw3h+UYN80Vy2RUVN9YgWm/3T01VV89Ttt0QhS1INXvZ2Lpfa/kBYHG5AdUFVcOv7XWKRLH5OKGmTEn4yXHXHH9CAT8ViDVS3C8NQswT9delxRFCsUkC7Tk11kOZyBAR0yhmrIr3keaqmOL/v4+j3nEnrFi8AJ6yfwtUAn9bJi7Dy5E895/oLqBkH92yC97ZOiCo0NRZeak0QfsasG5vCs3s89M257CGldjX/URoHtLNX7BYBP/yVF7wOjCfdfn6xTXk4DAmvfnMntZgg1w2LH8LbzWEFtI6enQFFn2TMyhO861znZ/Jv2wj6pwLW6gj4M7HfX53LgN6R80MqT7GKkTeVDRPKFPvhN8Ej1dCfkyPfB0tyP+MFxBhNZXOwZt5715h+Xuhfq3VKDrbHGsVDXQdWpFjnrtJ4dZy7D5TvDtRXs32DyZRDHQpTjP0IJKVdKuAe7I5R4goZ/DZimBV/YIAz5lKFA9FbU29P3lcUf+3LDbMV3H6T7sOmu5KD7yT045sTfu0yuqDGa/qbjmho6SwX3OPO2jcYX67PY67oQZ+4tB9ixEMpEeBtLx5Oxy1b63zHBuzyz0REwyFDQor7Vkr6NZJjXyiIZhn5zl8bHqWHM2H0f98OsX14TpGOoCi3pRyH9NqU1wPJo/aAf2O0fdP7kDcgVdYIHwRXqPogxWjHR22ywfeJyZR+UBg1SRNAHWy1E4Etl/kPx+EL2LTfyJ7Giq0Mh+6b4Zw836cTWtvSFjUTV+kA3uWcEUD+e75h174vjmwj3+kIM4A5LEmyZRqFCrz6f59DnbLoKpz1kWyiOGMwBP7eCYiO4iCgbzbpb7X3IJ3RMQHnxgmr8c75oECxjxNA/VYx1w6uxJV/+z9IiJ6RNig6C5KI9wQmHx7Xv48eH8RF49S+5OQQQV/2ZF8MjUP9rEVDGlozBKifrZaGzCwFaWsVeSHOPXFgIfEtzRAHD85d/N4WIXHdKLB97AS7iPQOWXPA1j7XUVrXi+zwT1DGzh4MxJm+jrI5eduVMB1WU/xfOyvxbfZILF/qrtlt+KDv9qDZRMD2UwKXeQABl1dZ1FrHL9P/dZuXaSIdwhrPE6snbZj9vynJ1imxP/5h6494XNkf0FZ76RfN03cggrfDswMYmh7S2zJl2HICD9vTDQdhKhj9n50/DI3PLYC3pJ9hYAUuYX5OVZTTz3Xg3IlOykXjW0YNfEsKprVPZKWsm4PaRXWVxroI659ogSD/9Ybx6RbrL8DjM8Bghj7IAdB4ljJfAiVfzDtAexuYvo+FF//zGBldD+bGJ8KsVsbl1LhrZcRMz/15agdO2KhJfLa8CDkZKwoO5ZrtVpcXBYlue+410zzhMA0laLCuaR/r51Q60Z2c513nV09VeUbpWIh5zpr7J7Osv8LHti1Ywep5S7X+KS1fXL2UT80dA/tkQBD4nIX1XJvLmh8DVQCd7G4LAlz8c8NONHpVqn0LO5to3ld7aRHrzbKeZ2m1xp0JxpMRol4qI9cqXVw9HP8TOcBwb5p/auQMvjgP7LnZFBzfRmEdiY0vIE0c6w56IaMAjcvnL03XP21O68yKbnnD8To0S2wwdfO5MZt0dVpK+nBltH5qr3+mGeDx+Ct+Pmfhz30zQ3RGI5Lt8PyXWlkG6YhhVHV00fv1pzICex5MZfmcOuljWDw/Mj9b7jVCWC9SAYMsucmYhH2cvH+f25TsQfVnDzZc3la4Fwt4xpZyHdyXdmPHn1wmvEU99Ps4VTIs9brfifsPqke8DLSy3dokk9W6qLXzLWansQMGTR2Zha1ANBUjw3tYg1482ih1d69QkmsMPRvYLWhO55bM5hSR/VJk6GrMoKtxCNIQIKvPClDFfBACpPtT55rXNqbITdk95ZFjW6aRGmUFKtMRihM+tqP1B8NV6c8GhZWgG65G6fnylNbD88DYJSYwLpDfithELETCyNANmwWfRwcQLiaz8si7NrvzKc2nz7T429RnHgbUQLiYDGB+tgbc+cQhl77ovtPE/ll8ccwv0zShP2fX4APWYBnH7qR4cTyh+SytH+580lD/PbVXY7JpgX4/HnQL1i/dndbqZkrShVesd39YcIABwOTiVKDGGoJuNQp6DRA5GLdIQWGwfNJV8XHjHD3G7NNlXuCukxM1Qou53/3aWHt2uT39EUpbNCQBu0RwpxolDNRo5OipGBGrVs+swIlvw25rC8j9VpA+KxBGdztv12Xfp/ieN+dks82tZFYdsaNgYn+eK2nCEbLAuCCSt21sO/vkZnhocTOGId4tnqq1d8AIUkuFKgh+3Aj6NN9oXkb88eHJj9jETXlT3uRRB4UsbgSFB4KBf9K0PZHg0av5s55aqZERvXegIFKDxCcRpMAkHjGuz3GNgKJAQ3mwP0RKuCQkgGL4NDp6R8fTLkfbOj+R5i6eT/l2lxMLu314XMhHxJJLADi2ny1MMK0oaywE6GBv3iiaP2fYs16jBpdUdM/i9v7PG9/kN1wkLuiCrj/PIajERt6GjS455DIuzyExhdjVmephYVH2bmRUek9yIhmKFras8wLiBruSJ5w3waQ31WdQo6DKZ5KgSd4wTLyTVzMCTOgs3+7ZT9ALhsnrCFk3mn+xlG2CLnm+ykenmgs86nzF7wu7VvKxF+J/twAXGRQ02J2lPRbzEelDcvKp6OVua0w8GAGLnE96mIOtjmfIpj7HjWTW3GhH2zhaWh+6oHem1LJjXSAcTmcWy4CZJzGLWft5I7zc199vL/gRRUPnJBq82Dz52TziEjsQhXnvW7OnOxAJXane4X4+1y4w2FJqjYSGLUL8p732IzLdXtIegEWNE2HIOsYWzFrxLRgptu71Lcz8BrGZV8wTyRNnzOU9Wfm3lohNLjQN3OKrkZnloNB22uvwbGQBbn9jeLKZi08R8dZH7wSs/G9egFmRl/ZwT/j0xERE6fJ5vXaLa8er6khPV/PeFS9Pm7T5gHpUccytecyw/IhcWRq7Z+iuTt6wbPzQKYhyurJ7OIvpmtmFmQFKCMVbsquQ8ZjEwdK33HAlXwz7qSKRR9r8YRZ7KjlApaIaz+I2ykXajn7SZ3IoFHKzCC8AmC7KE3hpwxmQl9uAOdY4jxaKXeeERhyLFNJszn6FrsxjxHP5rVUY8NwROQVlbZLmegt9Zl+igshQ4EuRSkknIl3mGWlVsH/fO0MuoaxtuOKZUsIDz3R5n1DI8IeTvXEa/vBEcCiXivPsSJYsm/2ZI5ZZ9Qt9K+d62BdG+NvVsHECGBpgEHYXhW9NBRbq8LyVM7hygwMelZy7km8JiVqhNVncLCmY3J5ixpuTTnpHcn3GEXhcjfs5jvNKzD+AySAwC9A1gcHqNAfOg/z/2gZT8ZZdKN9aCFSszypoHq3KoSD/GATOuJB4D54FiNqJRPAkPW5mYoZLd5ZFXBiWSkNaomDO6acWIYCTgyqV6wgRyoMCcdPpUE4jaXUs/H71unx/oajIEPJaDAPfOD6G9uJDpdgfb2AXaFBzIxw2pMhIBCDe1WHRTQ6GFCS8m0JxvWmpjM0Lwlk2cjhZkeXNGcMCYZizZI53x1utFb6YwXymmO2Q3yIKgoNE+SUzvzj0f+ZJ1DEP1Cggj3rVeJBYGATPLckFnKaUaK7nKo43nmhacEauawmgXVuwpWmk5VFuSDuRMftpK0NnJcML6+C0Pe6siBAYKi1hA3qv3gViSViUaiStQo5Wd7cf6CWZonaac+QuddhifQXL4uwmRI+9TmhkhoVXMi9+xqfuja7CQw54Z3ty2HcbEkDszjm99bs1NjD+/fK8nz6bGZWAqxaxHiqkRtwEOBMBf56OBfyFXtzn7lKC/+Wn3vMvhc0d3K7w/I/o3oy4MttPV3reLR97YyxX9duko6hzJYFOnSyChfecxYIkm0gVqlQtssA/cnQ1EqE9XVzzTpZ7VRQmjGShJbOqHN1/TbsncCc+nUc/WxMp70LMwr4h2VV/MP/7u5vXUR7PttKLiFAgHF1gbVg38NrkIl/p7J7UETC3BH8xXSTE0SjxxHxYcnyoGSiLP63mOsf+apG3EgpaS0z7s/OwaaafXvb69xsxX/b2IWs3jg6ZRxuIbJ984r7dlKWm35YBhndH+0lYwi484xTRTI/0sZdGdzyc80lLIQGoRYjZJ+NbGAIdnpjAB6GHWASGTqpuzCDHzvLaO4DvwkRMQTRJdNgHw61jp1L2iMskcPv+pLnodDOIwLVVF/iMMshpY+uNwMvzJ2yzdg+pQGWXENyEE4slYrygy9u/8YEOnWUeE0Xmb3xkU5YN22tRvuJ7APqwCDrJHnnMjBrfRxvhEuXkOFXCVU89GeJ9LnS6sjl+CFFFQ7c2+qrcHok5FkRR/P/Vl3CEdOQo2ZaWWLXr4oUsY7qs1DmcPWYbRas6fQjwgi/EocAxa/2/grmJGNUTfdiaFwfpz6sCockeeWc+RlY27KH932Jr/ULbK66EqS4uyNRTbdWE1J4eJzCn4/O9SYKEOM4NW/LUvinP9xUobGoU2NUmPbBP3KVe4q/H6Sierk/aLNQm/UdNYT/SA0KFAdhdzyU9sPSIMXMlibWumM05WEu9rwO6CI7wIClk5bwCuYTwVxLnmY7dWRdMBmiTwQRMfVCY27wyN4ZYQllXCrSK7lKSaxYA8XGRZJPjlQwKxKqBREltQypbVJ6Ne8gUF8MlkpXuLZu0n1YTQBigzc2aFueIC9ZsiWZMHE8yPSyk2naOV5UOrALoE0Fy8fs0i2p3CM/E8+UnGKV9/FpnnD0Nn+yxMFUDMuOsu+krTYrtbwM3FiY8IgJ+Gk5yBOi3BGbp0FGPMqGvNRLkHG+igaY+5ibnR0/hRtPNlukMXI9XIqD+8KdWiXq5lIDSS8jzl0qseU1vluv4yM6KG7EgdrHkm9fBn1mWu9lwly16K5kVS1xzFg0EBhizZMqVQHa8fMDRzd9xN4BJdmmrjRfcO2H8IElI/lR16bYR7fxvA94nWziRx/SkfJMoV4U2kiAvd4HzEib5nQdxLyP5UFiOxEpvq70nWoR7Es3/P8ZhL/Ze75Yx45tI5baqKtc6k/FSN8oUnb0MMxhySaR5PFkThR/cOE1UhSP9vg6tJgmuu7Qi1lDdnA/PnOJUYSISLjTS9/5BNdqpBsvPS+B9cpkfsq82NAT5mgp6zI/RdPe4HxIi7m+Vjx+k3noSwRk5+afxLJDfaeVZcLmsfDjeXGbBbrvInronE+miQ1QNOWon4TZT6A0qp/7ZuM+GIa+6Th9SG2klGpqWty6g+jJ7+jbf5FnY8WoaW+Jm9yDAq2qZx0c0QWN8hUR/nw947oTBNiR31JC/i0lJesWWyBHBfWtOJUzM7ELBqFNOTYrYDFIE0JT8q351KF6emh1mPcnCXM1rz2c6LmGPxZflPEMEvNhky1IgyhtuboMPT8U5GDiDl5y54V5k0ZwNSwx6j/sEFY15Vmz6U7mWMmSRKrQqQIXxESZEQE26TzmD5AbrL0Zg0vQDQHFZ/7Y4ugiKLMyfoUer+GIvf7SW/NwdJ0WKPbSasDL5Hzgqe4PB8+lvoi9ICw9X++MQS60iI7gEtKIHIGkCUZxexRugTAsLurCIbJzoinmxwPmumNmEW/zhhVviBuGDGF/QXZ+Hx+nXJkYz0cIpWFV9/MMLZVj3G+csKaNyp91FwnCuEtX1dwYUn9JSW1weh4AgfupE9vo6rrcA81gPfnzjxF23OFWnVpNp+paUW5+6lMg3yqveZfH18PHYWjuxP0C2Y8WxKDs2GnGMNMD1PFLI2BX2VkGERvXCIyIgR+yghhV21kr83401c+1cnmoNMYCYztqAT76rMtHBuLOo3Sey6SDZPBt7TmPEaGi1TlnhMe0yqWHstHr5uggCEsqBo39xUKfUzHtMJk9TLfYcY7bWYcWHZV1l9fRxNabHlRf2qIUVprRfdMZdFKwgCzkwKRg7Y9aCJFW/GUEeXQ3Kj4rjq2pfdenXnXQCRSCYok30N1IOVydB1rpszELXSrRp1nVTkA3beL0RyJ8dW+SBS2aFX30HHRJZUh9OC0B5lnI3A/EJO0iWeAlkMCANJYqwZQAClKnea9Hvd1lCZdcas91MDaqu4mEQRuAIoOep96Mb8ipI7i90EZyilXi8/6Bo6QPiMMbA2O7Bjj7sTPHp45rBSa5lgpBCNUckKYnfDUEzycIBkgvpq0p6dd3+CYuro3W2UXuJRFp7DC+h4W/WBkqKVMxaj0pow0pnYKrwKrJUlxRPV0yOHRaAjmOwdXN+SLClDAbLZawGWqJA5y0VQmEG8DBO6y3h8jJbI+7SgwevzaBHLs1YSLOBZj6syy7BQJPzepmgiNtSwiLaHMCA0iAY6iGYbRqaMFV0G1iXWMRtuu7BUQEvsHi81EUmhr3YAY1iUG0AEdrB304nzdMekIVfZYseQRz/sdwtt8eoEUERgEvpCXJUm5tMTPzJOqH329suy9Z8FgsYL8gJI4WAH9IvXy7yQQ6/eLr8xB5OfH0W+VJrTFETPOct9bkBAU1riS9b24w5KEKzvJZ6+YbOo4C29Svp2yzUn6uxqKwDpOWpJWyh1SO5Xq0ChW+wastLnpacAQlPHxyqljW5RMtbPZ3V3GguyvplGXWcBz+CAch/ovIS8eODmVf0HnamkIF7hWxBl9++ipXBNna5Htjo/yc42DLySg8Luc+o2Dfo8XK3adANYQMtOQ68iAcFzs0WicPksCUY2OMzQNDi6mJ0i4K+0/tjmTCrwQS13qkRwvrqT5cpQDvWgF7Om6deherQJ+n4DsgxN42LY7T16cYMfIwsnHpIbP6z3G4MfcrvBiY+FxGem34VGXynkftg0+vgD1R46J+fly/ld1s3X/rBo5rTG8CdW7yt7mVYBHNHneQjZfrF5bbjEAOd24IvB8PPtwto2DCzDfoTbrjGfgH9OWtDZNyskE5ibo+Ps+l0NfzTRCHgWZnn33hmjfPwV7RXD8F8DJ8AwLLOvIxIeQBkprZ/QYLNuUvL/JX/koYHlOvHp7rnA/gEYnzXQ2JVi8AFZ36/LWG+ssUrC9PexO5khjjryO9WtL7iDazv4WTe7LsuZKnaNG2o4LiHmXP7JJ2fTo6+uUee6qoKaAHqCd5zbdeUnOO+VZZdGhsgYAWm2CZQqyPGcns2fFpCNa9E3hD443l6/hFZDTPrXDRn05UBz1UMJ7zhTifEMJnDSizfKawncJop9XNuSc74n4ZlXsf0/Q7Q8APkpgXmG6+X9EhH/ySWkLWFFqTjqSnmeigcP1OE/pl5r0xlpoAqQ9KuJE+MOXgjVFp/X33sp5ioI1A9lgFxuPLfDAUVyqav8/8WWgbdCLGqt2OFG1rY5rIrE8AvsdqMqJmCVPVVjVPgCl+0ePWJhOIHk6i3nVphS8sTsRdwuqTRVJvLje5WRzPLMw3VyNMbZ9PZwXBoiwvcZy35bsOq2kLiDC9JMG4ik9TbUCfdRpc+LfGS9GlYzCnWojirD4KcVwy7+B0YjKueJ23sEd5KvAcFDJyhaoOC5DlcR8GGMH7NU+UnXxL5mVvWXIhubEGurrA6u9pThh5jx+oueY0OxLCarKWwZHy58bP5BiHX8OMM/PBgMYDS7R3jZ7QqTPxyvBRvUOdvFKJenfzVwvpVS6LxsqgrEWGtDyFx9qkdg3B/JwvJ8990WdDVUWE1zT8QI9G4TBT1FKi8Jk3vRfDQMjUbqcQliAIA8Edd6NR3zptFzqOa6ZybmWMXwVRL0ZwF9ZrdtPatb5+CLo0HxEwdJo9jXrtph7RpxiGnheaAuTVrYq3SzoJp4XBedV7Tj3hcKmFD7xsnkzxpI/mnpalK5HojkhEttzl9ubzSS8o213caEB8p9IfZsCmcQLiylNG/ofjbkrFavg9bQxhq9asIZjXI/l3EtYDXQhvJpNpKptY9m++69qMkCD2ENNhvyp0e4tx5HgKwSsc7eSIbL9Dpxj3Va+aN2/4/9V3MSNjUuNjORPXl/LVj3ioZDCHK6s/PmHrP4IrA10DuCRKJZJmZ9TI/4Le2jNz+n0XbbUDg+OKmiOQNTsnjx7x9371x+ja+ynINHmQ4ptJUmtPAM0QReUxdiMYNZeT5UGwcOqeTuYMvV80Mpl73WZikAbDBwrFcFXg/Q3aAS+QJBnO26ghtl+rhYVXC+HXcbrBDQ1w1bbvwLFunrfGr6VzAstFkCSzWZpFArP1aFl7kaoFyYPibVcZ5IYCqdF7+aWwPjBE/KkjGdaWyzDH6Kj288D4YCwYBMc0ii+t3dnyEADVpLLzxtXhxvaER4g0OD2L+2LhuwpcgN7st8brArp/oWFHqBSeUCqO6e8IdYb2BXXOL05Xa62M9iFuzH7BBoab0Iv6LJyl0BbyRq+pmDXsK3sScDG2R51PkDA5X+tpq9K9totYsJ4MGX2T/Vyx5gRgwH7oTjNnOqY+shfA+akuIc0vhQlMRDrzAK7QjkY0TMjR0FtbPb3cqc7YPP6KvnXQ6TgazHR1fnP+gpefO4BvbuhLIJ19v6T7i1DBszU/ix+vFheFRO+4H8vavzAlFv66ii7YQTBHYkL4eS8lJd6Hnrd8EHsbsLMRKjWfX9Yq/+fCHh4oFcJ6e5EWP6qOkzUaI9AojmE7vS/49QpvsOs86531somYwwfrf2l+/C5Eu68rt+Fhe6HHw4FeeOhJLB4RYrAXQieznir2CRXX20vmj0F6+OnwUa8pnnpARSf26dzyKX6r4VvRl7VhVIzqIj/7Bxrm3c5VuqI375yhnD4Y+DOuUk1h73h992CV3v3IENnm3BNu+my7w2uTI0o7+TM1Bxb3zdkLrwcMl6Zbqn/IQ7F/RnTF59aJEkTs27XucfyYD1l42/HbtYj0PfOg77QyX8wFTdphhgKesDSxrBUMyYc5RlhZQpkZTT0yiA6rSG/Tw0A9w+9sLFic5Ku2YgrrAPjodMT3gDhVRCvPiZEwN4siMEe+OmKSXZJxdnwLblIM2uxC4EbfLmma4x1WsymoVoJbQSBAV4BcJPJXwZPjos4/Cbv/FYdJZF9k/M/YcxKG9CiOgBO76qI+LYfnfN9L70M4iwJ1cdPgoDpRShKwcuQwyvAoETD4NyWG47E3a2eFkEy71+lYOv7rfwZc10sY4Rslc++mQDbGvR01L70jsJNgFbYvJ4SPXli+WUqdr4Vu8zyBHjxOoj6coha2+LazqII0A3GMjNGZdm947W6EdrJS32CuDNdDsZVNFN+47Pa3zl1T1l9gIEtkoh3Y2n636juJ1AoVyZ5A58xzUPvqX5cAeo2+RAirIzSomoif6HcA7Lm3sSJl8Ka8wVcPzLI7TlV3KcFDZGK2Fk3Iadjt5G4vyndKYnRMNPKVXfKQITMy6UAb5mtAmtioqql4/bNtpDDPbCh5WEJWpBIo8nMfKmQAOgHM5glsTuRlDxmrZOvqBqyYTef6/YZtDNoeWFpxkLB9CgTbuMFcCEiPSdGVtkBmw6F3BdVfbGA9vZA40SJkCArrS1k3TxteNru6cpZAOvh3JPQ+zCcHNbtgcs9R88LfRBiuSVo6Orue83mtdUDsEGKbkTydmrq16xRDfWhl9XAzd48TGZge737XoNgPJdDuvbI91/tbvSCc8sc6FxQbvpiuqTLU3g9LxjvFNaRGWbqmdTo6qE9O3kFJ6JZf7XR7WeB+vOpOEWUEIriHiNi8BPQG0hWosiuEMFogXytzFoMjG2lLb/8IFAnscdWDaXBNSzQ3E1Zp3u0LLCgKg0hAQctBRwUEgvQEOYYf30PrBAO1DHuwTeCyqD8QKyWEsQA7lmtu46VUoDRQKiBa1bXUretki1h1Vk6waNHFF95t2h8QcNvjyMtYKxiutvC9p56K/tX1hsArxqjQYYMhg6NHxgB4LZoXRLTm2NLVjA1bwyEc8iycwzpBOMYhFKIZFcFSmf0DsdHmASNdHGaWeL0rDloe1Txh4h4C1uA3VDR6SDe08ggWBebSP5CFPylbbTFkUgm7biXK+nAiq96uYU0KDHxRlT9gi/tfBLJ0TqxmGW4VYTtJ0JcaQ/gna+6aEV1ToikRx3dyyW91481UfeQYSbKFmszlgiA3MCydhCdMtk8HcHZCX4nn80s4Itn7q7jDs6Ty0jpYco34EVXkdjZdrwh8oXRkFygPrCxCc4Xy2g4STEaXu+i0UYpw+smThj8TkgaQGc7vnK1IS4/K0T6U0pJM7k0/Xv9xBsMXhwcrHVwsI0nEp2VizPCd+Leb7mAN0vd1ogKWjeLLUBCjVLw4QXxUayYvy8kX74VIuXdjUfe5j0ZQv0A+kcmle6qViqZdmpXkpl3KpQgppWgqpXlrvk+Fh+W3KmDu/++U3zCw144UAOJ2rRqEHRPt7J+Sl8KjJixeqsvq09eFTuYipsFpGJcK3O8V/dZ7uVkVWEhS/dK8kBmdKsXKNZ6le+4D10aue40gL4Z929pp2bgeo9PrEjKXGxy7fSguN14SLHY/NltKxsjVK57JjT8Has0p0UbKWJ32+9wXehtT/T/vgdSaoWS8coVRIrZiqehgvDHKM0ywuiRE+XXotcVeNTjjwwDJYKAi6zmSjy3zZxEtrYXBgeEWq6NS1QTuqzlDhpVGLYXxOICwRd8HoVAd1LzS1hkrr8DHzTFNFgzBnXcK08E11XrnnqxCQ+8ADm3lKEKu5aKZqqYwWQWG9ZfaRzlUotEQP4XIqM/TeemKm3CjUlHTNmgsTxY3Kq9WU7eXHTbb+1/zPvNUa3u8/gzr6av9A4K/2/MDoi/ZD81oVukOwS0tYWXVEIu6V0PFlAOh+ecgJXxsSRa11hwSb+j60YMcKyuBspf7kZjWJLlAoVT5oibNOWGJm8D5u7EZjvMCMR1pTgvwrPRNOzveMNLvMnQpL4l0OrJitJNd3Z2++3UZAxQSNNv36JI1JM28CwL3kvbETpukx4pM8wewGNXh25wcOPbK4c6ZmcWW4GPzIlfq9PYLjm4q8gnyNDot9zZJqLDJPKuWNCMM6preZO0BA/rYCGpgPsKzVc/g4/cbzoX11/IEbcMi86pJ5mNOxhzmIibtFNroMlWDsuBP0T7sUN4Li8jL8EU8fJJ3zu0Ika/uXN5Nzai2hpc45cvANy/9g4SNn4ca2u/zwaeA2Z/eKCEtWkdOwDZ/uBHyZKcH3LsX0Q/uV4B+mALfsV6j5br3e5qp+e688nFSYQzhsZ3n4fnOK/N58AL/3sectim3lchnLwrSsqHlyiSn2QB/xat6hzAXoQOAxh03Z9d0MDg8gvmUl+waRuS2GGebdeC9p8Q+VJ4ArRhMypbw/BlxDEdcG5Ai14Er+qIOfyTfLcm3LNY1HvVkWfpSCd8ubDeex+Sf79WDoNDN3Q1ChC9GJmne4NWfHdR+dzf5SCpW0XatqbAnLWbUCVin59HYdJUF/frsCqBD5YidivY95lqII4tCwncbzkPVwksmDpz52WQwaYKphslkbcQvUI4BJWoALSWuFuz9lF8YrOWzCrha2Z0jC8qG5tRN4r8XpSZMtmKhfK6wJMiqekQbsTbbIB6bDn+HoPR8f+Ks/ttJTuuVsoW6FB8XrfoTbyG3xgOcTqsZKS0pTZHDka5sBfY87gnolY0vvOOUF4yH+2gmECy2S5Pd0uEYW9fZRHXbccx7K1bmRdXlPOXXAXjsPbUdvaQ2DJwgSXaFa8eB/vxJlBKpnLzzGw3XtQbTxXtwJ5ltBNBya9tLn8sj+b3rFH+qoQvK/5R2hXovYXnRsohuxIquNsQblsjGMZcx5hg4x+W5VX3BLVqYlXqP/BDnPxr3pb2lHKP88I9IT///+Xw+WoNbZ/4eQcaXp7IMlnhh3cP+5DWx/Ef93zn2Np/m2VCUN12u9IAuTAz1uRRwnVtq0sLMTOZSHvUtW1MCUmQY1LBDPrYXT5U5FLAznI1QX2RNT4+xON8Mo3fzUjRQFDdCN0+FWp0wpEJ6C00FsM9OoiZBQJhxgvDeH/rxbMF7Xd2pyL31WpR2zDXmK0HbwQ7vimku5wkA1eHSmY3AmGKqUuVtlzDNBjknivY0xIA+m6dBORWc9uj+dtqnuFRvAWApY69olVgAWrw29L9XEy1Z7Grz4YoPXjJYaeWFq+eXPtdZrZHnQ9Mj/SFa8j3TX+TX4Crtr9Ck9zR4pEMcq9lon0a1Dobcln3o61TPZIIvhS/0yTTvPmMqik+sDgri0Amo5iSJQVDk9oXT+dKndCOTLVm2/jpwohpOFyaWrKibPLj5y1RlEevxfrFZSzk0Qf2lKDKcBEBY7v6gX0FKq6qJSXg03strfxSfquDYfiy6vi5uIuTsrsD/Kon2X6y7N18i9Nd+1MVr2oPujKu3TkrnTB9ob+OX130SNr2Tzk1Onl0eEMCKDrs8tsi+3eflmsKPApwktO1a0DhqXrAyzlCBHj4xRap436o1SV2zscl6hHEjtP30ZSNof46/LojqChBnGp141PooXknb27/RGBYjrdbwhQbvcsRks1SuKGLdq1JGG50/Guxogzzwc6rE2//nAa7gIZWUWUKnM50CenlrwmJ/6XMRxqht1Yn3/06mRvYfTlOqciNQ4Pfds+h1B3K38+z78WGChCltEtsJdt+bEiOQ9XSRSXY0wcjdbt+tm0y6K6MeWRkzSFgv+43e9QWoDOXrCC5SJmZPe9HKkt3BhZEpnUyjFPEv756d7u7cfXOmRpJdnSse9AUb3W3MncVMPzQ58/2aPiRmgY8ZjwvKP1jXP89NstL8CfiXzK6Br3bpS75NcjbeKSaL3OBSdjfq/TzAdblBM8bJysNcATLOrje7EhCHbR9u7QG3qo9HchgncxH8RtZ+kW4tU9l0abN+N9vLvn6QxIZY0vMbeWSMQojqTfLnSiPb/mGgv9yMkmSZg4qCHwee52OK4Ly3VStEMHHkjJ/lBlvDKE2VUCh3JLw7OAGQe12D0wLUEQ3esMt5GdSE2wrzPN06IlmLPinzcWYD727XvcA3ZPEuNa5Hft3wFCztlXnKzQL9c9/2U6OUotR4EUTD26O7dR74+9k3QmS+COKtM+xvOPn1Hw5Dvk0jGx4z7J3YM3/GNha6Mr66q+iozq8yt5VWc/tTtxGo2B/rDwSNlDY8QjCiQkgR1jkFeqJw1Wefp4hdxWGPrBH6bb0qNSadVEGNRhBVBy7RFff+iuHtPUVdWvjaWguDw4V+96wrKVXXsSYgwodnQSokCUrM/Osy/TthM0N/xNlgP6+F/QIgIhCvoEB/bPfe9gJZ5fvhkzqp8nMkig/Lo/Ye2wLs6w2S9TQPDiEhD2YyGbnrW3awRqqjJbhR1u6eMq0hgoO/6HC8gRnIDlCW02XOQIYMS7fWhqyFveORJHiPY/7EjwIg+OmeDwelwgX2z7xXEAIxssZH9pG+chw3qkdDUAtK7aO9M8fnuPN+IA4q/ykFmuFOPwpCdvQBFCIIBZ8JRODLdYDZXEOnfvBiaIphrxX9dhKcw6pAL+EGzlQAdkeEPEApsnfzNNBNtyA3blkNXHDN8tbU7+/FDC/UPUHYmvDdbtFrY3LCca38TFACH72r6oOzGdkN8cs0b11uqLXv5c4JQfHcnRnxnAUVFgMAin3WoDyJTJHzIrdoeUCDhR7ox/9iQXYya/k55vW1ff+LAc4ex2tiPDxBAw2PYqTyXqdfB/g5q7EWKo/Qh8aZ9QCo75TtG2Rh3nnLLrSwqNShMN55tad98mOrDGVNi2oRs+qjcQTagxDHYHE8Bn4F3laPsb4y6g/woDNof57IxbREBEB92OvXkLRKZGrvKp2gPcXwWdUTVXgmoD7b8ZLlDRf6xasm+cUPVe7etIPP0N5ldbTqgv93Tyyint53+0zmtcwtq/34ThG5dtNTqfXPLcTkXVek9rXwuHEf8Tgx2tMGI1anJN93MYxA7KWFwmo7v6Pp6DHhJoC5XHbdjX/3HD1S/WDvCWlRjtXVxEhPBNSA0gsiqjgNWaEp+haDvQKz9Adw+sHaaaTdEb3xihpBQDG/kmlzG8RPNCFNdzYcFiKtWFr6h8itJ/hUhfs/ri/S/V3s1+Adt7GOI/roHIgjeZ5JDbVxKI0JJeQ68yWgYZdvfVM30BjT5FIpT+C2tDtkuUYhZ/jCmPYzKFV2m3wRzK1heT4tbhRfiE5IWHkS6ax/9sd7ZhbWbvm+tYkdq688n0b0KPnfC0JEz2NZRsGjxpLrnBz0/GKkwCQjM5LxA27Hqp9mwzFhy0IWojTd7yuQv1Du1Oscy1cC9imb489p1IETbuKx2O93L1u9M54ehO8r55ZPi3bQqo5FXczIM8vOa+X/ajvLkeeZvVwtdf7FSwDpTjZIGma/VXaYb8+6rsF1jT++1iWqRDIZ8f6L0HCTQrOS8MZU/WBODfZ8Q+M2o1Ej8xolqsdLXHwsW9br/GA3+I1CiMecKlVdKOuuoSvPIUxOPvef8YM1YnqTAYBVZ1v45pJEsPKyQS02PK0htWT2PGatPBY+53eRS/NfBec48r8MOb2jyrEXUUaXn85T832jLsGPvNgzv3wRMarPa96i7QhLuDZNr5cPSjGQ3bP6VGBAPRItzheOtMwouVWB2IN8/YnQJRyvWhM5x8v7zb/7D+rCSg/s2v7UGwXAhEs6aW5T+RTZY9z/S7ej7q5UwbrkOIuLn2hLCOF2sq9xDsAJK/DwmuqAL1bQqiUTWNjMOKFG/xD7++XIPu2lYooyzr8yh4d2dYHhnJIiwncoTVTa9HqmA2wkhrnzwr+xRE4zwU+7U+IIfR0Hk1pUxB2e0+2+ec/vk5bd/7/+Hy338Ea/zOy+Q3lJkV4i/i1OfsAPePHfdeHtXotYBhbNKnX4CUWLMU/Puv6ZHA6yN0yiaE/4sLezVtgvvCtvO3cfPO5u6lzD+Z0ih8AOVzaA3acl+fIByehHMwaK+EPQpXU9+txNEYuQiBkpfdqTrdyqZm9+j5FT7ty8RgK8Ep2nOXl5DDRK9esWryqwFJ/5UJs/hL1zCPJZEN0tLlzrcX1N3No2/7m7/21+4kti8WPVatwsQ9H4ItT6wIGT+M2lQr4eD06V6LTu8sv75O6O+7aeR1TUzMWQRD4q8/aBQvdOmrOC1eb412y0/F0v9MRQbgEtcM+QYdq2r516/gc3glrSLJOPNBkdqGmsh6RoUxytn4jovIszoixq6KcHFCupwcqDJplRnU9FTxupZQKzLrEFzyPHz+uVAr+RQ2iuvfZ5PeYnCNBDQ3RcgetGeFCtmcagvNc/jNDgIZ/wK1GGoUsQ8vIFrbrdN7ROAtHxKQxvYp2nVmHdHw79Zz7V25GKAXerVQJUmQP0kqweErRez2KbuyvnyL2ARrbCeI99REqQ+OB+5xsf/aGwnFb39KiJFhcqy3nk98RFsaCt3PPiu3O5hiUusiObQoMvhZAf93vJvMfTrezcTQiAB86gJ3M6kWTR5sUHdoh1i1SdfMyTvTD/8poYHZUKz3iYrv/k85SM9NQ+YIzCU5EP80g7wBC/Rmhb0zXRfCCAkiyOE9jFa/8WegfI7wjZFU+e+jicNOGMtKe/sImgMQCdYJLlS5+hoCQJ7ZCNLt/2+frQFHC5/aJT+M1YttFGBMtjrbf8f99S784dmiaQ9ToOIVHQeg3QUQI3nyXnTaKxuJ//Tb/gzKdEnwCmR0uGr4kBADJUPzVaMqkgGz1AYReWEWsgQxRb1bM159B8agRlZXeWsfnzmFeHSxWeNLIeC+jFnVeRvRR/qBxgNUT++tNvIRYuniUZN9CmoQDOAlS5YondrVARL/G6FKFya9711kvdlVMlDsJByLvw60/UJTTj+XsDncyK1GFz5TFyp61k6XhUyHa8G0K62lUePpPpdmGKan7x3V01vYbkMmmrkfQnDfvXetsqojliL7kzFdcEZlfVG47JXzixAiwwzW3GRt+oVP4T2QlnVUa6QF3r2vkicFpp4/yhPC00/5GsjcX2hQfT5otBM2ulr+l1+vIpDeCCB4rV9MMnHqXf0eu3zE+I9MEJh/UiBVGiy/0HLsyzkDosfu686QYB9GTYlZaGwrgIN/YABD6o/Ho52KVDY129/T9dMy++6VvDU/5H2cbvuRfbNomDHiVuCtO2Zdx+2VaIdvnLwFT7pgBz7PSgRunN/xlsDKlhRtQLl8r+sQrvZdpSRyX/r9KG5kCX+Y0evaRccJv+LKh5JJFTgPkYVmhw/j4Zr76KudfooTIBlh1bvGg1VUxuNN0ZfrdqzOHnXAnSP4GWXFU7k8JIqhzZib4mdpuNVkjWQJSDYj97ZyPUkLyJnabqycEiZsuK1fgKvqwe8gOJ+igXmZK05FmDTe9lhc0rnbGIOkWpF7YEg/T8InuWU84ndx+IWy1FTe8z/loCgSOW9qwiIVSlLLDkj4qdGUQUDCoXlwmVWURGfClHuyttQqILFagQU4403cVB9yarkpWVYtF1ZMA+g9nL3m9OUDSC0aCjXEuC6m5GWy3q1IcNLTU82I2vVs25Ttr8N2Z1hJgh2+g3pEpDxqG06URmgNXUTAMxUIMxU8c4mqre6SiusGEtHYnPC/A4aMr/+rWFIGwaAHt0zVYEmrsSmGwwQk6shG8tCrHYbyNsKJi7k+rBKnwhM7o6VAXdjPlGNZBKSA6CEDzYVzIbBAocTpJA+S2ZMo1RfX+IbzY+/no3mk8FAPATSj0PWM3n6CajCi0AOEF3aCe29u6Dl0nuI5fZOTtfVTGM85FICsD65usQpgHAKSa5B/cEaWj+fGoG2BwQvcOPJtsq6PDhoqemYf6uIvdLeNkDtpNkUWw8ZvRBov+m61dqcVsgA9U9aVmvWgZ8YbI5/OT7KjbC15NIyO1tzJSGKq6vz/y5BEGg9JDt/tG3VnNYIyke6/eE/mQwWrKPShnjUj1ybLxKkzr+YUhU7g9eqfNnHEKlfUMpCpJ8hSxDViX8+zO2aImStyhe9k6azRQnIl23OmSYkHN1RaUPMi0WcoWFqVT4kfjfn0FcUXkqAPqphdQF4DqtU+ec/3vq/gKZSn3GfSusJvFJlX4xf4o6KRAG6CgnbLcoRTaW+/CZt1YYIE9lV7jvcRcqPRUmZf5EX0YlydK0u4sWu34h6yXXqi7aHs5xBmlCpjKCbkrBJkgnQP+d3lg5RJejEF/GgqXPKYnhTqe9af5zU0deglMdE48ewJcQUAow44LeD2d1EyJbKUAT4J7whRPWUR0KJ2lbQHbUB33Ad5qSYWp0vmzk9YXKpctGUbPkmD1dHhAvrg5A96BJp4ahz/invHEJkzQb2O8zxC2wEzirLRa1rcrejZJ/X3CRfLosC3/UQF4aYDo9JbAtKieFgWysLvTiVhtbtFHKOoGxCH4gelD/kDxPscdMwRqHta+5IVUTLratBqs3u2ayMci6n4EmWnoA9pT79DRngZiODLGYaX80laLQBdVCoqGV0a4ZrKAxHeEGKPaALtxZJZwtuBwelsEU0DrB90eJdm3PxfRskYhe7si2q8y0OfjuwIyP7QuqW5gEnuF1i/3jD0xRr+6bIs/rizVwn7+IfApIoh5Ila671v1jAuTwZ9soPrG+LOL+inLTICw6czbq/lZ198YOqrXWnx2ITg53y8FJQx3cB9+UxNx8aC9WjMdvaSZfAYH67mJ4t5c9CWcezCOp8lopx09VcmVKqCvy8c3VdnZu8FShlAH2p8vMASLtzavqr4HTGjR8hus41sDgfc0C49vAG1wGLFSP6kBzZgZ74KSZqOaAcUwOk8AGrl+1QRVd55KYrN4S14TElVI5KmjApneOHMREK3e9OsO80UzynEhtiYoX0hFyqj1WkUeSmNA3Xxi+g501d6Dzp0yA4eLhBKOqNYGxrVe0mYxw0cqfgPxbAlFU4fFiAG1Arh1EtT4wb0gCLbrOxMTE/d9EgRv3Gr9YZXzyFTdH2pRsmKFpZTMIIlFaKPFrwlodx+UDfpIxbnkSx8PLEcg/Nzbm/HXHXfPfXd/kYYqhInpAqSABmz+6AmOG8lE+DB+K/J7veJz0rIyM40eo3IV/mk9Yb4xyHLmMyXj+BRHfMJnstgqARHcTdZZz8do/byKwylxjhy3uTtzPBuiQooKB8c4jhwctfFZEnqKjQP2VoPAZw8T1uZFM9dnRAayW8UVFTHRTR++SoRDgRVLpYhsJMPWj6G+NET5pqIsvacitxjoqa6gSuLmZmorqHMy7IXenl2eiJB8EebkrB/aHV5eqiUNLPNLE4oFFqaC7wSbzbJzGPX/vLcAobkJG6jMp5IpPLW683wVPUIkzK2oMsC73J0np4QRSUU6BuXlLBfRqrCpnG+evyntCvUD3S/N2DcyrzsC7ySRxxn46rn2Vgon5lOOZvwqn/9QDyoie0gXPD4D78YCSEqSp2tNvBVsLdkfnCQL+T7HoeA9vAGdf7PT6GwbT7CCx42Y2C5LXFf608C0CAjJICApHdxU7kQBlxRTyFLOqSgfhy9OtjJ9ApvvUpSCDssWx1iWj8ZzKoOnGwZIz9QUUdR7EggjeGjrgB4VAX1Ak+qx4PcjjuBf1VZOzIGTmdMFvUdUP0jR1R0TFwZ6jP6oBKhTA3O+xkvbHA9ji5IVwZufp1Pdd20vJeR2h3NpFWqSDGas5XwlsA5w58AC+XuJ6UG/lBcfKdYPE4cFa4x0rX5WTAO0N0Cvc+2y90CqfV6nGhNQ05SAKu6YldIjkRkrK/KUnGTcQxecVCM+IhsHatWZ5J/3kh//tUYKbdb9w479VuJ+oyroEZ6omPAse97f5/2bTrUjGBKxAbtGrwEMECkzIvb+2cHRYmEBZ2g9m/m6V3JhFfuntWX03ZPEC3gCjJmRfNiK8qbGP92AI1XxaXXf+pQY6L4MKzCZvLLOzZfOnjW7XbBPBkiQLcdomA2mih9Fb04Ke6NGJHaPf0AoVL32anf5n5Wjr9yzIUN60QiwTGh2qQgdMiMpjmu9lqMXb6azP5PUbXIv2LuS0GBpXtZm+B2FCaCw8LP1bGvjYwkmk50fSiA+/gWo1kmvhXTIQn9nNxS8eOsR/ai9DtIw6fUd4GdB9b7tPxC+3KqXO3gnJHX+ifUFMCdMCgyMQ8U7AZ/cIz0H3hbpplW3bCbMVQ3tzS1bwxtrLHHYBiEUMOV/xjAlwIj6GYsltCafAO9PjintqIDQBjGPjj6qBPKkx3oLPlAm+3Gem3HQWF8pmEAE6664/4fE9rn42er4MAY1qCCor0T3DFzxHgXS+PAJop58IgtVmL11syY+52eRNhP6kF95fXqB4nvTBKwyW2+k+cSbp3McGq3HD5O7V1CdOadlyx7aPsh0IK+06FHO/7xwpwEU8h6Gfj+Dv0cwO9tub+8iR3DSdiSJ2ExqxtdQVPpRAEVu0wzDv1GNHc6GUP34roJwck1ua+fKdvXQIrgiybOt+Pt/A8TBHMrQUh+Gp8NURYtO+fN5OULSNXPE64Ke0JfydYsxvOzB2sBf/Wgsj9lIhLg6F8FeTg8O9+GPKcF4KFm3gZvo0l4mx//7WPT1PAdW6N0bGbQt9dYscU2kChM3dg8NqV1DLfkuduWXdwik+hqSrgznD41O7FM3Fg+ajz2+q4IHNsWoPjZ0RfQCLN7Kh6Msovpa4jMqN2FwRmxAoO2IxPGkR4lhS7Lr7/XCOKRIDXmT7aQabKVC9TI7KsdR/+TgE5irJ8mHFMyunu0Fky3giOSi8rhZ+yW1z7Y2qn+PNs+HcXmhXhhCGsfMw9OE84/HkfZE8zWa6pjHpcCfiGMw42I9wweMX3M1JPYBAhRwSww5cq/U0KR/dew9ptE5j+i4u8uMyp+iInXpsm32GeHTjCWwJVawL4Iya1DoBn+m1lKDnWfk07pa8xOg4aLYX0mYnE4gYhr42+gYjyJ0Us1eod3HqK5RZ0LDOVYUD7+uRADmQrTpNCcUTPB4tKRlAdDwiBAJumdiQXeMYx7rAH26ZuHM9HnK/V0L68IPgEXfCENDwKBMBhChiiSLDD9lpDfMF3QltEQyV9HyrOK8EgRsVcdKOyvHO/py0WcxkTcfJXqxvWYGk5zy2xpmZqUsAWQOPnL6EM35vKA2HiQxSZHqLkl4/DGN76xiwrgB89PffqCAKJ2EtItn6jyv7gSgsEiMAWflT6qQi4llYrWjF5bAnVFISBWBNLX0AFjNbP5n4NLtUaHUaNeYwzEg8QIJ5R9qB7194Y4AKbQCgejFReX/BXq27Calq0sJD3k+f5TCHRmWgMIBl5Oa4uAorI2xEmgm8Q+MDY0HJ6Gb5vrdiZB+Glt193Vz+Zz2EYFhutyO34WexS5NvJw3wzUuLq4/7huM25io0C/5al2zTgiAgydb43SMQ6rG4pm1b1kUIvGS+s5e69d6I7GhLf0SApPJKeLqDRs8nLaPUB1Fx/C6HBfz3kMIdMA3Lqodc81VYM+g2N10LQ0EYR2thHR3ok95ct6TUQNgWyAZCuu9qOwJJz4fVS9+vaerwTNDuYuHna2RgKKMKNSjnE2c1rCNe0zetz1PBdDFH7Kqjuc1wYx04HJ+82FLrhcwG9vYx6wzIUzW24V4BeJc/CijgZ8lktj7bMx830WOBUDdXmWR7sFsd+4q3uvKZu+yNDR0I8NG2b2Vr7OgFYD8L7KWcvLQX0EdajY4uEWh+0SYt8ldLKe8CXD9PULDqWoTjukEYJEpAtbGeceu4Zf/Jt/DqJXZIx9snC00K5TD3OArB6mD0ZWSBnG8xO7Lmx2QAVnL+IeSFSEu2luekZywKbKKEVsEPUMjVQxvCDYX2YHO3qBe7yY14zlWDtSIPRPAl/3SO0x1WEKyMVNsKj5jbwSc9bv4OSuBuzSxhgKDLWIgDgvvsENqLnBsbtmafsuhgQUFqM7kE7koMNR6z2YIiw8iNYix7ncFgX5PLlc2rffhTynOl/uXVOnf8759y4vaALOyg5HhkPKVldblMyf77yVYHvxlzG42fV1o93Ozbx1/EErqEeBBtN/9F2/D34aJZ4p1D1gNPMo6bFeAZNW6QhKJRYEBo/2f5B4sBUjDUpxzTI8YDpus1wS6NQgeNB2+XNb9sD2NEXKSAGH9e/J8UaajblZdPjPO0d25oK3l6H15/ZXb895+Zbe1Y4dbDUSVzVR1fonzi2dAUkEAcEzRasPnfBxOn3WuCo0AYqQys2N3ex6LtNXQSqwYBvi64DFBTs1Vv68YCiKZsw+p/7KnAE9G//VPJwx8BNpBq+sEckxpdftvqI24I1NKtYGAkbuHO6OyISPZ1KsLEuy/oJOT85F5n7GPukiVC9PEje6x0hrQvOoU8nhwhDEoCixSSlkGpE/gaRUoU+eTO3xJ096+7Dk+jVozMQBQtQdjqpLMw0wg8yeWGT2blIGokERY7bVRBTUn3sScYgs9vMmNGCgEYLJnIKqrm5wFlbdwt8Mj4vOalHEld92PXUfqBFZAsaVXqp0ZM0YBG28eX2z3eU6p7k1EcwtBbj3bC9YfHx7D0DgufuPShfUHPGLkdP/70TwPgelwHVljaF5urew7EpkcHUGw9mNRWvxRkJ65z+IQocZUXENDwhpbKF93tjksQdjbq4t2UIP6VJ1xiThhuwHH6dVM6Lkv2kf/u6br3fw4CrZmTR2bteybeRS2Nq6dyI0wFMPVz0U5OukpbOAVEeGoipPsIg8uW+6lZnnTkt1dJtVgOMzZFvWO8ETBnrkID6hGe6LgMmeH+Kd5MOHGGsgR0x9nWbyfcNfiEMfaLhmxY0UQ4SfAm9GPOb7mrdSLoS26vLgqs9McNhLEW/s9h82So3NL1yna0oqQVRijScy+9OOHE2AuYbuVVBrC72x8O+OwnQ4NsAB55ulD1BPEGUJp8zvFSF45ybfg7SJdlioiMbiUk0i9Zqo+5XjNaanNyR88yDASp44YRKb9kw4IoHV19ofRYfBVkDQDBVRDfSiKm9li+jwmTB+5Rh9nQhtfBQOhLALn7/2senEpA7woRVo/F9WDh5hR58XEbBxHLJQCTAJbcoDiZUHW0DRUOfs2u1P9qfOtFwEwZSctp0Wkq35LIZLDsqVXRxSamykzB7eOUm2dhTwo2sOuvPBXcr5rzcLp5WzGboD/XBb+r0VjbOPqL7xrsX99GMcofq8T1H071dcJubORcAJk/k5A1410GveuysSCgteq34A1vjNrlrxklbpKfacp9wUNE85aWpdn1I6roY82kvvQo7lLZpol/JVui1mRobgu9vBIRxrHhjKQWgl0pKuYqUAW1wJMQx/Df/QugvlxRJllbgSD05nTYwFvecmd0bS/eInPfEv/M8tOkd+BwbJZ4zADmOPwJWGD3CfujYZmN4rbDN9hLOgbU/XNV2LYO6V0EH4++1jJ1qm9nncnDFpahML99PRO5CpW5mqYlJNc92eMHqrd1RhWSEZ/kIpEvwrjIAE6r4gN7BXfrjzZ0Y6MbUULrKGOEHiskOzYKPX2/7Kgr38XlywXbmoim57jhKJRwOmoKATLUp/Mnd0ir1r54SV8vUpU3HnpLDYjMEYCVIAhu4tjv0bFl3e2osP7ELaUsBMppGcyiFnlANzz4Nl+Cy4zzAagMdfFw/6kucDJ7l2rvKXfs85ejWyvLbfCVuUWbUQYvdHEJaQcRxJe1erMql9/3BTgVzQR3otj+yz+NeHxhTtdZmauFgoRMgKQbRfbrXyK8MvsXQDcRdCYY9zEFOEzvRRo0E5YJdSi3yzoGyqfIpBwYBkIZl8pvQWcOD+ZRaYj9ots7hu/CPwlmoB/utxH/Lm6JQtOXOIf96TukRn/qr60IzUManJ7b9u0rX7VM1AIFwnEbl+Y63Tt/Ym332bK03u9SyoI2RsQvCvqG7R6ZNDlNYU9u1qP2QcX2Ig5f64ZaA/NSFY4j8taZeBdzNmVEOp2ZYvZSbQMwXJENtiwCjPbw57Kr8h0ZY4QNXqQSaKNG6u5M7aAUsZ9gqog7ldsltm2rCYdaS05paiatfdBjlp9pVIAMzXAknE1zeGX6SejzkK1eo/tVjjuMAX8NjVke/2CVSV/HvdoJUvvVNhp9ys45+qU4QDPhQpc5sDyQVSOZMvQWozSmPLICdrcI77PlXOpaTXceFHdAeHFYocbArX77hSH9tm91cfvjTtJsK/y+0u3g+FbrMlrd+1pb1NTo04JXryloLHeBOur2jFVvtRhFZliYEh4YPgl6dao/ooyXgNjjzkX4G1VrKmJaKN2yjCw/D7GI33GxL3Ehn7iKmVCzeEm6gACiN8WA3eTShCZ6wdNR0S6BHMLwTlNcj7JEl4i5+vO2dXAC041ff8fUGSmecQi+AFptIU17XmcNJw+zzzjPgR8uf7ZtjkMRdxkiPk7g01ZEzaszo2RhM+OA+mKZ7eERdIBRu513yD0XT+yszfnH0Qr/FQ0uwxN6ORgWfpDDbCh8CrkiAF9i5E8nIpA4Ys3o3oMruAxtg/B0otFmMd7NFBBPEV8Q/7VQkdH5BdocNVvRCzR/xVkKSFnMrXpQkud531x5OnS5Sz6U9CKcQcKx/1o089sk5I2DxvZ8iiH24uJHDhw0RcXQ23ycSiSPiUfDk1Ine/jmSUZWVxc/8YaCEYIvdsP0IDRcPOVj70hAvdIe1l+zYwuMUxS3lep6z59vSucE3eGgOJ31ZjUBdh7mnl8JDgaR4jhOY/Gr6jAfpEAdauFMg2JSRQ4AV6lZlEufo9NSpBbjVvOW7kOsVSG5HlhBzWIX7BAQN7a6Jn370K8jQveMpv0ITDmCi+KmIrJ6ZnTvJFjqXB5HlFft+k8FZfH3RgC2NO48JquYjAMzWGUpQH9PHNVnQv+rutulyj9jx/AAOE1oxkKC/jRBUoPTeGIoR60PJQbZLygoZpmuMBOjVa19mvNvU7EIT2zZUILAwYa4EML3r13YRYMZE7IozGbVbb0uwgNmOMbSA4hZo2YhAQ1zVebp7K5s4xf8Vxni23/4nPcAsT84Kjhk6wTv8X3Xt+wSSyPe6+eZW4EwYijiGMAczlBqkhaHT2ViIm3G3Rezy+2RxlCADiKI26BM4SBIG3Cvb9Phvi6mV6CS32dx+cwfN7TRvLfPXZ9/gNpjbaG6XuQVzW8wdMhEJl5jE1wj/1cwpsi10J891G3vGbxUXL6/NIzbmYINKlT9kLjxf9QD9DgNZPM6Uo5OoL651hbTPoZbL7L9+OHePzkHYcmE5WqM4n6w0+qy3YXfpaub6OkUt73MO94c0ZPT1mGG6alzCup+Yuv9xXSXQ61G3YKa/IIPi66bVuBwLE9Ii3siJRu4uPidDWuASkHahcC9fLFltRpRAUcIMAYPcRU/OCVgUnrvtlAJvL51ZCMaZN+OjPwPY2CLqdWf1KcwuTHSrwoMHxeI+wi4ddr+/qwMehn1KRhWRL7dDq7Ips3yTkr+dl0YTxJ6tpx6OYpekO2VlkcACGKIu7WSlFRcrLKWw6shxedb915fVDli8XOveHkDkNtHc4uIMu4Is3ISh4i07yVxxZ9qM5d5CXbUUtwbKbEUPRT+3LYnpLhStqIaWfY0KvCMrtTfLJYvxST9Vboit4392eaHZaqsuufD/t0qhKxUL0+oaFPqLwXc1enjzWOME5RC7reaypCsVGWfCVPs3V7h7Pkk1wub93IJLtPKr4i3LqI/fn2e0vxrvT+rvvXanJUpLUK+RePNaG0BvWS2oH7/dEzc7O+x2/o/tduOylAXxoobdYxuruty7/fvXeKPnX6sNDd0a60V+egkAfZR86eIJ9dcH8w3AawRCtfkaSmxrI8SmtD4rsYsGZQekbzqAz4nAl26+9maG4ciGjyzP2GbtQI/tgdwGML7H0DekRvAc/3jTALON1DL0P89AWmOcyHufriB+JWDso9TujjzA2vzEvP3PbEEJ5l19nXbVfyf4o3l+mIjPwL9WXU99TJ2zxw72Ey+0h7Z5uuQw1v22xq4dAsHfzQNInSe/+u0RxiV/vZDDZihMlVQ4YCbUyU/UhX8Xt4VlBpYs3sE0iSUErR1eadNJkRyAs4mfJSnbFtAmarcvremmNxB16jdn2XUb0BWUj//JbIEW7q9sjusgBTBFdT4d7QI6gjaEaf0t8pcQHVR0/RO6QYysaPsVMf0Mmt5GpnemU4IdjtNrnA1pdteU3Fuafe/OK1ltr9n0lwMzEF9METwGAHGKtK3tLM4Da38rs3pIVQNnt4sjRUMJ9Z5Qpqv8eHJMstLxVRjRwiUc1FGixYxPvKk9kgikh0+DhXYCtDhje85NJuz96Q6n5Z/CxsGoRCmqwckOZ9DMEJGtLgW20JdT9EKLR7tBkFDdEKWItVw9hQAJY4kGwEGFsKKq45v2kBZ9kK0mxeCURjtuUZOP3+HjB9VnLxb7YoKkU7YyrSPH0CRyXiMHc0DHOFSsT5mwd1GV+KGmsYrqLgc1IZTR6CuhVA/+ompZSxx+JZLnQqJG485p3Q4Hy9uBBKVwc1PellZRWhH+NzemOsD6ahDGJIExsl6pUPzxcASDzBcdm1W+Kyohb99p/SkyVVk9kU8akUd8YR1qIgEWUS94wVBemwrPSlUUFO611TWpx1MyrFMQP6AB+OJjp7NtH6hkDPo+ZUXS/2k8y0fsTigRdvPCmpljtudAuQYflGGKfWlB7M0XMuKm9BhwjjQPyfkfRFgHN6Jh0I+jVIx+fkQcPK3P/X7e302m/jagNDRu5lOYZbfToIgalTVhDRphRTkn/DOkeYpl+Kb0jWuw4wU/TL6QuZP3Jb1qp25mpZDhNmMPYWmJDDbSMuE4qqvWOOxmeWf51t28mcWal2cujkrY3EH62IxE/53NcOMiZ9vqOiZBC4ReRfMNMbJBzUlGuYI2YEXuU2YQzg+RF7rnXEVVoBjnB9BFD/yOnYIP50MKPFj4y2hccmzqjFt9he/SFxMGmb0PXxm2I0wd5+LLxMkgdrxio9zSMIHRIn4qnXEhYZSi043rc9MwYjJcXRopmSq0bMsw5a2CuCVZv58AIeP+AlYYfn5XS/sKXLlH011uu6gHSbXoSr95PdEEZoq/v6E9mPTZXJv1XhHLB4v024yanbEjKZFBUFli1pBlD6fzi+u3QS2F+/a42W87GWrlEx7cK3CWOH6dj0+a2PMXOC6dXjoq1W6w/z6CZ+W9aaHsRArAUgQo9A/KARl1muYdzqfqJ+s3Kme1DC3a3JqWm+7PMEeoQM9LRxcKlPF1JZkw/nRJgHN8PBTZoxITO9wVakdzOrR63iHn6tMdljukQFo8pF518LHYVdGAoYq0XM4NG/hJEOcCqOwxc2luncLnIoBaP/sKS6JlIOs3XJOM1PW+/B9q5hixKk+e3p+e7aTXvsv9Kwx8lkjMEt6ZZPNXCPbyWcvIZsKefTnxhYAnxmdL88lEed+QrJam9leeIn9Mw5NpxaGcuR7EhQyYZoASeTJhARjlfNSisA8VkKGHLWjaE7mrP6zEaH0hLf6pJYbWEZI8ekab3AW6xbqmqL9dHkTSkbNuaHI9chK1VLT5aNGpU9kCKXOfOFFGlEQZHLIL126Go+BQWX8iowCvlsPnH2sl8TSNamoEIijqPkoRICC0xOgA4AeuC3s2i2y9td8V+yOpwr9k/A/QkbnKvK1qSCu7VIkD0kVaLQXBnwsW8oNaXufDHHqpndE+3xMzPM0D2Kx0Bm03b/iRUOdtOYC8j4/CZnD+TrUQIZdBhQ5rUjOrWxnf/g2NHuEgUv/WP/XnKAKCuK1yyPz8XmFc416yJCgcVGHUNVVuaXqp33zLAPBececDduKsWe4KoHZvQvk7wbhr4waDTd6WyQBI8RINuvTBpX+rxMTesoC202fR3A/3Gtlg6ilSSktG7aRVcpbykOiqTRoiItz8chPI7G5QhNAI2ncHkR43BE1+kxIE8MGkvtKDThbMxqlZGOgfqC657OYxG/gw5XmL0ArYlZKtBFCCJoUeNSCShohwhBS8FgKn6h43DgN1BkYbpCTLWYwR8aZsSw4MxJhhQfHxiWEcm2efKvQe4Sa6rJz+aKvBX4xSTsP8mW0qENSbP0wXDa2/MyG4O24f7jowTl6qr3dHflbM9Q1f/vBORVtpOvcKq9+hB9Fv8A7khR3TdQ6me+LwQgzXjcw2+Y0UJ3PhwV6MdUYjtDWF948AFOgDOsFy+2EZxghVCF1ta6pGM4c9VWM6m+u+3kofOY4RJFTnFVm54KQez93IEgAVVVo7t6+kZnw84qh0jYE9/V04m0JQ7PMTbs84jDvEHk0Cb0lSe2t8H78M0HqViodX2oso3PfFIdryxwsHt4GCtTnki3xd6gH2YVSut5W83abRU2CQcpA8Ic692fXFdTnET00w8k1HMXpIBNT8R3WYixOwVEKi38/1CORcRGM7pwJ++VhmjyH1ewSgqy9gis4UrMTH952Re8tIvRBQAgk4uj8PEOcMncQbY8z28LAy6ES4ir9/IN9/Os31UdUhznHsc7DLm+DKiTe1Xzj0fQ9dFneSd4fsXT3nT2BkCBBA4eDt8wzkWMNSqqRKqGr6TNbpgekNTIT5VIbDLiruZ5Po2id9XpFAAslFVRIalKfgdTgeFdhln8enXdQZgltM6Q8kn6+jNTRAiW+chnMNj6EPP/4b3tx/WyyktZRu0f6gc/f3HL7IPeQkuR/sFpk7PeicSeg3KEsCDhmEZ3DoPO09XpODSxWMU53G/k5dV8v+Z2r9X86q6m5qigmFoTAll5Tef0XZVqz8FvaZ8ReGUYUXubF+eeEJTJ9hZBPnHMD1sxP5HtDkCeW+L2x3fecKriwHokm8V2rwI4r9KuVkhS4tzuvxZn1NzeIMkvxRVCGTLT3zS+2jgUtqiP4fn9OYTaOc8quiTdN+kZx+PPDZ45wyv77ltIMrObp7GnXhXLqLEjK9K8FOJ//T6/IGQ2gPNh6u9YhlVfMsyGYGAI/sft4/j42iLQnuMxf8by0GfXTlYC7d+T2Qc4N+PyK4B0/pQd2AWoNO/RDm7/Az/8DNoPl8h25Y3BV8i1v4h2WVD/pxk6Ch5YUeynboW3em8O4hzPvmOMlJUMsAcT9QRSD3FCDP++6I8ZdiVPxLGvOnSc1BgXeIou9lZrc/XQSUVSEpq+/3cIOZQbEm5a9yZywlTdqdAgRudI3SoDtHt9+B6EvxPShh4nZf1bDr7i5wD10I30Rv6tmU/38F6P6gurM9I2gjYDJoz8Z7ss3tfFHWPIFwPZW7/lTGmnzD633tJIE6msNWHfWYJ1GOxzVGIaOAAuqU4laM8Z9mal1+jJmwO3k5iPSWEI97mQIBlKTPRy//LRcQtMU+1118nhX3szzb/pRMDHCc5j5OVnkBaOuJD2mpnHPPWk/qHkUj/FexVHNwgEgOBxwuqJndFhYsGkJBxtIddTf8W7zoMwaZ+4+FKXGEzigH8Qnnnvmhx7cQtJe59nFAesqtEGEF9usO+Z6o4tgZEmnq4N85FnR8jkmlQbpun6gjus9bblIz5X8l7jY+dP0xgQ764b2fk5HxDiV/+kO2/6Uq/avfaUtCdlz2OejyOROOILW4hiL7zhxFjAKp6k1znxmmcYLxMo+1gWEi8DTHdNRMbZq8MDFvrI1FonQDe/pkerEDKugMUYWbjZaRdFDnjUsD1OroUYeB6sOMp/D+pFqIBrPm+A7xPKQuL9YN1ZsSz6R3ekXn+xSP+u9TystLQeIW6dDyHmUhQ8medwjV40SbaMrqwbCDrBJXY0hHtRiuUNcTk3tS8IkFylFowivNH2pGxenrDLD/ULH9fIQfA07Lt4PEYXPEGlnqbxaLgNbsAyP+c9jyAv818NUGs2nER0rTyE+j+dwRIaeW1pGy8GpdDRQYtPrgca8Y6Kmp2GijI8/JEESgbkRWD6lfD4G0s4lG3uBFtT3X1Tshqc3/m2oSa+oBJmjJNZGjE4qeqpjdDcx2TiQHs9bQfU3bAE1jgrzfpnM43W37tFXPGG+QsBSer85nldA/TCcEKZkcijN/VlkIoNfMo16G7h9ah4Fk2EEy8N45eGSkDdTq1QEIqJtvVYyIAnWDJQ21mjs/h9nX0YVPjiEMR0Vr/mEndadwaBWe8CapjLQODhWsJCZWfSxiFmr7KV/e50XJzGc3wU4un6C/V4v6oF8Fb4t3kNpLHlKMNFqeq2U1L5Rz3ENQYMW4PYHyhNmLBO3RwnYl/b45wZnOLz/P9PFdAo0K+1M44/OkvFAwsRE2WeI8dPSkcCcOYURJtDuIdbpiGBxKseTeDKJcaStaRbqiIkabFTMiD3y5d/OsfNr/TucdfY6JWMb/CAOxQkvcLe3hMt2RUdqOjvpfVe2M0+euk+IBBR45CwDBjNj3dtk+3+urvfJv/Q+vv+mLyGCg7XenCz7uXhRBRsLz6QjcUPC3tHKUrsD3pUos2OnNtcElDg4h79GOkFmhn/CjN4d8ozLdaC88guFRHBrFpeWdjBd2SCOL1ur+GMMeGJGJwj/UoB+pd3Acpoo9RouZ/j5oc+bj2WM2TGv2Q+cYOfrvPcSAAAkk67W/1RdKvG5xFHlTIcK934Tjo1FyqKGIMff97/Dw2MgQikKne/xdTFiuaDWm9Vn+7RhrildExSR+9aeS9z7a0KuevgEteFLeuGZnyJN1coz6/tZSpA/FXSkFpwTGpnqEmL69Fiw22kyrO4Gr4tm6ew1ueZXWCfeq+GitGYL9ws1CYyHrFlJylFvwpLHATz19LY1Mu+TexDPD9TciKfAoO2WUK4bCtnT6AGZLL7o7xpturxKxnE7MIiYl0TTx3AHpctdYxtWntH9nUzkUAAy3idtfQtpT335ZVygw/tEg1pnT2TpIc5q07rMGSwc7nnXP2xByqJTSPAXTkUPrd3VhuV47a8EbCaCIZAdvL32BQiFtLYa/JFDRd1YUGBJ6LmzMVF5E2U11D4YuiGl3zbCuKFl7NCZceKe0Nh/q2vd8acO4g5ydpG+zXd3QJ3n/J+1webqjlaGRPhxRHeMjk3BdfPMv1IA3xCw5sx6BA/YH7WxDOpt5mPSMK7vLmMX6+rzetyj0dQjTxAhpKryPc3gVTHn+cYLaJ5QbnHCHxzxKZw38ojEDHkGVJs8Y2xpDClU08FgJDootcxI62R3cFo3V0f5G0s3/Xqf+Y/aJVIHlAyTCu4knQ4DnAdX9WFOOWFm4MsUne5It2gDcTxhPmIa9Hhk47Ab72VRcC786xjbFAxKW5EkkFo0TJwzRzEsxr6hYWglJ1tw6UPq88Uag9DnqhpCKyOkPpSai8EM1a8xQj4Uh3K5RP+vVb8WAlJdhdNNtM86sWuxhDmJ/m9I35dfoyKaZs4w0c8Dbz8OVmoaJDiKLODWqCqtq3VmwJiChkvT5j6qdWjLUog51r1Xz9mxHgQRdXsf8KPumXYgu7TGrSjdlIoBvUhNW5Xc0sHOvN73E4/cSRv45iz4rZgAGAvi1OtUic2pOQDs/myxpTSy+u8MTEaoH5ClCQi/q25OnyAgtEOnZJ4qSL6ePnnvO0gMl5i57UImcP/PUwFWVH6bwdnIXcL6mrwQ/Ty+CFcjgLi57vS7THsS2rBr2ISgNb1WF1XsaN5w4e21ejv8eKW7wvovimO1RE+M/DIIzoOFTyYN1LVNrHmdFXn+8Im9thdFjXogmtJaZpx6RKXLlwHhq+OqeR8quaQmFJ9oFbcHPac51l8IDk7HxaVftQKJ5/UfVHFRQsD3uprt5nw6T/QJKmBcC+GkOVqAuCZ266Q7tEWxpt6wh9EdivRxtBdZJBkpp57cU80fmPgWZ9SPc3EnLm5kRGwPa/+2AdahhKuV2JWk2LTR2FyBg0GJi1f64Xj/5ZcEn7SeraE1+f8vcwsWhTVfOBldDL+77ooBW5tLXyCwmvaAxhRyhRx7R6vljmozunrcbYjg2d7gtij5Ot70bjXQ3eeSeNPyHBkwfmSnlqkmBVHeCCrCWrIajGO82ycewUlz2dVerLTD4mD3ade34UKB1CCma28gmHB9mnthjZIPgSYr1kp0Y+KQOn2et5YxM8lm5VFstvxvpVpExCK24EhPVW8cs0xhkRAFLXM/iw1OQhQECByijBQW+lDYaP4G2eZf4TEDyYOpgVpijJ0AIFDFZVFG74pa3QuLuMQBoouInrvv54wEkK1bdD5T5rAJfrPwKvtk9ir9byUS3H6/Z0tvi0+ES4YACAn76ENAQa95B/q7sl1qfoEohDmwhfnQ38fvvHeANgbE6MCWMXyajJZ+Ldzw+JWlNzHycGMNkXuhDd076kYeCy/U/rFIWl/oIwP3rCx2HNKH9VFRIwfZH4R4dOsK0Ns/tI3q2pPqeQ8EQKH5YqRgekIIMKOVGOuXDYODIQxObk9GyVf0b9eRBTcx89o9nMGbU0tC5ftML+OtK2eQsgChAJ8AP6VOZjdDz8ub4o8v2wxADWeFH+gihplt5WqQl0olu9hb/SL2ypF0Kvz9XSFtNRz85LpSs7ieYXLCvMk07kp8nlnU1bVbQoDeRvDpRLcfIrpWUS3SSQsmqJHpJXlInKZLEJRWSGol/+YVpJauWFEmUkukkSL86S3BS/+QW6BVgJvje4sh5/11Ah45AQfOdeweAsYOC0jy+Fx3VnOhSdLvyHpYL/jVGyHTenLWDr0lQiSKQ1y8UcKAhYut2oRTSsOQ5Fl8a8if/2btxuRZij0KrRLBm5+zsDqNFvh0ZxU5+Ys/8Mi4EhKbgN3yZrXQKYT083KbjHHph82ENFsF09y7C7xfmFSyJc8WLACTVeOp8PZTn2WRsNGZXgovZfdr59qkSL3TvXRF1YD9IGmQjUnJpqat9HVwXTZjrPODj2lUcHwUQPwKAyMcCiD2wGhl7yjk9X1cvlGHEaoTfrRFT4kQ15ykZ8xFgDbVRSZTdnhHPq4YJXp89ePceMngfS5EFAxxvqs6fkbabBUlMfzBa26jTM2bNblrLfkTqANbG0enlPmbmSQijN72AwQEmy252+HIauDnzFns5V9TTYSteyS2wnAeUTxK+nXdFgWixSz5Ddwaw+b2/PPz2b7CXvZxYIbc1hubNqedon5sY07VPIC5LJhRTyOnur5JShazvUz7QtGJ39UZVFLiTuWHE8v2JbyyBR7WEdBEzWhvlN5fALuMVx5qTLZTeT01MTH8FCDUJAZ1Dl7zDYFDCjXOZeHguPV9Vhj9Qj5McphX42vmIxU3DzIpemzTwsgu6qbqu8a6K8B3lGLOt0XuAiemPqcx9z70xWX+gYX9QT2YnD29s8gQ5ss2sI7SWiJRXhwr2YX+i9P7kx9FegGB+aoFZKl6g5Zwm937BXPy0X2LYXyl2WYSJ/+JDu1NGW9Oa9balk2GALck2AHUi2IHAyZxIKMCuRHxDHRU+ONxh1bWMPPnngexnKcoQYrGrnIpgNrESZRQyKvaWGxCRqkdxbz/7ys2l7fEd4lBiwcSriIN2kjkyjeVHMkxLFvDmZNYe+EF/fw9oMFTDbPH6+H4T/GVHAA==","base64")).toString()),QL)});var TAe=w((Y0t,LAe)=>{var kL;LAe.exports=()=>(typeof kL=="undefined"&&(kL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),kL)});var YAe=w((TL,OL)=>{(function(r){TL&&typeof TL=="object"&&typeof OL!="undefined"?OL.exports=r():typeof define=="function"&&define.amd?define([],r):typeof window!="undefined"?window.isWindows=r():typeof global!="undefined"?global.isWindows=r():typeof self!="undefined"?self.isWindows=r():this.isWindows=r()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var zAe=w((Vbt,qAe)=>{"use strict";ML.ifExists=C8e;var ah=require("util"),zs=require("path"),JAe=YAe(),m8e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,E8e={createPwshFile:!0,createCmdFile:JAe(),fs:require("fs")},I8e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function WAe(r){let e=N(N({},E8e),r),t=e.fs;return e.fs_={chmod:t.chmod?ah.promisify(t.chmod):async()=>{},mkdir:ah.promisify(t.mkdir),readFile:ah.promisify(t.readFile),stat:ah.promisify(t.stat),unlink:ah.promisify(t.unlink),writeFile:ah.promisify(t.writeFile)},e}async function ML(r,e,t){let i=WAe(t);await i.fs_.stat(r),await y8e(r,e,i)}function C8e(r,e,t){return ML(r,e,t).catch(()=>{})}function w8e(r,e){return e.fs_.unlink(r).catch(()=>{})}async function y8e(r,e,t){let i=await Q8e(r,t);return await B8e(e,t),b8e(r,e,i,t)}function B8e(r,e){return e.fs_.mkdir(zs.dirname(r),{recursive:!0})}function b8e(r,e,t,i){let n=WAe(i),s=[{generator:x8e,extension:""}];return n.createCmdFile&&s.push({generator:v8e,extension:".cmd"}),n.createPwshFile&&s.push({generator:k8e,extension:".ps1"}),Promise.all(s.map(o=>S8e(r,e+o.extension,t,o.generator,n)))}function P8e(r,e){return w8e(r,e)}function R8e(r,e){return D8e(r,e)}async function Q8e(r,e){let n=(await e.fs_.readFile(r,"utf8")).trim().split(/\r*\n/)[0].match(m8e);if(!n){let s=zs.extname(r).toLowerCase();return{program:I8e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function S8e(r,e,t,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[t.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:t.program,args:o}),await P8e(e,n),await n.fs_.writeFile(e,i(r,e,n),"utf8"),R8e(e,n)}function v8e(r,e,t){let n=zs.relative(zs.dirname(e),r).split("/").join("\\"),s=zs.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=t.prog,l=t.args||"",c=KL(t.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=t.progArgs?`${t.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function x8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=t.args||"",l=KL(t.nodePath).posix;n?(s=`"$basedir/${t.prog}"`,i=o):(n=o,a="",i="");let c=t.progArgs?`${t.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=t.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function k8e(r,e,t){let i=zs.relative(zs.dirname(e),r),n=t.prog&&t.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=zs.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=t.args||"",c=KL(t.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${t.prog}$exe"`,i=a):(s=a,l="",i="");let f=t.progArgs?`${t.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${t.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return t.nodePath&&(h+=` else { - $env:NODE_PATH="${g}" -}`),o?h+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${f}$args - } else { - & ${o} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args - } else { - & ${s} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:h+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args -} else { - & ${s} ${l} ${i} ${f}$args -} -${t.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,h}function D8e(r,e){return e.fs_.chmod(r,493)}function KL(r){if(!r)return{win32:"",posix:""};let e=typeof r=="string"?r.split(zs.delimiter):Array.from(r),t={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}qAe.exports=ML});var eT=w((RSt,hle)=>{hle.exports=require("stream")});var mle=w((FSt,ple)=>{"use strict";function dle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function Z8e(r){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=t+i.data;return n}},{key:"concat",value:function(t){if(this.length===0)return lb.alloc(0);for(var i=lb.allocUnsafe(t>>>0),n=this.head,s=0;n;)nze(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(t,i){var n;return to.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(t){var i=lb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:ize,value:function(t,i){return tT(this,Z8e({},i,{depth:0,customInspect:!1}))}}]),r}()});var iT=w((NSt,Ele)=>{"use strict";function sze(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(rT,this,r)):process.nextTick(rT,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(cb,t):(t._writableState.errorEmitted=!0,process.nextTick(Ile,t,s)):process.nextTick(Ile,t,s):e?(process.nextTick(cb,t),e(s)):process.nextTick(cb,t)}),this)}function Ile(r,e){rT(r,e),cb(r)}function cb(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit("close")}function oze(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function rT(r,e){r.emit("error",e)}function aze(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit("error",e)}Ele.exports={destroy:sze,undestroy:oze,errorOrDestroy:aze}});var Ul=w((LSt,yle)=>{"use strict";var wle={};function _s(r,e,t){t||(t=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,wle[r]=n}function Ble(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(", ")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function Aze(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function lze(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function cze(r,e,t){return typeof t!="number"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}_s("ERR_INVALID_OPT_VALUE",function(r,e){return'The value "'+e+'" is invalid for option "'+r+'"'},TypeError);_s("ERR_INVALID_ARG_TYPE",function(r,e,t){let i;typeof e=="string"&&Aze(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(lze(r," argument"))n=`The ${r} ${i} ${Ble(e,"type")}`;else{let s=cze(r,".")?"property":"argument";n=`The "${r}" ${s} ${i} ${Ble(e,"type")}`}return n+=`. Received type ${typeof t}`,n},TypeError);_s("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");_s("ERR_METHOD_NOT_IMPLEMENTED",function(r){return"The "+r+" method is not implemented"});_s("ERR_STREAM_PREMATURE_CLOSE","Premature close");_s("ERR_STREAM_DESTROYED",function(r){return"Cannot call "+r+" after a stream was destroyed"});_s("ERR_MULTIPLE_CALLBACK","Callback called multiple times");_s("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");_s("ERR_STREAM_WRITE_AFTER_END","write after end");_s("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);_s("ERR_UNKNOWN_ENCODING",function(r){return"Unknown encoding: "+r},TypeError);_s("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");yle.exports.codes=wle});var nT=w((TSt,ble)=>{"use strict";var uze=Ul().codes.ERR_INVALID_OPT_VALUE;function gze(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function fze(r,e,t,i){var n=gze(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:"highWaterMark";throw new uze(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}ble.exports={getHighWaterMark:fze}});var Qle=w((OSt,sT)=>{typeof Object.create=="function"?sT.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:sT.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Hl=w((MSt,oT)=>{try{if(aT=require("util"),typeof aT.inherits!="function")throw"";oT.exports=aT.inherits}catch(r){oT.exports=Qle()}var aT});var vle=w((KSt,Sle)=>{Sle.exports=require("util").deprecate});var cT=w((USt,xle)=>{"use strict";xle.exports=Gr;function kle(r){var e=this;this.next=null,this.entry=null,this.finish=function(){hze(e,r)}}var ch;Gr.WritableState=Gm;var pze={deprecate:vle()},Ple=eT(),ub=require("buffer").Buffer,dze=global.Uint8Array||function(){};function Cze(r){return ub.from(r)}function mze(r){return ub.isBuffer(r)||r instanceof dze}var AT=iT(),Eze=nT(),Ize=Eze.getHighWaterMark,jl=Ul().codes,yze=jl.ERR_INVALID_ARG_TYPE,wze=jl.ERR_METHOD_NOT_IMPLEMENTED,Bze=jl.ERR_MULTIPLE_CALLBACK,bze=jl.ERR_STREAM_CANNOT_PIPE,Qze=jl.ERR_STREAM_DESTROYED,Sze=jl.ERR_STREAM_NULL_VALUES,vze=jl.ERR_STREAM_WRITE_AFTER_END,xze=jl.ERR_UNKNOWN_ENCODING,uh=AT.errorOrDestroy;Hl()(Gr,Ple);function kze(){}function Gm(r,e,t){ch=ch||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof ch),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=Ize(this,r,"writableHighWaterMark",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){Pze(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new kle(this)}Gm.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(Gm.prototype,"buffer",{get:pze.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(r){}})();var gb;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(gb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Gr,Symbol.hasInstance,{value:function(e){return gb.call(this,e)?!0:this!==Gr?!1:e&&e._writableState instanceof Gm}})):gb=function(e){return e instanceof this};function Gr(r){ch=ch||ku();var e=this instanceof ch;if(!e&&!gb.call(Gr,this))return new Gr(r);this._writableState=new Gm(r,this,e),this.writable=!0,r&&(typeof r.write=="function"&&(this._write=r.write),typeof r.writev=="function"&&(this._writev=r.writev),typeof r.destroy=="function"&&(this._destroy=r.destroy),typeof r.final=="function"&&(this._final=r.final)),Ple.call(this)}Gr.prototype.pipe=function(){uh(this,new bze)};function Dze(r,e){var t=new vze;uh(r,t),process.nextTick(e,t)}function Rze(r,e,t,i){var n;return t===null?n=new Sze:typeof t!="string"&&!e.objectMode&&(n=new yze("chunk",["string","Buffer"],t)),n?(uh(r,n),process.nextTick(i,n),!1):!0}Gr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&mze(r);return s&&!ub.isBuffer(r)&&(r=Cze(r)),typeof e=="function"&&(t=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof t!="function"&&(t=kze),i.ending?Dze(this,t):(s||Rze(this,i,r,t))&&(i.pendingcb++,n=Fze(this,i,s,r,e,t)),n};Gr.prototype.cork=function(){this._writableState.corked++};Gr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&Dle(this,r))};Gr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new xze(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Gr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Nze(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e=="string"&&(e=ub.from(e,t)),e}Object.defineProperty(Gr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Fze(r,e,t,i,n,s){if(!t){var o=Nze(e,i,n);i!==o&&(t=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var Hze=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};Nle.exports=Ea;var Lle=uT(),gT=cT();Hl()(Ea,Lle);for(fT=Hze(gT.prototype),fb=0;fb{var pb=require("buffer"),vA=pb.Buffer;function Ole(r,e){for(var t in r)e[t]=r[t]}vA.from&&vA.alloc&&vA.allocUnsafe&&vA.allocUnsafeSlow?Tle.exports=pb:(Ole(pb,hT),hT.Buffer=gh);function gh(r,e,t){return vA(r,e,t)}Ole(vA,gh);gh.from=function(r,e,t){if(typeof r=="number")throw new TypeError("Argument must not be a number");return vA(r,e,t)};gh.alloc=function(r,e,t){if(typeof r!="number")throw new TypeError("Argument must be a number");var i=vA(r);return e!==void 0?typeof t=="string"?i.fill(e,t):i.fill(e):i.fill(0),i};gh.allocUnsafe=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return vA(r)};gh.allocUnsafeSlow=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return pb.SlowBuffer(r)}});var CT=w(Kle=>{"use strict";var pT=Mle().Buffer,Ule=pT.isEncoding||function(r){switch(r=""+r,r&&r.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Yze(r){if(!r)return"utf8";for(var e;;)switch(r){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return r;default:if(e)return;r=(""+r).toLowerCase(),e=!0}}function qze(r){var e=Yze(r);if(typeof e!="string"&&(pT.isEncoding===Ule||!Ule(r)))throw new Error("Unknown encoding: "+r);return e||r}Kle.StringDecoder=qm;function qm(r){this.encoding=qze(r);var e;switch(this.encoding){case"utf16le":this.text=Wze,this.end=zze,e=4;break;case"utf8":this.fillLast=Jze,e=4;break;case"base64":this.text=_ze,this.end=Vze,e=3;break;default:this.write=Xze,this.end=Zze;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=pT.allocUnsafe(e)}qm.prototype.write=function(r){if(r.length===0)return"";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return"";t=this.lastNeed,this.lastNeed=0}else t=0;return t>5==6?2:r>>4==14?3:r>>3==30?4:r>>6==2?-1:-2}function t5e(r,e,t){var i=e.length-1;if(i=0?(n>0&&(r.lastNeed=n-1),n):--i=0?(n>0&&(r.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function r5e(r,e,t){if((e[0]&192)!=128)return r.lastNeed=0,"\uFFFD";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return r.lastNeed=1,"\uFFFD";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return r.lastNeed=2,"\uFFFD"}}function Jze(r){var e=this.lastTotal-this.lastNeed,t=r5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function e5e(r,e){var t=t5e(this,r,e);if(!this.lastNeed)return r.toString("utf8",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString("utf8",e,i)}function $ze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+"\uFFFD":e}function Wze(r,e){if((r.length-e)%2==0){var t=r.toString("utf16le",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString("utf16le",e,r.length-1)}function zze(r){var e=r&&r.length?this.write(r):"";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,t)}return e}function _ze(r,e){var t=(r.length-e)%3;return t===0?r.toString("base64",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString("base64",e,r.length-t))}function Vze(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Xze(r){return r.toString(this.encoding)}function Zze(r){return r&&r.length?this.write(r):""}});var db=w((GSt,Hle)=>{"use strict";var jle=Ul().codes.ERR_STREAM_PREMATURE_CLOSE;function i5e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n{"use strict";var Cb;function Gl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var o5e=db(),Yl=Symbol("lastResolve"),Pu=Symbol("lastReject"),Jm=Symbol("error"),mb=Symbol("ended"),Du=Symbol("lastPromise"),mT=Symbol("handlePromise"),Ru=Symbol("stream");function ql(r,e){return{value:r,done:e}}function a5e(r){var e=r[Yl];if(e!==null){var t=r[Ru].read();t!==null&&(r[Du]=null,r[Yl]=null,r[Pu]=null,e(ql(t,!1)))}}function A5e(r){process.nextTick(a5e,r)}function l5e(r,e){return function(t,i){r.then(function(){if(e[mb]){t(ql(void 0,!0));return}e[mT](t,i)},i)}}var c5e=Object.getPrototypeOf(function(){}),u5e=Object.setPrototypeOf((Cb={get stream(){return this[Ru]},next:function(){var e=this,t=this[Jm];if(t!==null)return Promise.reject(t);if(this[mb])return Promise.resolve(ql(void 0,!0));if(this[Ru].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[Jm]?a(e[Jm]):o(ql(void 0,!0))})});var i=this[Du],n;if(i)n=new Promise(l5e(i,this));else{var s=this[Ru].read();if(s!==null)return Promise.resolve(ql(s,!1));n=new Promise(this[mT])}return this[Du]=n,n}},Gl(Cb,Symbol.asyncIterator,function(){return this}),Gl(Cb,"return",function(){var e=this;return new Promise(function(t,i){e[Ru].destroy(null,function(n){if(n){i(n);return}t(ql(void 0,!0))})})}),Cb),c5e),g5e=function(e){var t,i=Object.create(u5e,(t={},Gl(t,Ru,{value:e,writable:!0}),Gl(t,Yl,{value:null,writable:!0}),Gl(t,Pu,{value:null,writable:!0}),Gl(t,Jm,{value:null,writable:!0}),Gl(t,mb,{value:e._readableState.endEmitted,writable:!0}),Gl(t,mT,{value:function(s,o){var a=i[Ru].read();a?(i[Du]=null,i[Yl]=null,i[Pu]=null,s(ql(a,!1))):(i[Yl]=s,i[Pu]=o)},writable:!0}),t));return i[Du]=null,o5e(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[Pu];s!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,s(n)),i[Jm]=n;return}var o=i[Yl];o!==null&&(i[Du]=null,i[Yl]=null,i[Pu]=null,o(ql(void 0,!0))),i[mb]=!0}),e.on("readable",A5e.bind(null,i)),i};Yle.exports=g5e});var _le=w((qSt,Jle)=>{"use strict";function Wle(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function f5e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){Wle(s,i,n,o,a,"next",l)}function a(l){Wle(s,i,n,o,a,"throw",l)}o(void 0)})}}function zle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function p5e(r){for(var e=1;e{"use strict";Vle.exports=Ut;var fh;Ut.ReadableState=Xle;var JSt=require("events").EventEmitter,Zle=function(e,t){return e.listeners(t).length},Wm=eT(),Eb=require("buffer").Buffer,m5e=global.Uint8Array||function(){};function E5e(r){return Eb.from(r)}function I5e(r){return Eb.isBuffer(r)||r instanceof m5e}var ET=require("util"),Pt;ET&&ET.debuglog?Pt=ET.debuglog("stream"):Pt=function(){};var y5e=mle(),IT=iT(),w5e=nT(),B5e=w5e.getHighWaterMark,Ib=Ul().codes,b5e=Ib.ERR_INVALID_ARG_TYPE,Q5e=Ib.ERR_STREAM_PUSH_AFTER_EOF,S5e=Ib.ERR_METHOD_NOT_IMPLEMENTED,v5e=Ib.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,hh,yT,wT;Hl()(Ut,Wm);var zm=IT.errorOrDestroy,BT=["error","close","destroy","pause","resume"];function x5e(r,e,t){if(typeof r.prependListener=="function")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Xle(r,e,t){fh=fh||ku(),r=r||{},typeof t!="boolean"&&(t=e instanceof fh),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=B5e(this,r,"readableHighWaterMark",t),this.buffer=new y5e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(hh||(hh=CT().StringDecoder),this.decoder=new hh(r.encoding),this.encoding=r.encoding)}function Ut(r){if(fh=fh||ku(),!(this instanceof Ut))return new Ut(r);var e=this instanceof fh;this._readableState=new Xle(r,this,e),this.readable=!0,r&&(typeof r.read=="function"&&(this._read=r.read),typeof r.destroy=="function"&&(this._destroy=r.destroy)),Wm.call(this)}Object.defineProperty(Ut.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=IT.destroy;Ut.prototype._undestroy=IT.undestroy;Ut.prototype._destroy=function(r,e){e(r)};Ut.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r=="string"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=Eb.from(r,e),e=""),i=!0),$le(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return $le(this,r,null,!0,!1)};function $le(r,e,t,i,n){Pt("readableAddChunk",e);var s=r._readableState;if(e===null)s.reading=!1,P5e(r,s);else{var o;if(n||(o=k5e(s,e)),o)zm(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==Eb.prototype&&(e=E5e(e)),i)s.endEmitted?zm(r,new v5e):bT(r,s,e,!0);else if(s.ended)zm(r,new Q5e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?bT(r,s,e,!1):QT(r,s)):bT(r,s,e,!1)}else i||(s.reading=!1,QT(r,s))}return!s.ended&&(s.length=ece?r=ece:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function tce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=D5e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(r){Pt("read",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Pt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?ST(this):yb(this),null;if(r=tce(r,e),r===0&&e.ended)return e.length===0&&ST(this),null;var i=e.needReadable;Pt("need readable",i),(e.length===0||e.length-r0?n=rce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&ST(this)),n!==null&&this.emit("data",n),n};function P5e(r,e){if(Pt("onEofChunk"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?yb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,ice(r)))}}function yb(r){var e=r._readableState;Pt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Pt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(ice,r))}function ice(r){var e=r._readableState;Pt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,vT(r)}function QT(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(R5e,r,e))}function R5e(r,e){for(;!e.reading&&!e.ended&&(e.length1&&nce(i.pipes,r)!==-1)&&!c&&(Pt("false write response, pause",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Pt("onerror",y),m(),r.removeListener("error",f),Zle(r,"error")===0&&zm(r,y)}x5e(r,"error",f);function h(){r.removeListener("finish",p),m()}r.once("close",h);function p(){Pt("onfinish"),r.removeListener("close",h),m()}r.once("finish",p);function m(){Pt("unpipe"),t.unpipe(r)}return r.emit("pipe",t),i.flowing||(Pt("pipe resume"),t.resume()),r};function F5e(r){return function(){var t=r._readableState;Pt("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Zle(r,"data")&&(t.flowing=!0,vT(r))}}Ut.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit("unpipe",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):r==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Pt("on readable",i.length,i.reading),i.length?yb(this):i.reading||process.nextTick(N5e,this)),t};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(r,e){var t=Wm.prototype.removeListener.call(this,r,e);return r==="readable"&&process.nextTick(sce,this),t};Ut.prototype.removeAllListeners=function(r){var e=Wm.prototype.removeAllListeners.apply(this,arguments);return(r==="readable"||r===void 0)&&process.nextTick(sce,this),e};function sce(r){var e=r._readableState;e.readableListening=r.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount("data")>0&&r.resume()}function N5e(r){Pt("readable nexttick read 0"),r.read(0)}Ut.prototype.resume=function(){var r=this._readableState;return r.flowing||(Pt("resume"),r.flowing=!r.readableListening,L5e(this,r)),r.paused=!1,this};function L5e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(T5e,r,e))}function T5e(r,e){Pt("resume",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit("resume"),vT(r),e.flowing&&!e.reading&&r.read(0)}Ut.prototype.pause=function(){return Pt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Pt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function vT(r){var e=r._readableState;for(Pt("flow",e.flowing);e.flowing&&r.read()!==null;);}Ut.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on("end",function(){if(Pt("wrapped end"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on("data",function(o){if(Pt("wrapped data"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]=="function"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?t=e.buffer.join(""):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function ST(r){var e=r._readableState;Pt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(O5e,e,r))}function O5e(r,e){if(Pt("endReadableNT",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit("end"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol=="function"&&(Ut.from=function(r,e){return wT===void 0&&(wT=_le()),wT(Ut,r,e)});function nce(r,e){for(var t=0,i=r.length;t{"use strict";oce.exports=xA;var wb=Ul().codes,M5e=wb.ERR_METHOD_NOT_IMPLEMENTED,K5e=wb.ERR_MULTIPLE_CALLBACK,U5e=wb.ERR_TRANSFORM_ALREADY_TRANSFORMING,H5e=wb.ERR_TRANSFORM_WITH_LENGTH_0,Bb=ku();Hl()(xA,Bb);function j5e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit("error",new K5e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";Ace.exports=_m;var lce=xT();Hl()(_m,lce);function _m(r){if(!(this instanceof _m))return new _m(r);lce.call(this,r)}_m.prototype._transform=function(r,e,t){t(null,r)}});var pce=w((VSt,uce)=>{"use strict";var kT;function Y5e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var gce=Ul().codes,q5e=gce.ERR_MISSING_ARGS,J5e=gce.ERR_STREAM_DESTROYED;function fce(r){if(r)throw r}function W5e(r){return r.setHeader&&typeof r.abort=="function"}function z5e(r,e,t,i){i=Y5e(i);var n=!1;r.on("close",function(){n=!0}),kT===void 0&&(kT=db()),kT(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,W5e(r))return r.abort();if(typeof r.destroy=="function")return r.destroy();i(o||new J5e("pipe"))}}}function hce(r){r()}function _5e(r,e){return r.pipe(e)}function V5e(r){return!r.length||typeof r[r.length-1]!="function"?fce:r.pop()}function X5e(){for(var r=arguments.length,e=new Array(r),t=0;t0;return z5e(o,l,c,function(u){n||(n=u),u&&s.forEach(hce),!l&&(s.forEach(hce),i(n))})});return e.reduce(_5e)}uce.exports=X5e});var ph=w((Vs,Vm)=>{var Xm=require("stream");process.env.READABLE_STREAM==="disable"&&Xm?(Vm.exports=Xm.Readable,Object.assign(Vm.exports,Xm),Vm.exports.Stream=Xm):(Vs=Vm.exports=uT(),Vs.Stream=Xm||Vs,Vs.Readable=Vs,Vs.Writable=cT(),Vs.Duplex=ku(),Vs.Transform=xT(),Vs.PassThrough=cce(),Vs.finished=db(),Vs.pipeline=pce())});var mce=w((XSt,dce)=>{"use strict";var{Buffer:So}=require("buffer"),Cce=Symbol.for("BufferList");function mr(r){if(!(this instanceof mr))return new mr(r);mr._init.call(this,r)}mr._init=function(e){Object.defineProperty(this,Cce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};mr.prototype._new=function(e){return new mr(e)};mr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;ithis.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};mr.prototype.slice=function(e,t){return typeof e=="number"&&e<0&&(e+=this.length),typeof t=="number"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};mr.prototype.copy=function(e,t,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||So.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:So.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};mr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!="number"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};mr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};mr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};mr.prototype.duplicate=function(){let e=this._new();for(let t=0;tthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};mr.prototype._match=function(r,e){if(this.length-r{"use strict";var PT=ph().Duplex,Z5e=Hl(),Zm=mce();function Zi(r){if(!(this instanceof Zi))return new Zi(r);if(typeof r=="function"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),r=null}Zm._init.call(this,r),PT.call(this)}Z5e(Zi,PT);Object.assign(Zi.prototype,Zm.prototype);Zi.prototype._new=function(e){return new Zi(e)};Zi.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i=="function"&&i()};Zi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Zi.prototype.end=function(e){PT.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Zi.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Zi.prototype._isBufferList=function(e){return e instanceof Zi||e instanceof Zm||Zi.isBufferList(e)};Zi.isBufferList=Zm.isBufferList;bb.exports=Zi;bb.exports.BufferListStream=Zi;bb.exports.BufferList=Zm});var FT=w(dh=>{var $5e=Buffer.alloc,e9e="0000000000000000000",t9e="7777777777777777777",Ice="0".charCodeAt(0),yce=Buffer.from("ustar\0","binary"),r9e=Buffer.from("00","binary"),i9e=Buffer.from("ustar ","binary"),n9e=Buffer.from(" \0","binary"),s9e=parseInt("7777",8),$m=257,DT=263,o9e=function(r,e,t){return typeof r!="number"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},a9e=function(r){switch(r){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},A9e=function(r){switch(r){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},wce=function(r,e,t,i){for(;te?t9e.slice(0,e)+" ":e9e.slice(0,e-r.length)+r+" "};function l9e(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i=Math.pow(10,t)&&t++,e+t+r};dh.decodeLongPath=function(r,e){return Ch(r,0,r.length,e)};dh.encodePax=function(r){var e="";r.name&&(e+=RT(" path="+r.name+` -`)),r.linkname&&(e+=RT(" linkpath="+r.linkname+` -`));var t=r.pax;if(t)for(var i in t)e+=RT(" "+i+"="+t[i]+` -`);return Buffer.from(e)};dh.decodePax=function(r){for(var e={};r.length;){for(var t=0;t100;){var n=t.indexOf("/");if(n===-1)return null;i+=i?"/"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Jl(r.mode&s9e,6),100),e.write(Jl(r.uid,6),108),e.write(Jl(r.gid,6),116),e.write(Jl(r.size,11),124),e.write(Jl(r.mtime.getTime()/1e3|0,11),136),e[156]=Ice+A9e(r.type),r.linkname&&e.write(r.linkname,157),yce.copy(e,$m),r9e.copy(e,DT),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Jl(r.devmajor||0,6),329),e.write(Jl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Jl(Bce(e),6),148),e)};dh.decode=function(r,e,t){var i=r[156]===0?0:r[156]-Ice,n=Ch(r,0,100,e),s=Wl(r,100,8),o=Wl(r,108,8),a=Wl(r,116,8),l=Wl(r,124,12),c=Wl(r,136,12),u=a9e(i),g=r[157]===0?null:Ch(r,157,100,e),f=Ch(r,265,32),h=Ch(r,297,32),p=Wl(r,329,8),m=Wl(r,337,8),y=Bce(r);if(y===8*32)return null;if(y!==Wl(r,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(yce.compare(r,$m,$m+6)===0)r[345]&&(n=Ch(r,345,155,e)+"/"+n);else if(!(i9e.compare(r,$m,$m+6)===0&&n9e.compare(r,DT,DT+2)===0)){if(!t)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:m}}});var Pce=w((evt,bce)=>{var Qce=require("util"),c9e=Ece(),eE=FT(),Sce=ph().Writable,vce=ph().PassThrough,xce=function(){},kce=function(r){return r&=511,r&&512-r},u9e=function(r,e){var t=new Qb(r,e);return t.end(),t},g9e=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},Qb=function(r,e){this._parent=r,this.offset=e,vce.call(this,{autoDestroy:!1})};Qce.inherits(Qb,vce);Qb.prototype.destroy=function(r){this._parent.destroy(r)};var kA=function(r){if(!(this instanceof kA))return new kA(r);Sce.call(this,r),r=r||{},this._offset=0,this._buffer=c9e(),this._missing=0,this._partial=!1,this._onparse=xce,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=kce(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(kce(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=eE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=eE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=eE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=eE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit("error",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=g9e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,u9e(e,f),n);return}e._stream=new Qb(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};Qce.inherits(kA,Sce);kA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.emit("close"))};kA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};kA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=xce,this._overflow?this._write(this._overflow,void 0,r):r()}};kA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.lengths&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};kA.prototype._final=function(r){if(this._partial)return this.destroy(new Error("Unexpected end of data"));r()};bce.exports=kA});var Rce=w((tvt,Dce)=>{Dce.exports=require("fs").constants||require("constants")});var Oce=w((rvt,Fce)=>{var mh=Rce(),Nce=Mk(),Sb=Hl(),f9e=Buffer.alloc,Lce=ph().Readable,Eh=ph().Writable,h9e=require("string_decoder").StringDecoder,vb=FT(),p9e=parseInt("755",8),d9e=parseInt("644",8),Tce=f9e(1024),NT=function(){},LT=function(r,e){e&=511,e&&r.push(Tce.slice(0,512-e))};function C9e(r){switch(r&mh.S_IFMT){case mh.S_IFBLK:return"block-device";case mh.S_IFCHR:return"character-device";case mh.S_IFDIR:return"directory";case mh.S_IFIFO:return"fifo";case mh.S_IFLNK:return"symlink"}return"file"}var xb=function(r){Eh.call(this),this.written=0,this._to=r,this._destroyed=!1};Sb(xb,Eh);xb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};xb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var kb=function(){Eh.call(this),this.linkname="",this._decoder=new h9e("utf-8"),this._destroyed=!1};Sb(kb,Eh);kb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};kb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var tE=function(){Eh.call(this),this._destroyed=!1};Sb(tE,Eh);tE.prototype._write=function(r,e,t){t(new Error("No body allowed for this entry"))};tE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Ia=function(r){if(!(this instanceof Ia))return new Ia(r);Lce.call(this,r),this._drain=NT,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Sb(Ia,Lce);Ia.prototype.entry=function(r,e,t){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(t=e,e=null),t||(t=NT);var i=this;if((!r.size||r.type==="symlink")&&(r.size=0),r.type||(r.type=C9e(r.mode)),r.mode||(r.mode=r.type==="directory"?p9e:d9e),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return LT(i,r.size),n?process.nextTick(t):this._drain=t,new tE}if(r.type==="symlink"&&!r.linkname){var s=new kb;return Nce(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!=="file"&&r.type!=="contiguous-file")return process.nextTick(t),new tE;var o=new xb(this);return this._stream=o,Nce(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error("size mismatch"));LT(i,r.size),i._finalizing&&i.finalize(),t()}),o}};Ia.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Tce),this.push(null))};Ia.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit("error",r),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Ia.prototype._encode=function(r){if(!r.pax){var e=vb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};Ia.prototype._encodePax=function(r){var e=vb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:"PaxHeader",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:"pax-header",linkname:r.linkname&&"PaxHeader",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(vb.encode(t)),this.push(e),LT(this,e.length),t.size=r.size,t.type=r.type,this.push(vb.encode(t))};Ia.prototype._read=function(r){var e=this._drain;this._drain=NT,e()};Fce.exports=Ia});var Mce=w(TT=>{TT.extract=Pce();TT.pack=Oce()});var Xce=w((Qvt,Wce)=>{"use strict";var Ih=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=_ce(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return jT(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):P9e(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Ih(this.__specs,this.__opts,_ce(this.__providers).concat(e)),zce)}};try{let r=require("util");Ih.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+" "+r.inspect(this.toJSON(),t)}}catch(r){}function D9e(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:"EBADKEY"})}function jT(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))D9e(e);else{i||(i={});let n;for(let s of r.__providers){if(n=Vce(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=Vce(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(r):i.default:n}}function Vce(r,e){let t;return e.__isFiggyPudding?t=jT(e,r,!1):typeof e.get=="function"?t=e.get(r):t=e[r],t}var zce={has(r,e){return e in r.__specs&&jT(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Ih.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e=="symbol"||e.slice(0,2)==="__")return r[e]=t,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};Wce.exports=R9e;function R9e(r,e){function t(...i){return new Proxy(new Ih(r,e,i),zce)}return t}function _ce(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function P9e(r){return Object.keys(r).map(e=>[e,r[e]])}});var eue=w((Svt,ya)=>{"use strict";var iE=require("crypto"),F9e=Xce(),N9e=require("stream").Transform,Zce=["sha256","sha384","sha512"],L9e=/^[a-z0-9+/]+(?:=?=?)$/i,T9e=/^([^-]+)-([^?]+)([?\S*]*)$/,O9e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,M9e=/^[\x21-\x7E]+$/,Cn=F9e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>K9e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Fu=class{get isHash(){return!0}constructor(e,t){t=Cn(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?O9e:T9e);if(!n||i&&!Zce.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Cn(e),e.strict&&!(Zce.some(i=>i===this.algorithm)&&this.digest.match(L9e)&&(this.options||[]).every(i=>i.match(M9e))))return"";let t=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${t}`}},yh=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Cn(e);let t=e.sep||" ";return e.strict&&(t=t.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Fu.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=Cn(t);let i=typeof e=="string"?e:nE(e,t);return wa(`${this.toString(t)} ${i}`,t)}hexDigest(){return wa(this,{single:!0}).hexDigest()}match(e,t){t=Cn(t);let i=wa(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Cn(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ya.exports.parse=wa;function wa(r,e){if(e=Cn(e),typeof r=="string")return GT(r,e);if(r.algorithm&&r.digest){let t=new yh;return t[r.algorithm]=[r],GT(nE(t,e),e)}else return GT(nE(r,e),e)}function GT(r,e){return e.single?new Fu(r,e):r.trim().split(/\s+/).reduce((t,i)=>{let n=new Fu(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new yh)}ya.exports.stringify=nE;function nE(r,e){return e=Cn(e),r.algorithm&&r.digest?Fu.prototype.toString.call(r,e):typeof r=="string"?nE(wa(r,e),e):yh.prototype.toString.call(r,e)}ya.exports.fromHex=U9e;function U9e(r,e,t){t=Cn(t);let i=t.options&&t.options.length?`?${t.options.join("?")}`:"";return wa(`${e}-${Buffer.from(r,"hex").toString("base64")}${i}`,t)}ya.exports.fromData=H9e;function H9e(r,e){e=Cn(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return t.reduce((n,s)=>{let o=iE.createHash(s).update(r).digest("base64"),a=new Fu(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new yh)}ya.exports.fromStream=j9e;function j9e(r,e){e=Cn(e);let t=e.Promise||Promise,i=YT(e);return new t((n,s)=>{r.pipe(i),r.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}ya.exports.checkData=G9e;function G9e(r,e,t){if(t=Cn(t),e=wa(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(t),n=iE.createHash(i).update(r).digest("base64"),s=wa({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size=="number"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${r.length}`);throw a.code="EBADSIZE",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ya.exports.checkStream=Y9e;function Y9e(r,e,t){t=Cn(t);let i=t.Promise||Promise,n=YT(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}ya.exports.integrityStream=YT;function YT(r){r=Cn(r);let e=r.integrity&&wa(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(iE.createHash),a=0,l=new N9e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=r.options&&r.options.length?`?${r.options.join("?")}`:"",u=wa(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),r),g=t&&u.match(e,r);if(typeof r.size=="number"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=r.size,f.sri=e,l.emit("error",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}ya.exports.create=q9e;function q9e(r){r=Cn(r);let e=r.algorithms,t=r.options.length?`?${r.options.join("?")}`:"",i=e.map(iE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Fu(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new yh)}}}var J9e=new Set(iE.getHashes()),$ce=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(r=>J9e.has(r));function K9e(r,e){return $ce.indexOf(r.toLowerCase())>=$ce.indexOf(e.toLowerCase())?r:e}});var EC={};ft(EC,{BuildType:()=>cs,Cache:()=>Nt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>fk,DEFAULT_RC_FILENAME:()=>gk,FormatType:()=>Ri,InstallMode:()=>Ci,LightReport:()=>pA,LinkType:()=>Qt,Manifest:()=>At,MessageName:()=>X,MultiFetcher:()=>yd,PackageExtensionStatus:()=>qi,PackageExtensionType:()=>wi,Project:()=>ze,ProjectLookup:()=>ul,Report:()=>Ji,ReportError:()=>ct,SettingsType:()=>Ie,StreamReport:()=>Je,TAG_REGEXP:()=>zg,TelemetryManager:()=>mC,ThrowReport:()=>di,VirtualFetcher:()=>Bd,Workspace:()=>CC,WorkspaceFetcher:()=>bd,WorkspaceResolver:()=>oi,YarnVersion:()=>Ur,execUtils:()=>Nr,folderUtils:()=>sk,formatUtils:()=>ae,hashUtils:()=>Dn,httpUtils:()=>ir,miscUtils:()=>Se,nodeUtils:()=>Vg,parseMessageName:()=>II,scriptUtils:()=>Zt,semverUtils:()=>Wt,stringifyMessageName:()=>_A,structUtils:()=>P,tgzUtils:()=>Bi,treeUtils:()=>ls});var Nr={};ft(Nr,{EndStrategy:()=>ss,ExecError:()=>Ik,PipeError:()=>ww,execvp:()=>pve,pipevp:()=>ra});var Zh={};ft(Zh,{AliasFS:()=>Na,CwdFS:()=>_t,DEFAULT_COMPRESSION_LEVEL:()=>lc,FakeFS:()=>YA,Filename:()=>kt,JailFS:()=>La,LazyFS:()=>_h,LinkStrategy:()=>Gh,NoFS:()=>jE,NodeFS:()=>ar,PortablePath:()=>Me,PosixFS:()=>Vh,ProxiedFS:()=>Qi,VirtualFS:()=>Wr,ZipFS:()=>li,ZipOpenFS:()=>Is,constants:()=>Rr,extendFs:()=>WE,normalizeLineEndings:()=>sc,npath:()=>H,opendir:()=>KE,patchFs:()=>pQ,ppath:()=>k,statUtils:()=>rQ,toFilename:()=>Jr,xfs:()=>K});var Rr={};ft(Rr,{SAFE_TIME:()=>tQ,S_IFDIR:()=>Da,S_IFLNK:()=>Fa,S_IFMT:()=>_n,S_IFREG:()=>Ra});var _n=61440,Da=16384,Ra=32768,Fa=40960,tQ=456789e3;var rQ={};ft(rQ,{BigIntStatsEntry:()=>Uh,DEFAULT_MODE:()=>Kh,DirEntry:()=>KO,StatEntry:()=>jA,areStatsEqual:()=>nQ,clearStats:()=>RE,convertToBigIntStats:()=>FE,makeDefaultStats:()=>Hh,makeEmptyStats:()=>fge});var iQ=ge(require("util"));var Kh=Ra|420,KO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},jA=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Kh;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&_n)===Da}isFIFO(){return!1}isFile(){return(this.mode&_n)===Ra}isSocket(){return!1}isSymbolicLink(){return(this.mode&_n)===Fa}},Uh=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Kh);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(_n))===BigInt(Da)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(_n))===BigInt(Ra)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(_n))===BigInt(Fa)}};function Hh(){return new jA}function fge(){return RE(Hh())}function RE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t=="number"?r[e]=0:typeof t=="bigint"?r[e]=BigInt(0):iQ.types.isDate(t)&&(r[e]=new Date(0))}return r}function FE(r){let e=new Uh;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i=="number"?e[t]=BigInt(i):iQ.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nQ(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var LE=ge(require("fs"));var jh=ge(require("path")),UO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(UO||(UO={}));var Me={root:"/",dot:"."},kt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},H=Object.create(jh.default),k=Object.create(jh.default.posix);H.cwd=()=>process.cwd();k.cwd=()=>sQ(process.cwd());k.resolve=(...r)=>r.length>0&&k.isAbsolute(r[0])?jh.default.posix.resolve(...r):jh.default.posix.resolve(k.cwd(),...r);var HO=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?".":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};H.fromPortablePath=jO;H.toPortablePath=sQ;H.contains=(r,e)=>HO(H,r,e);k.contains=(r,e)=>HO(k,r,e);var hge=/^([a-zA-Z]:.*)$/,pge=/^\/\/(\.\/)?(.*)$/,dge=/^\/([a-zA-Z]:.*)$/,Cge=/^\/unc\/(\.dot\/)?(.*)$/;function jO(r){if(process.platform!=="win32")return r;let e,t;if(e=r.match(dge))r=e[1];else if(t=r.match(Cge))r=`\\\\${t[1]?".\\":""}${t[2]}`;else return r;return r.replace(/\//g,"\\")}function sQ(r){if(process.platform!=="win32")return r;r=r.replace(/\\/g,"/");let e,t;return(e=r.match(hge))?r=`/${e[1]}`:(t=r.match(pge))&&(r=`/unc/${t[1]?".dot/":""}${t[2]}`),r}function NE(r,e){return r===H?jO(e):sQ(e)}function Jr(r){if(H.parse(r).dir!==""||k.parse(r).dir!=="")throw new Error(`Invalid filename: "${r}"`);return r}var TE=new Date(tQ*1e3),Gh;(function(t){t.Allow="allow",t.ReadOnly="readOnly"})(Gh||(Gh={}));async function GO(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:TE,mtime:TE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise=="function"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await oQ(a,l,g,r,s,t,o,te(N({},n),{didParentExist:!0}));for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function oQ(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await mge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:TE,mtime:TE}:c,f;switch(!0){case c.isDirectory():f=await Ege(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Ige(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await yge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function mge(r,e){try{return await r.lstatPromise(e)}catch(t){return null}}async function Ege(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?te(N({},c),{didParentExist:!1}):c;if(c.stableSort)for(let h of g.sort())await oQ(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await oQ(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var aQ=new WeakMap;function AQ(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===Gh.ReadOnly&&(i.mode&=~146,await r.chmodPromise(e,i.mode))}}function wge(r,e,t,i,n){let s=aQ.get(r);return typeof s=="undefined"?async()=>{try{await r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE),aQ.set(r,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")aQ.set(r,!1),await AQ(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,LE.default.constants.COPYFILE_FICLONE_FORCE):AQ(r,e,t,i,n)}async function Ige(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?wge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,LE.default.constants.COPYFILE_FICLONE):u!==null?AQ(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function yge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(NE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function Es(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function OE(r){return Es("EBUSY",r)}function Yh(r,e){return Es("ENOSYS",`${r}, ${e}`)}function GA(r){return Es("EINVAL",`invalid argument, ${r}`)}function Ai(r){return Es("EBADF",`bad file descriptor, ${r}`)}function io(r){return Es("ENOENT",`no such file or directory, ${r}`)}function Ro(r){return Es("ENOTDIR",`not a directory, ${r}`)}function qh(r){return Es("EISDIR",`illegal operation on a directory, ${r}`)}function ME(r){return Es("EEXIST",`file already exists, ${r}`)}function In(r){return Es("EROFS",`read-only filesystem, ${r}`)}function YO(r){return Es("ENOTEMPTY",`directory not empty, ${r}`)}function qO(r){return Es("EOPNOTSUPP",`operation not supported, ${r}`)}function JO(){return Es("ERR_DIR_CLOSED","Directory handle was closed")}var lQ=class extends Error{constructor(e,t){super(e);this.name="Libzip Error",this.code=t}};var WO=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw JO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e!="undefined"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function KE(r,e,t,i){let n=()=>{let s=t.shift();return typeof s=="undefined"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new WO(e,n,i)}var zO=ge(require("os"));var YA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!=="EBUSY"&&o.code!=="ENOTEMPTY")throw o;ssetTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code==="EEXIST")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await GO(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(NE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,"0")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch(s){}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s="";try{s=await this.readFilePromise(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch(s){}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s="";try{s=this.readFileSync(e,"utf8")}catch(a){}let o=i?sc(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code==="EXDEV")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code==="EXDEV")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let t=await this.readFilePromise(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,"utf8");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)} -`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)} -`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},oc=class extends YA{constructor(){super(k)}};function Bge(r){let e=r.match(/\r?\n/g);if(e===null)return zO.EOL;let t=e.filter(n=>n===`\r -`).length,i=e.length-t;return t>i?`\r -`:` -`}function sc(r,e){return e.replace(/\r?\n/g,Bge(r))}var zu=ge(require("fs")),cQ=ge(require("stream")),ZO=ge(require("util")),uQ=ge(require("zlib"));var _O=ge(require("fs"));var ar=class extends oc{constructor(e=_O.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Me.root}resolve(e){return k.resolve(e)}async openPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.open(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}openSync(e,t,i){return this.realFs.openSync(H.fromPortablePath(e),t,i)}async opendirPromise(e,t){return await new Promise((i,n)=>{typeof t!="undefined"?this.realFs.opendir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.opendir(H.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,t){let i=typeof t!="undefined"?this.realFs.opendirSync(H.fromPortablePath(e),t):this.realFs.opendirSync(H.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,t,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,t,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,t,i,n,s){return this.realFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return await new Promise((o,a)=>typeof t=="string"?this.realFs.write(e,t,i,this.makeCallback(o,a)):this.realFs.write(e,t,i,n,s,this.makeCallback(o,a)))}writeSync(e,t,i,n,s){return typeof t=="string"?this.realFs.writeSync(e,t,i):this.realFs.writeSync(e,t,i,n,s)}async closePromise(e){await new Promise((t,i)=>{this.realFs.close(e,this.makeCallback(t,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createReadStream(i,t)}createWriteStream(e,t){let i=e!==null?H.fromPortablePath(e):e;return this.realFs.createWriteStream(i,t)}async realpathPromise(e){return await new Promise((t,i)=>{this.realFs.realpath(H.fromPortablePath(e),{},this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}realpathSync(e){return H.toPortablePath(this.realFs.realpathSync(H.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(t=>{this.realFs.exists(H.fromPortablePath(e),t)})}accessSync(e,t){return this.realFs.accessSync(H.fromPortablePath(e),t)}async accessPromise(e,t){return await new Promise((i,n)=>{this.realFs.access(H.fromPortablePath(e),t,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(H.fromPortablePath(e))}async statPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.stat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.stat(H.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,t){return t?this.realFs.statSync(H.fromPortablePath(e),t):this.realFs.statSync(H.fromPortablePath(e))}async fstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.fstat(e,t,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,t){return t?this.realFs.fstatSync(e,t):this.realFs.fstatSync(e)}async lstatPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.lstat(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.lstat(H.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,t){return t?this.realFs.lstatSync(H.fromPortablePath(e),t):this.realFs.lstatSync(H.fromPortablePath(e))}async fchmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.fchmod(e,t,this.makeCallback(i,n))})}fchmodSync(e,t){return this.realFs.fchmodSync(e,t)}async chmodPromise(e,t){return await new Promise((i,n)=>{this.realFs.chmod(H.fromPortablePath(e),t,this.makeCallback(i,n))})}chmodSync(e,t){return this.realFs.chmodSync(H.fromPortablePath(e),t)}async chownPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.chown(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}chownSync(e,t,i){return this.realFs.chownSync(H.fromPortablePath(e),t,i)}async renamePromise(e,t){return await new Promise((i,n)=>{this.realFs.rename(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}renameSync(e,t){return this.realFs.renameSync(H.fromPortablePath(e),H.fromPortablePath(t))}async copyFilePromise(e,t,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(H.fromPortablePath(e),H.fromPortablePath(t),i,this.makeCallback(n,s))})}copyFileSync(e,t,i=0){return this.realFs.copyFileSync(H.fromPortablePath(e),H.fromPortablePath(t),i)}async appendFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFile(o,t,i,this.makeCallback(n,s)):this.realFs.appendFile(o,t,this.makeCallback(n,s))})}appendFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,t,i):this.realFs.appendFileSync(n,t)}async writeFilePromise(e,t,i){return await new Promise((n,s)=>{let o=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFile(o,t,i,this.makeCallback(n,s)):this.realFs.writeFile(o,t,this.makeCallback(n,s))})}writeFileSync(e,t,i){let n=typeof e=="string"?H.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,t,i):this.realFs.writeFileSync(n,t)}async unlinkPromise(e){return await new Promise((t,i)=>{this.realFs.unlink(H.fromPortablePath(e),this.makeCallback(t,i))})}unlinkSync(e){return this.realFs.unlinkSync(H.fromPortablePath(e))}async utimesPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.utimes(H.fromPortablePath(e),t,i,this.makeCallback(n,s))})}utimesSync(e,t,i){this.realFs.utimesSync(H.fromPortablePath(e),t,i)}async lutimesPromiseImpl(e,t,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,H.fromPortablePath(e),t,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,t,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw Yh("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,H.fromPortablePath(e),t,i)}async mkdirPromise(e,t){return await new Promise((i,n)=>{this.realFs.mkdir(H.fromPortablePath(e),t,this.makeCallback(i,n))})}mkdirSync(e,t){return this.realFs.mkdirSync(H.fromPortablePath(e),t)}async rmdirPromise(e,t){return await new Promise((i,n)=>{t?this.realFs.rmdir(H.fromPortablePath(e),t,this.makeCallback(i,n)):this.realFs.rmdir(H.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,t){return this.realFs.rmdirSync(H.fromPortablePath(e),t)}async linkPromise(e,t){return await new Promise((i,n)=>{this.realFs.link(H.fromPortablePath(e),H.fromPortablePath(t),this.makeCallback(i,n))})}linkSync(e,t){return this.realFs.linkSync(H.fromPortablePath(e),H.fromPortablePath(t))}async symlinkPromise(e,t,i){return await new Promise((n,s)=>{this.realFs.symlink(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i,this.makeCallback(n,s))})}symlinkSync(e,t,i){return this.realFs.symlinkSync(H.fromPortablePath(e.replace(/\/+$/,"")),H.fromPortablePath(t),i)}async readFilePromise(e,t){return await new Promise((i,n)=>{let s=typeof e=="string"?H.fromPortablePath(e):e;this.realFs.readFile(s,t,this.makeCallback(i,n))})}readFileSync(e,t){let i=typeof e=="string"?H.fromPortablePath(e):e;return this.realFs.readFileSync(i,t)}async readdirPromise(e,t){return await new Promise((i,n)=>{(t==null?void 0:t.withFileTypes)?this.realFs.readdir(H.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(H.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,t){return(t==null?void 0:t.withFileTypes)?this.realFs.readdirSync(H.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(H.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((t,i)=>{this.realFs.readlink(H.fromPortablePath(e),this.makeCallback(t,i))}).then(t=>H.toPortablePath(t))}readlinkSync(e){return H.toPortablePath(this.realFs.readlinkSync(H.fromPortablePath(e)))}async truncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.truncate(H.fromPortablePath(e),t,this.makeCallback(i,n))})}truncateSync(e,t){return this.realFs.truncateSync(H.fromPortablePath(e),t)}async ftruncatePromise(e,t){return await new Promise((i,n)=>{this.realFs.ftruncate(e,t,this.makeCallback(i,n))})}ftruncateSync(e,t){return this.realFs.ftruncateSync(e,t)}watch(e,t,i){return this.realFs.watch(H.fromPortablePath(e),t,i)}watchFile(e,t,i){return this.realFs.watchFile(H.fromPortablePath(e),t,i)}unwatchFile(e,t){return this.realFs.unwatchFile(H.fromPortablePath(e),t)}makeCallback(e,t){return(i,n)=>{i?t(i):e(n)}}};var VO=ge(require("events"));var ac;(function(t){t.Change="change",t.Stop="stop"})(ac||(ac={}));var Ac;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(Ac||(Ac={}));function XO(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Jh=class extends VO.EventEmitter{constructor(e,t,{bigint:i=!1}={}){super();this.status=Ac.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=t,this.bigint=i,this.lastStats=this.stat()}static create(e,t,i){let n=new Jh(e,t,i);return n.start(),n}start(){XO(this.status,Ac.Ready),this.status=Ac.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(ac.Change,this.lastStats,this.lastStats)},3)}stop(){XO(this.status,Ac.Running),this.status=Ac.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(ac.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let t=this.bigint?new Uh:new jA;return RE(t)}}makeInterval(e){let t=setInterval(()=>{let i=this.stat(),n=this.lastStats;nQ(i,n)||(this.lastStats=i,this.emit(ac.Change,i,n))},e.interval);return e.persistent?t:t.unref()}registerChangeListener(e,t){this.addListener(ac.Change,e),this.changeListeners.set(e,this.makeInterval(t))}unregisterChangeListener(e){this.removeListener(ac.Change,e);let t=this.changeListeners.get(e);typeof t!="undefined"&&clearInterval(t),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var UE=new WeakMap;function HE(r,e,t,i){let n,s,o,a;switch(typeof t){case"function":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=UE.get(r);typeof l=="undefined"&&UE.set(r,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Jh.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Wh(r,e,t){let i=UE.get(r);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof t=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function zh(r){let e=UE.get(r);if(typeof e!="undefined")for(let t of e.keys())Wh(r,t)}var lc="mixed";function bge(r){if(typeof r=="string"&&String(+r)===r)return+r;if(Number.isFinite(r))return r<0?Date.now()/1e3:r;if(ZO.types.isDate(r))return r.getTime()/1e3;throw new Error("Invalid time")}function $O(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var li=class extends oc{constructor(e,t){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=t.libzip;let i=t;if(this.level=typeof i.level!="undefined"?i.level:lc,e!=null||(e=$O()),typeof e=="string"){let{baseFs:o=new ar}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(t.stats)this.stats=t.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Hh();else throw o}else this.stats=Hh();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),t.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(H.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Me.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(t,t+e);return Buffer.from(n)}finally{this.libzip.free(t)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw OE("archive closed, close");zh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Kh?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,$O(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return k.resolve(Me.root,e)}async openPromise(e,t,i){return this.openSync(e,t,i)}openSync(e,t,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,t){return this.opendirSync(e,t)}opendirSync(e,t={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return KE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,t,i,n,s){return this.readSync(e,t,i,n,s)}readSync(e,t,i=0,n=t.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Ai("read");let a=s===-1||s===null?o.cursor:s,l=this.readFileSync(o.p);l.copy(t,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,t,i,n,s){return typeof t=="string"?this.writeSync(e,t,s):this.writeSync(e,t,i,n,s)}writeSync(e,t,i,n,s){throw typeof this.fds.get(e)=="undefined"?Ai("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Ai("read");this.fds.delete(e)}createReadStream(e,{encoding:t}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cQ.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,t);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:t}={}){if(this.readOnly)throw In(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cQ.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),t),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let t=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`lstat '${e}'`);return t}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw OE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=k.resolve(Me.root,e);return this.entries.has(i)||this.listings.has(i)}let t;try{t=this.resolveFilename(`stat '${e}'`,e,void 0,!1)}catch(i){return!1}return t===void 0?!1:this.entries.has(t)||this.listings.has(t)}async accessPromise(e,t){return this.accessSync(e,t)}accessSync(e,t=zu.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`access '${e}'`);if(this.readOnly&&t&zu.constants.W_OK)throw In(`access '${e}'`)}async statPromise(e,t={bigint:!1}){return t.bigint?this.statSync(e,{bigint:!0}):this.statSync(e)}statSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`stat '${e}'`,e,void 0,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`stat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,t)}}async fstatPromise(e,t){return this.fstatSync(e,t)}fstatSync(e,t){let i=this.fds.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw io(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw Ro(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,t)}async lstatPromise(e,t={bigint:!1}){return t.bigint?this.lstatSync(e,{bigint:!0}):this.lstatSync(e)}lstatSync(e,t={bigint:!1,throwIfNoEntry:!0}){let i=this.resolveFilename(`lstat '${e}'`,e,!1,t.throwIfNoEntry);if(i!==void 0){if(!this.entries.has(i)&&!this.listings.has(i)){if(t.throwIfNoEntry===!1)return;throw io(`lstat '${e}'`)}if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,t)}}statImpl(e,t,i={}){let n=this.entries.get(t);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,m=f,y=new Date(h),b=new Date(p),v=new Date(m),x=new Date(f),T=this.listings.has(t)?Da:this.isSymbolicLink(n)?Fa:Ra,q=T===Da?493:420,Y=T|this.getUnixMode(n,q)&511,$=this.libzip.struct.statCrc(s),_=Object.assign(new jA,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:y,birthtime:b,ctime:v,mtime:x,atimeMs:h,birthtimeMs:p,ctimeMs:m,mtimeMs:f,mode:Y,crc:$});return i.bigint===!0?FE(_):_}if(this.listings.has(t)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),m=new Date(g),y=new Date(f),b=new Date(h),v=Da|493,x=0,T=Object.assign(new jA,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:y,mtime:b,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:v,crc:x});return i.bigint===!0?FE(T):T}throw new Error("Unreachable")}getUnixMode(e,t){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?t:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let t=this.listings.get(e);if(t)return t;this.registerListing(k.dirname(e)).add(k.basename(e));let n=new Set;return this.listings.set(e,n),n}registerEntry(e,t){this.registerListing(k.dirname(e)).add(k.basename(e)),this.entries.set(e,t)}unregisterListing(e){this.listings.delete(e);let t=this.listings.get(k.dirname(e));t==null||t.delete(k.basename(e))}unregisterEntry(e){this.unregisterListing(e);let t=this.entries.get(e);this.entries.delete(e),typeof t!="undefined"&&(this.fileSources.delete(t),this.isSymbolicLink(t)&&this.symlinkCount--)}deleteEntry(e,t){if(this.unregisterEntry(e),this.libzip.delete(this.zip,t)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,t,i=!0,n=!0){if(!this.ready)throw OE(`archive closed, ${e}`);let s=k.resolve(Me.root,t);if(s==="/")return Me.root;let o=this.entries.get(s);if(i&&o!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(o)){let a=this.getFileSource(o).toString();return this.resolveFilename(e,k.resolve(k.dirname(s),a),!0,n)}else return s;for(;;){let a=this.resolveFilename(e,k.dirname(s),!0,n);if(a===void 0)return a;let l=this.listings.has(a),c=this.entries.has(a);if(!l&&!c){if(n===!1)return;throw io(e)}if(!l)throw Ro(e);if(s=k.resolve(a,k.basename(s)),!i||this.symlinkCount===0)break;let u=this.libzip.name.locate(this.zip,s.slice(1));if(u===-1)break;if(this.isSymbolicLink(u)){let g=this.getFileSource(u).toString();s=k.resolve(k.dirname(s),g)}else break}return s}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let t=this.libzip.malloc(e.byteLength);if(!t)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,t,e.byteLength).set(e),{buffer:t,byteLength:e.byteLength}}allocateUnattachedSource(e){let t=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,t);if(s===0)throw this.libzip.free(t),this.makeLibzipError(t);return s}allocateSource(e){let{buffer:t,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,t,i,0,!0);if(n===0)throw this.libzip.free(t),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,t){let i=Buffer.isBuffer(t)?t:Buffer.from(t),n=k.relative(Me.root,e),s=this.allocateSource(t);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&_n)===Fa}getFileSource(e,t={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(t.asyncDecompress)return new Promise((h,p)=>{uQ.default.inflateRaw(f,(m,y)=>{m?p(m):(this.fileSources.set(e,y),h(y))})});{let h=uQ.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async fchmodPromise(e,t){return this.chmodPromise(this.fdToPath(e,"fchmod"),t)}fchmodSync(e,t){return this.chmodSync(this.fdToPath(e,"fchmodSync"),t)}async chmodPromise(e,t){return this.chmodSync(e,t)}chmodSync(e,t){if(this.readOnly)throw In(`chmod '${e}'`);t&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Ra|0)&~511|t;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,t,i){return this.chownSync(e,t,i)}chownSync(e,t,i){throw new Error("Unimplemented")}async renamePromise(e,t){return this.renameSync(e,t)}renameSync(e,t){throw new Error("Unimplemented")}async copyFilePromise(e,t,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,t,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,t,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,t,i=0){if(this.readOnly)throw In(`copyfile '${e} -> '${t}'`);if((i&zu.constants.COPYFILE_FICLONE_FORCE)!=0)throw Yh("unsupported clone operation",`copyfile '${e}' -> ${t}'`);let n=this.resolveFilename(`copyfile '${e} -> ${t}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw GA(`copyfile '${e}' -> '${t}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${t}'`,t),a=this.entries.get(o);if((i&(zu.constants.COPYFILE_EXCL|zu.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw ME(`copyfile '${e}' -> '${t}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,t,i){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFilePromise(e,t,i)}appendFileSync(e,t,i={}){if(this.readOnly)throw In(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=N({flag:"a"},i)),this.writeFileSync(e,t,i)}fdToPath(e,t){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Ai(t);return i}async writeFilePromise(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,t,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(t=Buffer.concat([this.getFileSource(o),Buffer.from(t)])),n!==null&&(t=t.toString(n));let l=this.setFileSource(a,t);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,t){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw In(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw qh(`open '${e}'`);let n=null,s=null;typeof t=="string"?n=t:typeof t=="object"&&({encoding:n=null,mode:s=null}=t);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw In(`unlink '${e}'`);let t=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(t))throw qh(`unlink '${e}'`);let i=this.entries.get(t);if(typeof i=="undefined")throw GA(`unlink '${e}'`);this.deleteEntry(t,i)}async utimesPromise(e,t,i){return this.utimesSync(e,t,i)}utimesSync(e,t,i){if(this.readOnly)throw In(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,t,i){return this.lutimesSync(e,t,i)}lutimesSync(e,t,i){if(this.readOnly)throw In(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,t){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,bge(t),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,t){return this.mkdirSync(e,t)}mkdirSync(e,{mode:t=493,recursive:i=!1}={}){if(i)return this.mkdirpSync(e,{chmod:t});if(this.readOnly)throw In(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw ME(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,t)}async rmdirPromise(e,t){return this.rmdirSync(e,t)}rmdirSync(e,{recursive:t=!1}={}){if(this.readOnly)throw In(`rmdir '${e}'`);if(t){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw Ro(`rmdir '${e}'`);if(n.size>0)throw YO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw GA(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let t=this.libzip.dir.add(this.zip,k.relative(Me.root,e));if(t===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,t),t}async linkPromise(e,t){return this.linkSync(e,t)}linkSync(e,t){throw qO(`link '${e}' -> '${t}'`)}async symlinkPromise(e,t){return this.symlinkSync(e,t)}symlinkSync(e,t){if(this.readOnly)throw In(`symlink '${e}' -> '${t}'`);let i=this.resolveFilename(`symlink '${e}' -> '${t}'`,t);if(this.listings.has(i))throw qh(`symlink '${e}' -> '${t}'`);if(this.entries.has(i))throw ME(`symlink '${e}' -> '${t}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Fa|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return t?i.toString(t):i}readFileSync(e,t){typeof t=="object"&&(t=t?t.encoding:void 0);let i=this.readFileBuffer(e);return t?i.toString(t):i}readFileBuffer(e,t={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw Ro(`open '${e}'`);if(this.listings.has(i))throw qh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,t)}async readdirPromise(e,t){return this.readdirSync(e,t)}readdirSync(e,t){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw io(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw Ro(`scandir '${e}'`);let s=[...n];return(t==null?void 0:t.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",k.join(e,o)),{name:o})):s}async readlinkPromise(e){let t=this.prepareReadlink(e);return(await this.getFileSource(t,{asyncDecompress:!0})).toString()}readlinkSync(e){let t=this.prepareReadlink(e);return this.getFileSource(t).toString()}prepareReadlink(e){let t=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(t)&&!this.listings.has(t))throw io(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(t))throw Ro(`open '${e}'`);if(this.listings.has(t))throw GA(`readlink '${e}'`);let i=this.entries.get(t);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw GA(`readlink '${e}'`);return i}async truncatePromise(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(t,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,t=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw GA(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(t,0);return s.copy(o),this.writeFileSync(e,o)}async ftruncatePromise(e,t){return this.truncatePromise(this.fdToPath(e,"ftruncate"),t)}ftruncateSync(e,t){return this.truncateSync(this.fdToPath(e,"ftruncateSync"),t)}watch(e,t,i){let n;switch(typeof t){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=t);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,t,i){let n=k.resolve(Me.root,e);return HE(this,n,t,i)}unwatchFile(e,t){let i=k.resolve(Me.root,e);return Wh(this,i,t)}};var Qi=class extends YA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Na=class extends Qi{constructor(e,{baseFs:t,pathUtils:i}){super(i);this.target=e,this.baseFs=t}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var _t=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.normalize(e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?k.normalize(e):this.baseFs.resolve(k.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var eM=Me.root,La=class extends Qi{constructor(e,{baseFs:t=new ar}={}){super(k);this.target=this.pathUtils.resolve(Me.root,e),this.baseFs=t}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Me.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let t=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(eM,e));if(t.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(eM,this.pathUtils.relative(this.target,e))}};var _h=class extends Qi{constructor(e,t){super(t);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var et=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gQ=class extends YA{constructor(){super(k)}getExtractHint(){throw et()}getRealPath(){throw et()}resolve(){throw et()}async openPromise(){throw et()}openSync(){throw et()}async opendirPromise(){throw et()}opendirSync(){throw et()}async readPromise(){throw et()}readSync(){throw et()}async writePromise(){throw et()}writeSync(){throw et()}async closePromise(){throw et()}closeSync(){throw et()}createWriteStream(){throw et()}createReadStream(){throw et()}async realpathPromise(){throw et()}realpathSync(){throw et()}async readdirPromise(){throw et()}readdirSync(){throw et()}async existsPromise(e){throw et()}existsSync(e){throw et()}async accessPromise(){throw et()}accessSync(){throw et()}async statPromise(){throw et()}statSync(){throw et()}async fstatPromise(e){throw et()}fstatSync(e){throw et()}async lstatPromise(e){throw et()}lstatSync(e){throw et()}async fchmodPromise(){throw et()}fchmodSync(){throw et()}async chmodPromise(){throw et()}chmodSync(){throw et()}async chownPromise(){throw et()}chownSync(){throw et()}async mkdirPromise(){throw et()}mkdirSync(){throw et()}async rmdirPromise(){throw et()}rmdirSync(){throw et()}async linkPromise(){throw et()}linkSync(){throw et()}async symlinkPromise(){throw et()}symlinkSync(){throw et()}async renamePromise(){throw et()}renameSync(){throw et()}async copyFilePromise(){throw et()}copyFileSync(){throw et()}async appendFilePromise(){throw et()}appendFileSync(){throw et()}async writeFilePromise(){throw et()}writeFileSync(){throw et()}async unlinkPromise(){throw et()}unlinkSync(){throw et()}async utimesPromise(){throw et()}utimesSync(){throw et()}async readFilePromise(){throw et()}readFileSync(){throw et()}async readlinkPromise(){throw et()}readlinkSync(){throw et()}async truncatePromise(){throw et()}truncateSync(){throw et()}async ftruncatePromise(e,t){throw et()}ftruncateSync(e,t){throw et()}watch(){throw et()}watchFile(){throw et()}unwatchFile(){throw et()}},jE=gQ;jE.instance=new gQ;var Vh=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return H.fromPortablePath(e)}mapToBase(e){return H.toPortablePath(e)}};var Qge=/^[0-9]+$/,fQ=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,Sge=/^([^/]+-)?[a-f0-9]+$/,Wr=class extends Qi{static makeVirtualPath(e,t,i){if(k.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!k.basename(t).match(Sge))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=k.relative(k.dirname(e),i).split("/"),o=0;for(;o{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==k.sep);){if(r[t-1]===k.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==k.sep?null:r.slice(0,i)},Is=class extends oc{constructor({libzip:e,baseFs:t=new ar,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=t,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,t){let i=new Is(t);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(zh(this),this.zipInstances)for(let[e,{zipFs:t}]of this.zipInstances.entries())t.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,t){let i=this.nextFd++|Vn;return this.fdMap.set(i,[e,t]),i}async openPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,t,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,t,i)))}openSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,t,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,t,i)))}async opendirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,t),async(i,{subPath:n})=>await i.opendirPromise(n,t),{requireSubpath:!1})}opendirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,t),(i,{subPath:n})=>i.opendirSync(n,t),{requireSubpath:!1})}async readPromise(e,t,i,n,s){if((e&Vn)==0)return await this.baseFs.readPromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("read");let[a,l]=o;return await a.readPromise(l,t,i,n,s)}readSync(e,t,i,n,s){if((e&Vn)==0)return this.baseFs.readSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("readSync");let[a,l]=o;return a.readSync(l,t,i,n,s)}async writePromise(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("write");let[a,l]=o;return typeof t=="string"?await a.writePromise(l,t,i):await a.writePromise(l,t,i,n,s)}writeSync(e,t,i,n,s){if((e&Vn)==0)return typeof t=="string"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Ai("writeSync");let[a,l]=o;return typeof t=="string"?a.writeSync(l,t,i):a.writeSync(l,t,i,n,s)}async closePromise(e){if((e&Vn)==0)return await this.baseFs.closePromise(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("close");this.fdMap.delete(e);let[i,n]=t;return await i.closePromise(n)}closeSync(e){if((e&Vn)==0)return this.baseFs.closeSync(e);let t=this.fdMap.get(e);if(typeof t=="undefined")throw Ai("closeSync");this.fdMap.delete(e);let[i,n]=t;return i.closeSync(n)}createReadStream(e,t){return e===null?this.baseFs.createReadStream(e,t):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,t),(i,{archivePath:n,subPath:s})=>{let o=i.createReadStream(s,t);return o.path=H.fromPortablePath(this.pathUtils.join(n,s)),o})}createWriteStream(e,t){return e===null?this.baseFs.createWriteStream(e,t):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,t),(i,{subPath:n})=>i.createWriteStream(n,t))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,await t.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(t,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Me.root,t.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(t,{subPath:i})=>await t.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(t,{subPath:i})=>t.existsSync(i))}async accessPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,t),async(i,{subPath:n})=>await i.accessPromise(n,t))}accessSync(e,t){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,t),(i,{subPath:n})=>i.accessSync(n,t))}async statPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,t),async(i,{subPath:n})=>await i.statPromise(n,t))}statSync(e,t){return this.makeCallSync(e,()=>this.baseFs.statSync(e,t),(i,{subPath:n})=>i.statSync(n,t))}async fstatPromise(e,t){if((e&Vn)==0)return this.baseFs.fstatPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstat");let[n,s]=i;return n.fstatPromise(s,t)}fstatSync(e,t){if((e&Vn)==0)return this.baseFs.fstatSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fstatSync");let[n,s]=i;return n.fstatSync(s,t)}async lstatPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,t),async(i,{subPath:n})=>await i.lstatPromise(n,t))}lstatSync(e,t){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,t),(i,{subPath:n})=>i.lstatSync(n,t))}async fchmodPromise(e,t){if((e&Vn)==0)return this.baseFs.fchmodPromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmod");let[n,s]=i;return n.fchmodPromise(s,t)}fchmodSync(e,t){if((e&Vn)==0)return this.baseFs.fchmodSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("fchmodSync");let[n,s]=i;return n.fchmodSync(s,t)}async chmodPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,t),async(i,{subPath:n})=>await i.chmodPromise(n,t))}chmodSync(e,t){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,t),(i,{subPath:n})=>i.chmodSync(n,t))}async chownPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,t,i),async(n,{subPath:s})=>await n.chownPromise(s,t,i))}chownSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,t,i),(n,{subPath:s})=>n.chownSync(s,t,i))}async renamePromise(e,t){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.renamePromise(e,t),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(t,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,t){return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.renameSync(e,t),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(t,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,t,i=0){let n=async(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(t,async()=>await this.baseFs.copyFilePromise(e,t,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(t,async()=>await n(s,o,this.baseFs,t),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,t,i=0){let n=(s,o,a,l)=>{if((i&Xh.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Xh.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(t,()=>this.baseFs.copyFileSync(e,t,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(t,()=>n(s,o,this.baseFs,t),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,t,i),async(n,{subPath:s})=>await n.appendFilePromise(s,t,i))}appendFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,t,i),(n,{subPath:s})=>n.appendFileSync(s,t,i))}async writeFilePromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,t,i),async(n,{subPath:s})=>await n.writeFilePromise(s,t,i))}writeFileSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,t,i),(n,{subPath:s})=>n.writeFileSync(s,t,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(t,{subPath:i})=>await t.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(t,{subPath:i})=>t.unlinkSync(i))}async utimesPromise(e,t,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,t,i),async(n,{subPath:s})=>await n.utimesPromise(s,t,i))}utimesSync(e,t,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,t,i),(n,{subPath:s})=>n.utimesSync(s,t,i))}async mkdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,t),async(i,{subPath:n})=>await i.mkdirPromise(n,t))}mkdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,t),(i,{subPath:n})=>i.mkdirSync(n,t))}async rmdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,t),async(i,{subPath:n})=>await i.rmdirPromise(n,t))}rmdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,t),(i,{subPath:n})=>i.rmdirSync(n,t))}async linkPromise(e,t){return await this.makeCallPromise(t,async()=>await this.baseFs.linkPromise(e,t),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,t){return this.makeCallSync(t,()=>this.baseFs.linkSync(e,t),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.symlinkPromise(e,t,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,t,i){return this.makeCallSync(t,()=>this.baseFs.symlinkSync(e,t,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,t){return this.makeCallPromise(e,async()=>{switch(t){case"utf8":return await this.baseFs.readFilePromise(e,t);default:return await this.baseFs.readFilePromise(e,t)}},async(i,{subPath:n})=>await i.readFilePromise(n,t))}readFileSync(e,t){return this.makeCallSync(e,()=>{switch(t){case"utf8":return this.baseFs.readFileSync(e,t);default:return this.baseFs.readFileSync(e,t)}},(i,{subPath:n})=>i.readFileSync(n,t))}async readdirPromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,t),async(i,{subPath:n})=>await i.readdirPromise(n,t),{requireSubpath:!1})}readdirSync(e,t){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,t),(i,{subPath:n})=>i.readdirSync(n,t),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(t,{subPath:i})=>await t.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(t,{subPath:i})=>t.readlinkSync(i))}async truncatePromise(e,t){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,t),async(i,{subPath:n})=>await i.truncatePromise(n,t))}truncateSync(e,t){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,t),(i,{subPath:n})=>i.truncateSync(n,t))}async ftruncatePromise(e,t){if((e&Vn)==0)return this.baseFs.ftruncatePromise(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncate");let[n,s]=i;return n.ftruncatePromise(s,t)}ftruncateSync(e,t){if((e&Vn)==0)return this.baseFs.ftruncateSync(e,t);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Ai("ftruncateSync");let[n,s]=i;return n.ftruncateSync(s,t)}watch(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,t,i),(n,{subPath:s})=>n.watch(s,t,i))}watchFile(e,t,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,t,i),()=>HE(this,e,t,i))}unwatchFile(e,t){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,t),()=>Wh(this,e,t))}async makeCallPromise(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await t();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await t():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await t()}makeCallSync(e,t,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return t();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?t():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let t="";for(;;){let i=e.substring(t.length),n;if(!this.fileExtensions)n=tM(i,".zip");else for(let s of this.fileExtensions)if(n=tM(i,s),n)break;if(!n)return null;if(t=this.pathUtils.join(t,n),this.isZip.has(t)===!1){if(this.notZip.has(t))continue;try{if(!this.baseFs.lstatSync(t).isFile()){this.notZip.add(t);continue}}catch{return null}this.isZip.add(t)}return{archivePath:t,subPath:this.pathUtils.join(Me.root,e.substring(t.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let t=Date.now(),i=t+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(t>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-t).unref())}async getZipPromise(e,t){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new li(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await t(n.zipFs)}finally{n.refCount-=1}}else{let n=new li(e,await i());try{return await t(n)}finally{n.saveAndClose()}}}getZipSync(e,t){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new li(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,t(n.zipFs)}else{let n=new li(e,i());try{return t(n)}finally{n.saveAndClose()}}}};var Vu=ge(require("util"));var GE=ge(require("url"));var hQ=class extends Qi{constructor(e){super(H);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof GE.URL?(0,GE.fileURLToPath)(e):e}};var en=Symbol("kBaseFs"),Ta=Symbol("kFd"),qA=Symbol("kClosePromise"),YE=Symbol("kCloseResolve"),qE=Symbol("kCloseReject"),_u=Symbol("kRefs"),Fo=Symbol("kRef"),No=Symbol("kUnref"),Q6e,S6e,v6e,x6e,JE=class{constructor(e,t){this[Q6e]=1;this[S6e]=void 0;this[v6e]=void 0;this[x6e]=void 0;this[en]=t,this[Ta]=e}get fd(){return this[Ta]}async appendFile(e,t){var i;try{this[Fo](this.appendFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[en].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[No]()}}chown(e,t){throw new Error("Method not implemented.")}async chmod(e){try{return this[Fo](this.chmod),await this[en].fchmodPromise(this.fd,e)}finally{this[No]()}}createReadStream(e){return this[en].createReadStream(null,te(N({},e),{fd:this.fd}))}createWriteStream(e){return this[en].createWriteStream(null,te(N({},e),{fd:this.fd}))}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,t,i,n){var s,o,a;try{this[Fo](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[en].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[No]()}}async readFile(e){var t;try{this[Fo](this.readFile);let i=(t=typeof e=="string"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[en].readFilePromise(this.fd,i)}finally{this[No]()}}async stat(e){try{return this[Fo](this.stat),await this[en].fstatPromise(this.fd,e)}finally{this[No]()}}async truncate(e){try{return this[Fo](this.truncate),await this[en].ftruncatePromise(this.fd,e)}finally{this[No]()}}utimes(e,t){throw new Error("Method not implemented.")}async writeFile(e,t){var i;try{this[Fo](this.writeFile);let n=(i=typeof t=="string"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[en].writeFilePromise(this.fd,e,n)}finally{this[No]()}}async write(...e){try{if(this[Fo](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[en].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[No]()}}async writev(e,t){try{this[Fo](this.writev);let i=0;if(typeof t!="undefined")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e)i+=(await this.write(n)).bytesWritten;return{buffers:e,bytesWritten:i}}finally{this[No]()}}readv(e,t){throw new Error("Method not implemented.")}close(){if(this[Ta]===-1)return Promise.resolve();if(this[qA])return this[qA];if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[qA]=this[en].closePromise(e).finally(()=>{this[qA]=void 0})}else this[qA]=new Promise((e,t)=>{this[YE]=e,this[qE]=t}).finally(()=>{this[qA]=void 0,this[qE]=void 0,this[YE]=void 0});return this[qA]}[(en,Ta,Q6e=_u,S6e=qA,v6e=YE,x6e=qE,Fo)](e){if(this[Ta]===-1){let t=new Error("file closed");throw t.code="EBADF",t.syscall=e.name,t}this[_u]++}[No](){if(this[_u]--,this[_u]===0){let e=this[Ta];this[Ta]=-1,this[en].closePromise(e).then(this[YE],this[qE])}}};var vge=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),rM=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]);function pQ(r,e){e=new hQ(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Vu.promisify.custom])!="undefined"&&(s[Vu.promisify.custom]=o[Vu.promisify.custom])};{t(r,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,"read",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of rM){let n=i.replace(/Promise$/,"");if(typeof r[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}}),t(r,"readSync",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of vge){let n=i;if(typeof r[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let s of rM){let o=s.replace(/Promise$/,"");if(typeof n[o]=="undefined")continue;let a=e[s];typeof a!="undefined"&&s!=="open"&&t(n,o,(l,...c)=>l instanceof JE?l[o].apply(l,c):a.call(e,l,...c))}t(n,"open",async(...s)=>{let o=await e.openPromise(...s);return new JE(o,e)})}}r.read[Vu.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Vu.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function WE(r,e){let t=Object.create(r);return pQ(t,e),t}var iM=ge(require("os"));function nM(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${r}${e}`}var no=new Set,dQ=null;function sM(){if(dQ)return dQ;let r=H.toPortablePath(iM.default.tmpdir()),e=K.realpathSync(r);return process.once("exit",()=>{K.rmtempSync()}),dQ={tmpdir:r,realTmpdir:e}}var K=Object.assign(new ar,{detachTemp(r){no.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{this.mkdirSync(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return r(n)}finally{if(no.has(n)){no.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=sM();for(;;){let i=nM("xfs-");try{await this.mkdirPromise(k.join(e,i))}catch(s){if(s.code==="EEXIST")continue;throw s}let n=k.join(t,i);if(no.add(n),typeof r=="undefined")return n;try{return await r(n)}finally{if(no.has(n)){no.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(no.values()).map(async r=>{try{await K.removePromise(r,{maxRetries:0}),no.delete(r)}catch{}}))},rmtempSync(){for(let r of no)try{K.removeSync(r),no.delete(r)}catch{}}});var mk=ge(SQ());var op={};ft(op,{parseResolution:()=>$E,parseShell:()=>_E,parseSyml:()=>Si,stringifyArgument:()=>PQ,stringifyArgumentSegment:()=>DQ,stringifyArithmeticExpression:()=>ZE,stringifyCommand:()=>kQ,stringifyCommandChain:()=>eg,stringifyCommandChainThen:()=>xQ,stringifyCommandLine:()=>VE,stringifyCommandLineThen:()=>vQ,stringifyEnvSegment:()=>XE,stringifyRedirectArgument:()=>$h,stringifyResolution:()=>eI,stringifyShell:()=>$u,stringifyShellLine:()=>$u,stringifySyml:()=>Ma,stringifyValueArgument:()=>uc});var _M=ge(zM());function _E(r,e={isGlobPattern:()=>!1}){try{return(0,_M.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function $u(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${VE(t)}${i===";"?n!==r.length-1||e?";":"":" &"}`).join(" ")}function VE(r){return`${eg(r.chain)}${r.then?` ${vQ(r.then)}`:""}`}function vQ(r){return`${r.type} ${VE(r.line)}`}function eg(r){return`${kQ(r)}${r.then?` ${xQ(r.then)}`:""}`}function xQ(r){return`${r.type} ${eg(r.chain)}`}function kQ(r){switch(r.type){case"command":return`${r.envs.length>0?`${r.envs.map(e=>XE(e)).join(" ")} `:""}${r.args.map(e=>PQ(e)).join(" ")}`;case"subshell":return`(${$u(r.subshell)})${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"group":return`{ ${$u(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>$h(e)).join(" ")}`:""}`;case"envs":return r.envs.map(e=>XE(e)).join(" ");default:throw new Error(`Unsupported command type: "${r.type}"`)}}function XE(r){return`${r.name}=${r.args[0]?uc(r.args[0]):""}`}function PQ(r){switch(r.type){case"redirection":return $h(r);case"argument":return uc(r);default:throw new Error(`Unsupported argument type: "${r.type}"`)}}function $h(r){return`${r.subtype} ${r.args.map(e=>uc(e)).join(" ")}`}function uc(r){return r.segments.map(e=>DQ(e)).join("")}function DQ(r){let e=(i,n)=>n?`"${i}"`:i,t=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(r.type){case"text":return t(r.text);case"glob":return r.pattern;case"shell":return e(`\${${$u(r.shell)}}`,r.quoted);case"variable":return e(typeof r.defaultValue=="undefined"?typeof r.alternativeValue=="undefined"?`\${${r.name}}`:r.alternativeValue.length===0?`\${${r.name}:+}`:`\${${r.name}:+${r.alternativeValue.map(i=>uc(i)).join(" ")}}`:r.defaultValue.length===0?`\${${r.name}:-}`:`\${${r.name}:-${r.defaultValue.map(i=>uc(i)).join(" ")}}`,r.quoted);case"arithmetic":return`$(( ${ZE(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${r.type}"`)}}function ZE(r){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(ZE(n),!["number","variable"].includes(n.type));switch(r.type){case"number":return String(r.value);case"variable":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var ZM=ge(XM());function $E(r){let e=r.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,ZM.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function eI(r){let e="";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+="/"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var uI=ge(jK()),qK=ge(YK()),Tpe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,JK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],YQ=class{constructor(e){this.data=e}};function WK(r){return r.match(Tpe)?r:JSON.stringify(r)}function zK(r){return typeof r=="undefined"?!0:typeof r=="object"&&r!==null?Object.keys(r).every(e=>zK(r[e])):!1}function qQ(r,e,t){if(r===null)return`null -`;if(typeof r=="number"||typeof r=="boolean")return`${r.toString()} -`;if(typeof r=="string")return`${WK(r)} -`;if(Array.isArray(r)){if(r.length===0)return`[] -`;let i=" ".repeat(e);return` -${r.map(s=>`${i}- ${qQ(s,e+1,!1)}`).join("")}`}if(typeof r=="object"&&r){let i,n;r instanceof YQ?(i=r.data,n=!1):(i=r,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=JK.indexOf(l),g=JK.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!zK(i[l])).map((l,c)=>{let u=i[l],g=WK(l),f=qQ(u,e+1,!0),h=c>0||t?s:"",p=g.length>1024?`? ${g} -${h}:`:`${g}:`,m=f.startsWith(` -`)?f:` ${f}`;return`${h}${p}${m}`}).join(e===0?` -`:"")||` -`;return t?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Ma(r){try{let e=qQ(r,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Ma.PreserveOrdering=YQ;function Ope(r){return r.endsWith(` -`)||(r+=` -`),(0,qK.parse)(r)}var Mpe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function Kpe(r){if(Mpe.test(r))return Ope(r);let e=(0,uI.safeLoad)(r,{schema:uI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Si(r){return Kpe(r)}var T4=ge(VK()),mw=ge(Ic());var Cp={};ft(Cp,{Builtins:()=>oS,Cli:()=>ws,Command:()=>Re,Option:()=>J,UsageError:()=>Pe,formatMarkdownish:()=>Ui});var yc=0,ap=1,tn=2,WQ="",vi="\0",lg=-1,zQ=/^(-h|--help)(?:=([0-9]+))?$/,gI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,tU=/^-[a-zA-Z]{2,}$/,_Q=/^([^=]+)=([\s\S]*)$/,VQ=process.env.DEBUG_CLI==="1";var Pe=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ap=class extends Error{constructor(e,t){super();if(this.input=e,this.candidates=t,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${XQ(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},ZQ=class extends Error{constructor(e,t){super();this.input=e,this.usages=t,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${XQ(e)}`}},XQ=r=>`While running ${r.filter(e=>e!==vi).map(e=>{let t=JSON.stringify(e);return e.match(/\s/)||e.length===0||t!==`"${e}"`?t:e}).join(" ")}`;var lp=Symbol("clipanion/isOption");function rn(r){return te(N({},r),{[lp]:!0})}function Oo(r,e){return typeof r=="undefined"?[r,e]:typeof r=="object"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function fI(r,e=!1){let t=r.replace(/^\.: /,"");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function cp(r,e){return e.length===1?new Pe(`${r}: ${fI(e[0],!0)}`):new Pe(`${r}: -${e.map(t=>` -- ${fI(t)}`).join("")}`)}function up(r,e,t){if(typeof t=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw cp(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var Re=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ys(),cg)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw cp("Invalid option schema",l);for(let[,g]of c)g()}else if(t!=null)throw new Error("Invalid command schema");let i=await this.execute();return typeof i!="undefined"?i:0}};Re.isOption=lp;Re.Default=[];var uU=80,tS=Array(uU).fill("\u2501");for(let r=0;r<=24;++r)tS[tS.length-r]=`[38;5;${232+r}m\u2501`;var rS={header:r=>`\u2501\u2501\u2501 ${r}${r.length`${r}`,error:r=>`${r}`,code:r=>`${r}`},gU={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function yde(r){let e=r.split(` -`),t=e.filter(n=>n.match(/\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function Ui(r,{format:e,paragraphs:t}){return r=r.replace(/\r\n?/g,` -`),r=yde(r),r=r.replace(/^\n+|\n+$/g,""),r=r.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),r=r.replace(/\n(\n)?\n*/g,"$1"),t&&(r=r.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),r=r.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r} -`:""}var sS=ge(require("tty"));function wn(r){VQ&&console.log(r)}var fU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:lg};function hU(){return{nodes:[sn(),sn(),sn()]}}function Bde(r){let e=hU(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(yc)}function Qde(r,{prefix:e=""}={}){if(VQ){wn(`${e}Nodes are:`);for(let t=0;tl!==tn).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===tn))throw new Ap(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=Sde(a)}if(i.length>0){wn(" Results:");for(let s of i)wn(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else wn(" No results");return i}function vde(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,vi)){for(let{to:t}of r.statics[vi])if(t===ap)return!0}return!1}function kde(r,e,t){let i=t&&e.length>0?[""]:[],n=dU(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let m=r.nodes[p],y=Object.keys(m.statics);for(let b of Object.keys(m.statics)){let v=y[0];for(let{to:x,reducer:T}of m.statics[v])T==="pushPath"&&(u||l.push(v),g.push(x))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=vde(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==vi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===tn)continue;let p=xde(f,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function Dde(r,e){let t=dU(r,[...e,vi]);return Pde(e,t.map(({state:i})=>i))}function Sde(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function Pde(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ap(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=Rde(c);if(u.length>1)throw new ZQ(r,u.map(g=>g.candidateUsage));return u[0]}function Rde(r){let e=[],t=[];for(let i of r)i.selectedIndex===lg?t.push(i):e.push(i);return t.length>0&&e.push(te(N({},fU),{path:CU(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])})),e}function CU(r,e,...t){return e===void 0?Array.from(r):CU(r.filter((i,n)=>i===e[n]),...t)}function sn(){return{dynamics:[],shortcuts:[],statics:{}}}function pU(r){return r===ap||r===tn}function nS(r,e=0){return{to:pU(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function wde(r,e=0){let t=sn();for(let[i,n]of r.dynamics)t.dynamics.push([i,nS(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(nS(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>nS(s,e));return t}function xi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function ug(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function Ka(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function pI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function xde(r,e){let t=Array.isArray(r)?dI[r[0]]:dI[r];if(typeof t.suggest=="undefined")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var dI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(r,e)=>r.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&tU.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(_Q);return!r.ignoreOptions&&!!n&&gI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&zQ.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith("-")&&gI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith("-")&&!gI.test(e)};dI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var iS={setCandidateState:(r,e,t)=>N(N({},r),t),setSelectedIndex:(r,e,t)=>te(N({},r),{selectedIndex:t}),pushBatch:(r,e)=>te(N({},r),{options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(_Q);return te(N({},r),{options:r.options.concat({name:t,value:i})})},pushPath:(r,e)=>te(N({},r),{path:r.path.concat(e)}),pushPositional:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>te(N({},r),{positionals:r.positionals.concat({value:e,extra:Zn})}),pushTrue:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>te(N({},r),{options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>te(N({},r),{options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i=te(N({},r),{options:[...r.options]}),n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t=te(N({},r),{options:[...r.options]}),i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>te(N({},r),{ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(zQ);return typeof i!="undefined"?te(N({},r),{options:[{name:"-c",value:String(t)},{name:"-i",value:i}]}):te(N({},r),{options:[{name:"-c",value:String(t)}]})},setError:(r,e,t)=>e===vi?te(N({},r),{errorMessage:`${t}.`}):te(N({},r),{errorMessage:`${t} ("${e}").`}),setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return te(N({},r),{errorMessage:`Not enough arguments to option ${t.name}.`})}},Zn=Symbol(),mU=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e="arg",required:t=!0}={}){if(!t&&this.arity.extra===Zn)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!t&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!t&&this.arity.extra!==Zn?this.arity.extra.push(e):this.arity.extra!==Zn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:t=0}={}){if(this.arity.extra===Zn)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Zn?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=hU(),t=yc,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=so(e,sn()),Ka(e,yc,WQ,t,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=so(e,sn());ug(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=so(e,sn());xi(e,l,"isHelp",f,["useHelp",this.cliIndex]),Ka(e,f,vi,ap,["setSelectedIndex",lg]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ka(e,l,vi,tn,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&Ka(e,h,vi,tn,["setError","Not enough positional arguments"]),xi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Zn||this.arity.extra.length>0){let f=so(e,sn());if(ug(e,c,f),this.arity.extra===Zn){let h=so(e,sn());this.arity.proxy||this.registerOptions(e,h),xi(e,c,s,h,"pushExtraNoLimits"),xi(e,h,s,h,"pushExtraNoLimits"),ug(e,h,f)}else for(let h=0;h0&&Ka(e,u,vi,tn,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)xi(e,t,["isOption",s,i.hidden||s!==n],t,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&xi(e,t,["isNegatedOption",s],t,["pushFalse",s]);else{let s=so(e,sn());for(let o of i.names)xi(e,t,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eDde(i,n),suggest:(n,s)=>kde(i,n,s)}}};var dp=class extends Re{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,t){let i=new dp(t);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var EU=Symbol("clipanion/errorCommand");function Fde(){return process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY?8:1}var ws=class{constructor({binaryLabel:e,binaryName:t="...",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new pp({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new ws(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Re.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case lg:return dp.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[EU]=a,l}}break}}async run(e,t){var i;let n,s=N(N({},ws.defaultContext),t),o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,N(N({},s),u)),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?Nde(s):IU,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Ui(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Ui(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Ui(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Ui(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Re?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Ui(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(t).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${rS.header("Options")} -`;let h=f.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` -`;for(let{definition:p,description:m}of f)a+=` ${this.format(t).bold(p.padEnd(h))} ${Ui(m,{format:this.format(t),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(t).header("Details")} -`,a+=` -`,a+=Ui(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(t).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=Ui(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(t).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Ui(f.usage.category,{format:this.format(t),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:y}=this.getUsageByIndex(h);m.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)} -`:a+=`${this.format(t).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(t).bold(n)}${this.binaryName} -`):a+=`${this.format(t).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((m,y)=>m.usage.localeCompare(y.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(t).header(`${p}`)} -`;for(let{commandClass:m,usage:y}of h){let b=m.usage.description||"undocumented";a+=` -`,a+=` ${this.format(t).bold(y)} -`,a+=` ${Ui(b,{format:this.format(t),paragraphs:!1})}`}}a+=` -`,a+=Ui("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[EU])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:ws.defaultContext.colorDepth>1)?rS:gU}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};ws.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:"getColorDepth"in sS.default.WriteStream.prototype?sS.default.WriteStream.prototype.getColorDepth():Fde()};var yU;function Nde(r){let e=yU;if(typeof e=="undefined"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return IU;let{AsyncLocalStorage:t}=require("async_hooks");e=yU=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l=="undefined"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function IU(r){return r()}var oS={};ft(oS,{DefinitionsCommand:()=>CI,HelpCommand:()=>mI,VersionCommand:()=>EI});var CI=class extends Re{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};CI.paths=[["--clipanion=definitions"]];var mI=class extends Re{async execute(){this.context.stdout.write(this.cli.usage())}};mI.paths=[["-h"],["--help"]];var EI=class extends Re{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};EI.paths=[["-v"],["--version"]];var J={};ft(J,{Array:()=>wU,Boolean:()=>BU,Counter:()=>bU,Proxy:()=>QU,Rest:()=>SU,String:()=>vU,applyValidator:()=>up,cleanValidationError:()=>fI,formatError:()=>cp,isOptionSymbol:()=>lp,makeCommandOption:()=>rn,rerouteArguments:()=>Oo});function wU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function BU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function bU(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),s=r.split(","),o=new Set(s);return rn({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function QU(r={}){return rn({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function SU(r={}){return rn({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Zn||a.extra===!1&&oo)}})}function Lde(r,e,t){let[i,n]=Oo(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(","),a=new Set(o);return rn({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?up(g!=null?g:c,f,n.validator):f}})}function Tde(r={}){let{required:e=!0}=r;return rn({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;oYW,areIdentsEqual:()=>fd,areLocatorsEqual:()=>hd,areVirtualPackagesEquivalent:()=>aSe,bindDescriptor:()=>sSe,bindLocator:()=>oSe,convertDescriptorToLocator:()=>Aw,convertLocatorToDescriptor:()=>_x,convertPackageToLocator:()=>nSe,convertToIdent:()=>iSe,convertToManifestRange:()=>cSe,copyPackage:()=>cd,devirtualizeDescriptor:()=>ud,devirtualizeLocator:()=>gd,getIdentVendorPath:()=>ek,isPackageCompatible:()=>gw,isVirtualDescriptor:()=>Al,isVirtualLocator:()=>ea,makeDescriptor:()=>rr,makeIdent:()=>$o,makeLocator:()=>cn,makeRange:()=>cw,parseDescriptor:()=>ll,parseFileStyleRange:()=>ASe,parseIdent:()=>An,parseLocator:()=>Yc,parseRange:()=>qg,prettyDependent:()=>Lv,prettyDescriptor:()=>sr,prettyIdent:()=>fi,prettyLocator:()=>It,prettyLocatorNoColors:()=>$x,prettyRange:()=>aw,prettyReference:()=>dd,prettyResolution:()=>Tv,prettyWorkspace:()=>Cd,renamePackage:()=>ld,slugifyIdent:()=>Zx,slugifyLocator:()=>Jg,sortDescriptors:()=>Wg,stringifyDescriptor:()=>Pn,stringifyIdent:()=>Ot,stringifyLocator:()=>Rs,tryParseDescriptor:()=>pd,tryParseIdent:()=>qW,tryParseLocator:()=>lw,virtualizeDescriptor:()=>Vx,virtualizePackage:()=>Xx});var Yg=ge(require("querystring")),HW=ge(ri()),jW=ge(nY());var ae={};ft(ae,{LogLevel:()=>ho,Style:()=>Tc,Type:()=>qe,addLogFilterSupport:()=>nd,applyColor:()=>ns,applyHyperlink:()=>Mg,applyStyle:()=>Ry,json:()=>Oc,jsonOrPretty:()=>KBe,mark:()=>Hv,pretty:()=>tt,prettyField:()=>_o,prettyList:()=>Uv,supportsColor:()=>Py,supportsHyperlinks:()=>Mv,tuple:()=>fo});var rd=ge(uv()),id=ge(Ic());var sJ=ge(is()),oJ=ge(Jq());var Se={};ft(Se,{AsyncActions:()=>$q,BufferStream:()=>Zq,CachingStrategy:()=>Lc,DefaultStream:()=>eJ,allSettledSafe:()=>go,assertNever:()=>Pv,bufferStream:()=>Tg,buildIgnorePattern:()=>LBe,convertMapsToIndexableObjects:()=>ky,dynamicRequire:()=>Og,escapeRegExp:()=>PBe,getArrayWithDefault:()=>Fg,getFactoryWithDefault:()=>_a,getMapWithDefault:()=>Ng,getSetWithDefault:()=>Nc,isIndexableObject:()=>Dv,isPathLike:()=>TBe,isTaggedYarnVersion:()=>kBe,mapAndFilter:()=>zo,mapAndFind:()=>$p,overrideType:()=>kv,parseBoolean:()=>td,parseOptionalBoolean:()=>nJ,prettifyAsyncErrors:()=>Lg,prettifySyncErrors:()=>Rv,releaseAfterUseAsync:()=>RBe,replaceEnvVariables:()=>Fv,sortMap:()=>kn,tryParseOptionalBoolean:()=>Nv,validateEnum:()=>DBe});var Wq=ge(is()),zq=ge(gg()),_q=ge(ri()),xv=ge(require("stream"));function kBe(r){return!!(_q.default.valid(r)&&r.match(/^[^-]+(-rc\.[0-9]+)?$/))}function PBe(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kv(r){}function Pv(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function DBe(r,e){let t=Object.values(r);if(!t.includes(e))throw new Pe(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(", ")})`);return e}function zo(r,e){let t=[];for(let i of r){let n=e(i);n!==Vq&&t.push(n)}return t}var Vq=Symbol();zo.skip=Vq;function $p(r,e){for(let t of r){let i=e(t);if(i!==Xq)return i}}var Xq=Symbol();$p.skip=Xq;function Dv(r){return typeof r=="object"&&r!==null}async function go(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status==="rejected")throw i.reason;t.push(i.value)}return t}function ky(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Dv(r))for(let e of Object.keys(r)){let t=r[e];Dv(t)&&(r[e]=ky(t))}return r}function _a(r,e,t){let i=r.get(e);return typeof i=="undefined"&&r.set(e,i=t()),i}function Fg(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=[]),t}function Nc(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Set),t}function Ng(r,e){let t=r.get(e);return typeof t=="undefined"&&r.set(e,t=new Map),t}async function RBe(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function Lg(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Rv(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Tg(r){return await new Promise((e,t)=>{let i=[];r.on("error",n=>{t(n)}),r.on("data",n=>{i.push(n)}),r.on("end",()=>{e(Buffer.concat(i))})})}var Zq=class extends xv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}};function FBe(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var $q=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,zq.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=FBe());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},eJ=class extends xv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,t,i){if(t!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},ed=eval("require");function tJ(r){return ed(H.fromPortablePath(r))}function rJ(path){let physicalPath=H.fromPortablePath(path),currentCacheEntry=ed.cache[physicalPath];delete ed.cache[physicalPath];let result;try{result=tJ(physicalPath);let freshCacheEntry=ed.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{ed.cache[physicalPath]=currentCacheEntry}return result}var iJ=new Map;function NBe(r){let e=iJ.get(r),t=K.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=rJ(r);return iJ.set(r,{mtime:t.mtimeMs,instance:i}),i}var Lc;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Lc||(Lc={}));function Og(r,{cachingStrategy:e=2}={}){switch(e){case 0:return rJ(r);case 1:return NBe(r);case 2:return tJ(r);default:throw new Error("Unsupported caching strategy")}}function kn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function LBe(r){return r.length===0?null:r.map(e=>`(${Wq.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Fv(r,{env:e}){let t=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new Pe(`Environment variable not found (${n})`)})}function td(r){switch(r){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${r}" as a boolean`)}}function nJ(r){return typeof r=="undefined"?r:td(r)}function Nv(r){try{return nJ(r)}catch{return null}}function TBe(r){return!!(H.isAbsolute(r)||r.match(/^(\.{1,2}|~)\//))}var Qt;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(Qt||(Qt={}));var wi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(wi||(wi={}));var qi;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(qi||(qi={}));var qe={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN"},Tc;(function(e){e[e.BOLD=2]="BOLD"})(Tc||(Tc={}));var Ov=id.default.GITHUB_ACTIONS?{level:2}:rd.default.supportsColor?{level:rd.default.supportsColor.level}:{level:0},Py=Ov.level!==0,Mv=Py&&!id.default.GITHUB_ACTIONS&&!id.default.CIRCLE&&!id.default.GITLAB,Kv=new rd.default.Instance(Ov),OBe=new Map([[qe.NO_HINT,null],[qe.NULL,["#a853b5",129]],[qe.SCOPE,["#d75f00",166]],[qe.NAME,["#d7875f",173]],[qe.RANGE,["#00afaf",37]],[qe.REFERENCE,["#87afff",111]],[qe.NUMBER,["#ffd700",220]],[qe.PATH,["#d75fd7",170]],[qe.URL,["#d75fd7",170]],[qe.ADDED,["#5faf00",70]],[qe.REMOVED,["#d70000",160]],[qe.CODE,["#87afff",111]],[qe.SIZE,["#ffd700",220]]]),Fs=r=>r,Dy={[qe.NUMBER]:Fs({pretty:(r,e)=>`${e}`,json:r=>r}),[qe.IDENT]:Fs({pretty:(r,e)=>fi(r,e),json:r=>Ot(r)}),[qe.LOCATOR]:Fs({pretty:(r,e)=>It(r,e),json:r=>Rs(r)}),[qe.DESCRIPTOR]:Fs({pretty:(r,e)=>sr(r,e),json:r=>Pn(r)}),[qe.RESOLUTION]:Fs({pretty:(r,{descriptor:e,locator:t})=>Tv(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:Pn(r),locator:e!==null?Rs(e):null})}),[qe.DEPENDENT]:Fs({pretty:(r,{locator:e,descriptor:t})=>Lv(r,e,t),json:({locator:r,descriptor:e})=>({locator:Rs(r),descriptor:Pn(e)})}),[qe.PACKAGE_EXTENSION]:Fs({pretty:(r,e)=>{switch(e.type){case wi.Dependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"dependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependency:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependencies",qe.CODE)} \u27A4 ${fi(r,e.descriptor)}`;case wi.PeerDependencyMeta:return`${fi(r,e.parentDescriptor)} \u27A4 ${ns(r,"peerDependenciesMeta",qe.CODE)} \u27A4 ${fi(r,An(e.selector))} \u27A4 ${ns(r,e.key,qe.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case wi.Dependency:return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case wi.PeerDependency:return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case wi.PeerDependencyMeta:return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[qe.SETTING]:Fs({pretty:(r,e)=>(r.get(e),Mg(r,ns(r,e,qe.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[qe.DURATION]:Fs({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[qe.SIZE]:Fs({pretty:(r,e)=>{let t=["KB","MB","GB","TB"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return ns(r,`${s} ${t[i-1]}`,qe.NUMBER)},json:r=>r}),[qe.PATH]:Fs({pretty:(r,e)=>ns(r,H.fromPortablePath(e),qe.PATH),json:r=>H.fromPortablePath(r)}),[qe.MARKDOWN]:Fs({pretty:(r,{text:e,format:t,paragraphs:i})=>Ui(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function fo(r,e){return[e,r]}function Ry(r,e,t){return r.get("enableColors")&&t&2&&(e=rd.default.bold(e)),e}function ns(r,e,t){if(!r.get("enableColors"))return e;let i=OBe.get(t);if(i===null)return e;let n=typeof i=="undefined"?t:Ov.level>=3?i[0]:i[1],s=typeof n=="number"?Kv.ansi256(n):n.startsWith("#")?Kv.hex(n):Kv[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var MBe=!!process.env.KONSOLE_VERSION;function Mg(r,e,t){return r.get("enableHyperlinks")?MBe?`]8;;${t}\\${e}]8;;\\`:`]8;;${t}\x07${e}]8;;\x07`:e}function tt(r,e,t){if(e===null)return ns(r,"null",qe.NULL);if(Object.prototype.hasOwnProperty.call(Dy,t))return Dy[t].pretty(r,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ns(r,e,t)}function Uv(r,e,t,{separator:i=", "}={}){return[...e].map(n=>tt(r,n,t)).join(i)}function Oc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Dy,e))return kv(e),Dy[e].json(r);if(typeof r!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function KBe(r,e,[t,i]){return r?Oc(t,i):tt(e,t,i)}function Hv(r){return{Check:ns(r,"\u2713","green"),Cross:ns(r,"\u2718","red"),Question:ns(r,"?","cyan")}}function _o(r,{label:e,value:[t,i]}){return`${tt(r,e,qe.CODE)}: ${tt(r,t,i)}`}var ho;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(ho||(ho={}));function nd(r,{configuration:e}){let t=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let m=g.get("pattern");typeof m!="undefined"&&s.push([sJ.default.matcher(m,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===X.UNNAMED)return h;let p=n.size>0||s.length>0?(0,oJ.default)(f):f;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:h}if(s.length>0){for(let[m,y]of s)if(m(p))return y!=null?y:h}if(i.size>0){let m=i.get(_A(g));if(typeof m!="undefined")return m!=null?m:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case ho.Info:a.call(g,f,h);break;case ho.Warning:l.call(g,f!=null?f:X.UNNAMED,h);break;case ho.Error:c.call(g,f!=null?f:X.UNNAMED,h);break}};r.reportInfo=function(...g){return u(this,...g,ho.Info)},r.reportWarning=function(...g){return u(this,...g,ho.Warning)},r.reportError=function(...g){return u(this,...g,ho.Error)}}var Dn={};ft(Dn,{checksumFile:()=>sw,checksumPattern:()=>ow,makeHash:()=>ln});var nw=ge(require("crypto")),zx=ge(Wx());function ln(...r){let e=(0,nw.createHash)("sha512"),t="";for(let i of r)typeof i=="string"?t+=i:i&&(t&&(e.update(t),t=""),e.update(i));return t&&e.update(t),e.digest("hex")}async function sw(r,{baseFs:e,algorithm:t}={baseFs:K,algorithm:"sha512"}){let i=await e.openPromise(r,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,nw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function ow(r,{cwd:e}){let i=(await(0,zx.default)(r,{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,zx.default)([r,...i],{cwd:H.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=H.toPortablePath(a),u=await K.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await K.readlinkPromise(c))):u.isFile()&&l.push(await K.readFilePromise(c)),l.join("\0")})),o=(0,nw.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var Ad="virtual:",tSe=5,GW=/(os|cpu|libc)=([a-z0-9_-]+)/,rSe=(0,jW.makeParser)(GW);function $o(r,e){if(r==null?void 0:r.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:ln(r,e),scope:r,name:e}}function rr(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:ln(r.identHash,e),range:e}}function cn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:ln(r.identHash,e),reference:e}}function iSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Aw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function _x(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function nSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function ld(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function cd(r){return ld(r,r)}function Vx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return rr(r,`virtual:${e}#${r.range}`)}function Xx(r,e){if(e.includes("#"))throw new Error("Invalid entropy");return ld(r,cn(r,`virtual:${e}#${r.reference}`))}function Al(r){return r.range.startsWith(Ad)}function ea(r){return r.reference.startsWith(Ad)}function ud(r){if(!Al(r))throw new Error("Not a virtual descriptor");return rr(r,r.range.replace(/^[^#]*#/,""))}function gd(r){if(!ea(r))throw new Error("Not a virtual descriptor");return cn(r,r.reference.replace(/^[^#]*#/,""))}function sSe(r,e){return r.range.includes("::")?r:rr(r,`${r.range}::${Yg.default.stringify(e)}`)}function oSe(r,e){return r.reference.includes("::")?r:cn(r,`${r.reference}::${Yg.default.stringify(e)}`)}function fd(r,e){return r.identHash===e.identHash}function YW(r,e){return r.descriptorHash===e.descriptorHash}function hd(r,e){return r.locatorHash===e.locatorHash}function aSe(r,e){if(!ea(r))throw new Error("Invalid package type");if(!ea(e))throw new Error("Invalid package type");if(!fd(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!YW(t,i))return!1}return!0}function An(r){let e=qW(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function qW(r){let e=r.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e,n=typeof t!="undefined"?t:null;return $o(n,i)}function ll(r,e=!1){let t=pd(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function pd(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid range (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return rr($o(o,n),a)}function Yc(r,e=!1){let t=lw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function lw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s==="unknown")throw new Error(`Invalid reference (${r})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return cn($o(o,n),a)}function qg(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]!="undefined"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]!="undefined"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]!="undefined"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=(e==null?void 0:e.parseSelector)?Yg.default.parse(s):s,a=typeof t[4]!="undefined"?Yg.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ASe(r,{protocol:e}){let{selector:t,params:i}=qg(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Yc(i.locator,!0),path:t}}function JW(r){return r=r.replace(/%/g,"%25"),r=r.replace(/:/g,"%3A"),r=r.replace(/#/g,"%23"),r}function lSe(r){return r===null?!1:Object.entries(r).length>0}function cw({protocol:r,source:e,selector:t,params:i}){let n="";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${JW(e)}#`),n+=JW(t),lSe(i)&&(n+=`::${Yg.default.stringify(i)}`),n}function cSe(r){let{params:e,protocol:t,source:i,selector:n}=qg(r);for(let s in e)s.startsWith("__")&&delete e[s];return cw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function Pn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Rs(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function Zx(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function Jg(r){let{protocol:e,selector:t}=qg(r.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=HW.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${Zx(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Jr(a)}function fi(r,e){return e.scope?`${tt(r,`@${e.scope}/`,qe.SCOPE)}${tt(r,e.name,qe.NAME)}`:`${tt(r,e.name,qe.NAME)}`}function uw(r){if(r.startsWith(Ad)){let e=uw(r.substring(r.indexOf("#")+1)),t=r.substring(Ad.length,Ad.length+tSe);return`${e} [${t}]`}else return r.replace(/\?.*/,"?[...]")}function aw(r,e){return`${tt(r,uw(e),qe.RANGE)}`}function sr(r,e){return`${fi(r,e)}${tt(r,"@",qe.RANGE)}${aw(r,e.range)}`}function dd(r,e){return`${tt(r,uw(e),qe.REFERENCE)}`}function It(r,e){return`${fi(r,e)}${tt(r,"@",qe.REFERENCE)}${dd(r,e.reference)}`}function $x(r){return`${Ot(r)}@${uw(r.reference)}`}function Wg(r){return kn(r,[e=>Ot(e),e=>e.range])}function Cd(r,e){return fi(r,e.locator)}function Tv(r,e,t){let i=Al(e)?ud(e):e;return t===null?`${sr(r,i)} \u2192 ${Hv(r).Cross}`:i.identHash===t.identHash?`${sr(r,i)} \u2192 ${dd(r,t.reference)}`:`${sr(r,i)} \u2192 ${It(r,t)}`}function Lv(r,e,t){return t===null?`${It(r,e)}`:`${It(r,e)} (via ${aw(r,t.range)})`}function ek(r){return`node_modules/${Ot(r)}`}function gw(r,e){return r.conditions?rSe(r.conditions,t=>{let[,i,n]=t.match(GW),s=e[i];return s?s.includes(n):!0}):!0}var WW={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(rr(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=Cd(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error("Resolutions field will be ignored"));for(let i of t.errors)e.reportWarning(X.INVALID_MANIFEST,i.message)}}};var XW=ge(ri());var md=class{supportsDescriptor(e,t){return!!(e.range.startsWith(md.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(md.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(md.protocol.length));return te(N({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:Qt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},oi=md;oi.protocol="workspace:";var Wt={};ft(Wt,{SemVer:()=>zW.SemVer,clean:()=>gSe,satisfiesWithPrereleases:()=>qc,validRange:()=>po});var fw=ge(ri()),zW=ge(ri()),_W=new Map;function qc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=_W.get(i);if(typeof n=="undefined")try{n=new fw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{_W.set(i,n||null)}else if(n===null)return!1;let s;try{s=new fw.default.SemVer(r,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var VW=new Map;function po(r){if(r.indexOf(":")!==-1)return null;let e=VW.get(r);if(typeof e!="undefined")return e;try{e=new fw.default.Range(r)}catch{e=null}return VW.set(r,e),e}var uSe=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/;function gSe(r){let e=uSe.exec(r);return e?e[1]:null}var cl=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new ar}={}){let i=k.join(e,"package.json");try{return await cl.fromFile(i,{baseFs:t})}catch(n){if(n.code==="ENOENT")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await cl.tryFind(e,{baseFs:t});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:t=new ar}={}){let i=new cl;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new cl;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse($W(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=ZW(e)}async loadFile(e,{baseFs:t=new ar}){let i=await t.readFilePromise(e,"utf8"),n;try{n=JSON.parse($W(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=ZW(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=An(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!="string"?i.push(new Error("Parsing failed for the 'libc' field")):s.push(o)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=un(e.main):this.main=null,typeof e.module=="string"?this.module=un(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=un(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(un(s),typeof o=="string"?un(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,un(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=An(s);this.bin.set(a.name,un(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=An(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(oi.protocol)&&!po(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=rr(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=ll(s),l=this.ensureDependencyMeta(a),c=hw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=hw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=hw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=ll(s),l=this.ensurePeerDependencyMeta(a),c=hw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:$E(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=un(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=un(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=un(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(un(s),typeof o=="string"?un(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,un(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,un(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(un(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=An(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=rr(a,o);this.dependencies.set(l.identHash,l);let c=rr(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(tk("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(tk("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(tk("libc",this.libc)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return cl.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return cl.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!XW.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=te(N({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Wg(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Wg(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Wg(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Wg(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of kn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of kn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?Pn(rr(An(o),l)):o,g=N({},c);t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...kn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[eI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},At=cl;At.fileName="package.json",At.allDependencies=["dependencies","devDependencies","peerDependencies"],At.hardDependencies=["dependencies","devDependencies"];function ZW(r){let e=r.match(/^[ \t]+/m);return e?e[0]:" "}function $W(r){return r.charCodeAt(0)===65279?r.slice(1):r}function un(r){return r.replace(/\\/g,"/")}function hw(r,{yamlCompatibilityMode:e}){return e?Nv(r):typeof r=="undefined"||typeof r=="boolean"?r:null}function e4(r,e){let t=e.search(/[^!]/);if(t===-1)return"invalid";let i=t%2==0?"":"!",n=e.slice(t);return`${i}${r}=${n}`}function tk(r,e){return e.length===1?e4(r,e[0]):`(${e.map(t=>e4(r,t)).join(" | ")})`}var D4=ge(P4()),R4=ge(require("stream")),F4=ge(require("string_decoder"));var sve=15,ct=class extends Error{constructor(e,t,i){super(t);this.reportExtra=i;this.reportCode=e}};function ove(r){return typeof r.reportCode!="undefined"}var Ji=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t{t=o}),n=(0,D4.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/sve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){ove(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(X.EXCEPTION,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new R4.PassThrough,i=new F4.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var yd=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new ct(X.FETCHER_NOT_FOUND,`${It(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var wd=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${sr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${It(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var N4=ge(ri());var zg=/^(?!v)[a-z0-9._-]+$/i,nk=class{supportsDescriptor(e,t){return!!(po(e.range)||zg.test(e.range))}supportsLocator(e,t){return!!(N4.default.valid(e.reference)||zg.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return ld(i,e)}forwardDescriptor(e,t){return rr(e,`${t.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,t){return cn(e,`${t.project.configuration.get("defaultProtocol")}${e.reference}`)}};var Bd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=cn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return Jg(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Wr.makeVirtualPath(s,o,n),l=new Na(a,{baseFs:t.packageFs,pathUtils:k});return te(N({},t),{packageFs:l})}};var _g=class{static isVirtualDescriptor(e){return!!e.range.startsWith(_g.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(_g.protocol)}supportsDescriptor(e,t){return _g.isVirtualDescriptor(e)}supportsLocator(e,t){return _g.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},pw=_g;pw.protocol="virtual:";var bd=class{supports(e){return!!e.reference.startsWith(oi.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new _t(i),prefixPath:Me.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(oi.protocol.length))}};var sk={};ft(sk,{getDefaultGlobalFolder:()=>ak,getHomeFolder:()=>Qd,isFolderInside:()=>Ak});var ok=ge(require("os"));function ak(){if(process.platform==="win32"){let r=H.toPortablePath(process.env.LOCALAPPDATA||H.join((0,ok.homedir)(),"AppData","Local"));return k.resolve(r,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let r=H.toPortablePath(process.env.XDG_DATA_HOME);return k.resolve(r,"yarn/berry")}return k.resolve(Qd(),".yarn/berry")}function Qd(){return H.toPortablePath((0,ok.homedir)()||"/usr/local/share")}function Ak(r,e){let t=k.relative(e,r);return t&&!t.startsWith("..")&&!k.isAbsolute(t)}var Vg={};ft(Vg,{builtinModules:()=>lk,getArchitecture:()=>Sd,getArchitectureName:()=>Ave,getArchitectureSet:()=>ck});var L4=ge(require("module"));function lk(){return new Set(L4.default.builtinModules||Object.keys(process.binding("natives")))}function ave(){var i,n,s,o;if(process.platform==="win32")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return(o=$p(e,a=>{let l=a.match(t);if(!l)return $p.skip;if(l[1])return"glibc";if(l[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")}))!=null?o:null}var dw,Cw;function Sd(){return dw=dw!=null?dw:{os:process.platform,cpu:process.arch,libc:ave()}}function Ave(r=Sd()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function ck(){let r=Sd();return Cw=Cw!=null?Cw:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}var lve=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),Ew="yarn_",gk=".yarnrc.yml",fk="yarn.lock",cve="********",Ie;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(Ie||(Ie={}));var Ri=qe,hk={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:Ie.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:Ie.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:Ie.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:Ie.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:Ie.STRING,default:null},globalFolder:{description:"Folder where all system-global files are stored",type:Ie.ABSOLUTE_PATH,default:ak()},cacheFolder:{description:"Folder where the cache files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:Ie.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:lc},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:Ie.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:Ie.STRING,default:fk},installStatePath:{description:"Path of the file where the install state will be persisted",type:Ie.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:Ie.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:Ie.STRING,default:Iw()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:Ie.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:Ie.BOOLEAN,default:Py,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:Ie.BOOLEAN,default:Mv,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:Ie.BOOLEAN,default:mw.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:Ie.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:Ie.BOOLEAN,default:!mw.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:Ie.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:Ie.BOOLEAN,default:mw.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:Ie.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:Ie.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:Ie.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:Ie.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:Ie.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:Ie.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:Ie.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:Ie.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:Ie.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:Ie.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:Ie.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:Ie.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:Ie.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:Ie.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:Ie.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:Ie.STRING,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:Ie.ABSOLUTE_PATH,default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:Ie.ABSOLUTE_PATH,default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:Ie.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:Ie.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:Ie.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:Ie.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:Ie.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:Ie.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:Ie.STRING,values:Object.values(ho),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:Ie.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:Ie.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:Ie.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:Ie.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:Ie.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:Ie.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:Ie.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:Ie.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:Ie.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:Ie.MAP,valueDefinition:{description:"A range",type:Ie.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:Ie.MAP,valueDefinition:{description:"A semver range",type:Ie.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:Ie.MAP,valueDefinition:{description:"The peerDependency meta",type:Ie.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:Ie.BOOLEAN,default:!1}}}}}}}};function dk(r,e,t,i,n){if(i.isArray||i.type===Ie.ANY&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>pk(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>pk(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return pk(r,e,t,i,n)}function pk(r,e,t,i,n){var a;switch(i.type){case Ie.ANY:return t;case Ie.SHAPE:return uve(r,e,t,i,n);case Ie.MAP:return gve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(t))return t;let o=(()=>{if(i.type===Ie.BOOLEAN&&typeof t!="string")return td(t);if(typeof t!="string")throw new Error(`Expected value (${t}) to be a string`);let l=Fv(t,{env:process.env});switch(i.type){case Ie.ABSOLUTE_PATH:return k.resolve(n,H.toPortablePath(l));case Ie.LOCATOR_LOOSE:return Yc(l,!1);case Ie.NUMBER:return parseInt(l);case Ie.LOCATOR:return Yc(l);case Ie.BOOLEAN:return td(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function uve(r,e,t,i,n){if(typeof t!="object"||Array.isArray(t))throw new Pe(`Object configuration settings "${e}" must be an object`);let s=Ck(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new Pe(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,dk(r,l,a,i.properties[o],n))}return s}function gve(r,e,t,i,n){let s=new Map;if(typeof t!="object"||Array.isArray(t))throw new Pe(`Map configuration settings "${e}" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,dk(r,c,a,u,n))}return s}function Ck(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case Ie.SHAPE:{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,Ck(r,s));return i}break;case Ie.MAP:return e.isArray&&!t?[]:new Map;case Ie.ABSOLUTE_PATH:return e.default===null?null:r.projectCwd===null?k.isAbsolute(e.default)?k.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>k.resolve(r.projectCwd,i)):k.resolve(r.projectCwd,e.default);default:return e.default}}function yw(r,e,t){if(e.type===Ie.SECRET&&typeof r=="string"&&t.hideSecrets)return cve;if(e.type===Ie.ABSOLUTE_PATH&&typeof r=="string"&&t.getNativePaths)return H.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(yw(n,e,t));return i}if(e.type===Ie.MAP&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,yw(s,e.valueDefinition,t));return i}if(e.type===Ie.SHAPE&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,yw(s,o,t))}return i}return r}function fve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(Ew)&&(e=(0,T4.default)(e.slice(Ew.length)),r[e]=t);return r}function Iw(){let r=`${Ew}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t=="string")return t;return gk}var ul;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(ul||(ul={}));var tA=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new tA(e);typeof t!="undefined"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(hk);let s=typeof i!="undefined"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=fve();delete a.rcFilename;let l=await tA.findRcFiles(e),c=await tA.findHomeRcFile();if(c){let b=l.find(v=>v.path===c.path);b?b.strict=!1:l.push(te(N({},c),{strict:!1}))}let u=({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T})=>({ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}),g=Y=>{var $=Y,{ignoreCwd:b,yarnPath:v,ignorePath:x,lockfileFilename:T}=$,q=Or($,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return q},f=new tA(e);f.importSettings(u(hk)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:b,cwd:v,data:x}of l)f.useWithSource(b,u(x),v,{strict:!1});if(s){let b=f.get("yarnPath"),v=f.get("ignorePath");if(b!==null&&!v)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await tA.findProjectCwd(e,h);break;case 1:p=await tA.findProjectCwd(e,null);break;case 2:K.existsSync(k.join(e,"package.json"))?p=k.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(hk));let m=new Map([["@@core",WW]]),y=b=>"default"in b?b.default:b;if(t!==null){for(let T of t.plugins.keys())m.set(T,y(t.modules.get(T)));let b=new Map;for(let T of lk())b.set(T,()=>Og(T));for(let[T,q]of t.modules)b.set(T,()=>q);let v=new Set,x=async(T,q)=>{let{factory:Y,name:$}=Og(T);if(v.has($))return;let _=new Map(b),ne=A=>{if(_.has(A))return _.get(A)();throw new Pe(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},ee=await Lg(async()=>y(await Y(ne)),A=>`${A} (when initializing ${$}, defined in ${q})`);b.set($,()=>ee),v.add($),m.set($,ee)};if(a.plugins)for(let T of a.plugins.split(";")){let q=k.resolve(e,H.toPortablePath(T));await x(q,"")}for(let{path:T,cwd:q,data:Y}of l)if(!!o&&!!Array.isArray(Y.plugins))for(let $ of Y.plugins){let _=typeof $!="string"?$.path:$,ne=k.resolve(q,H.toPortablePath(_));await x(ne,T)}}for(let[b,v]of m)f.activatePlugin(b,v);f.useWithSource("",g(a),e,{strict:n});for(let{path:b,cwd:v,data:x,strict:T}of l)f.useWithSource(b,g(x),v,{strict:T!=null?T:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Iw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=k.join(s,t);if(K.existsSync(o)){let a=await K.readFilePromise(o,"utf8"),l;try{l=Si(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new Pe(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=k.dirname(s)}return i}static async findHomeRcFile(){let e=Iw(),t=Qd(),i=k.join(t,e);if(K.existsSync(i)){let n=await K.readFilePromise(i,"utf8"),s=Si(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,K.existsSync(k.join(s,"package.json"))&&(i=s),t!==null){if(K.existsSync(k.join(s,t))){i=s;break}}else if(i!==null)break;n=k.dirname(s)}return i}static async updateConfiguration(e,t){let i=Iw(),n=k.join(e,i),s=K.existsSync(n)?Si(await K.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof t=="function"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await K.changeFilePromise(n,Ma(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=Qd();return await tA.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration!="undefined"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings "${t}"`);this.settings.set(t,i),this.values.set(t,Ck(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${tt(this,e,qe.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(t)]){if(typeof t[o]=="undefined"||o==="plugins"||e===""&&lve.has(o))continue;if(o==="rcFilename")throw new Pe(`The rcFilename settings can only be set via ${`${Ew}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new Pe(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===Ie.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=dk(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${tt(this,e,qe.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===Ie.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new Pe(`Couldn't find a configuration settings named "${e}"`);return yw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=K.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${tt(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${tt(this,"STDERR","red")}`);s=new uk.PassThrough,s.pipe(l),s.pipe(a),o=new uk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t!="undefined"&&s.write(`${t} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new wd([new pw,new oi,new nk,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new yd([new Bd,new bd,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=Sd(),t=this.get("supportedArchitectures"),i=t.get("os");i!==null&&(i=i.map(o=>o==="current"?e.os:o));let n=t.get("cpu");n!==null&&(n=n.map(o=>o==="current"?e.cpu:o));let s=t.get("libc");return s!==null&&(s=zo(s,o=>{var a;return o==="current"?(a=e.libc)!=null?a:zo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!po(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new At;o.load(n,{yamlCompatibilityMode:!0});let a=Fg(e,i.identHash),l=[];a.push([i.range,l]);let c={status:qi.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(te(N({},c),{type:wi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(te(N({},c),{type:wi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(te(N({},c),{type:wi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get("packageExtensions"))t(ll(i,!0),ky(n),{userProvided:!0})}normalizePackage(e){let t=cd(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!qc(s,o))for(let l of a)switch(l.status===qi.Inactive&&(l.status=qi.Redundant),l.type){case wi.Dependency:typeof t.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependency:typeof t.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=qi.Active,t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case wi.PeerDependencyMeta:{let c=t.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=qi.Active,_a(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Pv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=An(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,rr(o,"*"))}for(let s of t.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=$o("types",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,rr(a,"*")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(kn(t.dependencies,([,s])=>Pn(s))),t.peerDependencies=new Map(kn(t.peerDependencies,([,s])=>Pn(s))),t}getLimit(e){return _a(this.limits,e,()=>(0,O4.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o!="undefined")return o}return null}},ye=tA;ye.telemetry=null;var ss;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(ss||(ss={}));var ww=class extends ct{constructor({fileName:e,code:t,signal:i}){let n=ye.create(k.cwd()),s=tt(n,e,qe.PATH);super(X.EXCEPTION,`Child ${s} reported an error`,o=>{hve(t,i,{configuration:n,report:o})});this.code=Ek(t,i)}},Ik=class extends ww{constructor({fileName:e,code:t,signal:i,stdout:n,stderr:s}){super({fileName:e,code:t,signal:i});this.stdout=n,this.stderr=s}};function zc(r){return r!==null&&typeof r.fd=="number"}var _c=new Set;function yk(){}function wk(){for(let r of _c)r.kill()}async function ra(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":zc(s)&&(c[0]=s),zc(o)&&(c[1]=o),zc(a)&&(c[2]=a);let u=(0,mk.default)(r,e,{cwd:H.fromPortablePath(t),env:te(N({},i),{PWD:H.fromPortablePath(t)}),stdio:c});_c.add(u),_c.size===1&&(process.on("SIGINT",yk),process.on("SIGTERM",wk)),!zc(s)&&s!==null&&s.pipe(u.stdin),zc(o)||u.stdout.pipe(o,{end:!1}),zc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))zc(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,m)=>{_c.delete(u),_c.size===0&&(process.off("SIGINT",yk),process.off("SIGTERM",wk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:Ek(p,m)}):h(new ww({fileName:r,code:p,signal:m}))})})}async function pve(r,e,{cwd:t,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=H.fromPortablePath(t);typeof i.PWD!="undefined"&&(i=te(N({},i),{PWD:c}));let u=(0,mk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",h=>{let p=ye.create(t),m=tt(p,r,qe.PATH);f(new ct(X.EXCEPTION,`Process ${m} failed to spawn`,y=>{y.reportError(X.EXCEPTION,` ${_o(p,{label:"Thrown Error",value:fo(qe.NO_HINT,h.message)})}`)}))}),u.on("close",(h,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:Ek(h,p),stdout:m,stderr:y}):f(new Ik({fileName:r,code:h,signal:p,stdout:m,stderr:y}))})})}var dve=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function Ek(r,e){let t=dve.get(e);return typeof t!="undefined"?128+t:r!=null?r:1}function hve(r,e,{configuration:t,report:i}){i.reportError(X.EXCEPTION,` ${_o(t,r!==null?{label:"Exit Code",value:fo(qe.NUMBER,r)}:{label:"Exit Signal",value:fo(qe.CODE,e)})}`)}var ir={};ft(ir,{Method:()=>Cl,RequestError:()=>w5.RequestError,del:()=>xPe,get:()=>SPe,getNetworkSettings:()=>S5,post:()=>HP,put:()=>vPe,request:()=>Od});var E5=ge(Uw()),I5=ge(require("https")),y5=ge(require("http")),MP=ge(is()),KP=ge(m5()),Hw=ge(require("url"));var w5=ge(Uw()),B5=new Map,b5=new Map,wPe=new y5.Agent({keepAlive:!0}),BPe=new I5.Agent({keepAlive:!0});function Q5(r){let e=new Hw.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function UP(r){return _a(b5,r,()=>K.readFilePromise(r).then(e=>(b5.set(r,e),e)))}function bPe({statusCode:r,statusMessage:e},t){let i=tt(t,r,qe.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return Mg(t,`${i}${e?` (${e})`:""}`,n)}async function jw(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof E5.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${tt(e,"httpTimeout",qe.SETTING)})`);let a=new ct(X.NETWORK_ERROR,o,l=>{s.response&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Response Code",value:fo(qe.NO_HINT,bPe(s.response,e))})}`),s.request&&(l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Method",value:fo(qe.NO_HINT,s.request.options.method)})}`),l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request URL",value:fo(qe.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Redirects",value:fo(qe.NO_HINT,Uv(e,s.request.redirects,qe.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(X.NETWORK_ERROR,` ${_o(e,{label:"Request Retry Count",value:fo(qe.NO_HINT,`${tt(e,s.request.retryCount,qe.NUMBER)} (can be increased via ${tt(e,"httpRetry",qe.SETTING)})`)})}`)});throw a.originalError=s,a}}function S5(r,e){let t=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r=="string"?new Hw.URL(r):r;for(let[o,a]of t)if(MP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Cl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Cl||(Cl={}));async function Od(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=async()=>await QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function SPe(r,n){var s=n,{configuration:e,jsonResponse:t}=s,i=Or(s,["configuration","jsonResponse"]);let o=_a(B5,r,()=>jw(Od(r,null,N({configuration:e},i)),{configuration:e}).then(a=>(B5.set(r,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),t?JSON.parse(o.toString()):o}async function vPe(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.PUT})),i)).body}async function HP(r,e,n){var s=n,{customErrorMessage:t}=s,i=Or(s,["customErrorMessage"]);return(await jw(Od(r,e,te(N({},i),{method:Cl.POST})),i)).body}async function xPe(r,i){var n=i,{customErrorMessage:e}=n,t=Or(n,["customErrorMessage"]);return(await jw(Od(r,null,te(N({},t),{method:Cl.DELETE})),t)).body}async function QPe(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=Cl.GET}){let a=typeof r=="string"?new Hw.URL(r):r,l=S5(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!MP.default.isMatch(a.hostname,t.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?KP.default.httpOverHttp(Q5(l.httpProxy)):wPe,https:l.httpsProxy?KP.default.httpsOverHttp(Q5(l.httpsProxy)):BPe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=t.get("httpTimeout"),f=t.get("httpRetry"),h=t.get("enableStrictSsl"),p=l.caFilePath,m=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:b}=await Promise.resolve().then(()=>ge(Uw())),v=p?await UP(p):void 0,x=m?await UP(m):void 0,T=y?await UP(y):void 0,q=b.extend(N({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:x,key:T}},u));return t.getLimit("networkConcurrency")(()=>q(a))}var Zt={};ft(Zt,{PackageManager:()=>hn,detectPackageManager:()=>K9,executePackageAccessibleBinary:()=>Y9,executePackageScript:()=>nB,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>WDe,executeWorkspaceLifecycleScript:()=>G9,executeWorkspaceScript:()=>j9,getPackageAccessibleBinaries:()=>sB,getWorkspaceAccessibleBinaries:()=>H9,hasPackageScript:()=>YDe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Yd,maybeExecuteWorkspaceLifecycleScript:()=>JDe,prepareExternalProject:()=>GDe});var Md={};ft(Md,{getLibzipPromise:()=>fn,getLibzipSync:()=>D5});var P5=ge(x5());var ml=["number","number"],YP;(function(L){L[L.ZIP_ER_OK=0]="ZIP_ER_OK",L[L.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",L[L.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",L[L.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",L[L.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",L[L.ZIP_ER_READ=5]="ZIP_ER_READ",L[L.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",L[L.ZIP_ER_CRC=7]="ZIP_ER_CRC",L[L.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",L[L.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",L[L.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",L[L.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",L[L.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",L[L.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",L[L.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",L[L.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",L[L.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",L[L.ZIP_ER_EOF=17]="ZIP_ER_EOF",L[L.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",L[L.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",L[L.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",L[L.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",L[L.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",L[L.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",L[L.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",L[L.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",L[L.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",L[L.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",L[L.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",L[L.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",L[L.ZIP_ER_TELL=30]="ZIP_ER_TELL",L[L.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(YP||(YP={}));var k5=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:YP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap("zip_open","number",["string","number","number"]),openFromSource:r.cwrap("zip_open_from_source","number",["number","number","number"]),close:r.cwrap("zip_close","number",["number"]),discard:r.cwrap("zip_discard",null,["number"]),getError:r.cwrap("zip_get_error","number",["number"]),getName:r.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:r.cwrap("zip_get_num_entries","number",["number","number"]),delete:r.cwrap("zip_delete","number",["number","number"]),stat:r.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:r.cwrap("zip_stat_index","number",["number",...ml,"number","number"]),fopen:r.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:r.cwrap("zip_fopen_index","number",["number",...ml,"number"]),fread:r.cwrap("zip_fread","number",["number","number","number","number"]),fclose:r.cwrap("zip_fclose","number",["number"]),dir:{add:r.cwrap("zip_dir_add","number",["number","string"])},file:{add:r.cwrap("zip_file_add","number",["number","string","number","number"]),getError:r.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:r.cwrap("zip_file_get_external_attributes","number",["number",...ml,"number","number","number"]),setExternalAttributes:r.cwrap("zip_file_set_external_attributes","number",["number",...ml,"number","number","number"]),setMtime:r.cwrap("zip_file_set_mtime","number",["number",...ml,"number","number"]),setCompression:r.cwrap("zip_set_file_compression","number",["number",...ml,"number","number"])},ext:{countSymlinks:r.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:r.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:r.cwrap("zip_error_strerror","string",["number"])},name:{locate:r.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:r.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:r.cwrap("zip_source_buffer","number",["number","number",...ml,"number"]),free:r.cwrap("zip_source_free",null,["number"]),keep:r.cwrap("zip_source_keep",null,["number"]),open:r.cwrap("zip_source_open","number",["number"]),close:r.cwrap("zip_source_close","number",["number"]),seek:r.cwrap("zip_source_seek","number",["number",...ml,"number"]),tell:r.cwrap("zip_source_tell","number",["number"]),read:r.cwrap("zip_source_read","number",["number","number","number"]),error:r.cwrap("zip_source_error","number",["number"]),setMtime:r.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:r.cwrap("zipstruct_stat","number",[]),statS:r.cwrap("zipstruct_statS","number",[]),statName:r.cwrap("zipstruct_stat_name","string",["number"]),statIndex:r.cwrap("zipstruct_stat_index","number",["number"]),statSize:r.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:r.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:r.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:r.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:r.cwrap("zipstruct_stat_crc","number",["number"]),error:r.cwrap("zipstruct_error","number",[]),errorS:r.cwrap("zipstruct_errorS","number",[]),errorCodeZip:r.cwrap("zipstruct_error_code_zip","number",["number"])}});var qP=null;function D5(){return qP===null&&(qP=k5((0,P5.default)())),qP}async function fn(){return D5()}var Ud={};ft(Ud,{ShellError:()=>Ms,execute:()=>Xw,globUtils:()=>Yw});var G5=ge(uv()),Y5=ge(require("os")),os=ge(require("stream")),q5=ge(require("util"));var Ms=class extends Error{constructor(e){super(e);this.name="ShellError"}};var Yw={};ft(Yw,{fastGlobOptions:()=>N5,isBraceExpansion:()=>L5,isGlobPattern:()=>kPe,match:()=>PPe,micromatchOptions:()=>Jw});var R5=ge(Zy()),F5=ge(require("fs")),qw=ge(is()),Jw={strictBrackets:!0},N5={onlyDirectories:!1,onlyFiles:!1};function kPe(r){if(!qw.default.scan(r,Jw).isGlob)return!1;try{qw.default.parse(r,Jw)}catch{return!1}return!0}function PPe(r,{cwd:e,baseFs:t}){return(0,R5.default)(r,te(N({},N5),{cwd:H.fromPortablePath(e),fs:WE(F5.default,new Vh(t))}))}function L5(r){return qw.default.scan(r,Jw).isBrace}var T5=ge(SQ()),na=ge(require("stream")),O5=ge(require("string_decoder")),Fn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Fn||(Fn={}));var Xc=new Set;function JP(){}function WP(){for(let r of Xc)r.kill()}function M5(r,e,t,i){return n=>{let s=n[0]instanceof na.Transform?"pipe":n[0],o=n[1]instanceof na.Transform?"pipe":n[1],a=n[2]instanceof na.Transform?"pipe":n[2],l=(0,T5.default)(r,e,te(N({},i),{stdio:[s,o,a]}));return Xc.add(l),Xc.size===1&&(process.on("SIGINT",JP),process.on("SIGTERM",WP)),n[0]instanceof na.Transform&&n[0].pipe(l.stdin),n[1]instanceof na.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof na.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),u.code){case"ENOENT":n[2].write(`command not found: ${r} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${r} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("close",u=>{Xc.delete(l),Xc.size===0&&(process.off("SIGINT",JP),process.off("SIGTERM",WP)),c(u!==null?u:129)})})}}}function K5(r){return e=>{let t=e[0]==="pipe"?new na.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var mo=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},U5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Kd=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new Kd(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new Kd(this,e),n=new U5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function Ww(r,e){return Kd.start(r,e)}function H5(r,e=null){let t=new na.PassThrough,i=new O5.StringDecoder,n="";return t.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n="",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on("end",()=>{let s=i.end();s!==""&&r(e!==null?`${e} ${s}`:s)}),t}function j5(r,{prefix:e}){return{stdout:H5(t=>r.stdout.write(`${t} -`),r.stdout.isTTY?e:null),stderr:H5(t=>r.stderr.write(`${t} -`),r.stderr.isTTY?e:null)}}var DPe=(0,q5.promisify)(setTimeout);var zi;(function(t){t[t.Readable=1]="Readable",t[t.Writable=2]="Writable"})(zi||(zi={}));function J5(r,e,t){let i=new os.PassThrough({autoDestroy:!0});switch(r){case Fn.STDIN:(e&1)==1&&t.stdin.pipe(i,{end:!1}),(e&2)==2&&t.stdin instanceof os.Writable&&i.pipe(t.stdin,{end:!1});break;case Fn.STDOUT:(e&1)==1&&t.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stdout,{end:!1});break;case Fn.STDERR:(e&1)==1&&t.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(t.stderr,{end:!1});break;default:throw new Ms(`Bad file descriptor: "${r}"`)}return i}function zw(r,e={}){let t=N(N({},r),e);return t.environment=N(N({},r.environment),e.environment),t.variables=N(N({},r.variables),e.variables),t}var RPe=new Map([["cd",async([r=(0,Y5.homedir)(),...e],t,i)=>{let n=k.resolve(i.cwd,H.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new Ms(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new Ms(`cd: not a directory: ${r}`);return i.cwd=n,0}],["pwd",async(r,e,t)=>(t.stdout.write(`${H.fromPortablePath(t.cwd)} -`),0)],[":",async(r,e,t)=>0],["true",async(r,e,t)=>0],["false",async(r,e,t)=>1],["exit",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables["?"],10)],["echo",async(r,e,t)=>(t.stdout.write(`${r.join(" ")} -`),0)],["sleep",async([r],e,t)=>{if(typeof r=="undefined")throw new Ms("sleep: missing operand");let i=Number(r);if(Number.isNaN(i))throw new Ms(`sleep: invalid time interval '${r}'`);return await DPe(1e3*i,0)}],["__ysh_run_procedure",async(r,e,t)=>{let i=t.procedures[r[0]];return await Ww(i,{stdin:new mo(t.stdin),stdout:new mo(t.stdout),stderr:new mo(t.stderr)}).run()}],["__ysh_set_redirects",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!=="--";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},y=Number(r[c++]),b=c+y;for(let v=c;ve.baseFs.createReadStream(k.resolve(t.cwd,H.toPortablePath(r[v]))));break;case"<<<":p(()=>{let x=new os.PassThrough;return process.nextTick(()=>{x.write(`${r[v]} -`),x.end()}),x});break;case"<&":p(()=>J5(Number(r[v]),1,t));break;case">":case">>":{let x=k.resolve(t.cwd,H.toPortablePath(r[v]));m(x==="/dev/null"?new os.Writable({autoDestroy:!0,emitClose:!0,write(T,q,Y){setImmediate(Y)}}):e.baseFs.createWriteStream(x,f===">>"?{flags:"a"}:void 0))}break;case">&":m(J5(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new os.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new os.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new os.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await Ww(Hd(r.slice(c+1),e,t),{stdin:new mo(i),stdout:new mo(n),stderr:new mo(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function FPe(r,e,t){let i=[],n=new os.PassThrough;return n.on("data",s=>i.push(s)),await _w(r,e,zw(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function W5(r,e,t){let i=r.map(async s=>{let o=await aA(s.args,e,t);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Vw(r){return r.match(/[^ \r\n\t]+/g)||[]}async function z5(r,e,t,i,n=i){switch(r.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Vw(s);for(let a=0;a=0&&sr+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function jd(r,e,t){if(r.type==="number"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: "${r.value}", only integers are allowed`)}else if(r.type==="variable"){let i=[];await z5(te(N({},r),{quoted:!0}),e,t,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?jd({type:"variable",name:i.join(" ")},e,t):jd({type:"number",value:n},e,t)}else return NPe[r.type](await jd(r.left,e,t),await jd(r.right,e,t))}async function aA(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case"redirection":{let f=await aA(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await FPe(f.shell,e,t);if(f.quoted)o(h);else{let p=Vw(h);for(let m=0;m0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Hd(r,e,t){e.builtins.has(r[0])||(r=["command",...r]);let i=H.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD!="undefined"&&(n=te(N({},n),{PWD:i}));let[s,...o]=r;if(s==="command")return M5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return K5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function LPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,zw(t,{stdin:n}));return{stdin:n,promise:s}}}function TPe(r,e,t){return i=>{let n=new os.PassThrough,s=_w(r,e,t);return{stdin:n,promise:s}}}function _5(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=N({},i.procedures),i.procedures[n]=r,Hd([...e,"__ysh_run_procedure",n],t,i)}}async function V5(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?N({},t):t,a;switch(i.type){case"command":{let l=await aA(i.args,e,t),c=await W5(i.envs,e,t);a=i.envs.length?Hd(l,e,zw(o,{environment:c})):Hd(l,e,o)}break;case"subshell":{let l=await aA(i.args,e,t),c=LPe(i.subshell,e,o);a=_5(c,l,e,o)}break;case"group":{let l=await aA(i.args,e,t),c=TPe(i.group,e,o);a=_5(c,l,e,o)}break;case"envs":{let l=await W5(i.envs,e,t);o.environment=N(N({},o.environment),l),a=Hd(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=Ww(a,{stdin:new mo(o.stdin),stdout:new mo(o.stdout),stderr:new mo(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Fn.STDOUT);break;case"|&":s=s.pipeTo(a,Fn.STDOUT|Fn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function OPe(r,e,t,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return G5.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=j5(t,{prefix:l});return t.backgroundJobs.push(V5(r,e,zw(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(eg(r))}' has ended -`)})),0}return await V5(r,e,t)}async function MPe(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables["?"]=String(a)},o=async a=>{try{return await OPe(a.chain,e,t,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof Ms))throw l;return t.stderr.write(`${l.message} -`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case"&&":n===0&&s(await o(r.then.line));break;case"||":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${r.then.type}"`)}r=r.then.line}return n}async function _w(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await MPe(s,e,t,{background:o==="&"}),t.exitCode!==null)return t.exitCode;t.variables["?"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function X5(r){switch(r.type){case"variable":return r.name==="@"||r.name==="#"||r.name==="*"||Number.isFinite(parseInt(r.name,10))||"defaultValue"in r&&!!r.defaultValue&&r.defaultValue.some(e=>Gd(e))||"alternativeValue"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>Gd(e));case"arithmetic":return zP(r.arithmetic);case"shell":return _P(r.shell);default:return!1}}function Gd(r){switch(r.type){case"redirection":return r.args.some(e=>Gd(e));case"argument":return r.segments.some(e=>X5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${r.type}"`)}}function zP(r){switch(r.type){case"variable":return X5(r);case"number":return!1;default:return zP(r.left)||zP(r.right)}}function _P(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case"subshell":i=_P(t.subshell);break;case"command":i=t.envs.some(n=>n.args.some(s=>Gd(s)))||t.args.some(n=>Gd(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Xw(r,e=[],{baseFs:t=new ar,builtins:i={},cwd:n=H.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=Yw}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let f=new Map(RPe);for(let[p,m]of Object.entries(i))f.set(p,m);o===null&&(o=new os.PassThrough,o.end());let h=_E(r,u);if(!_P(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(y=>({type:"argument",segments:[{type:"text",text:y}]}))))}return await _w(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var O9=ge(Zw()),M9=ge(gg()),El=ge(require("stream"));var R9=ge(D9()),tB=ge(Ic());var F9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],N9=80,TDe=new Set([X.FETCH_NOT_CACHED,X.UNUSED_CACHE_ENTRY]),ODe=5,rB=tB.default.GITHUB_ACTIONS?{start:r=>`::group::${r} -`,end:r=>`::endgroup:: -`}:tB.default.TRAVIS?{start:r=>`travis_fold:start:${r} -`,end:r=>`travis_fold:end:${r} -`}:tB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${r} -`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\W+/g,"_")}\r`}:null,L9=new Date,MDe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,KDe=r=>r,iB=KDe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),UDe=MDe&&Object.keys(iB).find(r=>{let e=iB[r];return!(e.date&&(e.date[0]!==L9.getDate()||e.date[1]!==L9.getMonth()+1))})||"default";function T9(r,{configuration:e,json:t}){if(!e.get("enableMessageNames"))return"";let n=_A(r===null?0:r);return!t&&r===null?tt(e,n,"grey"):n}function eD(r,{configuration:e,json:t}){let i=T9(r,{configuration:e,json:t});if(!i||r===null||r===X.UNNAMED)return i;let n=X[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Mg(e,i,s)}var Je=class extends Ji{constructor({configuration:e,stdout:t,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=ODe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(nd(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...TDe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=t,e.get("enableProgressBars")&&!i&&t.isTTY&&t.columns>22){let u=e.get("progressBarStyle")||UDe;if(!Object.prototype.hasOwnProperty.call(iB,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=iB[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(t.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}}static async start(e,t){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(X.UNNAMED,a)};try{await t(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,t){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof t!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(X.FETCH_NOT_CACHED,t)}startSectionSync({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}async startSectionPromise({reportHeader:e,reportFooter:t,skipIfEmpty:i},n){let s={committed:!1,action:()=>{e==null||e()}};i?this.uncommitted.add(s):(s.action(),s.committed=!0);let o=Date.now();try{return await n()}catch(a){throw this.reportExceptionOnce(a),a}finally{let a=Date.now();this.uncommitted.delete(s),s.committed&&(t==null||t(a-o))}}startTimerImpl(e,t,i){let n=typeof t=="function"?{}:t;return{cb:typeof t=="function"?t:i,reportHeader:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.start(e))},reportFooter:o=>{this.indent-=1,rB!==null&&!this.json&&this.includeInfos&&this.stdout.write(rB.end(e)),this.configuration.get("enableTimers")&&o>200?this.reportInfo(null,`\u2514 Completed in ${tt(this.configuration,o,qe.DURATION)}`):this.reportInfo(null,"\u2514 Completed")},skipIfEmpty:n.skipIfEmpty}}startTimerSync(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionSync(s,n)}async startTimerPromise(e,t,i){let o=this.startTimerImpl(e,t,i),{cb:n}=o,s=Or(o,["cb"]);return this.startSectionPromise(s,n)}async startCacheReport(e){let t=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{t!==null&&this.reportCacheChanges(t)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,t){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${tt(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${t}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,t){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${t}`)}reportError(e,t){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:t}):this.writeLineWithForgettableReset(`${tt(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${t}`,{truncate:!1})}reportProgress(e){if(this.progressStyle===null)return te(N({},Promise.resolve()),{stop:()=>{}});if(e.hasProgress&&e.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let t=!1,i=Promise.resolve().then(async()=>{let s={progress:e.hasProgress?0:void 0,title:e.hasTitle?"":void 0};this.progress.set(e,{definition:s,lastScaledSize:e.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:o,title:a}of e)t||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{t||(t=!0,this.progress.delete(e),this.refreshProgress({delta:1}))};return te(N({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let t=tt(this.configuration,Date.now()-this.startTime,qe.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${t}`:e;this.errorCount>0?this.reportError(X.UNNAMED,i):this.warningCount>0?this.reportWarning(X.UNNAMED,i):this.reportInfo(X.UNNAMED,i)}writeLine(e,{truncate:t}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:t})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:t}={}){this.forgettableLines=[],this.writeLine(e,{truncate:t})}writeLines(e,{truncate:t}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:t})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:t}){let i=this.cacheHitCount-e,n=this.cacheMissCount-t;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${It(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${It(this.configuration,this.lastCacheMiss)})`),this.reportInfo(X.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let t of e)t.committed=!0,t.action()}clearProgress({delta:e=0,clear:t=!1}){this.progressStyle!==null&&this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||t)&&this.stdout.write(""))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>N9&&(this.progressFrame=(this.progressFrame+1)%F9.length,this.progressTime=e);let t=F9[this.progressFrame];for(let i of this.progress.values()){let n="";if(typeof i.lastScaledSize!="undefined"){let l=this.progressStyle.chars[0].repeat(i.lastScaledSize),c=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize);n=` ${l}${c}`}let s=this.formatName(null),o=s?`${s}: `:"",a=i.definition.title?` ${i.definition.title}`:"";this.stdout.write(`${tt(this.configuration,"\u27A4","blueBright")} ${o}${t}${n}${a} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},N9)}refreshProgress({delta:e=0,force:t=!1}={}){let i=!1,n=!1;if(t||this.progress.size===0)i=!0;else for(let s of this.progress.values()){let o=typeof s.definition.progress!="undefined"?Math.trunc(this.progressMaxScaledSize*s.definition.progress):void 0,a=s.lastScaledSize;s.lastScaledSize=o;let l=s.lastTitle;if(s.lastTitle=s.definition.title,o!==a||(n=l!==s.definition.title)){i=!0;break}}i&&(this.clearProgress({delta:e,clear:n}),this.writeProgress())}truncate(e,{truncate:t}={}){return this.progressStyle===null&&(t=!1),typeof t=="undefined"&&(t=this.configuration.get("preferTruncatedLines")),t&&(e=(0,R9.default)(e,0,this.stdout.columns-1)),e}formatName(e){return T9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Ur="3.2.2";var hn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(hn||(hn={}));async function AA(r,e,t,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${t}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await K.writeFilePromise(k.format({dir:r,name:e,ext:".cmd"}),n)}await K.writeFilePromise(k.join(r,e),`#!/bin/sh -exec "${t}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function K9(r){let e=await At.tryFind(r);if(e==null?void 0:e.packageManager){let i=lw(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?hn.Yarn1:hn.Yarn2,reason:n};case"npm":return{packageManager:hn.Npm,reason:n};case"pnpm":return{packageManager:hn.Pnpm,reason:n}}}}let t;try{t=await K.readFilePromise(k.join(r,kt.lockfile),"utf8")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:hn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:hn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:K.existsSync(k.join(r,"package-lock.json"))?{packageManager:hn.Npm,reason:`found npm's "package-lock.json" lockfile`}:K.existsSync(k.join(r,"pnpm-lock.yaml"))?{packageManager:hn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Yd({project:r,locator:e,binFolder:t,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=H.fromPortablePath(t);n.BERRY_BIN_FOLDER=H.fromPortablePath(s);let o=process.env.COREPACK_ROOT?H.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([AA(t,"node",process.execPath),...Ur!==null?[AA(t,"run",process.execPath,[o,"run"]),AA(t,"yarn",process.execPath,[o]),AA(t,"yarnpkg",process.execPath,[o]),AA(t,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),r&&(n.INIT_CWD=H.fromPortablePath(r.configuration.startingCwd),n.PROJECT_CWD=H.fromPortablePath(r.cwd)),n.PATH=n.PATH?`${s}${H.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${H.sep}yarn`,n.npm_node_execpath=`${s}${H.sep}node`,e){if(!r)throw new Error("Assertion failed: Missing project");let u=r.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=r.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=Ot(e),n.npm_package_version=g;let f;if(u)f=u.cwd;else{let h=r.storedPackages.get(e.locatorHash);if(!h)throw new Error(`Package for ${It(r.configuration,e)} not found in the project`);let p=r.configuration.getLinkers(),m={project:r,report:new Je({stdout:new El.PassThrough,configuration:r.configuration})},y=p.find(b=>b.supportsPackage(h,m));if(!y)throw new Error(`The package ${It(r.configuration,h)} isn't supported by any of the available linkers`);f=await y.findPackageLocation(h,m)}n.npm_package_json=H.fromPortablePath(k.join(f,kt.manifest))}let a=Ur!==null?`yarn/${Ur}`:`yarn/${Og("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.version} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),r&&await r.configuration.triggerHook(u=>u.setupScriptEnvironment,r,n,async(u,g,f)=>await AA(t,Jr(u),g,f)),n}var HDe=2,jDe=(0,M9.default)(HDe);async function GDe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await jDe(async()=>{await K.mktempPromise(async o=>{let a=k.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:H.fromPortablePath(r),report:i}),g=s&&ea(s)?gd(s):s,f=g?Rs(g):"an external project";c.write(`Packing ${f} from sources -`);let h=await K9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} - -`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=hn.Yarn2),await K.mktempPromise(async m=>{let y=await Yd({binFolder:m}),v=new Map([[hn.Yarn1,async()=>{let T=n!==null?["workspace",n]:[],q=await ra("yarn",["set","version","classic","--only-if-needed"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;await K.appendFilePromise(k.join(r,".npmignore"),`/.yarn -`),c.write(` -`),delete y.NODE_ENV;let Y=await ra("yarn",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(Y.code!==0)return Y.code;c.write(` -`);let $=await ra("yarn",[...T,"pack","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[hn.Yarn2,async()=>{let T=n!==null?["workspace",n]:[];y.YARN_ENABLE_INLINE_BUILDS="1";let q=k.join(r,kt.lockfile);await K.existsPromise(q)||await K.writeFilePromise(q,"");let Y=await ra("yarn",[...T,"pack","--install-if-needed","--filename",H.fromPortablePath(e)],{cwd:r,env:y,stdin:l,stdout:c,stderr:u});return Y.code!==0?Y.code:0}],[hn.Npm,async()=>{if(n!==null){let A=new El.PassThrough,oe=Tg(A);A.pipe(c,{end:!1});let ce=await ra("npm",["--version"],{cwd:r,env:y,stdin:l,stdout:A,stderr:u,end:ss.Never});if(A.end(),ce.code!==0)return c.end(),u.end(),ce.code;let Z=(await oe).toString().trim();if(!qc(Z,">=7.x")){let O=$o(null,"npm"),L=rr(O,Z),de=rr(O,">=7.x");throw new Error(`Workspaces aren't supported by ${sr(t,L)}; please upgrade to ${sr(t,de)} (npm has been detected as the primary package manager for ${tt(t,r,qe.PATH)})`)}}let T=n!==null?["--workspace",n]:[];delete y.npm_config_user_agent,delete y.npm_config_production,delete y.NPM_CONFIG_PRODUCTION,delete y.NODE_ENV;let q=await ra("npm",["install"],{cwd:r,env:y,stdin:l,stdout:c,stderr:u,end:ss.ErrorCode});if(q.code!==0)return q.code;let Y=new El.PassThrough,$=Tg(Y);Y.pipe(c);let _=await ra("npm",["pack","--silent",...T],{cwd:r,env:y,stdin:l,stdout:Y,stderr:u});if(_.code!==0)return _.code;let ne=(await $).toString().trim().replace(/^.*\n/s,""),ee=k.resolve(r,H.toPortablePath(ne));return await K.renamePromise(ee,e),0}]]).get(p);if(typeof v=="undefined")throw new Error("Assertion failed: Unsupported workflow");let x=await v();if(!(x===0||typeof x=="undefined"))throw K.detachTemp(o),new ct(X.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${x}, logs can be found here: ${tt(t,a,qe.PATH)})`)})})})}async function YDe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return tD(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t.configuration,r)} not found in the project`);return await Is.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Je({stdout:new El.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${It(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new _t(u,{baseFs:s});return(await At.find(Me.dot,{baseFs:g})).scripts.has(e)},{libzip:await fn()})}async function nB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await U9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Xw(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await K.mktempPromise(async l=>{let{env:c,cwd:u}=await U9(r,{project:n,binFolder:l,cwd:i});return await Xw(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function qDe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await Yd({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await H9(r),([s,[,o]])=>AA(e,Jr(s),process.execPath,[o]))),typeof t=="undefined"&&(t=k.dirname(await K.realpathPromise(k.join(r.cwd,"package.json")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function U9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return qDe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${It(e.configuration,r)} not found in the project`);return await Is.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Je({stdout:new El.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${It(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Yd({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await sB(r,{project:e}),([y,[,b]])=>AA(t,Jr(y),process.execPath,[b])));let h=await g.findPackageLocation(o,u),p=new _t(h,{baseFs:a}),m=await At.find(Me.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:m,binFolder:t,env:f,cwd:i}},{libzip:await fn()})}async function j9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await nB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function tD(r,e){return r.manifest.scripts.has(e)}async function G9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await K.mktempPromise(async o=>{let a=k.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${H.fromPortablePath(r.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:It(n,r.anchoredLocator),header:l});i.reportInfo(X.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await j9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw K.detachTemp(o),new ct(X.LIFECYCLE_SCRIPT,`${(0,O9.default)(e)} script failed (exit code ${tt(n,g,qe.NUMBER)}, logs can be found here: ${tt(n,a,qe.PATH)}); run ${tt(n,`yarn ${e}`,qe.CODE)} to investigate`)})}async function JDe(r,e,t){tD(r,e)&&await G9(r,e,t)}async function sB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${It(t,r)} not found in the project`);let s=new El.Writable,o=t.getLinkers(),a={project:e,report:new Je({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${sr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return zo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return zo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return zo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===zo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,H.fromPortablePath(k.resolve(f,p))])}return i}async function H9(r){return await sB(r.anchoredLocator,{project:r.project})}async function Y9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await sB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${It(n.configuration,r)}`);return await K.mktempPromise(async g=>{let[,f]=u,h=await Yd({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([m,[,y]])=>AA(h.BERRY_BIN_FOLDER,Jr(m),process.execPath,[y])));let p;try{p=await ra(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await K.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function WDe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await Y9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Bi={};ft(Bi,{convertToZip:()=>iNe,extractArchiveTo:()=>sNe,makeArchiveFromDirectory:()=>rNe});var T6=ge(require("stream")),O6=ge(P6());var D6=ge(require("os")),R6=ge(gg()),F6=ge(require("worker_threads")),Dl=Symbol("kTaskInfo"),pR=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,R6.default)(Math.max(1,(0,D6.cpus)().length));this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new F6.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",t=>{if(!e[Dl])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Dl].resolve(t),e[Dl]=null,e.unref(),this.workers.push(e)}),e.on("error",t=>{var i;(i=e[Dl])==null||i.reject(t),e[Dl]=null}),e.on("exit",t=>{var i;t!==0&&((i=e[Dl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[Dl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[Dl]={resolve:n,reject:s},t.postMessage(e)})})}};var M6=ge(L6());async function rNe(r,{baseFs:e=new ar,prefixPath:t=Me.root,compressionLevel:i,inMemory:n=!1}={}){let s=await fn(),o;if(n)o=new li(null,{libzip:s,level:i});else{let l=await K.mktempPromise(),c=k.join(l,"archive.zip");o=new li(c,{create:!0,libzip:s,level:i})}let a=k.resolve(Me.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var K6;async function iNe(r,e){let t=await K.mktempPromise(),i=k.join(t,"archive.zip");return K6||(K6=new pR((0,M6.getContent)())),await K6.run({tmpFile:i,tgz:r,opts:e}),new li(i,{libzip:await fn(),level:e.compressionLevel})}async function*nNe(r){let e=new O6.default.Parse,t=new T6.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{t.write(i)}),e.on("error",i=>{t.destroy(i)}),e.on("close",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function sNe(r,e,{stripComponents:t=0,prefixPath:i=Me.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=t)}for await(let a of nNe(r)){if(n(a))continue;let l=k.normalize(H.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=t)continue;let c=l.slice(t).join("/"),u=k.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.writeFileSync(u,await Tg(a),{mode:g}),e.utimesSync(u,Rr.SAFE_TIME,Rr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(k.dirname(u),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,Rr.SAFE_TIME,Rr.SAFE_TIME);break}}return e}var ls={};ft(ls,{emitList:()=>oNe,emitTree:()=>q6,treeNodeToJson:()=>Y6,treeNodeToTreeify:()=>G6});var j6=ge(H6());function G6(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Ry(e,l,Tc.BOLD)),typeof c!="undefined"&&g.push(tt(e,c[0],c[1])),g.length===0&&g.push(Ry(e,`${a}`,Tc.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof r.children=="undefined")throw new Error("The root node must only contain children");return i(r.children,t),t}function Y6(r){let e=t=>{var s;if(typeof t.children=="undefined"){if(typeof t.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Oc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value=="undefined"?n:{value:Oc(t.value[0],t.value[1]),children:n}};return e(r)}function oNe(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));q6({children:n},{configuration:e,stdout:t,json:i})}function q6(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(Y6(l))} -`);return}let s=(0,j6.asTree)(G6(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");t.write(s)}var J6=ge(require("crypto")),mR=ge(require("fs"));var aNe=8,Nt=class{constructor(e,{configuration:t,immutable:i=t.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,J6.randomBytes)(8).toString("hex")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get("compressionLevel"),a=o!==lc?`c${o}`:"";this.cacheKey=[aNe,a].join("")}}static async find(e,{immutable:t,check:i}={}){let n=new Nt(e.get("cacheFolder"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Jg(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=ANe(t).slice(0,10);return`${Jg(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?k.resolve(this.cwd,this.getVersionFilename(e)):t===null||ER(t)!==this.cacheKey?null:k.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?k.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await K.existsPromise(this.cwd))throw new ct(X.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await K.mkdirPromise(this.cwd,{recursive:!0});let e=k.resolve(this.cwd,".gitignore");await K.changeFilePromise(e,`/.gitignore -*.flock -*.tmp -`)}(this.mirrorCwd||!this.immutable)&&await K.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=Or(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new ar,g=()=>{let oe=new li(null,{libzip:q}),ce=k.join(Me.root,ek(e));return oe.mkdirSync(ce,{recursive:!0}),oe.writeJsonSync(k.join(ce,kt.manifest),{name:Ot(e),mocked:!0}),oe},f=async(oe,ce=null)=>{var O;if(ce===null&&((O=o.unstablePackages)==null?void 0:O.has(e.locatorHash)))return null;let Z=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(oe)}`:t;if(ce!==null){let L=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await sw(ce)}`:t;if(Z!==L)throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(t!==null&&Z!==t){let L;switch(this.check?L="throw":ER(t)!==ER(Z)?L="update":L=this.configuration.get("checksumBehavior"),L){case"ignore":return t;case"update":return Z;default:case"throw":throw new ct(X.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return Z},h=async oe=>{if(!s)throw new Error(`Cache check required but no loader configured for ${It(this.configuration,e)}`);let ce=await s(),Z=ce.getRealPath();return ce.saveAndClose(),await K.chmodPromise(Z,420),await f(oe,Z)},p=async()=>{if(c===null||!await K.existsPromise(c)){let oe=await s(),ce=oe.getRealPath();return oe.saveAndClose(),{source:"loader",path:ce}}return{source:"mirror",path:c}},m=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${It(this.configuration,e)}`);if(this.immutable)throw new ct(X.IMMUTABLE_CACHE,`Cache entry required but missing for ${It(this.configuration,e)}`);let{path:oe,source:ce}=await p(),Z=await f(oe),O=this.getLocatorPath(e,Z,o);if(!O)throw new Error("Assertion failed: Expected the cache path to be available");let L=[];ce!=="mirror"&&c!==null&&L.push(async()=>{let Be=`${c}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,c)}),(!o.mirrorWriteOnly||c===null)&&L.push(async()=>{let Be=`${O}${this.cacheId}`;await K.copyFilePromise(oe,Be,mR.default.constants.COPYFILE_FICLONE),await K.chmodPromise(Be,420),await K.renamePromise(Be,O)});let de=o.mirrorWriteOnly&&c!=null?c:O;return await Promise.all(L.map(Be=>Be())),[!1,de,Z]},y=async()=>{let ce=(async()=>{var je;let Z=this.getLocatorPath(e,t,o),O=Z!==null?await u.existsPromise(Z):!1,L=!!((je=o.mockedPackages)==null?void 0:je.has(e.locatorHash))&&(!this.check||!O),de=L||O,Be=de?i:n;if(Be&&Be(),de){let re=null,se=Z;return L||(re=this.check?await h(se):await f(se)),[L,se,re]}else return m()})();this.mutexes.set(e.locatorHash,ce);try{return await ce}finally{this.mutexes.delete(e.locatorHash)}};for(let oe;oe=this.mutexes.get(e.locatorHash);)await oe;let[b,v,x]=await y();this.markedFiles.add(v);let T,q=await fn(),Y=b?()=>g():()=>new li(v,{baseFs:u,libzip:q,readOnly:!0}),$=new _h(()=>Rv(()=>T=Y(),oe=>`Failed to open the cache entry for ${It(this.configuration,e)}: ${oe}`),k),_=new Na(v,{baseFs:$,pathUtils:k}),ne=()=>{T==null||T.discardAndClose()},ee=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:x;return[_,ne,ee]}};function ER(r){let e=r.indexOf("/");return e!==-1?r.slice(0,e):null}function ANe(r){let e=r.indexOf("/");return e!==-1?r.slice(e+1):r}var cs;(function(t){t[t.SCRIPT=0]="SCRIPT",t[t.SHELLCODE=1]="SHELLCODE"})(cs||(cs={}));var pA=class extends Ji{constructor({configuration:e,stdout:t,suggestInstall:i=!0}){super();this.errorCount=0;nd(this,{configuration:e}),this.configuration=e,this.stdout=t,this.suggestInstall=i}static async start(e,t){let i=new this(e);try{await t(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){this.errorCount+=1,this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${t} -`)}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${tt(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var i0=ge(require("crypto"));function dA(){}dA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var m=-1*c;m<=c;m+=2){var y=void 0,b=g[m-1],v=g[m+1],x=(v?v.newPos:0)-m;b&&(g[m-1]=void 0);var T=b&&b.newPos+1=a&&x+1>=l)return o(lNe(s,y.components,t,e,s.useLongestToken));g[m]=y}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();h()||m()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?m:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&r.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function cNe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var nAt=new dA;var W6=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,z6=/\S/,_6=new dA;_6.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!z6.test(r)&&!z6.test(e)};_6.tokenize=function(r){for(var e=r.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),t=0;tr.length)&&(e=r.length);for(var t=0,i=new Array(e);t0?l(Y.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(q=f).push.apply(q,yR(T.map(function(Z){return(x.added?"+":"-")+Z}))),x.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&v=a.length-2&&T.length<=o.context){var A=/\n$/.test(t),oe=/\n$/.test(i),ce=T.length==0&&f.length>ee.oldLines;!A&&ce&&t.length>0&&f.splice(ee.oldLines,0,"\\ No newline at end of file"),(!A&&!ce||!oe)&&f.push("\\ No newline at end of file")}c.push(ee),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y`${t}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(r,e,t="",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(r,e)=>cw({protocol:"npm:",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],NR=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=k.join(e.cwd,e.configuration.get("lockfileFilename"));if(!K.existsSync(i))return;let n=await K.readFilePromise(i,"utf8"),s=Si(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=pd(a);if(!l){t.reportWarning(X.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}po(l.range)&&(l=rr(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of JOe){let m=u.match(h);if(m){g=p(c,...m);break}}if(!g){t.reportWarning(X.YARN_IMPORT_FAILED,`${sr(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=qg(l.range),p=pd(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,cn(f,g))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return await this.resolver.getCandidates(_x(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var LR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Aw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Aw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var TR=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,t,i){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,t){throw new ct(X.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var di=class extends Ji{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t=="function"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t=="function"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){let t=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return te(N({},t),{stop:i})}reportJson(e){}async finalize(){}};var iZ=ge(Wx());var CC=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await At.tryFind(this.cwd))!=null?s:new At,this.relativeCwd=k.relative(this.project.cwd,this.cwd)||Me.dot;let e=this.manifest.name?this.manifest.name:$o(null,`${this.computeCandidateName()}-${ln(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:"0.0.0";this.locator=cn(e,t),this.anchoredDescriptor=rr(this.locator,`${oi.protocol}${this.relativeCwd}`),this.anchoredLocator=cn(this.locator,`${oi.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o),n=await(0,iZ.default)(i,{cwd:H.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let o of n){let a=k.resolve(this.cwd,H.toPortablePath(o));K.existsSync(k.join(a,"package.json"))&&this.workspacesCwds.add(a)}}accepts(e){var o;let t=e.indexOf(":"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===oi.protocol&&k.normalize(n)===this.relativeCwd||i===oi.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=po(n);return s?i===oi.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${k.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=At.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&hd(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=k.join(this.cwd,At.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await K.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var oZ=6,WOe=1,zOe=/ *, */g,aZ=/\/$/,_Oe=32,VOe=(0,OR.promisify)(KR.default.gzip),XOe=(0,OR.promisify)(KR.default.gunzip),Ci;(function(t){t.UpdateLockfile="update-lockfile",t.SkipBuild="skip-build"})(Ci||(Ci={}));var UR={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},AZ=r=>ln(`${WOe}`,r),ze=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,m,y;if(!e.projectCwd)throw new Pe(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,K.existsSync(k.join(s,kt.manifest))){i=s;break}n=k.dirname(s)}let o=new ze(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(m=ye.telemetry)==null||m.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((b,v)=>b+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=tt(e,o.cwd,qe.PATH),u=tt(e,k.relative(o.cwd,i),qe.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new Pe(`The nearest package directory (${tt(e,i,qe.PATH)}) doesn't seem to be part of the project declared in ${tt(e,o.cwd,qe.PATH)}. - -${[g,f,h].join(` -`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t=this.configuration.get("defaultLanguageName");if(K.existsSync(e)){let n=await K.readFilePromise(e,"utf8");this.lockFileChecksum=AZ(n);let s=Si(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let t=e;e=[];for(let i of t){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let t=new CC(e,{project:this});await t.setup();let i=this.workspacesByIdent.get(t.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${fi(this.configuration,t.locator)}: ${H.fromPortablePath(e)} conflicts with ${H.fromPortablePath(i.cwd)}`);return this.workspaces.push(t),this.workspacesByCwd.set(e,t),this.workspacesByIdent.set(t.locator.identHash,t),t}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){k.isAbsolute(e)||(e=k.resolve(this.cwd,e)),e=k.normalize(e).replace(/\/+$/,"");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)k.relative(i.cwd,e).startsWith("../")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t=="undefined"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${fi(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(Al(e)&&(e=ud(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${sr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(ea(e)&&(e=gd(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${It(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${Cd(this.configuration,e)} (${tt(this.configuration,k.join(e.cwd,kt.manifest),qe.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}forgetResolution(e){let t=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);t(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&t(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let t of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(t,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(t)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)Al(i)&&e.dependencies.set(t,ud(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!sZ.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new di,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(aZ,"")!==e.replace(aZ,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new NR(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new TR(t)]:[i,t],s=new wd([new LR(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,m=new Set,y=[],b=ck(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ji.progressViaTitle(),async ne=>{let ee=async O=>{let L=await Lg(async()=>await s.resolve(O,a),je=>`${It(this.configuration,O)}: ${je}`);if(!hd(O,L))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${It(this.configuration,O)} to ${It(this.configuration,L)})`);g.set(L.locatorHash,L);let de=this.configuration.normalizePackage(L);for(let[je,re]of de.dependencies){let se=await this.configuration.reduceHook(he=>he.reduceDependency,re,this,de,re,{resolver:s,resolveOptions:a});if(!fd(re,se))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let be=s.bindDescriptor(se,O,a);de.dependencies.set(je,be)}let Be=go([...de.dependencies.values()].map(je=>Z(je)));return y.push(Be),Be.catch(()=>{}),c.set(de.locatorHash,de),de},A=async O=>{let L=f.get(O.locatorHash);if(typeof L!="undefined")return L;let de=Promise.resolve().then(()=>ee(O));return f.set(O.locatorHash,de),de},oe=async(O,L)=>{let de=await Z(L);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,de.locatorHash),de},ce=async O=>{ne.setTitle(sr(this.configuration,O));let L=this.resolutionAliases.get(O.descriptorHash);if(typeof L!="undefined")return oe(O,this.storedDescriptors.get(L));let de=s.getResolutionDependencies(O,a),Be=new Map(await go(de.map(async se=>{let be=s.bindDescriptor(se,p,a),he=await Z(be);return m.add(he.locatorHash),[se.descriptorHash,he]}))),re=(await Lg(async()=>await s.getCandidates(O,Be,a),se=>`${sr(this.configuration,O)}: ${se}`))[0];if(typeof re=="undefined")throw new Error(`${sr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,re.locatorHash),A(re)},Z=O=>{let L=h.get(O.descriptorHash);if(typeof L!="undefined")return L;l.set(O.descriptorHash,O);let de=Promise.resolve().then(()=>ce(O));return h.set(O.descriptorHash,de),de};for(let O of this.workspaces){let L=O.anchoredDescriptor;y.push(Z(L))}for(;y.length>0;){let O=[...y];y.length=0,await go(O)}});let x=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),q=new Set,Y=new Map;ZOe({project:this,report:e.report,accessibleLocators:q,volatileDescriptors:x,optionalBuilds:T,peerRequirements:Y,allDescriptors:l,allResolutions:u,allPackages:c});for(let ne of m)T.delete(ne);for(let ne of x)l.delete(ne),u.delete(ne);let $=new Set,_=new Set;for(let ne of c.values())ne.conditions!=null&&(!T.has(ne.locatorHash)||(gw(ne,v)||(gw(ne,b)&&e.report.reportWarningOnce(X.GHOST_ARCHITECTURE,`${It(this.configuration,ne)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${tt(this.configuration,"supportedArchitectures",Ri.SETTING)} setting`),_.add(ne.locatorHash)),$.add(ne.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=q,this.conditionalLocators=$,this.disabledLocators=_,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=Y,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(kn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return Rs(h)}])));n===Ci.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Ji.progressViaCounter(l.length);t.reportProgress(u);let g=(0,nZ.default)(_Oe);if(await t.startCacheReport(async()=>{await go(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(ea(h))return;let p;try{p=await o.fetch(h,a)}catch(m){m.message=`${It(this.configuration,h)}: ${m.message}`,t.reportExceptionOnce(m),c=m;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var A,oe,ce;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(Z=>{let O=Z.makeInstaller(c),L=O.getCustomDataKey(),de=this.installersCustomData.get(L);return typeof de!="undefined"&&O.attachCustomData(de),[Z,O]})),g=new Map,f=new Map,h=new Map,p=new Map(await go([...this.accessibleLocators].map(async Z=>{let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");return[Z,await o.fetch(O,a)]}))),m=[];for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(typeof O=="undefined")throw new Error("Assertion failed: The locator should have been registered");let L=p.get(O.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let de=[],Be=re=>{de.push(re)},je=this.tryWorkspaceByLocator(O);if(je!==null){let re=[],{scripts:se}=je.manifest;for(let he of["preinstall","install","postinstall"])se.has(he)&&re.push([cs.SCRIPT,he]);try{for(let[he,Fe]of u)if(he.supportsPackage(O,c)&&(await Fe.installPackage(O,L,{holdFetchResult:Be})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{de.length===0?(A=L.releaseFs)==null||A.call(L):m.push(go(de).catch(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}let be=k.join(L.packageFs.getRealPath(),L.prefixPath);f.set(O.locatorHash,be),!ea(O)&&re.length>0&&h.set(O.locatorHash,{directives:re,buildLocations:[be]})}else{let re=l.find(he=>he.supportsPackage(O,c));if(!re)throw new ct(X.LINKER_NOT_FOUND,`${It(this.configuration,O)} isn't supported by any available linker`);let se=u.get(re);if(!se)throw new Error("Assertion failed: The installer should have been registered");let be;try{be=await se.installPackage(O,L,{holdFetchResult:Be})}finally{de.length===0?(oe=L.releaseFs)==null||oe.call(L):m.push(go(de).then(()=>{}).then(()=>{var he;(he=L.releaseFs)==null||he.call(L)}))}g.set(O.locatorHash,re),f.set(O.locatorHash,be.packageLocation),be.buildDirective&&be.buildDirective.length>0&&be.packageLocation&&h.set(O.locatorHash,{directives:be.buildDirective,buildLocations:[be.packageLocation]})}}let y=new Map;for(let Z of this.accessibleLocators){let O=this.storedPackages.get(Z);if(!O)throw new Error("Assertion failed: The locator should have been registered");let L=this.tryWorkspaceByLocator(O)!==null,de=async(Be,je)=>{let re=f.get(O.locatorHash);if(typeof re=="undefined")throw new Error(`Assertion failed: The package (${It(this.configuration,O)}) should have been registered`);let se=[];for(let be of O.dependencies.values()){let he=this.storedResolutions.get(be.descriptorHash);if(typeof he=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,be)}, from ${It(this.configuration,O)})should have been registered`);let Fe=this.storedPackages.get(he);if(typeof Fe=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);let Ke=this.tryWorkspaceByLocator(Fe)===null?g.get(he):null;if(typeof Ke=="undefined")throw new Error(`Assertion failed: The package (${he}, resolved from ${sr(this.configuration,be)}) should have been registered`);Ke===Be||Ke===null?f.get(Fe.locatorHash)!==null&&se.push([be,Fe]):!L&&re!==null&&Fg(y,he).push(re)}re!==null&&await je.attachInternalDependencies(O,se)};if(L)for(let[Be,je]of u)Be.supportsPackage(O,c)&&await de(Be,je);else{let Be=g.get(O.locatorHash);if(!Be)throw new Error("Assertion failed: The linker should have been found");let je=u.get(Be);if(!je)throw new Error("Assertion failed: The installer should have been registered");await de(Be,je)}}for(let[Z,O]of y){let L=this.storedPackages.get(Z);if(!L)throw new Error("Assertion failed: The package should have been registered");let de=g.get(L.locatorHash);if(!de)throw new Error("Assertion failed: The linker should have been found");let Be=u.get(de);if(!Be)throw new Error("Assertion failed: The installer should have been registered");await Be.attachExternalDependents(L,O)}let b=new Map;for(let Z of u.values()){let O=await Z.finalizeInstall();for(let L of(ce=O==null?void 0:O.records)!=null?ce:[])h.set(L.locatorHash,{directives:L.buildDirective,buildLocations:L.buildLocations});typeof(O==null?void 0:O.customData)!="undefined"&&b.set(Z.getCustomDataKey(),O.customData)}if(this.installersCustomData=b,await go(m),n===Ci.SkipBuild)return;let v=new Set(this.storedPackages.keys()),x=new Set(h.keys());for(let Z of x)v.delete(Z);let T=(0,i0.createHash)("sha512");T.update(process.versions.node),await this.configuration.triggerHook(Z=>Z.globalHashGeneration,this,Z=>{T.update("\0"),T.update(Z)});let q=T.digest("hex"),Y=new Map,$=Z=>{let O=Y.get(Z.locatorHash);if(typeof O!="undefined")return O;let L=this.storedPackages.get(Z.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: The package should have been registered");let de=(0,i0.createHash)("sha512");de.update(Z.locatorHash),Y.set(Z.locatorHash,"");for(let Be of L.dependencies.values()){let je=this.storedResolutions.get(Be.descriptorHash);if(typeof je=="undefined")throw new Error(`Assertion failed: The resolution (${sr(this.configuration,Be)}) should have been registered`);let re=this.storedPackages.get(je);if(typeof re=="undefined")throw new Error("Assertion failed: The package should have been registered");de.update($(re))}return O=de.digest("hex"),Y.set(Z.locatorHash,O),O},_=(Z,O)=>{let L=(0,i0.createHash)("sha512");L.update(q),L.update($(Z));for(let de of O)L.update(de);return L.digest("hex")},ne=new Map,ee=!1;for(;x.size>0;){let Z=x.size,O=[];for(let L of x){let de=this.storedPackages.get(L);if(!de)throw new Error("Assertion failed: The package should have been registered");let Be=!0;for(let se of de.dependencies.values()){let be=this.storedResolutions.get(se.descriptorHash);if(!be)throw new Error(`Assertion failed: The resolution (${sr(this.configuration,se)}) should have been registered`);if(x.has(be)){Be=!1;break}}if(!Be)continue;x.delete(L);let je=h.get(de.locatorHash);if(!je)throw new Error("Assertion failed: The build directive should have been registered");let re=_(de,je.buildLocations);if(this.storedBuildState.get(de.locatorHash)===re){ne.set(de.locatorHash,re);continue}ee||(await this.persistInstallStateFile(),ee=!0),this.storedBuildState.has(de.locatorHash)?t.reportInfo(X.MUST_REBUILD,`${It(this.configuration,de)} must be rebuilt because its dependency tree changed`):t.reportInfo(X.MUST_BUILD,`${It(this.configuration,de)} must be built because it never has been before or the last one failed`);for(let se of je.buildLocations){if(!k.isAbsolute(se))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${se})`);O.push((async()=>{for(let[be,he]of je.directives){let Fe=`# This file contains the result of Yarn building a package (${Rs(de)}) -`;switch(be){case cs.SCRIPT:Fe+=`# Script name: ${he} -`;break;case cs.SHELLCODE:Fe+=`# Script code: ${he} -`;break}let Ke=null;if(!await K.mktempPromise(async ve=>{let pe=k.join(ve,"build.log"),{stdout:V,stderr:Qe}=this.configuration.getSubprocessStreams(pe,{header:Fe,prefix:It(this.configuration,de),report:t}),le;try{switch(be){case cs.SCRIPT:le=await nB(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break;case cs.SHELLCODE:le=await rD(de,he,[],{cwd:se,project:this,stdin:Ke,stdout:V,stderr:Qe});break}}catch(gt){Qe.write(gt.stack),le=1}if(V.end(),Qe.end(),le===0)return ne.set(de.locatorHash,re),!0;K.detachTemp(ve);let fe=`${It(this.configuration,de)} couldn't be built successfully (exit code ${tt(this.configuration,le,qe.NUMBER)}, logs can be found here: ${tt(this.configuration,pe,qe.PATH)})`;return this.optionalBuilds.has(de.locatorHash)?(t.reportInfo(X.BUILD_FAILED,fe),ne.set(de.locatorHash,re),!0):(t.reportError(X.BUILD_FAILED,fe),!1)}))return}})())}}if(await go(O),Z===x.size){let L=Array.from(x).map(de=>{let Be=this.storedPackages.get(de);if(!Be)throw new Error("Assertion failed: The package should have been registered");return It(this.configuration,Be)}).join(", ");t.reportError(X.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${L})`);break}}this.storedBuildState=ne}async install(e){var a,l;let t=this.configuration.get("nodeLinker");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=qi.Inactive;let i=k.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await K.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=tt(this.configuration,g,qe.PACKAGE_EXTENSION);switch(g.status){case qi.Inactive:e.report.reportWarning(X.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case qi.Redundant:e.report.reportWarning(X.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=sc(n,this.generateLockfile());if(c!==n){let u=V6(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.ADDED)):f.startsWith("-")?e.report.reportError(X.FROZEN_LOCKFILE_EXCEPTION,tt(this.configuration,f,qe.REMOVED)):e.report.reportInfo(null,tt(this.configuration,f,"grey"))}e.report.reportSeparator()}throw new ct(X.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===qi.Active&&((l=ye.telemetry)==null||l.reportPackageExtension(Oc(g,qe.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==Ci.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>ow(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===Ci.UpdateLockfile){e.report.reportWarning(X.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${tt(this.configuration,"mode=update-lockfile",qe.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>ow(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:oZ,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>Pn(f)).sort().join(", "),c=new At;c.version=o.linkType===Qt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey=="undefined"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]=te(N({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:Rs(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Ma(t)}async persistLockfile(){let e=k.join(this.cwd,this.configuration.get("lockfileFilename")),t="";try{t=await K.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=sc(t,i);n!==t&&(await K.writeFilePromise(e,n),this.lockFileChecksum=AZ(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(UR))e.push(...o);let t=(0,n0.default)(this,e),i=MR.default.serialize(t),n=ln(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await K.mkdirPromise(k.dirname(s),{recursive:!0}),await K.writeFilePromise(s,await VOe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath"),s;try{let o=await XOe(await K.readFilePromise(n));s=MR.default.deserialize(o),this.installStateChecksum=ln(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData!="undefined"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,n0.default)(s,UR.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,n0.default)(s,UR.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new di}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:t}){if(this.configuration.get("enableGlobalCache"))return;let i=new Set([".gitignore"]);if(!Ak(e.cwd,this.cwd)||!await K.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await K.readdirPromise(e.cwd)){if(i.has(a))continue;let l=k.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(X.IMMUTABLE_CACHE,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(X.UNUSED_CACHE_ENTRY,`${tt(this.configuration,k.basename(l),"magenta")} appears to be unused - removing`),await K.removePromise(l)))}n&&s!==0&&t.reportInfo(X.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function ZOe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,m=new Map,y=new Map,b=new Map(r.workspaces.map(ee=>{let A=ee.anchoredLocator.locatorHash,oe=i.get(A);if(typeof oe=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,cd(oe)]})),v=()=>{let ee=K.mktempSync(),A=k.join(ee,"stacktrace.log"),oe=String(g.length+1).length,ce=g.map((Z,O)=>`${`${O+1}.`.padStart(oe," ")} ${Rs(Z)} -`).join("");throw K.writeFileSync(A,ce),K.detachTemp(ee),new ct(X.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${H.fromPortablePath(A)}`)},x=ee=>{let A=t.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let oe=i.get(A);if(!oe)throw new Error("Assertion failed: The package could not be found");return oe},T=(ee,A,oe,{top:ce,optional:Z})=>{g.length>1e3&&v(),g.push(A);let O=q(ee,A,oe,{top:ce,optional:Z});return g.pop(),O},q=(ee,A,oe,{top:ce,optional:Z})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),Z||s.delete(A.locatorHash);let O=i.get(A.locatorHash);if(!O){if(c)return;throw new Error(`Assertion failed: The package (${It(r.configuration,A)}) should have been registered`)}let L=[],de=[],Be=[],je=[],re=[];for(let be of Array.from(O.dependencies.values())){if(O.peerDependencies.has(be.identHash)&&O.locatorHash!==ce)continue;if(Al(be))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");a.delete(be.descriptorHash);let he=Z;if(!he){let Qe=O.dependenciesMeta.get(Ot(be));if(typeof Qe!="undefined"){let le=Qe.get(null);typeof le!="undefined"&&le.optional&&(he=!0)}}let Fe=t.get(be.descriptorHash);if(!Fe){if(c)continue;throw new Error(`Assertion failed: The resolution (${sr(r.configuration,be)}) should have been registered`)}let Ke=b.get(Fe)||i.get(Fe);if(!Ke)throw new Error(`Assertion failed: The package (${Fe}, resolved from ${sr(r.configuration,be)}) should have been registered`);if(Ke.peerDependencies.size===0){T(be,Ke,new Map,{top:ce,optional:he});continue}let ke,ve,pe=new Set,V;de.push(()=>{ke=Vx(be,A.locatorHash),ve=Xx(Ke,A.locatorHash),O.dependencies.delete(be.identHash),O.dependencies.set(ke.identHash,ke),t.set(ke.descriptorHash,ve.locatorHash),e.set(ke.descriptorHash,ke),i.set(ve.locatorHash,ve),L.push([Ke,ke,ve])}),Be.push(()=>{var Qe;V=new Map;for(let le of ve.peerDependencies.values()){let fe=O.dependencies.get(le.identHash);if(!fe&&fd(A,le)&&(ee.identHash===A.identHash?fe=ee:(fe=rr(A,ee.range),e.set(fe.descriptorHash,fe),t.set(fe.descriptorHash,A.locatorHash),a.delete(fe.descriptorHash))),(!fe||fe.range==="missing:")&&ve.dependencies.has(le.identHash)){ve.peerDependencies.delete(le.identHash);continue}fe||(fe=rr(le,"missing:")),ve.dependencies.set(fe.identHash,fe),Al(fe)&&Nc(p,fe.descriptorHash).add(ve.locatorHash),f.set(fe.identHash,fe),fe.range==="missing:"&&pe.add(fe.identHash),V.set(le.identHash,(Qe=oe.get(le.identHash))!=null?Qe:ve.locatorHash)}ve.dependencies=new Map(kn(ve.dependencies,([le,fe])=>Ot(fe)))}),je.push(()=>{if(!i.has(ve.locatorHash))return;let Qe=u.get(Ke.locatorHash);typeof Qe=="number"&&Qe>=2&&v();let le=u.get(Ke.locatorHash),fe=typeof le!="undefined"?le+1:1;u.set(Ke.locatorHash,fe),T(ke,ve,V,{top:ce,optional:he}),u.set(Ke.locatorHash,fe-1)}),re.push(()=>{let Qe=O.dependencies.get(be.identHash);if(typeof Qe=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let le=t.get(Qe.descriptorHash);if(typeof le=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Nc(y,le).add(A.locatorHash),!!i.has(ve.locatorHash)){for(let fe of ve.peerDependencies.values()){let gt=V.get(fe.identHash);if(typeof gt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Fg(Ng(m,gt),Ot(fe)).push(ve.locatorHash)}for(let fe of pe)ve.dependencies.delete(fe)}})}for(let be of[...de,...Be])be();let se;do{se=!0;for(let[be,he,Fe]of L){let Ke=Ng(h,be.locatorHash),ke=ln(...[...Fe.dependencies.values()].map(Qe=>{let le=Qe.range!=="missing:"?t.get(Qe.descriptorHash):"missing:";if(typeof le=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${sr(r.configuration,Qe)} to have been registered`);return le===ce?`${le} (top)`:le}),he.identHash),ve=Ke.get(ke);if(typeof ve=="undefined"){Ke.set(ke,he);continue}if(ve===he)continue;i.delete(Fe.locatorHash),e.delete(he.descriptorHash),t.delete(he.descriptorHash),n.delete(Fe.locatorHash);let pe=p.get(he.descriptorHash)||[],V=[O.locatorHash,...pe];p.delete(he.descriptorHash);for(let Qe of V){let le=i.get(Qe);typeof le!="undefined"&&(le.dependencies.get(he.identHash).descriptorHash!==ve.descriptorHash&&(se=!1),le.dependencies.set(he.identHash,ve))}}}while(!se);for(let be of[...je,...re])be()};for(let ee of r.workspaces){let A=ee.anchoredLocator;a.delete(ee.anchoredDescriptor.descriptorHash),T(ee.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var Y;(function(oe){oe[oe.NotProvided=0]="NotProvided",oe[oe.NotCompatible=1]="NotCompatible"})(Y||(Y={}));let $=[];for(let[ee,A]of y){let oe=i.get(ee);if(typeof oe=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let ce=m.get(ee);if(typeof ce!="undefined")for(let Z of A){let O=i.get(Z);if(typeof O!="undefined")for(let[L,de]of ce){let Be=An(L);if(O.peerDependencies.has(Be.identHash))continue;let je=`p${ln(Z,L,ee).slice(0,5)}`;o.set(je,{subject:Z,requested:Be,rootRequester:ee,allRequesters:de});let re=oe.dependencies.get(Be.identHash);if(typeof re!="undefined"){let se=x(re),be=(ne=se.version)!=null?ne:"0.0.0",he=new Set;for(let Ke of de){let ke=i.get(Ke);if(typeof ke=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let ve=ke.peerDependencies.get(Be.identHash);if(typeof ve=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");he.add(ve.range)}[...he].every(Ke=>{if(Ke.startsWith(oi.protocol)){if(!r.tryWorkspaceByLocator(se))return!1;Ke=Ke.slice(oi.protocol.length),(Ke==="^"||Ke==="~")&&(Ke="*")}return qc(be,Ke)})||$.push({type:1,subject:O,requested:Be,requester:oe,version:be,hash:je,requirementCount:de.length})}else{let se=oe.peerDependenciesMeta.get(L);(se==null?void 0:se.optional)||$.push({type:0,subject:O,requested:Be,requester:oe,hash:je})}}}}let _=[ee=>$x(ee.subject),ee=>Ot(ee.requested),ee=>`${ee.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(X.UNNAMED,`Some peer dependencies are incorrectly met; run ${tt(r.configuration,"yarn explain peer-requirements ",qe.CODE)} for details, where ${tt(r.configuration,"",qe.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let ee of kn($,_))switch(ee.type){case 0:l.reportWarning(X.MISSING_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} doesn't provide ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}), requested by ${fi(r.configuration,ee.requester)}`);break;case 1:{let A=ee.requirementCount>1?"and some of its descendants request":"requests";l.reportWarning(X.INCOMPATIBLE_PEER_DEPENDENCY,`${It(r.configuration,ee.subject)} provides ${fi(r.configuration,ee.requested)} (${tt(r.configuration,ee.hash,qe.CODE)}) with version ${dd(r.configuration,ee.version)}, which doesn't satisfy what ${fi(r.configuration,ee.requester)} ${A}`)}break}})}var ca;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(ca||(ca={}));var mC=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!K.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(ca.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(ca.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(ca.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(ca.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(ca.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(ca.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(ca.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(ca.DEPENDENCY_COUNT,String(e))}reportValue(e,t){Nc(this.values,e).add(t)}reportEnumerator(e,t){Nc(this.enumerators,e).add(ln(t))}reportHit(e,t="*"){let i=Ng(this.hits,e),n=_a(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return k.join(e,"telemetry.json")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=K.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{K.mkdirSync(k.dirname(t),{recursive:!0}),K.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>HP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=h,m.reportType="primary";for(let v of Object.keys((f=m.enumerators)!=null?f:{}))m.enumerators[v]=m.enumerators[v].length;c(m);let y=new Map,b=20;for(let[v,x]of Object.entries(m.values))x.length>0&&y.set(v,x.slice(0,b));for(;y.size>0;){let v={};v.userId=h,v.reportType="secondary",v.metrics={};for(let[x,T]of y)v.metrics[x]=T.shift(),T.length===0&&y.delete(x);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=K.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},b=y[m]=(u=y[m])!=null?u:{};for(let[v,x]of this.hits.get(m))b[v]=((g=b[v])!=null?g:0)+x}for(let m of["values","enumerators"])for(let y of this[m].keys()){let b=s[m]=(f=s[m])!=null?f:{};b[y]=[...new Set([...(h=b[y])!=null?h:[],...(p=this[m].get(y))!=null?p:[]])]}K.mkdirSync(k.dirname(e),{recursive:!0}),K.writeJsonSync(e,t)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var HR=ge(require("child_process")),lZ=ge(Ic());var jR=ge(require("fs"));var Lf=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function $Oe(r){let e=H.fromPortablePath(r);process.on("SIGINT",()=>{}),e?(0,HR.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,HR.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:te(N({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function s0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new ws({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var m,y,b,v,x;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(!Se.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!Wt.satisfiesWithPrereleases(s,o))throw new Pe(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let l=await ye.find(H.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get("yarnPath"),u=l.get("ignorePath"),g=l.get("ignoreCwd"),f=H.toPortablePath(H.resolve(process.argv[1])),h=T=>K.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(c!==null&&!u)if(!K.existsSync(c))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${l.sources.get("yarnPath")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{$Oe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get("enableTelemetry")&&!lZ.isCI&&process.stdout.isTTY&&(ye.telemetry=new mC(l,"puba9cdc10ec5790a2cf4969dd413a47270")),(m=ye.telemetry)==null||m.reportVersion(r);for(let[$,_]of l.plugins.entries()){Lf.has((b=(y=$.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:y[1])!=null?b:"")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let ne of _.commands||[])n.register(ne)}let q=n.process(process.argv.slice(2));q.help||(x=ye.telemetry)==null||x.reportCommandName(q.path.join(" "));let Y=q.cwd;if(typeof Y!="undefined"&&!g){let $=(0,jR.realpathSync)(process.cwd()),_=(0,jR.realpathSync)(Y);if($!==_){process.chdir(Y),await t();return}}await n.runExit(q,{cwd:H.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>K.rmtempPromise())}function cZ(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var GC={};ft(GC,{BaseCommand:()=>Le,WorkspaceRequiredError:()=>ht,getDynamicLibs:()=>bre,getPluginConfiguration:()=>L0,main:()=>s0,openWorkspace:()=>Wf,pluginCommands:()=>Lf});var Le=class extends Re{constructor(){super(...arguments);this.cwd=J.String("--cwd",{hidden:!0})}};var ht=class extends Pe{constructor(e,t){let i=k.relative(e,t),n=k.join(e,At.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var sGe=ge(ri());ys();var oGe=ge(UF()),bre=()=>new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",Cp],["semver",sGe],["typanion",cg],["yup",oGe]]);async function Wf(r,e){let{project:t,workspace:i}=await ze.find(r,e);if(!i)throw new ht(t.cwd,e);return i}var Q_e=ge(ri());ys();var S_e=ge(UF());var GN={};ft(GN,{dedupeUtils:()=>wN,default:()=>mWe,suggestUtils:()=>lN});var Sae=ge(Ic());var Fne=ge(WC());ys();var lN={};ft(lN,{Modifier:()=>pa,Strategy:()=>Vr,Target:()=>Hr,WorkspaceModifier:()=>Xf,applyModifier:()=>kne,extractDescriptorFromPath:()=>gN,extractRangeModifier:()=>xne,fetchDescriptorFrom:()=>uN,findProjectDescriptors:()=>Rne,getModifier:()=>zC,getSuggestedDescriptors:()=>_C,makeWorkspaceDescriptor:()=>Dne,toWorkspaceModifier:()=>Pne});var cN=ge(ri()),bYe="workspace:",Hr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(Hr||(Hr={}));var pa;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(pa||(pa={}));var Xf;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(Xf||(Xf={}));var Vr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Vr||(Vr={}));function zC(r,e){return r.exact?pa.EXACT:r.caret?pa.CARET:r.tilde?pa.TILDE:e.configuration.get("defaultSemverRangePrefix")}var QYe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function xne(r,{project:e}){let t=r.match(QYe);return t?t[1]:e.configuration.get("defaultSemverRangePrefix")}function kne(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return cN.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function Pne(r){switch(r){case pa.CARET:return Xf.CARET;case pa.TILDE:return Xf.TILDE;case pa.EXACT:return Xf.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${r}"`)}}function Dne(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${bYe}${Pne(e)}`)}async function Rne(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===Hr.PEER){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===Hr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function gN(r,{cwd:e,workspace:t}){return await SYe(async i=>{k.isAbsolute(r)||(r=k.relative(t.cwd,k.resolve(e,r)),r.match(/^\.{0,2}\//)||(r=`./${r}`));let{project:n}=t,s=await uN(P.makeIdent(null,"archive"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new di,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await At.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return P.makeDescriptor(h.name,r)})}async function _C(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!=="unknown")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof t!="undefined"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Vr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Vr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await Rne(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(Vr.KEEP))continue;let m=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:m})}});break;case Vr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Vr.PROJECT:await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Dne(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ae.pretty(e.configuration,h.relativeCwd,ae.Type.PATH)})`})});break;case Vr.LATEST:await g(async()=>{if(r.range!=="unknown")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:"(explicit range requested)"});else if(n===Hr.PEER)c.push({descriptor:P.makeDescriptor(r,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await uN(r,"latest",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=kne(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function uN(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new di,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=te(N({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:m,source:y,params:b,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(m===t.configuration.get("defaultProtocol")&&(m=null),cN.default.valid(v)&&s!==!1){let x=typeof s=="string"?s:o.range;v=xne(x,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:m,source:y,params:b,selector:v}))}async function SYe(r){return await K.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Nt(e,{configuration:t,check:!1,immutable:!1}))})}var VC=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=J.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=J.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=J.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=J.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=J.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=J.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.silent=J.Boolean("--silent",{hidden:!0});this.packages=J.Rest()}async execute(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=[...s?[Vr.REUSE]:[],Vr.PROJECT,...this.cached?[Vr.CACHE]:[],Vr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async y=>{let b=y.match(/^\.{0,2}\//)?await gN(y,{cwd:this.context.cwd,workspace:i}):P.tryParseDescriptor(y),v=y.match(/^(https?:|git@github)/);if(v)throw new Pe(`It seems you are trying to add a package using a ${ae.pretty(e,`${v[0]}...`,Ri.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${ae.pretty(e,"yarn add",Ri.CODE)} ${ae.pretty(e,P.makeDescriptor(P.makeIdent(null,"my-package"),`${v[0]}...`),Ri.DESCRIPTOR)}`);if(!b)throw new Pe(`The ${ae.pretty(e,y,Ri.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let x=vYe(i,b,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),T=await _C(b,{project:t,workspace:i,cache:n,target:x,modifier:o,strategies:a,maxResults:l});return[b,T,x]})),u=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[b,{suggestions:v,rejections:x}]of c)if(v.filter(q=>q.descriptor!==null).length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),y.reportSeparator(),y.reportExceptionOnce(q)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:y},b]of c){let v,x=y.filter($=>$.descriptor!==null),T=x[0].descriptor,q=x.every($=>P.areDescriptorsEqual($.descriptor,T));x.length===1||q?v=T:(g=!0,{answer:v}=await(0,Fne.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:y.map(({descriptor:$,name:_,reason:ne})=>$?{name:_,hint:ne,descriptor:$}:{name:_,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result($){return this.find($,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Y=i.manifest[b].get(v.identHash);(typeof Y=="undefined"||Y.descriptorHash!==v.descriptorHash)&&(i.manifest[b].set(v.identHash,v),this.optional&&(b==="dependencies"?i.manifest.ensureDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0:b==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(te(N({},v),{range:"unknown"})).optional=!0)),typeof Y=="undefined"?f.push([i,b,v,a]):h.push([i,b,Y,v]))}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` -`),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};VC.paths=[["add"]],VC.usage=Re.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var Nne=VC;function vYe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[Hr.REGULAR].has(e.identHash),a=r.manifest[Hr.DEVELOPMENT].has(e.identHash),l=r.manifest[Hr.PEER].has(e.identHash);if((t||i)&&o)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new Pe(`Package "${P.prettyIdent(r.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?Hr.PEER:t||n?Hr.DEVELOPMENT:o?Hr.REGULAR:a?Hr.DEVELOPMENT:Hr.REGULAR}var XC=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);if(await t.restoreInstallState(),this.name){let o=(await Zt.getPackageAccessibleBinaries(i,{project:t})).get(this.name);if(!o)throw new Pe(`Couldn't find a binary named "${this.name}" for package "${P.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Zt.getPackageAccessibleBinaries(i,{project:t}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:P.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${P.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};XC.paths=[["bin"]],XC.usage=Re.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var Lne=XC;var ZC=class extends Le{constructor(){super(...arguments);this.mirror=J.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=J.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Nt.find(e);return(await Je.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&t.mirrorCwd!==null,s=!this.mirror;n&&(await K.removePromise(t.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await K.removePromise(t.cwd)})).exitCode()}};ZC.paths=[["cache","clean"],["cache","clear"]],ZC.usage=Re.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var Tne=ZC;var One=ge(C0()),fN=ge(require("util")),$C=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=J.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(t)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${t}"`);let s=e.getSpecial(t,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=Se.convertMapsToIndexableObjects(s),a=i?(0,One.default)(o,i):o,l=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();fN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,fN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};$C.paths=[["config","get"]],$C.usage=Re.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var Mne=$C;var Vse=ge(EN()),Xse=ge(C0()),Zse=ge(_se()),IN=ge(require("util")),tm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String();this.value=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new Pe("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>ye.updateHomeConfiguration(h):h=>ye.updateConfiguration(t(),h))(h=>{if(n){let p=(0,Vse.default)(h);return(0,Zse.default)(p,this.name,o),p}else return te(N({},h),{[i]:o})});let c=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=Se.convertMapsToIndexableObjects(c),g=n?(0,Xse.default)(u,n):u;return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{IN.inspect.styles.name="cyan",h.reportInfo(X.UNNAMED,`Successfully set ${this.name} to ${(0,IN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};tm.paths=[["config","set"]],tm.usage=Re.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var $se=tm;var Aoe=ge(EN()),loe=ge(yC()),coe=ge(aoe()),rm=class extends Le{constructor(){super(...arguments);this.home=J.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=()=>{if(!e.projectCwd)throw new Pe("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new Pe(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>ye.updateHomeConfiguration(l):l=>ye.updateConfiguration(t(),l);return(await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,loe.default)(u,this.name))return l.reportWarning(X.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Aoe.default)(u):N({},u);return(0,coe.default)(g,this.name),g}),c||l.reportInfo(X.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};rm.paths=[["config","unset"]],rm.usage=Re.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var uoe=rm;var yN=ge(require("util")),im=class extends Le{constructor(){super(...arguments);this.verbose=J.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=J.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(X.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=Se.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(N({key:s,effective:a,source:l},o))}}else{let n=Se.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,yN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,yN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};im.paths=[["config"]],im.usage=Re.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var goe=im;ys();var wN={};ft(wN,{Strategy:()=>Bu,acceptedStrategies:()=>P3e,dedupe:()=>BN});var foe=ge(is()),Bu;(function(e){e.HIGHEST="highest"})(Bu||(Bu={}));var P3e=new Set(Object.values(Bu)),D3e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Se.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!foe.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c=="undefined"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let b=r.originalPackages.get(y);if(typeof b=="undefined")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return b.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,m=r.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function BN(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new di,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await D3e[e](r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Ji.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(b=>b.then(v=>{if(v===null)return;p++;let{descriptor:x,currentPackage:T,updatedPackage:q}=v;n.reportInfo(X.UNNAMED,`${P.prettyDescriptor(s,x)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,q)}`),n.reportJson({descriptor:P.stringifyDescriptor(x),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(q)}),r.storedResolutions.set(x.descriptorHash,q.locatorHash)}).finally(()=>h.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let y=ae.pretty(s,e,ae.Type.CODE);return n.reportInfo(X.UNNAMED,`${m} can be deduped using the ${y} strategy`),p})}var nm=class extends Le{constructor(){super(...arguments);this.strategy=J.String("-s,--strategy",Bu.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:nn(Bu)});this.check=J.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=await Nt.find(e);await t.restoreInstallState({restoreResolutions:!1});let n=0,s=await Je.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await BN(t,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await t.install({cache:i,report:a,mode:this.mode})})).exitCode()}};nm.paths=[["dedupe"]],nm.usage=Re.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var hoe=nm;var J0=class extends Le{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=ws.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=doe()["@yarnpkg/builder"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};J0.paths=[["--clipanion=definitions"]];var Coe=J0;var W0=class extends Le{async execute(){this.context.stdout.write(this.cli.usage(null))}};W0.paths=[["help"],["--help"],["-h"]];var moe=W0;var bN=class extends Le{constructor(){super(...arguments);this.leadingArgument=J.String();this.args=J.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let e=k.resolve(this.context.cwd,H.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Eoe=bN;var z0=class extends Le{async execute(){this.context.stdout.write(`${Ur||""} -`)}};z0.paths=[["-v"],["--version"]];var Ioe=z0;var sm=class extends Le{constructor(){super(...arguments);this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,locator:i}=await ze.find(e,this.context.cwd);return await t.restoreInstallState(),await Zt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:t})}};sm.paths=[["exec"]],sm.usage=Re.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var yoe=sm;ys();var om=class extends Le{constructor(){super(...arguments);this.hash=J.String({required:!1,validator:fp(gp(),[hp(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return await t.restoreInstallState({restoreResolutions:!1}),await t.applyLightResolution(),typeof this.hash!="undefined"?await R3e(this.hash,t,{stdout:this.context.stdout}):(await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>P.stringifyLocator(t.storedPackages.get(a.subject)),([,a])=>P.stringifyIdent(a.requested)];for(let[a,l]of Se.sortMap(t.peerRequirements,s)){let c=t.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=t.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ae.pretty(e,a,ae.Type.CODE),h=P.prettyLocator(e,c),p=P.prettyIdent(e,l.requested),m=P.prettyIdent(e,u),y=l.allRequesters.length-1,b=`descendant${y===1?"":"s"}`,v=y>0?` and ${y} ${b}`:"",x=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${x} ${p} to ${m}${v}`)}})).exitCode()}};om.paths=[["explain","peer-requirements"]],om.usage=Re.Usage({description:"explain a set of peer requirements",details:` - A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. - - When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. - - When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var woe=om;async function R3e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${r}"`);return(await Je.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var b,v;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(b=a.dependencies.get(n.requested.identHash))!=null?b:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(x=>{let T=e.storedPackages.get(x);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let q=P.devirtualizeLocator(T),Y=e.storedPackages.get(q.locatorHash);if(typeof Y=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let $=Y.peerDependencies.get(n.requested.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:T,peerDependency:$}});if(g!==null){let x=f.every(({peerDependency:T})=>Wt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:"")}, which ${x?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(X.UNNAMED,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ae.mark(i),p=[];for(let{pkg:x,peerDependency:T}of Se.sortMap(f,q=>P.stringifyLocator(q.pkg))){let Y=(g!==null?Wt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(x),prettyLocator:P.prettyLocator(i,x),prettyRange:P.prettyRange(i,T.range),mark:Y})}let m=Math.max(...p.map(({stringifiedLocator:x})=>x.length)),y=Math.max(...p.map(({prettyRange:x})=>x.length));for(let{stringifiedLocator:x,prettyLocator:T,prettyRange:q,mark:Y}of Se.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${T.padEnd(m+(T.length-x.length)," ")} \u2192 ${q.padEnd(y," ")} ${Y}`);p.length>1&&(o.reportSeparator(),o.reportInfo(X.UNNAMED,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ys();var Boe=ge(ri()),am=class extends Le{constructor(){super(...arguments);this.onlyIfNeeded=J.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let t=()=>{if(typeof Ur=="undefined")throw new Pe("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=t();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await Am(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await Am(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^https?:/))i=this.version;else if(this.version.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.version))i=`file://${H.resolve(this.version)}`;else if(Wt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Wt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Wt.validRange(this.version))i=`https://repo.yarnpkg.com/${await F3e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new Pe(`Invalid version descriptor "${this.version}"`);return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,i,Ri.URL)}`),a=await K.readFilePromise(H.toPortablePath(i.slice(o.length)))):(s.reportInfo(X.UNNAMED,`Retrieving ${ae.pretty(e,i,Ri.PATH)}`),a=await ir.get(i,{configuration:e})),await QN(e,null,a,{report:s})})).exitCode()}};am.paths=[["set","version"]],am.usage=Re.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});var boe=am;async function F3e(r,e){let i=(await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0})).tags.filter(n=>Wt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new Pe(`No matching release found for range ${ae.pretty(r,e,ae.Type.RANGE)}.`);return i[0]}async function Am(r,e){let t=await ir.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new Pe(`Tag ${ae.pretty(r,e,ae.Type.RANGE)} not found`);return t.latest[e]}async function QN(r,e,t,{report:i}){var g;e===null&&await K.mktempPromise(async f=>{let h=k.join(f,"yarn.cjs");await K.writeFilePromise(h,t);let{stdout:p}=await Nr.execvp(process.execPath,[H.fromPortablePath(h),"--version"],{cwd:f,env:te(N({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!Boe.default.valid(e))throw new Error(`Invalid semver version. ${ae.pretty(r,"yarn --version",ae.Type.CODE)} returned: -${e}`)});let n=(g=r.projectCwd)!=null?g:r.startingCwd,s=k.resolve(n,".yarn/releases"),o=k.resolve(s,`yarn-${e}.cjs`),a=k.relative(r.startingCwd,o),l=k.relative(n,o),c=r.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(X.UNNAMED,`Saving the new release in ${ae.pretty(r,a,"magenta")}`),await K.removePromise(k.dirname(o)),await K.mkdirPromise(k.dirname(o),{recursive:!0}),await K.writeFilePromise(o,t,{mode:493}),u){await ye.updateConfiguration(n,{yarnPath:l});let f=await At.tryFind(n)||new At;f.packageManager=`yarn@${e&&Se.isTaggedYarnVersion(e)?e:await Am(r,"stable")}`;let h={};f.exportTo(h);let p=k.join(n,At.fileName),m=`${JSON.stringify(h,null,f.indent)} -`;await K.changeFilePromise(p,m,{automaticNewlines:!0})}}function Qoe(r){return X[II(r)]}var N3e=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function L3e(r){let t=`https://repo.yarnpkg.com/${Se.isTaggedYarnVersion(Ur)?Ur:await Am(r,"canary")}/packages/gatsby/content/advanced/error-codes.md`,i=await ir.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(N3e),({groups:n})=>{if(!n)throw new Error("Assertion failed: Expected the match to have been successful");let s=Qoe(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected "${n.name}" to be named "${s}"`);return[n.code,n.details]}))}var lm=class extends Le{constructor(){super(...arguments);this.code=J.String({required:!1,validator:fp(gp(),[hp(/^YN[0-9]{4}$/)])});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code!="undefined"){let t=Qoe(this.code),i=ae.pretty(e,t,ae.Type.CODE),n=this.cli.format().header(`${this.code} - ${i}`),o=(await L3e(e)).get(this.code),a=typeof o!="undefined"?ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.MARKDOWN,{text:o,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${ae.jsonOrPretty(this.json,e,ae.tuple(ae.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:t,details:a})} -`):this.context.stdout.write(`${n} - -${a} -`)}else{let t={children:Se.mapAndFilter(Object.entries(X),([i,n])=>Number.isNaN(Number(i))?Se.mapAndFilter.skip:{label:_A(Number(i)),value:ae.tuple(ae.Type.CODE,n)})};ls.emitTree(t,{configuration:e,stdout:this.context.stdout,json:this.json})}}};lm.paths=[["explain"]],lm.usage=Re.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});var Soe=lm;var voe=ge(is()),cm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=J.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=J.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=J.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=J.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=J.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=J.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i&&!this.all)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(x,{recursive:T})=>{let q=x.anchoredLocator.locatorHash,Y=new Map,$=[q];for(;$.length>0;){let _=$.shift();if(Y.has(_))continue;let ne=t.storedPackages.get(_);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(Y.set(_,ne),P.isVirtualLocator(ne)&&$.push(P.devirtualizeLocator(ne).locatorHash),!(!T&&_!==q))for(let ee of ne.dependencies.values()){let A=t.storedResolutions.get(ee.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");$.push(A)}}return Y.values()},a=({recursive:x})=>{let T=new Map;for(let q of t.workspaces)for(let Y of o(q,{recursive:x}))T.set(Y.locatorHash,Y);return T.values()},l=({all:x,recursive:T})=>x&&T?t.storedPackages.values():x?a({recursive:T}):o(i,{recursive:T}),c=({all:x,recursive:T})=>{let q=l({all:x,recursive:T}),Y=this.patterns.map(ne=>{let ee=P.parseLocator(ne),A=voe.default.makeRe(P.stringifyIdent(ee)),oe=P.isVirtualLocator(ee),ce=oe?P.devirtualizeLocator(ee):ee;return Z=>{let O=P.stringifyIdent(Z);if(!A.test(O))return!1;if(ee.reference==="unknown")return!0;let L=P.isVirtualLocator(Z),de=L?P.devirtualizeLocator(Z):Z;return!(oe&&L&&ee.reference!==Z.reference||ce.reference!==de.reference)}}),$=Se.sortMap([...q],ne=>P.stringifyLocator(ne));return{selection:$.filter(ne=>Y.length===0||Y.some(ee=>ee(ne))),sortedLookup:$}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new Pe("No package matched your request");let f=new Map;if(this.dependents)for(let x of g)for(let T of x.dependencies.values()){let q=t.storedResolutions.get(T.descriptorHash);if(typeof q=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");Se.getArrayWithDefault(f,q).push(x)}let h=new Map;for(let x of g){if(!P.isVirtualLocator(x))continue;let T=P.devirtualizeLocator(x);Se.getArrayWithDefault(h,T.locatorHash).push(x)}let p={},m={children:p},y=e.makeFetcher(),b={project:t,fetcher:y,cache:n,checksums:t.storedChecksums,report:new di,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},v=[async(x,T,q)=>{var _,ne;if(!T.has("manifest"))return;let Y=await y.fetch(x,b),$;try{$=await At.find(Y.prefixPath,{baseFs:Y.packageFs})}finally{(_=Y.releaseFs)==null||_.call(Y)}q("Manifest",{License:ae.tuple(ae.Type.NO_HINT,$.license),Homepage:ae.tuple(ae.Type.URL,(ne=$.raw.homepage)!=null?ne:null)})},async(x,T,q)=>{var A;if(!T.has("cache"))return;let Y={mockedPackages:t.disabledLocators,unstablePackages:t.conditionalLocators},$=(A=t.storedChecksums.get(x.locatorHash))!=null?A:null,_=n.getLocatorPath(x,$,Y),ne;if(_!==null)try{ne=K.statSync(_)}catch{}let ee=typeof ne!="undefined"?[ne.size,ae.Type.SIZE]:void 0;q("Cache",{Checksum:ae.tuple(ae.Type.NO_HINT,$),Path:ae.tuple(ae.Type.PATH,_),Size:ee})}];for(let x of u){let T=P.isVirtualLocator(x);if(!this.virtuals&&T)continue;let q={},Y={value:[x,ae.Type.LOCATOR],children:q};if(p[P.stringifyLocator(x)]=Y,this.nameOnly){delete Y.children;continue}let $=h.get(x.locatorHash);typeof $!="undefined"&&(q.Instances={label:"Instances",value:ae.tuple(ae.Type.NUMBER,$.length)}),q.Version={label:"Version",value:ae.tuple(ae.Type.NO_HINT,x.version)};let _=(ee,A)=>{let oe={};if(q[ee]=oe,Array.isArray(A))oe.children=A.map(ce=>({value:ce}));else{let ce={};oe.children=ce;for(let[Z,O]of Object.entries(A))typeof O!="undefined"&&(ce[Z]={label:Z,value:O})}};if(!T){for(let ee of v)await ee(x,s,_);await e.triggerHook(ee=>ee.fetchPackageInfo,x,s,_)}x.bin.size>0&&!T&&_("Exported Binaries",[...x.bin.keys()].map(ee=>ae.tuple(ae.Type.PATH,ee)));let ne=f.get(x.locatorHash);typeof ne!="undefined"&&ne.length>0&&_("Dependents",ne.map(ee=>ae.tuple(ae.Type.LOCATOR,ee))),x.dependencies.size>0&&!T&&_("Dependencies",[...x.dependencies.values()].map(ee=>{var ce;let A=t.storedResolutions.get(ee.descriptorHash),oe=typeof A!="undefined"&&(ce=t.storedPackages.get(A))!=null?ce:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:oe})})),x.peerDependencies.size>0&&T&&_("Peer dependencies",[...x.peerDependencies.values()].map(ee=>{var Z,O;let A=x.dependencies.get(ee.identHash),oe=typeof A!="undefined"&&(Z=t.storedResolutions.get(A.descriptorHash))!=null?Z:null,ce=oe!==null&&(O=t.storedPackages.get(oe))!=null?O:null;return ae.tuple(ae.Type.RESOLUTION,{descriptor:ee,locator:ce})}))}ls.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};cm.paths=[["info"]],cm.usage=Re.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var xoe=cm;var _0=ge(Ic());ys();var um=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=J.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=J.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=J.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=J.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.cacheFolder=J.String("--cache-folder",{hidden:!0});this.frozenLockfile=J.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=J.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=J.Boolean("--non-interactive",{hidden:!0});this.preferOffline=J.Boolean("--prefer-offline",{hidden:!0});this.production=J.Boolean("--production",{hidden:!0});this.registry=J.String("--registry",{hidden:!0});this.silent=J.Boolean("--silent",{hidden:!0});this.networkTimeout=J.String("--network-timeout",{hidden:!0})}async execute(){var g;let e=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let t=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(f,{error:h})=>{let p=await Je.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{h?m.reportError(X.DEPRECATED_CLI_SETTINGS,f):m.reportWarning(X.DEPRECATED_CLI_SETTINGS,f)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let f=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.registry!="undefined"){let f=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(f!==null)return f}if(typeof this.preferOffline!="undefined"){let f=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!_0.default.VERCEL});if(f!==null)return f}if(typeof this.production!="undefined"){let f=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(f!==null)return f}if(typeof this.nonInteractive!="undefined"){let f=await i("The --non-interactive option is deprecated",{error:!t});if(f!==null)return f}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let f=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!_0.default.NETLIFY});if(f!==null)return f}let n=this.mode===Ci.UpdateLockfile;if(n&&(this.immutable||this.immutableCache))throw new Pe(`${ae.pretty(e,"--immutable",ae.Type.CODE)} and ${ae.pretty(e,"--immutable-cache",ae.Type.CODE)} cannot be used with ${ae.pretty(e,"--mode=update-lockfile",ae.Type.CODE)}`);let s=((g=this.immutable)!=null?g:e.get("enableImmutableInstalls"))&&!n,o=this.immutableCache&&!n;if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{await T3e(e,s)&&(h.reportInfo(X.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let f=e.projectCwd,h;try{h=await K.readFilePromise(k.join(f,kt.lockfile),"utf8")}catch{}if(h==null?void 0:h.includes("yarn lockfile v1")){let p=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo(X.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},f,{overwrite:!0}),await ye.updateConfiguration(f,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let f=await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{var p;((p=ye.telemetry)==null?void 0:p.isNew)&&(h.reportInfo(X.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),h.reportInfo(X.TELEMETRY_NOTICE,`Run ${ae.pretty(e,"yarn config set --home enableTelemetry 0",ae.Type.CODE)} to disable`),h.reportSeparator())});if(f.hasErrors())return f.exitCode()}let{project:a,workspace:l}=await ze.find(e,this.context.cwd),c=await Nt.find(e,{immutable:o,check:this.checkCache});if(!l)throw new ht(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async f=>{await a.install({cache:c,report:f,immutable:s,mode:this.mode})})).exitCode()}};um.paths=[["install"],Re.Default],um.usage=Re.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). - - - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). - - If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. - - If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var koe=um,O3e="|||||||",M3e=">>>>>>>",K3e="=======",Poe="<<<<<<<";async function T3e(r,e){if(!r.projectCwd)return!1;let t=k.join(r.projectCwd,r.get("lockfileFilename"));if(!await K.existsPromise(t))return!1;let i=await K.readFilePromise(t,"utf8");if(!i.includes(Poe))return!1;if(e)throw new ct(X.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=U3e(i),o,a;try{o=Si(n),a=Si(s)}catch(c){throw new ct(X.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=N(N({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await K.changeFilePromise(t,Ma(l),{automaticNewlines:!0}),!0}function U3e(r){let e=[[],[]],t=r.split(/\r?\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Poe)){for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===K3e){i=!1;break}else if(i||s.startsWith(O3e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(M3e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var gm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=J.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=J.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=k.resolve(this.context.cwd,H.toPortablePath(this.destination)),o=await ye.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await ze.find(o,s);if(t.cwd===a.cwd)throw new Pe("Invalid destination; Can't link the project to itself");if(!l)throw new ht(a.cwd,s);let c=t.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new Pe("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new Pe("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=P.stringifyIdent(f.locator),p=this.relative?k.relative(t.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Je.start({configuration:e,stdout:this.context.stdout},async f=>{await t.install({cache:n,report:f})})).exitCode()}};gm.paths=[["link"]],gm.usage=Re.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var Doe=gm;var fm=class extends Le{constructor(){super(...arguments);this.args=J.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};fm.paths=[["node"]],fm.usage=Re.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Roe=fm;var Hoe=ge(require("os"));var Noe=ge(require("os"));var H3e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function bu(r){let e=await ir.get(H3e,{configuration:r});return Si(e.toString())}var hm=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await bu(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Or(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(N({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};hm.paths=[["plugin","list"]],hm.usage=Re.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Foe=hm;var j3e=/^[0-9]+$/;function Loe(r){return j3e.test(r)?`pull/${r}/head`:r}var G3e=({repository:r,branch:e},t)=>[["git","init",H.fromPortablePath(t)],["git","remote","add","origin",r],["git","fetch","origin","--depth=1",Loe(e)],["git","reset","--hard","FETCH_HEAD"]],Y3e=({branch:r})=>[["git","fetch","origin","--depth=1",Loe(r),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],q3e=({plugins:r,noMinify:e},t)=>[["yarn","build:cli",...new Array().concat(...r.map(i=>["--plugin",k.resolve(t,i)])),...e?["--no-minify"]:[],"|"]],pm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=J.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=J.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Noe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{await vN(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(X.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await dm(q3e(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=k.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await K.readFilePromise(o);await QN(e,"sources",a,{report:s}),this.skipPlugins||await J3e(this,{project:t,report:s,target:i})})).exitCode()}};pm.paths=[["set","version","from","sources"]],pm.usage=Re.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var Toe=pm;async function dm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Nr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await Nr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function vN(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&K.existsSync(k.join(i,".git"))){t.reportInfo(X.UNNAMED,"Fetching the latest commits"),t.reportSeparator();try{await dm(Y3e(r),{configuration:e,context:r.context,target:i}),n=!0}catch(s){t.reportSeparator(),t.reportWarning(X.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(t.reportInfo(X.UNNAMED,"Cloning the remote repository"),t.reportSeparator(),await K.removePromise(i),await K.mkdirPromise(i,{recursive:!0}),await dm(G3e(r,i),{configuration:e,context:r.context,target:i}))}async function J3e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await SN(o,r,{project:e,report:t,target:i})}var Ooe=ge(ri()),Moe=ge(require("url")),Koe=ge(require("vm"));var Cm=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await ze.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||H.isAbsolute(this.name)){let a=k.resolve(this.context.cwd,H.toPortablePath(this.name));i.reportInfo(X.UNNAMED,`Reading ${ae.pretty(e,a,ae.Type.PATH)}`),s=k.relative(n.cwd,a),o=await K.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Moe.URL(this.name)}catch{throw new ct(X.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=P.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!Ooe.default.valid(l.reference))throw new ct(X.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=P.stringifyIdent(l),u=await bu(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Ur!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Ur}/`))}i.reportInfo(X.UNNAMED,`Downloading ${ae.pretty(e,a,"green")}`),o=await ir.get(a,{configuration:e})}await xN(s,o,{project:n,report:i})})).exitCode()}};Cm.paths=[["plugin","import"]],Cm.usage=Re.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var Uoe=Cm;async function xN(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Koe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=k.resolve(t.cwd,l);i.reportInfo(X.UNNAMED,`Saving the new plugin in ${ae.pretty(n,l,"magenta")}`),await K.mkdirPromise(k.dirname(c),{recursive:!0}),await K.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,y=k.resolve(t.cwd,H.toPortablePath(m)),{name:b}=Se.dynamicRequire(y);b!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),te(N({},g),{plugins:f})})}var W3e=({pluginName:r,noMinify:e},t)=>[["yarn",`build:${r}`,...e?["--no-minify"]:[],"|"]],mm=class extends Le{constructor(){super(...arguments);this.installPath=J.String("--path",{description:"The path where the repository should be cloned to"});this.repository=J.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=J.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=J.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=J.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.installPath!="undefined"?k.resolve(this.context.cwd,H.toPortablePath(this.installPath)):k.resolve(H.toPortablePath((0,Hoe.tmpdir)()),"yarnpkg-sources",Dn.makeHash(this.repository).slice(0,6));return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await ze.find(e,this.context.cwd),o=P.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=P.stringifyIdent(o),l=await bu(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new ct(X.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await vN(this,{configuration:e,report:n,target:t}),await SN(c,this,{project:s,report:n,target:t})})).exitCode()}};mm.paths=[["plugin","import","from","sources"]],mm.usage=Re.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var joe=mm;async function SN(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(X.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await dm(W3e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=k.resolve(s,`packages/${o}/bundles/${r}.js`),c=await K.readFilePromise(l);await xN(r,c,{project:i,report:n})}var Em=class extends Le{constructor(){super(...arguments);this.name=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=P.parseIdent(s);if(!e.plugins.has(s))throw new Pe(`${P.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=k.resolve(t.cwd,a);K.existsSync(l)&&(n.reportInfo(X.UNNAMED,`Removing ${ae.pretty(e,a,ae.Type.PATH)}...`),await K.removePromise(l)),n.reportInfo(X.UNNAMED,"Updating the configuration..."),await ye.updateConfiguration(t.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:te(N({},c),{plugins:u})})})).exitCode()}};Em.paths=[["plugin","remove"]],Em.usage=Re.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var Goe=Em;var Im=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Im.paths=[["plugin","runtime"]],Im.usage=Re.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var Yoe=Im;var ym=class extends Le{constructor(){super(...arguments);this.idents=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(P.parseIdent(a).identHash);if(await t.restoreInstallState({restoreResolutions:!1}),await t.resolveEverything({cache:n,report:new di}),s.size>0)for(let a of t.storedPackages.values())s.has(a.identHash)&&t.storedBuildState.delete(a.locatorHash);else t.storedBuildState.clear();return(await Je.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await t.install({cache:n,report:a})})).exitCode()}};ym.paths=[["rebuild"]],ym.usage=Re.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var qoe=ym;var kN=ge(is());ys();var wm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=this.all?t.workspaces:[i],o=[Hr.REGULAR,Hr.DEVELOPMENT,Hr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,m=P.parseIdent(h);for(let y of s){let b=[...y.manifest.peerDependenciesMeta.keys()];for(let v of(0,kN.default)(b,h))y.manifest.peerDependenciesMeta.delete(v),l=!0,p=!0;for(let v of o){let x=y.manifest.getForScope(v),T=[...x.values()].map(q=>P.stringifyIdent(q));for(let q of(0,kN.default)(T,P.stringifyIdent(m))){let{identHash:Y}=P.parseIdent(q),$=x.get(Y);if(typeof $=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");y.manifest[v].delete(Y),c.push([y,v,$]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new Pe(`${u} ${ae.prettyList(e,a,Ri.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Je.start({configuration:e,stdout:this.context.stdout},async p=>{await t.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};wm.paths=[["remove"]],wm.usage=Re.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var Joe=wm;var Woe=ge(require("util")),V0=class extends Le{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);return(await Je.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Se.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,Woe.inspect)(g,l)}`)})).exitCode()}};V0.paths=[["run"]];var zoe=V0;var Bm=class extends Le{constructor(){super(...arguments);this.inspect=J.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=J.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=J.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=J.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=J.Boolean("--silent",{hidden:!0});this.scriptName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i,locator:n}=await ze.find(e,this.context.cwd);await t.restoreInstallState();let s=this.topLevel?t.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Zt.hasPackageScript(s,this.scriptName,{project:t}))return await Zt.executePackageScript(s,this.scriptName,this.args,{project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Zt.getPackageAccessibleBinaries(s,{project:t});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Zt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:t,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(t.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Zt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new Pe(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${P.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new Pe("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Lf)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new Pe(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new Pe(`Couldn't find a script named "${this.scriptName}".`)}}};Bm.paths=[["run"]],Bm.usage=Re.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var _oe=Bm;var bm=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=J.String();this.resolution=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(await t.restoreInstallState({restoreResolutions:!1}),!i)throw new ht(t.cwd,this.context.cwd);let s=P.parseDescriptor(this.descriptor,!0),o=P.makeDescriptor(s,this.resolution);return t.storedDescriptors.set(s.descriptorHash,s),t.storedDescriptors.set(o.descriptorHash,o),t.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};bm.paths=[["set","resolution"]],bm.usage=Re.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Voe=bm;var Xoe=ge(is()),Qm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);let s=t.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=k.resolve(this.context.cwd,H.toPortablePath(l));if(Se.isPathLike(l)){let u=await ye.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await ze.find(u,c);if(!f)throw new ht(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(P.stringifyIdent(h.locator));if(o.size===0)throw new Pe("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new Pe("The target workspace doesn't have a name and thus cannot be unlinked");o.add(P.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,Xoe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{await t.install({cache:n,report:l})})).exitCode()}};Qm.paths=[["unlink"]],Qm.usage=Re.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var Zoe=Qm;var $oe=ge(WC()),PN=ge(is());ys();var th=class extends Le{constructor(){super(...arguments);this.interactive=J.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=J.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=J.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=J.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=J.String("--mode",{description:"Change what artifacts installs generate",validator:nn(Ci)});this.patterns=J.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=[...t.storedDescriptors.values()],o=s.map(u=>P.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(P.parseDescriptor(u).range!=="unknown")throw new Pe("Ranges aren't allowed when using --recursive");for(let g of(0,PN.default)(o,u)){let f=P.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)t.storedDescriptors.delete(u.descriptorHash),t.storedResolutions.delete(u.descriptorHash);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{await t.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=zC(this,t),a=s?[Vr.KEEP,Vr.REUSE,Vr.PROJECT,Vr.LATEST]:[Vr.PROJECT,Vr.LATEST],l=[],c=[];for(let y of this.patterns){let b=!1,v=P.parseDescriptor(y);for(let x of t.workspaces)for(let T of[Hr.REGULAR,Hr.DEVELOPMENT]){let Y=[...x.manifest.getForScope(T).values()].map($=>P.stringifyIdent($));for(let $ of(0,PN.default)(Y,P.stringifyIdent(v))){let _=P.parseIdent($),ne=x.manifest[T].get(_.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let ee=P.makeDescriptor(_,v.range);l.push(Promise.resolve().then(async()=>[x,T,ne,await _C(ee,{project:t,workspace:x,cache:n,target:T,modifier:o,strategies:a})])),b=!0}}b||c.push(y)}if(c.length>1)throw new Pe(`Patterns ${ae.prettyList(e,c,Ri.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new Pe(`Pattern ${ae.prettyList(e,c,Ri.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await pA.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async y=>{for(let[,,b,{suggestions:v,rejections:x}]of u){let T=v.filter(q=>q.descriptor!==null);if(T.length===0){let[q]=x;if(typeof q=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let Y=this.cli.error(q);t.configuration.get("enableNetwork")?y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range - -${Y}`):y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${Y}`)}else T.length>1&&!s&&y.reportError(X.CANT_SUGGEST_RESOLUTIONS,`${P.prettyDescriptor(e,b)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[y,b,,{suggestions:v}]of u){let x,T=v.filter(_=>_.descriptor!==null),q=T[0].descriptor,Y=T.every(_=>P.areDescriptorsEqual(_.descriptor,q));T.length===1||Y?x=q:(f=!0,{answer:x}=await(0,$oe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${P.prettyWorkspace(e,y)} \u276F ${b}?`,choices:v.map(({descriptor:_,name:ne,reason:ee})=>_?{name:ne,hint:ee,descriptor:_}:{name:ne,hint:ee,disabled:!0}),onCancel:()=>process.exit(130),result(_){return this.find(_,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=y.manifest[b].get(x.identHash);if(typeof $=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if($.descriptorHash!==x.descriptorHash)y.manifest[b].set(x.identHash,x),h.push([y,b,$,x]);else{let _=e.makeResolver(),ne={project:t,resolver:_},ee=_.bindDescriptor($,y.anchoredLocator,ne);t.forgetResolution(ee)}}return await e.triggerMultipleHooks(y=>y.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` -`),(await Je.start({configuration:e,stdout:this.context.stdout},async y=>{await t.install({cache:n,report:y,mode:this.mode})})).exitCode()}};th.paths=[["up"]],th.usage=Re.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),th.schema=[eS("recursive",Bc.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var eae=th;var Sm=class extends Le{constructor(){super(...arguments);this.recursive=J.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=J.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=P.parseIdent(this.package).identHash,s=this.recursive?_3e(t,n,{configuration:e,peers:this.peers}):z3e(t,n,{configuration:e,peers:this.peers});ls.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Sm.paths=[["why"]],Sm.usage=Re.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var tae=Sm;function z3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=r.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=P.stringifyLocator(a);s[p]={value:[a,ae.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ae.Type.DEPENDENT]}}}return o}function _3e(r,e,{configuration:t,peers:i}){let n=Se.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let m=r.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let y=r.storedPackages.get(m);if(!y)throw new Error("Assertion failed: The package should have been registered");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let m=p!==null?ae.tuple(ae.Type.DEPENDENT,{locator:f,descriptor:p}):ae.tuple(ae.Type.LOCATOR,f),y={},b={value:m,children:y},v=P.stringifyLocator(f);if(h[v]=b,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let x of f.dependencies.values()){if(!i&&f.peerDependencies.has(x.identHash))continue;let T=r.storedResolutions.get(x.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let q=r.storedPackages.get(T);if(!q)throw new Error("Assertion failed: The package should have been registered");g(q,y,x)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var jN={};ft(jN,{default:()=>dWe,gitUtils:()=>Qu});var Qu={};ft(Qu,{TreeishProtocols:()=>On,clone:()=>KN,fetchBase:()=>wae,fetchChangedFiles:()=>Bae,fetchChangedWorkspaces:()=>hWe,fetchRoot:()=>yae,isGitUrl:()=>ih,lsRemote:()=>Iae,normalizeLocator:()=>TN,normalizeRepoUrl:()=>vm,resolveUrl:()=>MN,splitRepoUrl:()=>xm});var NN=ge(dae()),Cae=ge(Zw()),rh=ge(require("querystring")),LN=ge(ri()),mae=ge(require("url"));function Eae(){return te(N({},process.env),{GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`})}var fWe=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],On;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(On||(On={}));function ih(r){return r?fWe.some(e=>!!r.match(e)):!1}function xm(r){r=vm(r);let e=r.indexOf("#");if(e===-1)return{repo:r,treeish:{protocol:On.Head,request:"HEAD"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=rh.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(On).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=On.Head,a="HEAD");for(let l of Object.values(On))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function vm(r,{git:e=!1}={}){var t;if(r=r.replace(/^git\+https:/,"https:"),r=r.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),r=r.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){r=r.replace(/^git\+([^:]+):/,"$1:");let i;try{i=mae.default.parse(r)}catch{i=null}i&&i.protocol==="ssh:"&&((t=i.path)==null?void 0:t.startsWith("/:"))&&(r=r.replace(/^ssh:\/\//,""))}return r}function TN(r){return P.makeLocator(r,vm(r.reference))}async function Iae(r,e){let t=vm(r,{git:!0});if(!ir.getNetworkSettings(`https://${(0,NN.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await ON("listing refs",["ls-remote",t],{cwd:e.startingCwd,env:Eae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function MN(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=xm(r),o=await Iae(t,e),a=(c,u)=>{switch(c){case On.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return rh.default.stringify(te(N({},s),{commit:u}))}case On.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return rh.default.stringify(te(N({},s),{commit:g}))}case On.Semver:{let g=Wt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[LN.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),h=LN.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return rh.default.stringify(te(N({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(On.Commit,u))!==null||(g=l(On.Tag,u))!==null||(g=l(On.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${t}#${a(i,n)}`}async function KN(r,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=xm(r);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=vm(t,{git:!0});if(ir.getNetworkSettings(`https://${(0,NN.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await K.mktempPromise(),a={cwd:o,env:Eae()};return await ON("cloning the repository",["clone","-c core.autocrlf=false",s,H.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await ON("switching branch",["checkout",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function yae(r){let e=null,t,i=r;do t=i,await K.existsPromise(k.join(t,".git"))&&(e=t),i=k.dirname(t);while(e===null&&i!==t);return e}async function wae(r,{baseRefs:e}){if(e.length===0)throw new Pe("Can't run this command with zero base refs specified.");let t=[];for(let a of e){let{code:l}=await Nr.execvp("git",["merge-base",a,"HEAD"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new Pe(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await Nr.execvp("git",["merge-base","HEAD",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Nr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function Bae(r,{base:e,project:t}){let i=Se.buildIgnorePattern(t.configuration.get("changesetIgnorePatterns")),{stdout:n}=await Nr.execvp("git",["diff","--name-only",`${e}`],{cwd:r,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),{stdout:o}=await Nr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:r,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>k.resolve(r,H.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!k.relative(t.cwd,c).match(i)):l}async function hWe({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new Pe("This command can only be run from within a Yarn project");let t=[k.resolve(e.cwd,e.configuration.get("cacheFolder")),k.resolve(e.cwd,e.configuration.get("installStatePath")),k.resolve(e.cwd,e.configuration.get("lockfileFilename")),k.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await yae(e.configuration.projectCwd);if(i==null)throw new Pe("This command can only be run on Git repositories");let n=await wae(i,{baseRefs:typeof r=="string"?[r]:e.configuration.get("changesetBaseRefs")}),s=await Bae(i,{base:n.hash,project:e});return new Set(Se.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Se.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Se.mapAndFilter.skip:a}))}async function ON(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Nr.execvp("git",e,te(N({},t),{strict:!0}))}catch(s){if(!(s instanceof Nr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new ct(X.EXCEPTION,`Failed ${r}`,l=>{l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:"Repository URL",value:ae.tuple(ae.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u==="error"?"Error":`${(0,Cae.default)(u)} Error`;l.reportError(X.EXCEPTION,` ${ae.prettyField(i,{label:f,value:ae.tuple(ae.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var UN=class{supports(e,t){return ih(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=TN(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o=te(N({},t),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await KN(e.reference,t.project.configuration),n=xm(e.reference),s=k.join(i,"package.tgz");await Zt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await K.readFilePromise(s);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(o,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var HN=class{supportsDescriptor(e,t){return ih(e.range)}supportsLocator(e,t){return ih(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await MN(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var pWe={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:Ie.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:Ie.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:Ie.NUMBER,default:2}},fetchers:[UN],resolvers:[HN]};var dWe=pWe;var km=class extends Le{constructor(){super(...arguments);this.since=J.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=J.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd);return(await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Qu.fetchChangedWorkspaces({ref:this.since,project:t}):t.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of At.hardDependencies)for(let[h,p]of l.getForScope(f)){let m=t.tryWorkspaceByDescriptor(p);m===null?t.workspacesByIdent.has(h)&&g.add(p):u.add(m)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>P.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(N({location:a.relativeCwd,name:l.name?P.stringifyIdent(l.name):null},c))}})).exitCode()}};km.paths=[["workspaces","list"]],km.usage=Re.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var bae=km;var Pm=class extends Le{constructor(){super(...arguments);this.workspaceName=J.String();this.commandName=J.String();this.args=J.Proxy()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=t.workspaces,s=new Map(n.map(a=>{let l=P.convertToIdent(a.locator);return[P.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new Pe(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Pm.paths=[["workspace"]],Pm.usage=Re.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var Qae=Pm;var CWe={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:Ie.BOOLEAN,default:Sae.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:Ie.STRING,values:["^","~",""],default:pa.CARET}},commands:[Tne,Mne,$se,uoe,Voe,Toe,boe,bae,Coe,moe,Eoe,Ioe,Nne,Lne,goe,hoe,yoe,woe,Soe,xoe,koe,Doe,Zoe,Roe,joe,Uoe,Goe,Foe,Yoe,qoe,Joe,zoe,_oe,eae,tae,Qae]},mWe=CWe;var zN={};ft(zN,{default:()=>IWe});var Ge={optional:!0},YN=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Ge,zenObservable:Ge}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Ge}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Ge,["postcss-jsx"]:Ge,["postcss-less"]:Ge,["postcss-markdown"]:Ge,["postcss-scss"]:Ge}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Ge}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Ge}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Ge,"vue-template-compiler":Ge}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Ge,"utf-8-validate":Ge}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge,"vuetify-loader":Ge}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Ge}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Ge}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Ge}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Ge}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Ge,tinyliquid:Ge,"liquid-node":Ge,jade:Ge,"then-jade":Ge,dust:Ge,"dustjs-helpers":Ge,"dustjs-linkedin":Ge,swig:Ge,"swig-templates":Ge,"razor-tmpl":Ge,atpl:Ge,liquor:Ge,twig:Ge,ejs:Ge,eco:Ge,jazz:Ge,jqtpl:Ge,hamljs:Ge,hamlet:Ge,whiskers:Ge,"haml-coffee":Ge,"hogan.js":Ge,templayed:Ge,handlebars:Ge,underscore:Ge,lodash:Ge,pug:Ge,"then-pug":Ge,qejs:Ge,walrus:Ge,mustache:Ge,just:Ge,ect:Ge,mote:Ge,toffee:Ge,dot:Ge,"bracket-template":Ge,ractive:Ge,nunjucks:Ge,htmling:Ge,"babel-core":Ge,plates:Ge,"react-dom":Ge,react:Ge,"arc-templates":Ge,vash:Ge,slm:Ge,marko:Ge,teacup:Ge,"coffee-script":Ge,squirrelly:Ge,twing:Ge}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Ge,vue:Ge}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Ge}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Ge}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(r=>[r,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Ge,"webpack-command":Ge}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Ge}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Ge}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Ge,jimp:Ge}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Ge,"eslint-import-resolver-typescript":Ge,"eslint-import-resolver-webpack":Ge,"@typescript-eslint/parser":Ge}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Ge}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Ge}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.0"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Ge}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Ge}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@*",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:Ge}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@*",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:{optional:!0}}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}]];var qN;function vae(){return typeof qN=="undefined"&&(qN=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),qN}var JN;function xae(){return typeof JN=="undefined"&&(JN=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),JN}var WN;function kae(){return typeof WN=="undefined"&&(WN=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),WN}var Pae=new Map([[P.makeIdent(null,"fsevents").identHash,vae],[P.makeIdent(null,"resolve").identHash,xae],[P.makeIdent(null,"typescript").identHash,kae]]),EWe={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of YN)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t="compat/";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Pae.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(r,e,t,i)=>typeof Pae.get(r.identHash)=="undefined"?r:P.makeDescriptor(r,P.makeRange({protocol:"patch:",source:P.stringifyDescriptor(r),selector:`~builtin`,params:null}))}},IWe=EWe;var _N={};ft(_N,{default:()=>wWe});var X0=class extends Le{constructor(){super(...arguments);this.pkg=J.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let t=P.parseDescriptor(this.command),i;t.scope?i=P.makeIdent(t.scope,`create-${t.name}`):t.name.startsWith("@")?i=P.makeIdent(t.name.substring(1),"create"):i=P.makeIdent(null,`create-${t.name}`);let n=P.stringifyIdent(i);return t.range!=="unknown"&&(n+=`@${t.range}`),this.cli.run(["dlx",...e,n,...this.args])}};X0.paths=[["create"]];var Dae=X0;var Dm=class extends Le{constructor(){super(...arguments);this.packages=J.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=J.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=J.String();this.args=J.Proxy()}async execute(){return ye.telemetry=null,await K.mktempPromise(async e=>{var p;let t=k.join(e,`dlx-${process.pid}`);await K.mkdirPromise(t),await K.writeFilePromise(k.join(t,"package.json"),`{} -`),await K.writeFilePromise(k.join(t,"yarn.lock"),"");let i=k.join(t,".yarnrc.yml"),n=await ye.findProjectCwd(this.context.cwd,kt.lockfile),s=!(await ye.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?k.join(n,".yarnrc.yml"):null;o!==null&&K.existsSync(o)?(await K.copyFilePromise(o,i),await ye.updateConfiguration(t,m=>{let y=te(N({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(y.plugins=m.plugins.map(b=>{let v=typeof b=="string"?b:b.path,x=H.isAbsolute(v)?v:H.resolve(H.fromPortablePath(n),v);return typeof b=="string"?x:{path:x,spec:b.spec}})),y})):await K.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=P.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:t,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await ye.find(t,this.context.plugins),{project:g,workspace:f}=await ze.find(u,t);if(f===null)throw new ht(g.cwd,t);await g.restoreInstallState();let h=await Zt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Zt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Dm.paths=[["dlx"]],Dm.usage=Re.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var Rae=Dm;var yWe={commands:[Dae,Rae]},wWe=yWe;var nL={};ft(nL,{default:()=>QWe,fileUtils:()=>VN});var nh=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Rm=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Xr="file:";var VN={};ft(VN,{makeArchiveFromLocator:()=>Z0,makeBufferFromLocator:()=>$N,makeLocator:()=>ZN,makeSpec:()=>Fae,parseSpec:()=>XN});function XN(r){let{params:e,selector:t}=P.parseRange(r),i=H.toPortablePath(t);return{parentLocator:e&&typeof e.locator=="string"?P.parseLocator(e.locator):null,path:i}}function Fae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t!="undefined"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:N(N({},s),n)})}function ZN(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Fae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function Z0(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=k.isAbsolute(s)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=k.join(a.prefixPath,s);return await Se.releaseAfterUseAsync(async()=>await Bi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function $N(r,{protocol:e,fetchOptions:t}){return(await Z0(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var eL=class{supports(e,t){return!!e.reference.startsWith(Xr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return Z0(e,{protocol:Xr,fetchOptions:t})}};var BWe=2,tL=class{supportsDescriptor(e,t){return e.range.match(nh)?!0:!!e.range.startsWith(Xr)}supportsLocator(e,t){return!!e.reference.startsWith(Xr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=XN(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await $N(P.makeLocator(e,P.makeRange({protocol:Xr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:Xr,fetchOptions:i.fetchOptions}),a=Dn.makeHash(`${BWe}`,o).slice(0,6);return[ZN(e,{parentLocator:s,path:n,folderHash:a,protocol:Xr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var rL=class{supports(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:Xr}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Se.releaseAfterUseAsync(async()=>await Bi.convertToZip(c,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var iL=class{supportsDescriptor(e,t){return Rm.test(e.range)?!!(e.range.startsWith(Xr)||nh.test(e.range)):!1}supportsLocator(e,t){return Rm.test(e.reference)?!!e.reference.startsWith(Xr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return nh.test(e.range)&&(e=P.makeDescriptor(e,`${Xr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(Xr)&&(n=n.slice(Xr.length)),[P.makeLocator(e,`${Xr}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var bWe={fetchers:[rL,eL],resolvers:[iL,tL]},QWe=bWe;var oL={};ft(oL,{default:()=>xWe});var Nae=ge(require("querystring")),Lae=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function Tae(r){return r?Lae.some(e=>!!r.match(e)):!1}function Oae(r){let e;for(let a of Lae)if(e=r.match(a),e)break;if(!e)throw new Error(SWe(r));let[,t,i,n,s="master"]=e,{commit:o}=Nae.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:t,username:i,reponame:n,treeish:s}}function SWe(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var sL=class{supports(e,t){return!!Tae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await K.mktempPromise(async n=>{let s=new _t(n);await Bi.extractArchiveTo(i,s,{stripComponents:1});let o=Qu.splitRepoUrl(e.reference),a=k.join(n,"package.tgz");await Zt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await K.readFilePromise(a);return await Bi.convertToZip(l,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=Oae(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var vWe={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new sL;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch(n){return null}}}},xWe=vWe;var lL={};ft(lL,{default:()=>PWe});var Fm=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,Nm=/^https?:/;var aL=class{supports(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await ir.get(e.reference,{configuration:t.project.configuration});return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var AL=class{supportsDescriptor(e,t){return Fm.test(e.range)?!!Nm.test(e.range):!1}supportsLocator(e,t){return Fm.test(e.reference)?!!Nm.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var kWe={fetchers:[aL],resolvers:[AL]},PWe=kWe;var fL={};ft(fL,{default:()=>D4e});var cAe=ge(lAe()),gL=ge(require("util")),Lm=class extends Le{constructor(){super(...arguments);this.private=J.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=J.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=J.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=J.Boolean("-2",!1,{hidden:!0});this.yes=J.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=J.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return t!==null?await this.executeProxy(e,t):await this.executeRegular(e)}async executeProxy(e,t){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new Pe("Cannot use the --install flag from within a project subdirectory");K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=k.join(this.context.cwd,e.get("lockfileFilename"));K.existsSync(i)||await K.writeFilePromise(i,"");let n=await this.cli.run(["set","version",t],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await K.mktempPromise(async o=>{let{code:a}=await Nr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Zt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let t=null;try{t=(await ze.find(e,this.context.cwd)).project}catch{t=null}K.existsSync(this.context.cwd)||await K.mkdirPromise(this.context.cwd,{recursive:!0});let i=await At.tryFind(this.context.cwd)||new At,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:P.makeIdent(e.get("initScope"),k.basename(this.context.cwd)),i.packageManager=Ur&&Se.isTaggedYarnVersion(Ur)?`yarn@${Ur}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await K.mkdirPromise(k.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),gL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,gL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=k.join(this.context.cwd,At.fileName);await K.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=k.join(this.context.cwd,"README.md");if(K.existsSync(a)||await K.writeFilePromise(a,`# ${P.stringifyIdent(i.name)} -`),!t||t.cwd===this.context.cwd){let c=k.join(this.context.cwd,kt.lockfile);K.existsSync(c)||await K.writeFilePromise(c,"");let g=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!.yarn/cache","#.pnp.*"].map(y=>`${y} -`).join(""),f=k.join(this.context.cwd,".gitignore");K.existsSync(f)||await K.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,cAe.default)(h,e.get("initEditorConfig"));let p=`root = true -`;for(let[y,b]of Object.entries(h)){p+=` -[${y}] -`;for(let[v,x]of Object.entries(b))p+=`${v.replace(/[A-Z]/g,q=>`_${q.toLowerCase()}`)} = ${x} -`}let m=k.join(this.context.cwd,".editorconfig");K.existsSync(m)||await K.writeFilePromise(m,p),K.existsSync(k.join(this.context.cwd,".git"))||await Nr.execvp("git",["init"],{cwd:this.context.cwd})}}};Lm.paths=[["init"]],Lm.usage=Re.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var uAe=Lm;var P4e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:Ie.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:Ie.MAP,valueDefinition:{description:"",type:Ie.ANY}}},commands:[uAe]},D4e=P4e;var mL={};ft(mL,{default:()=>F4e});var wA="portal:",BA="link:";var hL=class{supports(e,t){return!!e.reference.startsWith(wA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:wA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot}}};var pL=class{supportsDescriptor(e,t){return!!e.range.startsWith(wA)}supportsLocator(e,t){return!!e.reference.startsWith(wA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(wA.length);return[P.makeLocator(e,`${wA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Se.releaseAfterUseAsync(async()=>await At.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return te(N({},e),{version:n.version||"0.0.0",languageName:n.languageName||t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var dL=class{supports(e,t){return!!e.reference.startsWith(BA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA});if(k.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:k.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:BA}),s=k.isAbsolute(n)?{packageFs:new _t(Me.root),prefixPath:Me.dot,localPath:Me.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,s.localPath),localPath:Me.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=k.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new _t(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0,localPath:l}:{packageFs:new La(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Me.dot,discardFromLookup:!0}}};var CL=class{supportsDescriptor(e,t){return!!e.range.startsWith(BA)}supportsLocator(e,t){return!!e.reference.startsWith(BA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(BA.length);return[P.makeLocator(e,`${BA}${H.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return te(N({},e),{version:"0.0.0",languageName:t.project.configuration.get("defaultLanguageName"),linkType:Qt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var R4e={fetchers:[dL,hL],resolvers:[CL,pL]},F4e=R4e;var JL={};ft(JL,{default:()=>j8e});var Mn;(function(i){i[i.REGULAR=0]="REGULAR",i[i.WORKSPACE=1]="WORKSPACE",i[i.EXTERNAL_SOFT_LINK=2]="EXTERNAL_SOFT_LINK"})(Mn||(Mn={}));var bA;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(bA||(bA={}));var EL=(r,e)=>`${r}@${e}`,gAe=(r,e)=>{let t=e.indexOf("#"),i=t>=0?e.substring(t+1):e;return EL(r,i)},yo;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(yo||(yo={}));var hAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=N4e(r,s),l=!1,c=0;do l=IL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=Tm(a);if(IL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${Tm(a)}`);let f=fAe(a);if(f)throw new Error(`${f}, after hoisting finished: -${Tm(a)}`)}return s.debugLevel>=2&&console.log(Tm(a)),L4e(a)},T4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},O4e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},pAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:m}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(m)},b=y.dependencies.get(t);return b&&b.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},M4e=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},yL=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},IL=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=U4e(o),l=M4e(o,a),c=r==o?new Map:n.fastLookupPossible?T4e(e):O4e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([m,y])=>[m,y[0]])),p=new Map;do{let m=K4e(r,e,t,c,h,l,i,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,b]of l)b.length>1&&!o.dependencies.has(y)&&(h.delete(y),b.shift(),h.set(y,b[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!t.has(m.locator)){t.add(m.locator);let y=IL(r,[...e,m],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},H4e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},j4e=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>Li(y)).join("\u2192")}`);let h=t[t.length-1],m=!(i.ident===h.ident);if(l&&!m&&(g="- self-reference"),m&&(m=i.dependencyKind!==1,l&&!m&&(g="- workspace")),m&&i.dependencyKind===2&&(m=!H4e(i),l&&!m&&(g="- external soft link with unhoisted dependencies")),m&&(m=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!m&&(g=h.reasons.get(i.name))),m&&(m=!r.peerNames.has(i.name),l&&!m&&(g=`- cannot shadow peer: ${Li(r.originalDependencies.get(i.name).locator)} at ${u}`)),m){let y=!1,b=n.get(i.name);if(y=!b||b.ident===i.ident,l&&!y&&(g=`- filled by: ${Li(b.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let T=t[v].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let q=a.get(h);q||(q=new Set,a.set(h,q)),q.add(i.name),l&&(g=`- filled by ${Li(T.locator)} at ${t.slice(0,v).map(Y=>Li(Y.locator)).join("\u2192")}`);break}}m=y}if(m&&(m=s.get(i.name)===i.ident,l&&!m&&(g=`- filled by: ${Li(o.get(i.name)[0])} at ${u}`)),m){let y=!0,b=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let x=t[v];for(let T of b){if(x.peerNames.has(T)&&x.originalDependencies.has(T))continue;let q=x.dependencies.get(T);q&&r.dependencies.get(T)!==q&&(v===t.length-1?f.add(q):(f=null,y=!1,l&&(g=`- peer dependency ${Li(q.locator)} from parent ${Li(x.locator)} was not hoisted to ${u}`))),b.delete(T)}if(!y)break}m=y}if(m&&!c)for(let y of i.hoistedDependencies.values()){let b=n.get(y.name)||r.dependencies.get(y.name);if(!b||y.ident!==b.ident){m=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${Li(y.locator)}, available: ${Li(b==null?void 0:b.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:m?0:1,reason:g}},$0=r=>`${r.name}@${r.locator}`,K4e=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(b,v,x,T,q)=>{if(u.has(T))return;let Y=[...v,$0(T)],$=[...x,$0(T)],_=new Map,ne=new Map;for(let Z of yL(T)){let O=j4e(c,t,[c,...b,T],Z,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(ne.set(Z,O),O.isHoistable===2)for(let L of O.dependsOn){let de=_.get(L.name)||new Set;de.add(Z.name),_.set(L.name,de)}}let ee=new Set,A=(Z,O,L)=>{if(!ee.has(Z)){ee.add(Z),ne.set(Z,{isHoistable:1,reason:L});for(let de of _.get(Z.name)||[])A(T.dependencies.get(de),O,l.debugLevel>=2?`- peer dependency ${Li(Z.locator)} from parent ${Li(T.locator)} was not hoisted`:"")}};for(let[Z,O]of ne)O.isHoistable===1&&A(Z,O,O.reason);let oe=!1;for(let Z of ne.keys())if(!ee.has(Z)){f=!0;let O=o.get(T);O&&O.has(Z.name)&&(g=!0),oe=!0,T.dependencies.delete(Z.name),T.hoistedDependencies.set(Z.name,Z),T.reasons.delete(Z.name);let L=c.dependencies.get(Z.name);if(l.debugLevel>=2){let de=Array.from(v).concat([T.locator]).map(je=>Li(je)).join("\u2192"),Be=c.hoistedFrom.get(Z.name);Be||(Be=[],c.hoistedFrom.set(Z.name,Be)),Be.push(de),T.hoistedTo.set(Z.name,Array.from(e).map(je=>Li(je.locator)).join("\u2192"))}if(!L)c.ident!==Z.ident&&(c.dependencies.set(Z.name,Z),q.add(Z));else for(let de of Z.references)L.references.add(de)}if(T.dependencyKind===2&&oe&&(g=!0),l.check){let Z=fAe(r);if(Z)throw new Error(`${Z}, after hoisting dependencies of ${[c,...b,T].map(O=>Li(O.locator)).join("\u2192")}: -${Tm(r)}`)}let ce=yL(T);for(let Z of ce)if(ee.has(Z)){let O=ne.get(Z);if((n.get(Z.name)===Z.ident||!T.reasons.has(Z.name))&&O.isHoistable!==0&&T.reasons.set(Z.name,O.reason),!Z.isHoistBorder&&$.indexOf($0(Z))<0){u.add(T);let de=pAe(T,Z);h([...b,T],Y,$,de,m),u.delete(T)}}},p,m=new Set(yL(c)),y=Array.from(e).map(b=>$0(b));do{p=m,m=new Set;for(let b of p){if(b.locator===c.locator||b.isHoistBorder)continue;let v=pAe(c,b);h([],Array.from(t),y,v,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},fAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>Li(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,m=`${h?` hoisted to ${h}`:""}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${m}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${m} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(` -`)},N4e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:EL(t,n),ident:gAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:m,peerNames:y,hoistPriority:b,dependencyKind:v}=c,x=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([m]),locator:EL(p,m),ident:gAe(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:x?x.has(h):!1,hoistPriority:b||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=m=>{if(!h.has(m)){h.add(m),m.decoupled=!1;for(let y of m.dependencies.values())m.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},wL=r=>r.substring(0,r.indexOf("@",1)),L4e=r=>{let e={name:r.name,identName:wL(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:wL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},U4e=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},Li=r=>{if(!r)return"none";let e=r.indexOf("@",1),t=r.substring(0,e);t.endsWith("$wsroot$")&&(t=`wh:${t.replace("$wsroot$","")}`);let i=r.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(t=`v:${t}`),n.startsWith("workspace")&&(t=`w:${t}`,n=""),`${t}${n?`@${n}`:""}`}else return`${t}`},dAe=5e4,Tm=r=>{let e=0,t=(n,s,o="")=>{if(e>dAe||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+Li(u.locator)+(g?` ${g}`:"")} -`,l+=t(u,s,`${o}${cdAe?` -Tree is too large, part of the tree has been dunped -`:"")};var wo;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(wo||(wo={}));var Kn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Kn||(Kn={}));var CAe="node_modules",Su="$wsroot$";var Om=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=G4e(r,e),o=null;if(n.length===0){let a=hAe(t,{hoistingLimits:i});o=Y4e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},da=r=>`${r.name}@${r.reference}`,BL=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(k.delimiter).length,o=n.split(k.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},mAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},bL=(r,e,t,i)=>{if(r.linkType!==wo.SOFT)return!1;let n=H.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation);return k.contains(i,n)===null},q4e=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(r.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=H.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=da(f);if(l.has(p))return;l.add(p);let m=r.getPackageInformation(f);if(m){let y=h?da(h):"";if(da(f)!==y&&m.linkType===wo.SOFT&&!bL(m,f,r,i)){let b=EAe(m,f,r);(!a.get(b)||f.reference.startsWith("workspace:"))&&a.set(b,f)}for(let[b,v]of m.packageDependencies)v!==null&&(m.packagePeers.has(b)||c(r.getLocator(b,v),f))}};for(let f of o)c(f,null);let u=i.split(k.sep);for(let f of a.values()){let h=r.getPackageInformation(f),m=H.toPortablePath(h.packageLocation.slice(0,-1)).split(k.sep).slice(u.length),y=s;for(let b of m){let v=y.children.get(b);v||(v={children:new Map},y.children.set(b,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=da(h),m=n.get(p);m||(m=new Set,n.set(p,m)),m.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},G4e=(r,e)=>{let t=[],i=!1,n=new Map,s=q4e(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=H.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:Mn.WORKSPACE},u=new Map,g=(h,p)=>`${da(p)}:${h}`,f=(h,p,m,y,b,v,x,T)=>{var Z,O;let q=g(h,m),Y=u.get(q),$=!!Y;!$&&m.name===a.name&&m.reference===a.reference&&(Y=c,u.set(q,c));let _=bL(p,m,r,l);if(!Y){let L=Mn.REGULAR;_?L=Mn.EXTERNAL_SOFT_LINK:p.linkType===wo.SOFT&&m.name.endsWith(Su)&&(L=Mn.WORKSPACE),Y={name:h,identName:m.name,reference:m.reference,dependencies:new Set,peerNames:L===Mn.WORKSPACE?new Set:p.packagePeers,dependencyKind:L},u.set(q,Y)}let ne;if(_?ne=2:b.linkType===wo.SOFT?ne=1:ne=0,Y.hoistPriority=Math.max(Y.hoistPriority||0,ne),T&&!_){let L=da({name:y.identName,reference:y.reference}),de=n.get(L)||new Set;n.set(L,de),de.add(Y.name)}let ee=new Map(p.packageDependencies);if(e.project){let L=e.project.workspacesByCwd.get(H.toPortablePath(p.packageLocation.slice(0,-1)));if(L){let de=new Set([...Array.from(L.manifest.peerDependencies.values(),Be=>P.stringifyIdent(Be)),...Array.from(L.manifest.peerDependenciesMeta.keys())]);for(let Be of de)ee.has(Be)||(ee.set(Be,v.get(Be)||null),Y.peerNames.add(Be))}}let A=da({name:m.name.replace(Su,""),reference:m.reference}),oe=s.get(A);if(oe)for(let L of oe)ee.set(`${L.name}${Su}`,L.reference);(p!==b||p.linkType!==wo.SOFT||!_&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(x)))&&y.dependencies.add(Y);let ce=m!==a&&p.linkType===wo.SOFT&&!m.name.endsWith(Su)&&!_;if(!$&&!ce){let L=new Map;for(let[de,Be]of ee)if(Be!==null){let je=r.getLocator(de,Be),re=r.getLocator(de.replace(Su,""),Be),se=r.getPackageInformation(re);if(se===null)throw new Error("Assertion failed: Expected the package to have been registered");let be=bL(se,je,r,l);if(e.validateExternalSoftLinks&&e.project&&be){se.packageDependencies.size>0&&(i=!0);for(let[ve,pe]of se.packageDependencies)if(pe!==null){let V=P.parseLocator(Array.isArray(pe)?`${pe[0]}@${pe[1]}`:`${ve}@${pe}`);if(da(V)!==da(je)){let Qe=ee.get(ve);if(Qe){let le=P.parseLocator(Array.isArray(Qe)?`${Qe[0]}@${Qe[1]}`:`${ve}@${Qe}`);mAe(le,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,le)}`})}else{let le=L.get(ve);if(le){let fe=le.target,gt=P.parseLocator(Array.isArray(fe)?`${fe[0]}@${fe[1]}`:`${ve}@${fe}`);mAe(gt,V)||t.push({messageName:X.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(je.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${m.name}@${m.reference}`))} dependency ${P.prettyLocator(e.project.configuration,V)} conflicts with dependency ${P.prettyLocator(e.project.configuration,gt)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(le.portal.name))}`})}else L.set(ve,{target:V.reference,portal:je})}}}}let he=(Z=e.hoistingLimitsByCwd)==null?void 0:Z.get(x),Fe=be?x:k.relative(l,H.toPortablePath(se.packageLocation))||Me.dot,Ke=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Fe),ke=he===Kn.DEPENDENCIES||Ke===Kn.DEPENDENCIES||Ke===Kn.WORKSPACES;f(de,se,je,Y,p,ee,Fe,ke)}}};return f(a.name,o,a,c,o,o.packageDependencies,Me.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function EAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?t.resolveVirtual(r.packageLocation):r.packageLocation;return H.toPortablePath(i||r.packageLocation)}function J4e(r,e,t){let i=e.getLocator(r.name.replace(Su,""),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return t.pnpifyFs?(o=H.toPortablePath(n.packageLocation),s=wo.SOFT):(o=EAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var Y4e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=J4e(u,r,t);return{locator:da(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:Jr(g),name:Jr(f)}:{scope:null,name:Jr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),m={name:h.identName,reference:p[0]},{name:y,scope:b}=s(h.name),v=b?[b,y]:[y],x=k.join(g,CAe),T=k.join(x,...v),q=`${f}/${m.name}`,Y=n(m,f,p.slice(1)),$=!1;if(Y.linkType===wo.SOFT&&t.project){let _=t.project.workspacesByCwd.get(Y.target.slice(0,-1));$=!!(_&&!_.manifest.name)}if(!h.name.endsWith(Su)&&!$){let _=i.get(T);if(_){if(_.dirList)throw new Error(`Assertion failed: ${T} cannot merge dir node with leaf node`);{let oe=P.parseLocator(_.locator),ce=P.parseLocator(Y.locator);if(_.linkType!==Y.linkType)throw new Error(`Assertion failed: ${T} cannot merge nodes with different link types ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/${P.stringifyLocator(ce)}`);if(oe.identHash!==ce.identHash)throw new Error(`Assertion failed: ${T} cannot merge nodes with different idents ${_.nodePath}/${P.stringifyLocator(oe)} and ${f}/s${P.stringifyLocator(ce)}`);Y.aliases=[...Y.aliases,..._.aliases,P.parseLocator(_.locator).reference]}}i.set(T,Y);let ne=T.split("/"),ee=ne.indexOf(CAe),A=ne.length-1;for(;ee>=0&&A>ee;){let oe=H.toPortablePath(ne.slice(0,A).join(k.sep)),ce=Jr(ne[A]),Z=i.get(oe);if(!Z)i.set(oe,{dirList:new Set([ce])});else if(Z.dirList){if(Z.dirList.has(ce))break;Z.dirList.add(ce)}A--}}a(h,Y.linkType===wo.SOFT?Y.target:T,q)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var LL={};ft(LL,{PnpInstaller:()=>oh,PnpLinker:()=>xu,default:()=>d8e,getPnpPath:()=>Tl,jsInstallUtils:()=>Ca,pnpUtils:()=>FL,quotePathIfNeeded:()=>GAe});var HAe=ge(ri()),jAe=ge(require("url"));var IAe;(function(t){t.HARD="HARD",t.SOFT="SOFT"})(IAe||(IAe={}));var er;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(er||(er={}));var yAe={[er.DEFAULT]:{collapsed:!1,next:{["*"]:er.DEFAULT}},[er.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:er.FALLBACK_EXCLUSION_LIST,packageRegistryData:er.PACKAGE_REGISTRY_DATA,["*"]:er.DEFAULT}},[er.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:er.FALLBACK_EXCLUSION_ENTRIES}},[er.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:er.FALLBACK_EXCLUSION_DATA}},[er.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:er.DEFAULT}},[er.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_REGISTRY_ENTRIES}},[er.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_STORE_DATA}},[er.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:er.PACKAGE_STORE_ENTRIES}},[er.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:er.PACKAGE_INFORMATION_DATA}},[er.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:er.PACKAGE_DEPENDENCIES,["*"]:er.DEFAULT}},[er.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:er.PACKAGE_DEPENDENCY}},[er.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:er.DEFAULT}}};function W4e(r,e,t){let i="";i+="[";for(let n=0,s=r.length;ns(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function X4e(r){let e=new Map,t=Mm(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function Z4e(r){return Mm(r.fallbackPool||[],([e])=>e)}function $4e(r){let e=[];for(let[t,i]of Mm(r.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of Mm(i,([g])=>g===null?"0":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,m]of Mm(a.entries(),([y])=>y))g.push([p,m]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function Km(r){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:X4e(r),fallbackPool:Z4e(r),packageRegistryData:$4e(r)}}var SAe=ge(QAe());function vAe(r,e){return[r?`${r} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,SAe.default)()].join("")}function e8e(r){return JSON.stringify(r,null,2)}function t8e(r){return`'${r.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function r8e(r){return[`return hydrateRuntimeState(JSON.parse(${t8e(BAe(r))}), {basePath: basePath || __dirname}); -`].join("")}function i8e(r){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function xAe(r){let e=Km(r),t=r8e(e);return vAe(r.shebang,t)}function kAe(r){let e=Km(r),t=i8e(r.dataLocation),i=vAe(r.shebang,t);return{dataFile:e8e(e),loaderFile:i}}var RAe=ge(require("fs")),l8e=ge(require("path")),FAe=ge(require("util"));function SL(r,{basePath:e}){let t=H.toPortablePath(e),i=k.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var x;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(x=p.discardFromLookup)!=null?x:!1,y={name:g,reference:h},b=s.get(p.packageLocation);b?(b.discardFromLookup=b.discardFromLookup&&m,m||(b.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:m});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return v||(v=k.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Um=ge(require("module"));function sh(r,e){if(typeof r=="string")return r;if(r){let t,i;if(Array.isArray(r)){for(t=0;t0)return(f=sh(n[g],u))?f.replace("*",c.substring(g.length-1)):vu(i,c,1)}return vu(i,c)}}var vL=ge(require("util"));var ur;(function(c){c.API_ERROR="API_ERROR",c.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",c.EXPORTS_RESOLUTION_FAILED="EXPORTS_RESOLUTION_FAILED",c.MISSING_DEPENDENCY="MISSING_DEPENDENCY",c.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",c.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",c.INTERNAL="INTERNAL",c.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",c.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var s8e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ai(r,e,t={},i){i!=null||(i=s8e.has(r)?"MODULE_NOT_FOUND":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:te(N({},n),{value:i}),pnpCode:te(N({},n),{value:r}),data:te(N({},n),{value:t})})}function Bo(r){return H.normalize(H.fromPortablePath(r))}var o8e=ge(require("fs")),DAe=ge(require("module")),a8e=ge(require("path")),A8e=new Set(DAe.Module.builtinModules||Object.keys(process.binding("natives"))),tb=r=>r.startsWith("node:")||A8e.has(r);function xL(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,s=/^(\/|\.{1,2}(\/|$))/,o=/\/$/,a=/^\.{0,2}\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=r.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");c.push({name:re,reference:be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(re,se){return{fn:re,args:se,error:null,result:null}}function m(re){var Ke,ke,ve,pe,V,Qe;let se=(ve=(ke=(Ke=process.stderr)==null?void 0:Ke.hasColors)==null?void 0:ke.call(Ke))!=null?ve:process.stdout.isTTY,be=(le,fe)=>`[${le}m${fe}`,he=re.error;console.error(he?be("31;1",`\u2716 ${(pe=re.error)==null?void 0:pe.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let le of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,vL.inspect)(le,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,vL.inspect)(re.result,{colors:se,compact:!0})}`));let Fe=(Qe=(V=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:V.slice(2))!=null?Qe:[];if(Fe.length>0){console.error();for(let le of Fe)console.error(` ${be("38;5;244",le)}`)}console.error()}function y(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let he=p(re,be);try{return he.result=se(...be)}catch(Fe){throw he.error=Fe}finally{m(he)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(he){let Fe=p(re,be);throw Fe.error=he,m(Fe),he}}}return se}function b(re){let se=A(re);if(!se)throw ai(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function v(re){if(re.name===null)return!0;for(let se of r.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let x=new Set(["default","node","require"]);function T(re,se=x){let be=Z(k.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ai(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:he}=b(be),Fe=k.join(he,kt.manifest);if(!e.fakeFs.existsSync(Fe))return null;let Ke=JSON.parse(e.fakeFs.readFileSync(Fe,"utf8")),ke=k.contains(he,re);if(ke===null)throw ai(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");a.test(ke)||(ke=`./${ke}`);let ve;try{ve=PAe(Ke,k.normalize(ke),{conditions:se,unsafe:!0})}catch(pe){throw ai(ur.EXPORTS_RESOLUTION_FAILED,pe.message,{unqualifiedPath:Bo(re),locator:be,pkgJson:Ke,subpath:Bo(ke),conditions:se},"ERR_PACKAGE_PATH_NOT_EXPORTED")}return typeof ve=="string"?k.join(he,ve):null}function q(re,se,{extensions:be}){let he;try{se.push(re),he=e.fakeFs.statSync(re)}catch(Fe){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(re);if(he&&he.isDirectory()){let Fe;try{Fe=JSON.parse(e.fakeFs.readFileSync(k.join(re,kt.manifest),"utf8"))}catch(ke){}let Ke;if(Fe&&Fe.main&&(Ke=k.resolve(re,Fe.main)),Ke&&Ke!==re){let ke=q(Ke,se,{extensions:be});if(ke!==null)return ke}}for(let Fe=0,Ke=be.length;Fe{let ve=JSON.stringify(ke.name);if(he.has(ve))return;he.add(ve);let pe=oe(ke);for(let V of pe)if(b(V).packagePeers.has(re))Fe(V);else{let le=be.get(V.name);typeof le=="undefined"&&be.set(V.name,le=new Set),le.add(V.reference)}};Fe(se);let Ke=[];for(let ke of[...be.keys()].sort())for(let ve of[...be.get(ke)].sort())Ke.push({name:ke,reference:ve});return Ke}function Z(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(_(re)&&!se)return null;let he=k.relative(r.basePath,re);he.match(s)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Fe=h.get(he);if(typeof Fe=="undefined"||Fe.discardFromLookup&&!be){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Fe.locator}while(he!=="");return null}function O(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return H.toPortablePath(e.pnpapiResolution);if(be&&tb(re))return null;let he=Bo(re),Fe=se&&Bo(se);if(se&&_(se)&&(!k.isAbsolute(re)||Z(re)===null)){let ve=$(re,se);if(ve===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(ve)}let Ke,ke=re.match(n);if(ke){if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let[,ve,pe]=ke,V=Z(se);if(!V){let jt=$(re,se);if(jt===!1)throw ai(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${he}" -Required by: ${Fe} -`,{request:he,issuer:Fe});return H.toPortablePath(jt)}let le=b(V).packageDependencies.get(ve),fe=null;if(le==null&&V.name!==null){let jt=r.fallbackExclusionList.get(V.name);if(!jt||!jt.has(V.reference)){for(let Oi=0,Xs=c.length;Oiv(Qr))?gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt}):gt=ai(ur.MISSING_PEER_DEPENDENCY,`${V.name} tried to access ${ve} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) - -${jt.map(Qr=>`Ancestor breaking the chain: ${Qr.name}@${Qr.reference} -`).join("")} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve,brokenAncestors:jt})}else le===void 0&&(!be&&tb(re)?v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${ve} isn't otherwise declared in ${V.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}):v(V)?gt=ai(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${ve}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${Fe} -`,{request:he,issuer:Fe,dependencyName:ve}):gt=ai(ur.UNDECLARED_DEPENDENCY,`${V.name} tried to access ${ve}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${ve}${ve!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,issuerLocator:Object.assign({},V),dependencyName:ve}));if(le==null){if(fe===null||gt===null)throw gt||new Error("Assertion failed: Expected an error to have been set");le=fe;let jt=gt.message.replace(/\n.*/g,"");gt.message=jt,!u.has(jt)&&i!==0&&(u.add(jt),process.emitWarning(gt))}let Ht=Array.isArray(le)?{name:le[0],reference:le[1]}:{name:ve,reference:le},Mt=b(Ht);if(!Mt.packageLocation)throw ai(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${Ht.name}@${Ht.reference}${Ht.name!==he?` (via "${he}")`:""} -Required by: ${V.name}@${V.reference} (via ${Fe}) -`,{request:he,issuer:Fe,dependencyLocator:Object.assign({},Ht)});let Ei=Mt.packageLocation;pe?Ke=k.join(Ei,pe):Ke=Ei}else if(k.isAbsolute(re))Ke=k.normalize(re);else{if(!se)throw ai(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Fe});let ve=k.resolve(se);se.match(o)?Ke=k.normalize(k.join(ve,re)):Ke=k.normalize(k.join(k.dirname(ve),re))}return k.normalize(Ke)}function L(re,se,be=x){if(s.test(re))return se;let he=T(se,be);return he?k.normalize(he):se}function de(re,{extensions:se=Object.keys(Um.Module._extensions)}={}){var Fe,Ke;let be=[],he=q(re,be,{extensions:se});if(he)return k.normalize(he);{let ke=Bo(re),ve=Z(re);if(ve){let{packageLocation:pe}=b(ve),V=!0;try{e.fakeFs.accessSync(pe)}catch(Qe){if((Qe==null?void 0:Qe.code)==="ENOENT")V=!1;else{let le=((Ke=(Fe=Qe==null?void 0:Qe.message)!=null?Fe:Qe)!=null?Ke:"empty exception thrown").replace(/^[A-Z]/,fe=>fe.toLowerCase());throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Required package exists but could not be accessed (${le}). - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}if(!V){let Qe=pe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${Qe} - -Missing package: ${ve.name}@${ve.reference} -Expected package location: ${Bo(pe)} -`,{unqualifiedPath:ke,extensions:se})}}throw ai(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${ke} -${be.map(pe=>`Not found: ${Bo(pe)} -`).join("")}`,{unqualifiedPath:ke,extensions:se})}}function Be(re,se,{considerBuiltins:be,extensions:he,conditions:Fe}={}){try{let Ke=O(re,se,{considerBuiltins:be});if(re==="pnpapi")return Ke;if(Ke===null)return null;let ke=()=>se!==null?_(se):!1,ve=(!be||!tb(re))&&!ke()?L(re,Ke,Fe):Ke;return de(ve,{extensions:he})}catch(Ke){throw Object.prototype.hasOwnProperty.call(Ke,"pnpCode")&&Object.assign(Ke.data,{request:Bo(re),issuer:se&&Bo(se)}),Ke}}function je(re){let se=k.normalize(re),be=Wr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:ne,topLevel:ee,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of f)for(let he of be.keys())se!==null&&he!==null&&re.push({name:se,reference:he});return re},getPackageInformation:re=>{let se=A(re);if(se===null)return null;let be=H.fromPortablePath(se.packageLocation);return te(N({},se),{packageLocation:be})},findPackageLocator:re=>Z(H.toPortablePath(re)),resolveToUnqualified:y("resolveToUnqualified",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=O(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveUnqualified:y("resolveUnqualified",(re,se)=>H.fromPortablePath(de(H.toPortablePath(re),se))),resolveRequest:y("resolveRequest",(re,se,be)=>{let he=se!==null?H.toPortablePath(se):null,Fe=Be(H.toPortablePath(re),he,be);return Fe===null?null:H.fromPortablePath(Fe)}),resolveVirtual:y("resolveVirtual",re=>{let se=je(H.toPortablePath(re));return se!==null?H.fromPortablePath(se):null})}}var O0t=(0,FAe.promisify)(RAe.readFile);var NAe=(r,e,t)=>{let i=Km(r),n=SL(i,{basePath:e}),s=H.join(e,kt.pnpCjs);return xL(n,{fakeFs:t,pnpapiResolution:s})};var PL=ge(TAe());var Ca={};ft(Ca,{checkAndReportManifestCompatibility:()=>MAe,checkManifestCompatibility:()=>OAe,extractBuildScripts:()=>rb,getExtractHint:()=>DL,hasBindingGyp:()=>RL});function OAe(r){return P.isPackageCompatible(r,Vg.getArchitectureSet())}function MAe(r,e,{configuration:t,report:i}){return OAe(r)?!0:(i==null||i.reportWarningOnce(X.INCOMPATIBLE_ARCHITECTURE,`${P.prettyLocator(t,r)} The ${Vg.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([cs.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([cs.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:r.linkType!==Qt.HARD?(n==null||n.reportWarningOnce(X.SOFT_LINK_BUILD,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(X.BUILD_DISABLED,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!t.built?(n==null||n.reportWarningOnce(X.DISABLED_BUILD_SCRIPTS,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):MAe(r,"build",{configuration:i,report:n})?s:[]}var c8e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function DL(r){return r.packageFs.getExtractHint({relevantExtensions:c8e})}function RL(r){let e=k.join(r.prefixPath,"binding.gyp");return r.packageFs.existsSync(e)}var FL={};ft(FL,{getUnpluggedPath:()=>Hm});function Hm(r,{configuration:e}){return k.resolve(e.get("pnpUnpluggedFolder"),P.slugifyLocator(r))}var u8e=new Set([P.makeIdent(null,"nan").identHash,P.makeIdent(null,"node-gyp").identHash,P.makeIdent(null,"node-pre-gyp").identHash,P.makeIdent(null,"node-addon-api").identHash,P.makeIdent(null,"fsevents").identHash,P.makeIdent(null,"open").identHash,P.makeIdent(null,"opn").identHash]),xu=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let i=Tl(t.project).cjs;if(!K.existsSync(i))throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return H.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Tl(t.project).cjs;if(!K.existsSync(i))return null;let s=Se.getFactoryWithDefault(this.pnpCache,i,()=>Se.dynamicRequire(i,{cachingStrategy:Se.CachingStrategy.FsTime})).findPackageLocator(H.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new oh(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},oh=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new Se.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==Qt.SOFT,g,f;if(c||u){let x=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(x.locatorHash),typeof g=="undefined"&&(g=await g8e(t),e.linkType===Qt.HARD&&this.customData.store.set(x.locatorHash,g)),g.manifest.type==="module"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(x,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(k.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let m=k.resolve(p.getRealPath(),t.prefixPath),y=NL(this.opts.project.cwd,m),b=new Map,v=new Set;if(a){for(let x of e.peerDependencies.values())b.set(P.stringifyIdent(x),null),v.add(P.stringifyIdent(x));if(!o){let x=P.devirtualizeLocator(e);this.virtualTemplates.set(x.locatorHash,{location:NL(this.opts.project.cwd,Wr.resolveVirtual(m)),locator:x})}}return Se.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:b,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:m,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Tl(this.opts.project);if(K.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(X.UNNAMED,`Removing the old ${ae.pretty(this.opts.project.configuration,kt.pnpJs,ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${ae.pretty(this.opts.project.configuration,kt.pnpCjs,ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ae.pretty(this.opts.project.configuration,"yarn sdks",ae.Type.CODE)}.`),await K.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await K.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await K.removePromise(e.cjs),await K.removePromise(this.opts.project.configuration.get("pnpDataPath")),await K.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())Se.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!=="none",s=[],o=new Map,a=Se.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(t==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let t=Tl(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(X.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await K.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=xAe(e);await K.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await K.removePromise(i)}else{let o=k.relative(k.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=kAe(te(N({},e),{dataLocation:o}));await K.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await K.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(X.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await K.changeFilePromise(t.esmLoader,(0,PL.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await K.removePromise(s);else for(let o of await K.readdirPromise(s)){let a=k.resolve(s,o);this.unpluggedPaths.has(a)||await K.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=k.join(n.cwd,"node_modules");if(i&&i.test(k.relative(this.opts.project.cwd,n.cwd))||!K.existsSync(s))continue;let o=await K.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)t.push(s);else for(let l of a)t.push(k.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged!="undefined"?i.unplugged:u8e.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=Hm(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Na(n,{baseFs:t.packageFs,pathUtils:k}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=k.join(n,t.prefixPath,".ready");await K.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,Me.dot,{baseFs:t.packageFs,overwrite:!1}),await K.writeFilePromise(s,""))})),new _t(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Se.getMapWithDefault(this.packageRegistry,"@@disk"),i=NL(this.opts.project.cwd,e);return Se.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:Qt.SOFT,discardFromLookup:!1}))}};function NL(r,e){let t=k.relative(r,e);return t.match(/^\.{0,2}\//)||(t=`./${t}`),t.replace(/\/?$/,"/")}async function g8e(r){var i;let e=(i=await At.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new At,t=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:DL(r),hasBindingGyp:RL(r)}}}var KAe=ge(is());var jm=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new Pe("This command can only be used if the `nodeLinker` option is set to `pnp`");await t.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=P.parseDescriptor(f),p=h.range!=="unknown"?h:P.makeDescriptor(h,"*");if(!Wt.validRange(p.range))throw new Pe(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(e,p)})`);return m=>{let y=P.stringifyIdent(m);return!KAe.default.isMatch(y,P.stringifyIdent(p))||m.version&&!Wt.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of t.storedPackages.values())!t.tryWorkspaceByLocator(h)&&!P.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],m=(y,b)=>{if(!h.has(y.locatorHash)&&(h.add(y.locatorHash),!t.tryWorkspaceByLocator(y)&&o.some(v=>v(y))&&p.push(y),!(b>0&&!this.recursive)))for(let v of y.dependencies.values()){let x=t.storedResolutions.get(v.descriptorHash);if(!x)throw new Error("Assertion failed: The resolution should have been registered");let T=t.storedPackages.get(x);if(!T)throw new Error("Assertion failed: The package should have been registered");m(T,b+1)}};for(let y of f){let b=t.storedPackages.get(y.anchoredLocator.locatorHash);if(!b)throw new Error("Assertion failed: The package should have been registered");m(b,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(t.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new Pe(`Patterns ${ae.prettyList(e,s,ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new Pe(`Pattern ${ae.prettyList(e,s,ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=Se.sortMap(c,f=>P.stringifyLocator(f)),(await Je.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let m=(h=p.version)!=null?h:"unknown",y=t.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(p,m));y.unplugged=!0,f.reportInfo(X.UNNAMED,`Will unpack ${P.prettyLocator(e,p)} to ${ae.pretty(e,Hm(p,{configuration:e}),ae.Type.PATH)}`),f.reportJson({locator:P.stringifyLocator(p),version:m})}await t.topLevelWorkspace.persistManifest(),f.reportSeparator(),await t.install({cache:n,report:f})})).exitCode()}};jm.paths=[["unplug"]],jm.usage=Re.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var UAe=jm;var Tl=r=>({cjs:k.join(r.cwd,kt.pnpCjs),cjsLegacy:k.join(r.cwd,kt.pnpJs),esmLoader:k.join(r.cwd,".pnp.loader.mjs")}),GAe=r=>/\s/.test(r)?JSON.stringify(r):r;async function f8e(r,e,t){let i=Tl(r),n=`--require ${GAe(H.fromPortablePath(i.cjs))}`;if(K.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,jAe.pathToFileURL)(H.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&HAe.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(K.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function h8e(r,e){let t=Tl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get("pnpDataPath")),e(r.configuration.get("pnpUnpluggedFolder"))}var p8e={hooks:{populateYarnPaths:h8e,setupScriptEnvironment:f8e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:Ie.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:Ie.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:Ie.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:Ie.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:Ie.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:Ie.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:Ie.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:Ie.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:Ie.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[xu],commands:[UAe]},d8e=p8e;var _Ae=ge(zAe());var UL=ge(require("crypto")),VAe=ge(require("fs")),XAe=1,jr="node_modules",ib=".bin",ZAe=".yarn-state.yml",Ti;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Ti||(Ti={}));var HL=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(n===null)throw new Pe("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let a=new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=t.project.configuration.startingCwd;return s.locations.find(a=>k.contains(o,a))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Se.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await jL(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=nb(k.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new $Ae(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},$Ae=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=k.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await F8e(e,t),e.linkType===Qt.HARD&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${H.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await jL(this.opts.project),i=this.opts.project.configuration.get("nmMode");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=Se.validateEnum(Kn,(m=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?m:h)}catch(y){let b=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(X.INVALID_MANIFEST,`${b}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Kn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,m;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(m=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?m:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(H.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>H.fromPortablePath(Wr.resolveVirtual(H.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=Om(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=BL(a);await N8e(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(ele(f))continue;let p=P.parseLocator(f),m=this.localStore.get(p.locatorHash);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(m.pkg))continue;let y=Ca.extractBuildScripts(m.pkg,m.customPackageData,m.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(X.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ae.pretty(this.opts.project.configuration,"--preserve-symlinks",ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function F8e(r,e){var n;let t=(n=await At.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new At,i=new Set(["preinstall","install","postinstall"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:Ca.getExtractHint(e),hasBindingGyp:Ca.hasBindingGyp(e)}}}async function L8e(r,e,t,i,{installChangedByUser:n}){let s="";s+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,s+=`# cause your node_modules installation to become invalidated. -`,s+=` -`,s+=`__metadata: -`,s+=` version: ${XAe} -`,s+=` nmMode: ${i.value} -`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=` -`,s+=`${JSON.stringify(u)}: -`,s+=` locations: -`;for(let f of g.locations){let h=k.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` - ${JSON.stringify(h)} -`}if(g.aliases.length>0){s+=` aliases: -`;for(let f of g.aliases)s+=` - ${JSON.stringify(f)} -`}if(u===a&&t.size>0){s+=` bin: -`;for(let[f,h]of t){let p=k.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=` ${JSON.stringify(p)}: -`;for(let[m,y]of h){let b=k.relative(k.join(f,jr),y);s+=` ${JSON.stringify(m)}: ${JSON.stringify(b)} -`}}}}let l=r.cwd,c=k.join(l,jr,ZAe);n&&await K.removePromise(c),await K.changeFilePromise(c,s,{automaticNewlines:!0})}async function jL(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=k.join(t,jr,ZAe),n;try{n=await K.statPromise(i)}catch(c){}if(!n)return null;let s=Si(await K.readFilePromise(i,"utf8"));if(s.__metadata.version>XAe)return null;let o=s.__metadata.nmMode||Ti.CLASSIC,a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>k.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let m=k.join(t,H.toPortablePath(h)),y=Se.getMapWithDefault(l,m);for(let[b,v]of Object.entries(p))y.set(Jr(b),H.toPortablePath([m,jr,v].join(k.sep)))}if(a.set(c,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:m}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,m),h),b=P.stringifyLocator(y);a.set(b,{target:Me.dot,linkType:Qt.HARD,locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:tle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var Ah=async(r,e)=>{if(r.split(k.sep).indexOf(jr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await K.statPromise(r):await K.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await K.unlinkPromise(r);return}}let t=await K.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=k.join(r,Jr(i.name));i.isDirectory()?(i.name!==jr||e&&e.innerLoop)&&await Ah(n,{innerLoop:!0,contentsOnly:!1}):await K.unlinkPromise(n)}e.contentsOnly||await K.rmdirPromise(r)}catch(t){if(t.code!=="ENOENT"&&t.code!=="ENOTEMPTY")throw t}},rle=4,nb=(r,{skipPrefix:e})=>{let t=k.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(k.sep).filter(l=>l!==""),n=i.indexOf(jr),s=i.slice(0,n).join(k.sep),o=k.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},tle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:Qt.HARD});for(let[n,s]of r.entries()){if(s.linkType===Qt.SOFT&&k.contains(e,s.target)!==null){let a=Se.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=nb(o,{skipPrefix:e}),c=Se.getFactoryWithDefault(t,a,i);for(let u=0;u{let t;try{process.platform==="win32"&&(t=await K.lstatPromise(r))}catch(i){}process.platform=="win32"&&(!t||t.isDirectory())?await K.symlinkPromise(r,e,"junction"):await K.symlinkPromise(k.relative(k.dirname(e),r),e)};async function ile(r,e,t){let i=k.join(r,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));try{await K.writeFilePromise(i,t);try{await K.linkPromise(i,e)}catch(n){}}finally{await K.unlinkPromise(i)}}async function T8e({srcPath:r,dstPath:e,srcMode:t,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Ti.HARDLINKS_GLOBAL&&i&&o){let l=k.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await Dn.checksumFile(l,{baseFs:K,algorithm:"sha1"})!==o){let g=k.join(i,Jr(`${UL.default.randomBytes(16).toString("hex")}.tmp`));await K.renamePromise(l,g);let f=await n.readFilePromise(r);await K.writeFilePromise(g,f);try{await K.linkPromise(g,l),await K.unlinkPromise(g)}catch(h){}}await K.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(r);await ile(i,l,u);try{await K.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Ti.HARDLINKS_LOCAL,await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let a=t&511;a!==420&&await K.chmodPromise(e,a)}var Ol;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(Ol||(Ol={}));var O8e=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await K.mkdirPromise(r,{recursive:!0});let o=async(l=Me.dot)=>{let c=k.join(e,l),u=await t.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=k.join(l,f.name),p,m=k.join(c,f.name);if(f.isFile()){if(p={kind:Ol.FILE,mode:(await t.lstatPromise(m)).mode},n.value===Ti.HARDLINKS_GLOBAL){let y=await Dn.checksumFile(m,{baseFs:t,algorithm:"sha1"});p.digest=y}}else if(f.isDirectory())p={kind:Ol.DIRECTORY};else if(f.isSymbolicLink())p={kind:Ol.SYMLINK,symlinkTo:await t.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await t.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==jr){let y=await o(h);for(let[b,v]of y)g.set(b,v)}}return g},a;if(n.value===Ti.HARDLINKS_GLOBAL&&i&&s){let l=k.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await K.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await ile(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=k.join(e,l),g=k.join(r,l);c.kind===Ol.DIRECTORY?await K.mkdirPromise(g,{recursive:!0}):c.kind===Ol.FILE?await T8e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:t,globalHardlinksStore:i}):c.kind===Ol.SYMLINK&&await GL(k.resolve(k.dirname(g),c.symlinkTo),g)}};function M8e(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,m=k.join(c,u),y=new Set;if(u===jr||u.startsWith("@")){let v;try{v=K.statSync(m)}catch(T){}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(K.readdirSync(m))):y=new Set(g.children.get(u).children.keys()):a=!0;let x=e.get(c);if(x){let T=k.join(c,jr,ib),q;try{q=K.statSync(T)}catch(Y){}if(!q)a=!0;else if(q.mtimeMs>t){a=!0;let Y=new Set(K.readdirSync(T)),$=new Map;s.set(c,$);for(let[_,ne]of x)Y.has(_)&&$.set(_,ne)}else s.set(c,x)}}else p=h.has(u);let b=g.children.get(u);if(p){let{linkType:v,locator:x}=b,T={children:new Map,linkType:v,locator:x};if(f.children.set(u,T),x){let q=Se.getSetWithDefault(o,x);q.add(m),o.set(x,q)}for(let q of b.children.keys())l(m,q,b,T,y)}else b.locator&&i.storedBuildState.delete(P.parseLocator(b.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Se.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(jr)&&l(c,jr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function ele(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function K8e(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=ele(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=k.join(l[0],f);f!==""&&K.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=k.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let m=k.join(a,H.toPortablePath(p));u.set(Jr(h),m)}for(let[h,p]of c.children){let m=k.join(a,h),y=o(m,m,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(k.join(a,f),l,h);for(let[m,y]of p)u.set(m,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var nle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function YL(r){return k.join(r.get("globalFolder"),"store")}async function N8e(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=k.join(i.cwd,jr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=M8e(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=tle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:_,dstDir:ne,linkType:ee,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})=>{let Z=(async()=>{try{ee===Qt.SOFT?(await K.mkdirPromise(k.dirname(ne),{recursive:!0}),await GL(k.resolve(_),ne)):await O8e(ne,_,{baseFs:t,globalHardlinksStore:A,nmMode:oe,packageChecksum:ce})}catch(O){throw O.message=`While persisting ${_} -> ${ne} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(Z),1));h.push(Z),h.length>rle&&await Promise.race(h)},m=async(_,ne,ee)=>{let A=(async()=>{let oe=async(ce,Z,O)=>{try{O.innerLoop||await K.mkdirPromise(Z,{recursive:!0});let L=await K.readdirPromise(ce,{withFileTypes:!0});for(let de of L){if(!O.innerLoop&&de.name===ib)continue;let Be=k.join(ce,de.name),je=k.join(Z,de.name);de.isDirectory()?(de.name!==jr||O&&O.innerLoop)&&(await K.mkdirPromise(je,{recursive:!0}),await oe(Be,je,te(N({},O),{innerLoop:!0}))):$.value===Ti.HARDLINKS_LOCAL||$.value===Ti.HARDLINKS_GLOBAL?await K.linkPromise(Be,je):await K.copyFilePromise(Be,je,VAe.default.constants.COPYFILE_FICLONE)}}catch(L){throw O.innerLoop||(L.message=`While cloning ${ce} -> ${Z} ${L.message}`),L}finally{O.innerLoop||T.tick()}};await oe(_,ne,ee)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>rle&&await Promise.race(h)},y=async(_,ne,ee)=>{if(ee)for(let[A,oe]of ne.children){let ce=ee.children.get(A);await y(k.join(_,A),oe,ce)}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!1});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:_===a,allowSymlink:A})}};for(let[_,ne]of l){let ee=f.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A),Z=k.join(_,A);await y(Z,oe,ce)}}let b=async(_,ne,ee)=>{if(ee){nle(ne.locator,ee.locator)||await Ah(_,{contentsOnly:ne.linkType===Qt.HARD});for(let[A,oe]of ne.children){let ce=ee.children.get(A);await b(k.join(_,A),oe,ce)}}else{ne.children.has(jr)&&await Ah(k.join(_,jr),{contentsOnly:!0});let A=k.basename(_)===jr&&f.has(k.join(k.dirname(_),k.sep));await Ah(_,{contentsOnly:ne.linkType===Qt.HARD,allowSymlink:A})}};for(let[_,ne]of f){let ee=l.get(_);for(let[A,oe]of ne.children){if(A===".")continue;let ce=ee&&ee.children.get(A);await b(k.join(_,A),oe,ce)}}let v=new Map,x=[];for(let[_,ne]of u)for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=f.get(A),Z=A;if(ce){for(let O of oe)if(Z=k.join(Z,O),ce=ce.children.get(O),!ce)break;if(ce){let O=nle(ce.locator,_),L=e.get(ce.locator),de=L.target,Be=Z,je=L.linkType;if(O)v.has(de)||v.set(de,Be);else if(de!==Be){let re=P.parseLocator(ce.locator);P.isVirtualLocator(re)&&(re=P.devirtualizeLocator(re)),x.push({srcDir:de,dstDir:Be,linkType:je,realLocatorHash:re.locatorHash})}}}}for(let[_,{locations:ne}]of e.entries())for(let ee of ne){let{locationRoot:A,segments:oe}=nb(ee,{skipPrefix:i.cwd}),ce=l.get(A),Z=f.get(A),O=A,L=e.get(_),de=P.parseLocator(_);P.isVirtualLocator(de)&&(de=P.devirtualizeLocator(de));let Be=de.locatorHash,je=L.target,re=ee;if(je===re)continue;let se=L.linkType;for(let be of oe)Z=Z.children.get(be);if(!ce)x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});else for(let be of oe)if(O=k.join(O,be),ce=ce.children.get(be),!ce){x.push({srcDir:je,dstDir:re,linkType:se,realLocatorHash:Be});break}}let T=Ji.progressViaCounter(x.length),q=n.reportProgress(T),Y=i.configuration.get("nmMode"),$={value:Y};try{let _=$.value===Ti.HARDLINKS_GLOBAL?`${YL(i.configuration)}/v1`:null;if(_&&!await K.existsPromise(_)){await K.mkdirpPromise(_);for(let ee=0;ee<256;ee++)await K.mkdirPromise(k.join(_,ee.toString(16).padStart(2,"0")))}for(let ee of x)(ee.linkType===Qt.SOFT||!v.has(ee.srcDir))&&(v.set(ee.srcDir,ee.dstDir),await p(te(N({},ee),{globalHardlinksStore:_,nmMode:$,packageChecksum:o.get(ee.realLocatorHash)||null})));await Promise.all(h),h.length=0;for(let ee of x){let A=v.get(ee.srcDir);ee.linkType!==Qt.SOFT&&ee.dstDir!==A&&await m(A,ee.dstDir,{nmMode:$})}await Promise.all(h),await K.mkdirPromise(a,{recursive:!0});let ne=await K8e(e,f,i.cwd,{loadManifest:s});await U8e(c,ne,i.cwd),await L8e(i,e,ne,$,{installChangedByUser:g}),Y==Ti.HARDLINKS_GLOBAL&&$.value==Ti.HARDLINKS_LOCAL&&n.reportWarningOnce(X.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{q.stop()}}async function U8e(r,e,t){for(let i of r.keys()){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=k.join(i,jr,ib);await K.removePromise(n)}}for(let[i,n]of e){if(k.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=k.join(i,jr,ib),o=r.get(i)||new Map;await K.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await K.removePromise(k.join(s,a)),process.platform==="win32"&&await K.removePromise(k.join(s,Jr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=k.join(s,a);c!==l&&(process.platform==="win32"?await(0,_Ae.default)(H.fromPortablePath(l),H.fromPortablePath(u),{createPwshFile:!1}):(await K.removePromise(u),await GL(l,u),k.contains(t,await K.realpathPromise(l))!==null&&await K.chmodPromise(l,493)))}}}var qL=class extends xu{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new sle(e)}},sle=class extends oh{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let t=new Wr({baseFs:new Is({libzip:await fn(),maxOpenFiles:80,readOnlyArchives:!0})}),i=NAe(e,this.opts.project.cwd,t),{tree:n,errors:s}=Om(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=P.parseLocator(g.locator),h=P.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=k.join(this.opts.project.cwd,kt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=k.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=k.join(g,h),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${h}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var H8e={hooks:{cleanGlobalArtifacts:async r=>{let e=YL(r);await K.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:Ie.STRING,values:[Kn.WORKSPACES,Kn.DEPENDENCIES,Kn.NONE],default:Kn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:Ie.STRING,values:[Ti.CLASSIC,Ti.HARDLINKS_LOCAL,Ti.HARDLINKS_GLOBAL],default:Ti.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:Ie.BOOLEAN,default:!0}},linkers:[HL,qL]},j8e=H8e;var qT={};ft(qT,{default:()=>V9e,npmConfigUtils:()=>br,npmHttpUtils:()=>zt,npmPublishUtils:()=>wh});var cle=ge(ri());var Cr="npm:";var zt={};ft(zt,{AuthType:()=>us,customPackageError:()=>q8e,del:()=>z8e,get:()=>bo,getIdentUrl:()=>Kl,handleInvalidAuthenticationError:()=>Ml,post:()=>J8e,put:()=>W8e});var Ale=ge(WC()),lle=ge(require("url"));var br={};ft(br,{RegistryType:()=>QA,getAuditRegistry:()=>G8e,getAuthConfiguration:()=>zL,getDefaultRegistry:()=>sb,getPublishRegistry:()=>ole,getRegistryConfiguration:()=>ale,getScopeConfiguration:()=>WL,getScopeRegistry:()=>SA,normalizeRegistry:()=>ma});var QA;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(QA||(QA={}));function ma(r){return r.replace(/\/$/,"")}function G8e(r,{configuration:e}){let t=e.get(QA.AUDIT_REGISTRY);return t!==null?ma(t):ole(r,{configuration:e})}function ole(r,{configuration:e}){var t;return((t=r.publishConfig)==null?void 0:t.registry)?ma(r.publishConfig.registry):r.name?SA(r.name.scope,{configuration:e,type:QA.PUBLISH_REGISTRY}):sb({configuration:e,type:QA.PUBLISH_REGISTRY})}function SA(r,{configuration:e,type:t=QA.FETCH_REGISTRY}){let i=WL(r,{configuration:e});if(i===null)return sb({configuration:e,type:t});let n=i.get(t);return n===null?sb({configuration:e,type:t}):ma(n)}function sb({configuration:r,type:e=QA.FETCH_REGISTRY}){let t=r.get(e);return ma(t!==null?t:r.get(QA.FETCH_REGISTRY))}function ale(r,{configuration:e}){let t=e.get("npmRegistries"),i=ma(r),n=t.get(i);if(typeof n!="undefined")return n;let s=t.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function WL(r,{configuration:e}){if(r===null)return null;let i=e.get("npmScopes").get(r);return i||null}function zL(r,{configuration:e,ident:t}){let i=t&&WL(t.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:ale(r,{configuration:e})||e}var us;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(us||(us={}));async function Ml(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(ob(r))throw new ct(X.AUTHENTICATION_INVALID,"Invalid OTP token");if(((s=r.originalError)==null?void 0:s.name)==="HTTPError"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new ct(X.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await Y8e(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function q8e(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Kl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function bo(r,a){var l=a,{configuration:e,headers:t,ident:i,authType:n,registry:s}=l,o=Or(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=SA(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await ab(s,{authType:n,configuration:e,ident:i});c&&(t=te(N({},t),{authorization:c}));try{return await ir.get(r.charAt(0)==="/"?`${s}${r}`:r,N({configuration:e,headers:t},o))}catch(u){throw await Ml(u,{registry:s,configuration:e,headers:t}),u}}async function J8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.post(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h)||l)throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.post(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function W8e(r,e,u){var g=u,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l}=g,c=Or(g,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(s&&typeof a=="undefined"&&(a=SA(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let f=await ab(a,{authType:o,configuration:i,ident:s});f&&(n=te(N({},n),{authorization:f})),l&&(n=N(N({},n),lh(l)));try{return await ir.put(a+r,e,N({configuration:i,headers:n},c))}catch(h){if(!ob(h))throw await Ml(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h;l=await _L();let p=N(N({},n),lh(l));try{return await ir.put(`${a}${r}`,e,N({configuration:i,headers:p},c))}catch(m){throw await Ml(m,{attemptedAs:t,registry:a,configuration:i,headers:n}),m}}}async function z8e(r,c){var u=c,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a}=u,l=Or(u,["attemptedAs","configuration","headers","ident","authType","registry","otp"]);if(n&&typeof o=="undefined"&&(o=SA(n.scope,{configuration:t})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let g=await ab(o,{authType:s,configuration:t,ident:n});g&&(i=te(N({},i),{authorization:g})),a&&(i=N(N({},i),lh(a)));try{return await ir.del(o+r,N({configuration:t,headers:i},l))}catch(f){if(!ob(f)||a)throw await Ml(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f;a=await _L();let h=N(N({},i),lh(a));try{return await ir.del(`${o}${r}`,N({configuration:t,headers:h},l))}catch(p){throw await Ml(p,{attemptedAs:e,registry:o,configuration:t,headers:i}),p}}}async function ab(r,{authType:e=2,configuration:t,ident:i}){let n=zL(r,{configuration:t,ident:i}),s=_8e(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new ct(X.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function _8e(r,e){switch(e){case 2:return r.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Y8e(r,e,{configuration:t}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await ir.get(new lle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function _L(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:r}=await(0,Ale.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return r}function ob(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function lh(r){return{["npm-otp"]:r}}var VL=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!cle.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await bo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await Bi.convertToZip(n,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var XL=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!P.tryParseDescriptor(e.range.slice(Cr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(Cr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(Cr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error("Unreachable")}};var ule=ge(ri()),gle=ge(require("url"));var Qo=class{supports(e,t){if(!e.reference.startsWith(Cr))return!1;let i=new gle.URL(e.reference);return!(!ule.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await bo(Qo.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch(n){i=await bo(Qo.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:t.project.configuration,ident:e})}return await Bi.convertToZip(i,{compressionLevel:t.project.configuration.get("compressionLevel"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=SA(e.scope,{configuration:i}),s=Qo.getLocatorUrl(e);return t=t.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t=t.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),t===n+s||t===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let t=Wt.clean(e.reference.slice(Cr.length));if(t===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Kl(e)}/-/${e.name}-${t}.tgz`}};var fle=ge(ri());var Ab=P.makeIdent(null,"node-gyp"),V8e=/\b(node-gyp|prebuild-install)\b/,ZL=class{supportsDescriptor(e,t){return e.range.startsWith(Cr)?!!Wt.validRange(e.range.slice(Cr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(Cr))return!1;let{selector:i}=P.parseRange(e.reference);return!!fle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);let s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Se.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Wt.SemVer(c);if(n.test(u))return u}catch{}return Se.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${Cr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Qo.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=Wt.validRange(e.range.slice(Cr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Cr.length)}`);return Se.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:Cr}),a=new Wt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Se.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=Wt.clean(i);if(n===null)throw new ct(X.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await bo(Kl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new At;if(o.load(s.versions[n]),!o.dependencies.has(Ab.identHash)&&!o.peerDependencies.has(Ab.identHash)){for(let a of o.scripts.values())if(a.match(V8e)){o.dependencies.set(Ab.identHash,P.makeDescriptor(Ab,"latest")),t.report.reportWarningOnce(X.NODE_GYP_INJECTED,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated=="string"&&o.raw.deprecated!==""){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(X.DEPRECATED_PACKAGE,l)}return te(N({},e),{version:n,languageName:"node",linkType:Qt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var $L=class{supportsDescriptor(e,t){return!(!e.range.startsWith(Cr)||!zg.test(e.range.slice(Cr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error("Unreachable")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(Cr.length),s=await bo(Kl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new ct(X.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=P.makeLocator(e,`${Cr}${a}`),c=s.versions[a].dist.tarball;return Qo.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error("Unreachable")}};var wh={};ft(wh,{getGitHead:()=>z9e,makePublishBody:()=>W9e});var HT={};ft(HT,{default:()=>k9e,packUtils:()=>PA});var PA={};ft(PA,{genPackList:()=>Pb,genPackStream:()=>UT,genPackageManifest:()=>Hce,hasPackScripts:()=>MT,prepareForPack:()=>KT});var OT=ge(is()),Kce=ge(Mce()),Uce=ge(require("zlib")),m9e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],E9e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function MT(r){return!!(Zt.hasWorkspaceScript(r,"prepack")||Zt.hasWorkspaceScript(r,"postpack"))}async function KT(r,{report:e},t){await Zt.maybeExecuteWorkspaceLifecycleScript(r,"prepack",{report:e});try{let i=k.join(r.cwd,At.fileName);await K.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:K}),await t()}finally{await Zt.maybeExecuteWorkspaceLifecycleScript(r,"postpack",{report:e})}}async function UT(r,e){var s,o;typeof e=="undefined"&&(e=await Pb(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(k.normalize(a));for(let a of r.manifest.bin.values())t.add(k.normalize(a));let i=Kce.default.pack();process.nextTick(async()=>{for(let a of e){let l=k.normalize(a),c=k.resolve(r.cwd,l),u=k.join("package",l),g=await K.lstatPromise(c),f={name:u,mtime:new Date(Rr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,m,y=new Promise((v,x)=>{p=v,m=x}),b=v=>{v?m(v):p()};if(g.isFile()){let v;l==="package.json"?v=Buffer.from(JSON.stringify(await Hce(r),null,2)):v=await K.readFilePromise(c),i.entry(te(N({},f),{mode:h,type:"file"}),v,b)}else g.isSymbolicLink()?i.entry(te(N({},f),{mode:h,type:"symlink",linkname:await K.readlinkPromise(c)}),b):b(new Error(`Unsupported file type ${g.mode} for ${H.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Uce.createGzip)();return i.pipe(n),n}async function Hce(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Pb(r){var g,f,h,p,m,y,b,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let x of E9e)i.reject.push(x);for(let x of m9e)i.accept.push(x);i.reject.push(t.get("rcFilename"));let n=x=>{if(x===null||!x.startsWith(`${r.cwd}/`))return;let T=k.relative(r.cwd,x),q=k.resolve(Me.root,T);i.reject.push(q)};n(k.resolve(e.cwd,t.get("lockfileFilename"))),n(t.get("cacheFolder")),n(t.get("globalFolder")),n(t.get("installStatePath")),n(t.get("virtualFolder")),n(t.get("yarnPath")),await t.triggerHook(x=>x.populateYarnPaths,e,x=>{n(x)});for(let x of e.workspaces){let T=k.relative(r.cwd,x.cwd);T!==""&&!T.match(/^(\.\.)?\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(m=r.manifest.publishConfig)==null?void 0:m.browser)!=null?y:r.manifest.browser,c=(v=(b=r.manifest.publishConfig)==null?void 0:b.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(k.resolve(Me.root,o)),a!=null&&s.accept.push(k.resolve(Me.root,a)),typeof l=="string"&&s.accept.push(k.resolve(Me.root,l));for(let x of c.values())s.accept.push(k.resolve(Me.root,x));if(l instanceof Map)for(let[x,T]of l.entries())s.accept.push(k.resolve(Me.root,x)),typeof T=="string"&&s.accept.push(k.resolve(Me.root,T));let u=r.manifest.files!==null;if(u){s.reject.push("/*");for(let x of r.manifest.files)jce(s.accept,x,{cwd:Me.root})}return await I9e(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function I9e(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new La(r),o=[[Me.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!Yce(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Me.root)for(let m of u)g=g||m===".gitignore",f=f||m===".npmignore";let h=f?await Gce(s,a,".npmignore"):g?await Gce(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;Yce(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([k.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(k.relative(Me.root,a))}return n.sort()}async function Gce(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(k.join(e,t),"utf8");for(let s of n.split(/\n/g))jce(i.reject,s,{cwd:e});return i}function y9e(r,{cwd:e}){let t=r[0]==="!";return t&&(r=r.slice(1)),r.match(/\.{0,1}\//)&&(r=k.resolve(e,r)),t&&(r=`!${r}`),r}function jce(r,e,{cwd:t}){let i=e.trim();i===""||i[0]==="#"||r.push(y9e(i,{cwd:t}))}var gs;(function(i){i[i.None=0]="None",i[i.Match=1]="Match",i[i.NegatedMatch=2]="NegatedMatch"})(gs||(gs={}));function Yce(r,{globalList:e,ignoreLists:t}){let i=Db(r,e.accept);if(i!==0)return i===2;let n=Db(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Db(r,s.accept);if(o!==0)return o===2;let a=Db(r,s.reject);if(a!==0)return a===1}return!1}function Db(r,e){let t=e,i=[];for(let n=0;n{await KT(i,{report:l},async()=>{l.reportJson({base:H.fromPortablePath(i.cwd)});let c=await Pb(i);for(let u of c)l.reportInfo(null,H.fromPortablePath(u)),l.reportJson({location:H.fromPortablePath(u)});if(!this.dryRun){let u=await UT(i,c),g=K.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(X.UNNAMED,`Package archive generated in ${ae.pretty(e,s,ae.Type.PATH)}`),l.reportJson({output:H.fromPortablePath(s)}))})).exitCode()}};rE.paths=[["pack"]],rE.usage=Re.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var Jce=rE;function w9e(r,{workspace:e}){let t=r.replace("%s",B9e(e)).replace("%v",b9e(e));return H.toPortablePath(t)}function B9e(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):"package"}function b9e(r){return r.manifest.version!==null?r.manifest.version:"unknown"}var Q9e=["dependencies","devDependencies","peerDependencies"],S9e="workspace:",v9e=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of Q9e)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===S9e)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new ct(X.WORKSPACE_NOT_FOUND,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector;let u=s==="dependencies"?P.makeDescriptor(o,"unknown"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?"optionalDependencies":s;e[g][P.stringifyIdent(o)]=c}}},x9e={hooks:{beforeWorkspacePacking:v9e},commands:[Jce]},k9e=x9e;var tue=ge(require("crypto")),rue=ge(eue()),iue=ge(require("url"));async function W9e(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.project.configuration,a=r.manifest.name,l=r.manifest.version,c=P.stringifyIdent(a),u=(0,tue.createHash)("sha1").update(e).digest("hex"),g=rue.default.fromData(e).toString();typeof t=="undefined"&&(r.manifest.publishConfig&&typeof r.manifest.publishConfig.access=="string"?t=r.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?t=o.get("npmPublishAccess"):a.scope?t="restricted":t="public");let f=await PA.genPackageManifest(r),h=`${c}-${l}.tgz`,p=new iue.URL(`${ma(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:t,["dist-tags"]:{[i]:l},versions:{[l]:te(N({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function z9e(r){try{let{stdout:e}=await Nr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:r});return e.trim()===""?void 0:e.trim()}catch{return}}var JT={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:Ie.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:Ie.SECRET,default:null}},nue={npmAuditRegistry:{description:"Registry to query for audit reports",type:Ie.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:Ie.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:Ie.STRING,default:"https://registry.yarnpkg.com"}},_9e={configuration:te(N(N({},JT),nue),{npmScopes:{description:"Settings per package scope",type:Ie.MAP,valueDefinition:{description:"",type:Ie.SHAPE,properties:N(N({},JT),nue)}},npmRegistries:{description:"Settings per registry",type:Ie.MAP,normalizeKeys:ma,valueDefinition:{description:"",type:Ie.SHAPE,properties:N({},JT)}}}),fetchers:[VL,Qo],resolvers:[XL,ZL,$L]},V9e=_9e;var VT={};ft(VT,{default:()=>s_e});ys();var Ba;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ba||(Ba={}));var vo;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(vo||(vo={}));var Rb=[vo.Info,vo.Low,vo.Moderate,vo.High,vo.Critical];function sue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function X9e(r,e){return new Set([...r].filter(t=>!e.has(t)))}function Z9e(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=sue(r,l),g=sue(r,c);return X9e(g,u)}function oue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function aue(r){if(typeof r=="undefined")return new Set;let e=Rb.indexOf(r),t=Rb.slice(e);return new Set(t)}function $9e(r,e){let t=aue(e),i={};for(let n of t)i[n]=r[n];return i}function Aue(r,e){var i;let t=$9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function lue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=aue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Se.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ae.tuple(ae.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ae.tuple(ae.Type.NO_HINT,o.title)},URL:{label:"URL",value:ae.tuple(ae.Type.URL,o.url)},Severity:{label:"Severity",value:ae.tuple(ae.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ae.tuple(ae.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ae.tuple(ae.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ae.tuple(ae.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ae.tuple(ae.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function cue(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[Ba.All,Ba.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ba.All,Ba.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return oue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function uue(r,e,{all:t}){var s;let i=Z9e(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:oue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var sE=class extends Le{constructor(){super(...arguments);this.all=J.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=J.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=J.String("--environment",Ba.All,{description:"Which environments to cover",validator:nn(Ba)});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=J.String("--severity",vo.Info,{description:"Minimal severity requested for packages to be displayed",validator:nn(vo)})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=cue(t,i,{all:this.all,environment:this.environment}),s=uue(t,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=br.getAuditRegistry(i.manifest,{configuration:e}),l,c=await pA.start({configuration:e,stdout:this.context.stdout},async()=>{l=await zt.post("/-/npm/v1/security/audits/quick",o,{authType:zt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=Aue(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(ls.emitTree(lue(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(X.EXCEPTION,"No audit suggestions")})).exitCode()}};sE.paths=[["npm","audit"]],sE.usage=Re.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${Rb.map(e=>`\`${e}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var gue=sE;var WT=ge(ri()),zT=ge(require("util")),oE=class extends Le{constructor(){super(...arguments);this.fields=J.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=J.Rest()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t}=await ze.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Je.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let x=t.topLevelWorkspace;if(!x.manifest.name)throw new Pe(`Missing ${ae.pretty(e,"name",ae.Type.CODE)} field in ${H.fromPortablePath(k.join(x.cwd,kt.manifest))}`);c=P.makeDescriptor(x.manifest.name,"unknown")}else c=P.parseDescriptor(l);let u=zt.getIdentUrl(c),g=_T(await zt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:zt.customPackageError})),f=Object.keys(g.versions).sort(WT.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],m=Wt.validRange(c.range);if(m){let x=WT.default.maxSatisfying(f,m);x!==null?p=x:(a.reportWarning(X.UNNAMED,`Unmet range ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else Object.prototype.hasOwnProperty.call(g["dist-tags"],c.range)?p=g["dist-tags"][c.range]:c.range!=="unknown"&&(a.reportWarning(X.UNNAMED,`Unknown tag ${P.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let y=g.versions[p],b=te(N(N({},g),y),{version:p,versions:f}),v;if(i!==null){v={};for(let x of i){let T=b[x];if(typeof T!="undefined")v[x]=T;else{a.reportWarning(X.EXCEPTION,`The ${ae.pretty(e,x,ae.Type.CODE)} field doesn't exist inside ${P.prettyIdent(e,c)}'s information`),s=!0;continue}}}else this.json||(delete b.dist,delete b.readme,delete b.users),v=b;a.reportJson(v),this.json||n.push(v)}});zT.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,zT.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};oE.paths=[["npm","info"]],oE.usage=Re.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var fue=oE;function _T(r){if(Array.isArray(r)){let e=[];for(let t of r)t=_T(t),t&&e.push(t);return e}else if(typeof r=="object"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith("_"))continue;let i=_T(r[t]);i&&(e[t]=i)}return e}else return r||null}var hue=ge(WC()),aE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await t_e({registry:t,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await zt.put(o,s,{attemptedAs:s.name,configuration:e,registry:t,jsonResponse:!0,authType:zt.AuthType.NO_AUTH});return await e_e(t,a.token,{configuration:e,scope:this.scope}),n.reportInfo(X.UNNAMED,"Successfully logged in")})).exitCode()}};aE.paths=[["npm","login"]],aE.usage=Re.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var pue=aE;async function Fb({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?br.getScopeRegistry(r,{configuration:t,type:br.RegistryType.PUBLISH_REGISTRY}):r?br.getScopeRegistry(r,{configuration:t}):e?br.getPublishRegistry((await Wf(t,i)).manifest,{configuration:t}):br.getDefaultRegistry({configuration:t})}async function e_e(r,e,{configuration:t,scope:i}){let n=o=>a=>{let l=Se.isIndexableObject(a)?a:{},c=l[o],u=Se.isIndexableObject(c)?c:{};return te(N({},l),{[o]:te(N({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function t_e({registry:r,report:e,stdin:t,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(X.UNNAMED,`Logging in to ${r}`);let n=!1;r.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(X.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,hue.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:t,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Bh=new Set(["npmAuthIdent","npmAuthToken"]),AE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=J.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t=async()=>{var l;let n=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await ye.find(this.context.cwd,this.context.plugins),o=P.makeIdent((l=this.scope)!=null?l:null,"pkg");return!br.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await r_e(),n.reportInfo(X.UNNAMED,"Successfully logged out from everything")),this.scope){await due("npmScopes",this.scope),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(X.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await Fb({configuration:e,cwd:this.context.cwd,publish:this.publish});await due("npmRegistries",s),await t()?n.reportInfo(X.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(X.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};AE.paths=[["npm","logout"]],AE.usage=Re.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Cue=AE;function i_e(r,e){let t=r[e];if(!Se.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...Bh].every(s=>!i.has(s)))return!1;for(let s of Bh)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n=N({},t);for(let s of Bh)delete n[s];return r[e]=n,!0}async function r_e(){let r=e=>{let t=!1,i=Se.isIndexableObject(e)?N({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))i_e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function due(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Se.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Se.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Bh].every(l=>!o.has(l)))return t;for(let l of Bh)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:te(N({},i),{[e]:void 0});let a={};for(let l of Bh)a[l]=void 0;return te(N({},i),{[e]:N(N({},s),a)})}})}var lE=class extends Le{constructor(){super(...arguments);this.access=J.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=J.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=J.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=J.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);if(i.manifest.private)throw new Pe("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new Pe("Workspaces must have valid names and versions to be published on an external registry");await t.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=br.getPublishRegistry(i.manifest,{configuration:e});return(await Je.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await zt.get(zt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new ct(X.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(X.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Zt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await PA.prepareForPack(i,{report:l},async()=>{let g=await PA.genPackList(i);for(let y of g)l.reportInfo(null,y);let f=await PA.genPackStream(i,g),h=await Se.bufferStream(f),p=await wh.getGitHead(i.cwd),m=await wh.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await zt.put(zt.getIdentUrl(n),m,{configuration:e,registry:o,ident:n,otp:this.otp,jsonResponse:!0})}),l.reportInfo(X.UNNAMED,"Package archive published")})).exitCode()}};lE.paths=[["npm","publish"]],lE.usage=Re.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var mue=lE;var Iue=ge(ri());var cE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String({required:!1})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=P.parseIdent(this.package);else{if(!i)throw new ht(t.cwd,this.context.cwd);if(!i.manifest.name)throw new Pe(`Missing 'name' field in ${H.fromPortablePath(k.join(i.cwd,kt.manifest))}`);n=i.manifest.name}let s=await uE(n,e),a={children:Se.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ae.tuple(ae.Type.RESOLUTION,{descriptor:P.makeDescriptor(n,l),locator:P.makeLocator(n,c)})}))};return ls.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};cE.paths=[["npm","tag","list"]],cE.usage=Re.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Eue=cE;async function uE(r,e){let t=`/-/package${zt.getIdentUrl(r)}/dist-tags`;return zt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:zt.customPackageError})}var gE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseDescriptor(this.package,!0),s=n.range;if(!Iue.default.valid(s))throw new Pe(`The range ${ae.pretty(e,n.range,ae.Type.RANGE)} must be a valid semver version`);let o=br.getPublishRegistry(i.manifest,{configuration:e}),a=ae.pretty(e,n,ae.Type.IDENT),l=ae.pretty(e,s,ae.Type.RANGE),c=ae.pretty(e,this.tag,ae.Type.CODE);return(await Je.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await uE(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(X.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(X.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};gE.paths=[["npm","tag","add"]],gE.usage=Re.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var yue=gE;var fE=class extends Le{constructor(){super(...arguments);this.package=J.String();this.tag=J.String()}async execute(){if(this.tag==="latest")throw new Pe("The 'latest' tag cannot be removed.");let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);let n=P.parseIdent(this.package),s=br.getPublishRegistry(i.manifest,{configuration:e}),o=ae.pretty(e,this.tag,ae.Type.CODE),a=ae.pretty(e,n,ae.Type.IDENT),l=await uE(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new Pe(`${o} is not a tag of package ${a}`);return(await Je.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${zt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await zt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(X.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};fE.paths=[["npm","tag","remove"]],fE.usage=Re.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var wue=fE;var hE=class extends Le{constructor(){super(...arguments);this.scope=J.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=J.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),t;return this.scope&&this.publish?t=br.getScopeRegistry(this.scope,{configuration:e,type:br.RegistryType.PUBLISH_REGISTRY}):this.scope?t=br.getScopeRegistry(this.scope,{configuration:e}):this.publish?t=br.getPublishRegistry((await Wf(e,this.context.cwd)).manifest,{configuration:e}):t=br.getDefaultRegistry({configuration:e}),(await Je.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await zt.get("/-/whoami",{configuration:e,registry:t,authType:zt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(X.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(X.UNNAMED,s.username)})).exitCode()}};hE.paths=[["npm","whoami"]],hE.usage=Re.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Bue=hE;var n_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:Ie.STRING,default:null}},commands:[gue,fue,pue,Cue,mue,yue,Eue,wue,Bue]},s_e=n_e;var nO={};ft(nO,{default:()=>y_e,patchUtils:()=>XT});var XT={};ft(XT,{applyPatchFile:()=>Tb,diffFolders:()=>tO,extractPackageToDisk:()=>eO,extractPatchFlags:()=>Due,isParentRequired:()=>$T,loadPatchFiles:()=>mE,makeDescriptor:()=>m_e,makeLocator:()=>ZT,parseDescriptor:()=>dE,parseLocator:()=>CE,parsePatchFile:()=>Lb});var pE=class extends Error{constructor(e,t){super(`Cannot apply hunk #${e+1}`);this.hunk=t}};var o_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function bh(r){return k.relative(Me.root,k.resolve(Me.root,H.toPortablePath(r)))}function a_e(r){let e=r.trim().match(o_e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var A_e=420,l_e=493,Zr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Zr||(Zr={}));var bue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),c_e=r=>({header:a_e(r),parts:[]}),u_e={["@"]:"header",["-"]:Zr.Deletion,["+"]:Zr.Insertion,[" "]:Zr.Context,["\\"]:"pragma",undefined:Zr.Context};function f_e(r){let e=[],t=bue(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=bue()}for(let l=0;l0?"patch":"mode change",v=null;switch(b){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:bh(u),toPath:bh(g)}),v=g}break;case"file deletion":{let x=n||p;if(!x)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(l),hash:f})}break;case"file creation":{let x=s||m;if(!x)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:y&&y[0]||null,path:bh(x),mode:Nb(c),hash:h})}break;case"patch":case"mode change":v=m||s;break;default:Se.assertNever(b);break}v&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:bh(v),oldMode:Nb(o),newMode:Nb(a)}),v&&y&&y.length&&e.push({type:"patch",semverExclusivity:i,path:bh(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function Nb(r){let e=parseInt(r,8)&511;if(e!==A_e&&e!==l_e)throw new Error(`Unexpected file mode string: ${r}`);return e}function Lb(r){let e=r.split(/\n/g);return e[e.length-1]===""&&e.pop(),h_e(f_e(e))}function g_e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case Zr.Context:t+=n.length,e+=n.length;break;case Zr.Deletion:e+=n.length;break;case Zr.Insertion:t+=n.length;break;default:Se.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}async function Qh(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n!="undefined"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function Tb(r,{baseFs:e=new ar,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!Wt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Qh(e,k.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Qh(e,k.dirname(n.fromPath),async()=>{await Qh(e,k.dirname(n.toPath),async()=>{await Qh(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(k.dirname(n.path),{chmod:493,utimes:[Rr.SAFE_TIME,Rr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,Rr.SAFE_TIME,Rr.SAFE_TIME)}break;case"patch":await Qh(e,n.path,async()=>{await p_e(n,{baseFs:e,dryRun:t})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Que(n.newMode)!==Que(o))continue;await Qh(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Se.assertNever(n);break}}function Que(r){return(r&64)>0}function Sue(r){return r.replace(/\s+$/,"")}function d_e(r,e){return Sue(r)===Sue(e)}async function p_e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),m=Math.max(h,p),y=0,b=0,v=null;for(;y<=m;){if(y<=h&&(b=f-y,v=vue(g,o,b),v!==null)){y=-y;break}if(y<=p&&(b=f+y,v=vue(g,o,b),v!==null))break;y+=1}if(v===null)throw new pE(r.indexOf(g),g);a.push(v),l+=y,c=b+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:Se.assertNever(f);break}await t.writeFilePromise(e,o.join(` -`),{mode:n})}function vue(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case Zr.Context:case Zr.Deletion:{for(let s of n.lines){let o=e[t];if(o==null||!d_e(o,s))return null;t+=1}n.type===Zr.Deletion&&(i.push({type:"splice",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Zr.Insertion:i.push({type:"splice",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:Se.assertNever(n.type);break}return i}var C_e=/^builtin<([^>]+)>$/;function xue(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>H.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?P.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function dE(r){let i=xue(r.range,P.parseDescriptor),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceDescriptor:e})}function CE(r){let i=xue(r.reference,P.parseLocator),{sourceItem:e}=i,t=Or(i,["sourceItem"]);return te(N({},t),{sourceLocator:e})}function kue({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return P.makeRange({protocol:"patch:",source:s(e),selector:t.join("&"),params:N(N(N({},a),l),o)})}function m_e(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function ZT(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,kue({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function Pue({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(C_e);return s!==null?t(s[1]):k.isAbsolute(i)?r(i):e(i)}function Due(r){let e=r.startsWith("~");return e&&(r=r.slice(1)),{optional:e}}function $T(r){return Pue({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function mE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new _t(Me.root),prefixPath:k.relative(Me.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Se.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Due(o),l=await Pue({onAbsolute:async()=>await K.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(k.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return te(N({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function eO(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=t.storedChecksums,s=new di,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await K.mktempPromise(),c=k.join(l,"source"),u=k.join(l,"user"),g=k.join(l,".yarn-patch.json");return await Promise.all([K.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),K.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),K.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),K.detachTemp(l),u}async function tO(r,e){let t=H.fromPortablePath(r).replace(/\\/g,"/"),i=H.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Nr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",t,i],{cwd:H.toPortablePath(process.cwd()),env:te(N({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=t.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Se.escapeRegExp(`/${o(t)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${Se.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(Se.escapeRegExp(`${t}/`),"g"),"").replace(new RegExp(Se.escapeRegExp(`${i}/`),"g"),"")}function Rue(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case Zr.Context:t.reportInfo(null,` ${ae.pretty(e,n,"grey")}`);break;case Zr.Deletion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`- ${ae.pretty(e,n,ae.Type.REMOVED)}`);break;case Zr.Insertion:t.reportError(X.FROZEN_LOCKFILE_EXCEPTION,`+ ${ae.pretty(e,n,ae.Type.ADDED)}`);break;default:Se.assertNever(i.type)}}var rO=class{supports(e,t){return!!e.reference.startsWith("patch:")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,N({onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck},t.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=CE(e),a=await mE(i,o,t),l=await K.mktempPromise(),c=k.join(l,"current.zip"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await fn(),h=new li(c,{libzip:f,create:!0,level:t.project.configuration.get("compressionLevel")});await Se.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let y=new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")}),b=new _t(k.resolve(Me.root,g),{baseFs:y});try{await Tb(Lb(p),{baseFs:b,version:s})}catch(v){if(!(v instanceof pE))throw v;let x=t.project.configuration.get("enableInlineHunks"),T=!x&&!m?" (set enableInlineHunks for details)":"",q=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${T}`,Y=$=>{!x||Rue(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),m){t.report.reportWarningOnce(X.PATCH_HUNK_FAILED,q,{reportExtra:Y});continue}else throw new ct(X.PATCH_HUNK_FAILED,q,Y)}y.saveAndClose()}return new li(c,{libzip:f,level:t.project.configuration.get("compressionLevel")})}};var E_e=3,iO=class{supportsDescriptor(e,t){return!!e.range.startsWith("patch:")}supportsLocator(e,t){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=dE(e);return n.every(s=>!$T(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=dE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=dE(e),a=await mE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=Dn.makeHash(`${E_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[ZT(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=CE(e),n=await t.resolver.resolve(i,t);return N(N({},n),e)}};var EE=class extends Le{constructor(){super(...arguments);this.save=J.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let n=k.resolve(this.context.cwd,H.toPortablePath(this.patchFolder)),s=k.join(n,"../source"),o=k.join(n,"../.yarn-patch.json");if(!K.existsSync(s))throw new Pe("The argument folder didn't get created by 'yarn patch'");let a=await tO(s,n),l=await K.readJsonPromise(o),c=P.parseLocator(l.locator,!0);if(!t.storedPackages.has(c.locatorHash))throw new Pe("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=k.join(u,`${P.slugifyLocator(c)}.patch`);await K.mkdirPromise(u,{recursive:!0}),await K.writeFilePromise(g,a);let f=k.relative(t.cwd,g);t.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(c),description:l.version}},reference:`patch:${P.stringifyLocator(c)}#${f}`}),await t.persist()}};EE.paths=[["patch-commit"]],EE.usage=Re.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Fue=EE;var IE=class extends Le{constructor(){super(...arguments);this.json=J.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=J.String()}async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await ze.find(e,this.context.cwd),n=await Nt.find(e);if(!i)throw new ht(t.cwd,this.context.cwd);await t.restoreInstallState();let s=P.parseLocator(this.package);if(s.reference==="unknown"){let o=Se.mapAndFilter([...t.storedPackages.values()],a=>a.identHash!==s.identHash?Se.mapAndFilter.skip:P.isVirtualLocator(a)?Se.mapAndFilter.skip:a);if(o.length===0)throw new Pe("No package found in the project for the given locator");if(o.length>1)throw new Pe(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${P.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!t.storedPackages.has(s.locatorHash))throw new Pe("No package found in the project for the given locator");await Je.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await eO(s,{cache:n,project:t});o.reportJson({locator:P.stringifyLocator(s),path:H.fromPortablePath(a)}),o.reportInfo(X.UNNAMED,`Package ${P.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(X.UNNAMED,`You can now edit the following folder: ${ae.pretty(e,H.fromPortablePath(a),"magenta")}`),o.reportInfo(X.UNNAMED,`Once you are done run ${ae.pretty(e,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${H.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};IE.paths=[["patch"]],IE.usage=Re.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n \n Once you're done with your changes, run `yarn patch-commit -s ` (with `` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n "});var Nue=IE;var I_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:Ie.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:Ie.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Fue,Nue],fetchers:[rO],resolvers:[iO]},y_e=I_e;var AO={};ft(AO,{default:()=>b_e});var sO=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s=="undefined")throw new Pe(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=oO(),n=t.project.installersCustomData.get(i);if(!n)throw new Pe(`The project in ${ae.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=k.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Lue(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Lue=class{constructor(e){this.opts=e;this.asyncActions=new Se.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return oO()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case Qt.SOFT:return this.installPackageSoft(e,t,i);case Qt.HARD:return this.installPackageHard(e,t,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,t,i){let n=k.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=w_e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await K.mkdirPromise(n,{recursive:!0}),await K.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await At.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new At,misc:{hasBindingGyp:Ca.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ca.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!Mue(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=k.join(n,kt.nodeModules),o=[],a=await Kue(s);for(let[l,c]of t){let u=c;Mue(c,{project:this.opts.project})||(this.opts.report.reportWarning(X.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=k.join(s,f),p=k.relative(k.dirname(h),g),m=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await K.readlinkPromise(h)===p)return;await K.removePromise(h)}await K.mkdirpPromise(k.dirname(h)),process.platform=="win32"?await K.symlinkPromise(g,h,"junction"):await K.symlinkPromise(p,h)}))}o.push(Uue(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=Oue(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await K.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=k.contains(e,s);if(o!==null){let[a,,...l]=o.split(k.sep);i.add(a);let c=k.join(e,a);t.push(K.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=k.join(c,g);if(g===kt.nodeModules){let h=await Kue(f);return h.delete(l.join(k.sep)),Uue(f,h)}else return K.removePromise(f)}))).catch(u=>{if(u.code!=="ENOENT")throw u}))}}let n;try{n=await K.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(K.removePromise(k.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await aO(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await aO(Tue(this.opts.project)),{customData:this.customData}}};function oO(){return JSON.stringify({name:"PnpmInstaller",version:2})}function Tue(r){return k.join(r.cwd,kt.nodeModules)}function Oue(r){return k.join(Tue(r),".store")}function w_e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return k.join(Oue(e),t,i)}function Mue(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function Kue(r){let e=new Map,t=[];try{t=await K.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of t)if(!i.name.startsWith("."))if(i.name.startsWith("@")){let n=await K.readdirPromise(k.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}async function Uue(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(K.removePromise(k.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>aO(k.join(r,s)))))}async function aO(r){try{await K.rmdirPromise(r)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var B_e={linkers:[sO]},b_e=B_e;var L0=()=>({modules:new Map([["@yarnpkg/cli",GC],["@yarnpkg/core",EC],["@yarnpkg/fslib",Zh],["@yarnpkg/libzip",Md],["@yarnpkg/parsers",op],["@yarnpkg/shell",Ud],["clipanion",cZ(Cp)],["semver",Q_e],["typanion",cg],["yup",S_e],["@yarnpkg/plugin-essentials",GN],["@yarnpkg/plugin-compat",zN],["@yarnpkg/plugin-dlx",_N],["@yarnpkg/plugin-file",nL],["@yarnpkg/plugin-git",jN],["@yarnpkg/plugin-github",oL],["@yarnpkg/plugin-http",lL],["@yarnpkg/plugin-init",fL],["@yarnpkg/plugin-link",mL],["@yarnpkg/plugin-nm",JL],["@yarnpkg/plugin-npm",qT],["@yarnpkg/plugin-npm-cli",VT],["@yarnpkg/plugin-pack",HT],["@yarnpkg/plugin-patch",nO],["@yarnpkg/plugin-pnp",LL],["@yarnpkg/plugin-pnpm",AO]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});s0({binaryVersion:Ur||"",pluginConfiguration:L0()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ diff --git a/.yarn/releases/yarn-3.5.0.cjs b/.yarn/releases/yarn-3.5.0.cjs new file mode 100755 index 000000000000..093e64a9fe46 --- /dev/null +++ b/.yarn/releases/yarn-3.5.0.cjs @@ -0,0 +1,873 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Qge=Object.create;var AS=Object.defineProperty;var bge=Object.getOwnPropertyDescriptor;var Sge=Object.getOwnPropertyNames;var vge=Object.getPrototypeOf,xge=Object.prototype.hasOwnProperty;var J=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')});var Pge=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)AS(r,t,{get:e[t],enumerable:!0})},Dge=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Sge(e))!xge.call(r,n)&&n!==t&&AS(r,n,{get:()=>e[n],enumerable:!(i=bge(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?Qge(vge(r)):{},Dge(e||!r||!r.__esModule?AS(t,"default",{value:r,enumerable:!0}):t,r));var QK=w((GXe,BK)=>{BK.exports=wK;wK.sync=Zge;var IK=J("fs");function Xge(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(";"),t.indexOf("")!==-1))return!0;for(var i=0;i{xK.exports=SK;SK.sync=_ge;var bK=J("fs");function SK(r,e,t){bK.stat(r,function(i,n){t(i,i?!1:vK(n,e))})}function _ge(r,e){return vK(bK.statSync(r),e)}function vK(r,e){return r.isFile()&&$ge(r,e)}function $ge(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var kK=w((qXe,DK)=>{var jXe=J("fs"),sI;process.platform==="win32"||global.TESTING_WINDOWS?sI=QK():sI=PK();DK.exports=SS;SS.sync=efe;function SS(r,e,t){if(typeof e=="function"&&(t=e,e={}),!t){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){SS(r,e||{},function(s,o){s?n(s):i(o)})})}sI(r,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function efe(r,e){try{return sI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code==="EACCES")return!1;throw t}}});var MK=w((JXe,OK)=>{var vg=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",RK=J("path"),tfe=vg?";":":",FK=kK(),NK=r=>Object.assign(new Error(`not found: ${r}`),{code:"ENOENT"}),LK=(r,e)=>{let t=e.colon||tfe,i=r.match(/\//)||vg&&r.match(/\\/)?[""]:[...vg?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(t)],n=vg?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=vg?n.split(t):[""];return vg&&r.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},TK=(r,e,t)=>{typeof e=="function"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=LK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(NK(r));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=RK.join(h,r),C=!h&&/^\.[\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];FK(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},rfe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=LK(r,e),s=[];for(let o=0;o{"use strict";var KK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};vS.exports=KK;vS.exports.default=KK});var jK=w((zXe,YK)=>{"use strict";var HK=J("path"),ife=MK(),nfe=UK();function GK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=ife.sync(r.command,{path:t[nfe({env:t})],pathExt:e?HK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=HK.resolve(n?r.options.cwd:"",o)),o}function sfe(r){return GK(r)||GK(r,!0)}YK.exports=sfe});var qK=w((VXe,PS)=>{"use strict";var xS=/([()\][%!^"`<>&|;, *?])/g;function ofe(r){return r=r.replace(xS,"^$1"),r}function afe(r,e){return r=`${r}`,r=r.replace(/(\\*)"/g,'$1$1\\"'),r=r.replace(/(\\*)$/,"$1$1"),r=`"${r}"`,r=r.replace(xS,"^$1"),e&&(r=r.replace(xS,"^$1")),r}PS.exports.command=ofe;PS.exports.argument=afe});var WK=w((XXe,JK)=>{"use strict";JK.exports=/^#!(.*)/});var VK=w((ZXe,zK)=>{"use strict";var Afe=WK();zK.exports=(r="")=>{let e=r.match(Afe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,"").split(" "),n=t.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var ZK=w((_Xe,XK)=>{"use strict";var DS=J("fs"),lfe=VK();function cfe(r){let t=Buffer.alloc(150),i;try{i=DS.openSync(r,"r"),DS.readSync(i,t,0,150,0),DS.closeSync(i)}catch{}return lfe(t.toString())}XK.exports=cfe});var tU=w(($Xe,eU)=>{"use strict";var ufe=J("path"),_K=jK(),$K=qK(),gfe=ZK(),ffe=process.platform==="win32",hfe=/\.(?:com|exe)$/i,pfe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function dfe(r){r.file=_K(r);let e=r.file&&gfe(r.file);return e?(r.args.unshift(r.file),r.command=e,_K(r)):r.file}function Cfe(r){if(!ffe)return r;let e=dfe(r),t=!hfe.test(e);if(r.options.forceShell||t){let i=pfe.test(e);r.command=ufe.normalize(r.command),r.command=$K.command(r.command),r.args=r.args.map(s=>$K.argument(s,i));let n=[r.command].concat(r.args).join(" ");r.args=["/d","/s","/c",`"${n}"`],r.command=process.env.comspec||"cmd.exe",r.options.windowsVerbatimArguments=!0}return r}function mfe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:Cfe(i)}eU.exports=mfe});var nU=w((eZe,iU)=>{"use strict";var kS=process.platform==="win32";function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Efe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i==="exit"){let s=rU(n,e,"spawn");if(s)return t.call(r,"error",s)}return t.apply(r,arguments)}}function rU(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawn"):null}function Ife(r,e){return kS&&r===1&&!e.file?RS(e.original,"spawnSync"):null}iU.exports={hookChildProcess:Efe,verifyENOENT:rU,verifyENOENTSync:Ife,notFoundError:RS}});var LS=w((tZe,xg)=>{"use strict";var sU=J("child_process"),FS=tU(),NS=nU();function oU(r,e,t){let i=FS(r,e,t),n=sU.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function yfe(r,e,t){let i=FS(r,e,t),n=sU.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}xg.exports=oU;xg.exports.spawn=oU;xg.exports.sync=yfe;xg.exports._parse=FS;xg.exports._enoent=NS});var AU=w((rZe,aU)=>{"use strict";function wfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Wl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Wl)}wfe(Wl,Error);Wl.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ie=me(">>",!1),de=">&",_e=me(">&",!1),Pt=">",It=me(">",!1),Or="<<<",ii=me("<<<",!1),gi="<&",hr=me("<&",!1),fi="<",ni=me("<",!1),Os=function(m){return{type:"argument",segments:[].concat(...m)}},pr=function(m){return m},Ii="$'",es=me("$'",!1),ua="'",pA=me("'",!1),ag=function(m){return[{type:"text",text:m}]},ts='""',dA=me('""',!1),ga=function(){return{type:"text",text:""}},yp='"',CA=me('"',!1),mA=function(m){return m},wr=function(m){return{type:"arithmetic",arithmetic:m,quoted:!0}},kl=function(m){return{type:"shell",shell:m,quoted:!0}},Ag=function(m){return{type:"variable",...m,quoted:!0}},Io=function(m){return{type:"text",text:m}},lg=function(m){return{type:"arithmetic",arithmetic:m,quoted:!1}},wp=function(m){return{type:"shell",shell:m,quoted:!1}},Bp=function(m){return{type:"variable",...m,quoted:!1}},vr=function(m){return{type:"glob",pattern:m}},se=/^[^']/,yo=Je(["'"],!0,!1),kn=function(m){return m.join("")},cg=/^[^$"]/,Qt=Je(["$",'"'],!0,!1),Rl=`\\ +`,Rn=me(`\\ +`,!1),rs=function(){return""},is="\\",gt=me("\\",!1),wo=/^[\\$"`]/,At=Je(["\\","$",'"',"`"],!1,!1),an=function(m){return m},S="\\a",Tt=me("\\a",!1),ug=function(){return"a"},Fl="\\b",Qp=me("\\b",!1),bp=function(){return"\b"},Sp=/^[Ee]/,vp=Je(["E","e"],!1,!1),xp=function(){return"\x1B"},G="\\f",yt=me("\\f",!1),EA=function(){return"\f"},Ji="\\n",Nl=me("\\n",!1),Xe=function(){return` +`},fa="\\r",gg=me("\\r",!1),FE=function(){return"\r"},Pp="\\t",NE=me("\\t",!1),ar=function(){return" "},Fn="\\v",Ll=me("\\v",!1),Dp=function(){return"\v"},Ms=/^[\\'"?]/,ha=Je(["\\","'",'"',"?"],!1,!1),An=function(m){return String.fromCharCode(parseInt(m,16))},Te="\\x",fg=me("\\x",!1),Tl="\\u",Ks=me("\\u",!1),Ol="\\U",IA=me("\\U",!1),hg=function(m){return String.fromCodePoint(parseInt(m,16))},pg=/^[0-7]/,pa=Je([["0","7"]],!1,!1),da=/^[0-9a-fA-f]/,rt=Je([["0","9"],["a","f"],["A","f"]],!1,!1),Bo=nt(),yA="-",Ml=me("-",!1),Us="+",Kl=me("+",!1),LE=".",kp=me(".",!1),dg=function(m,b,N){return{type:"number",value:(m==="-"?-1:1)*parseFloat(b.join("")+"."+N.join(""))}},Rp=function(m,b){return{type:"number",value:(m==="-"?-1:1)*parseInt(b.join(""))}},TE=function(m){return{type:"variable",...m}},Ul=function(m){return{type:"variable",name:m}},OE=function(m){return m},Cg="*",wA=me("*",!1),Rr="/",ME=me("/",!1),Hs=function(m,b,N){return{type:b==="*"?"multiplication":"division",right:N}},Gs=function(m,b){return b.reduce((N,U)=>({left:N,...U}),m)},mg=function(m,b,N){return{type:b==="+"?"addition":"subtraction",right:N}},BA="$((",R=me("$((",!1),q="))",Ce=me("))",!1),Ke=function(m){return m},Re="$(",ze=me("$(",!1),dt=function(m){return m},Ft="${",Nn=me("${",!1),qb=":-",S1=me(":-",!1),v1=function(m,b){return{name:m,defaultValue:b}},Jb=":-}",x1=me(":-}",!1),P1=function(m){return{name:m,defaultValue:[]}},Wb=":+",D1=me(":+",!1),k1=function(m,b){return{name:m,alternativeValue:b}},zb=":+}",R1=me(":+}",!1),F1=function(m){return{name:m,alternativeValue:[]}},Vb=function(m){return{name:m}},N1="$",L1=me("$",!1),T1=function(m){return e.isGlobPattern(m)},O1=function(m){return m},Xb=/^[a-zA-Z0-9_]/,Zb=Je([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),_b=function(){return T()},$b=/^[$@*?#a-zA-Z0-9_\-]/,eS=Je(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),M1=/^[(){}<>$|&; \t"']/,Eg=Je(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),tS=/^[<>&; \t"']/,rS=Je(["<",">","&",";"," "," ",'"',"'"],!1,!1),KE=/^[ \t]/,UE=Je([" "," "],!1,!1),Q=0,Me=0,QA=[{line:1,column:1}],d=0,E=[],I=0,k;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function T(){return r.substring(Me,Q)}function Z(){return Et(Me,Q)}function te(m,b){throw b=b!==void 0?b:Et(Me,Q),Ri([lt(m)],r.substring(Me,Q),b)}function Be(m,b){throw b=b!==void 0?b:Et(Me,Q),Ln(m,b)}function me(m,b){return{type:"literal",text:m,ignoreCase:b}}function Je(m,b,N){return{type:"class",parts:m,inverted:b,ignoreCase:N}}function nt(){return{type:"any"}}function wt(){return{type:"end"}}function lt(m){return{type:"other",description:m}}function it(m){var b=QA[m],N;if(b)return b;for(N=m-1;!QA[N];)N--;for(b=QA[N],b={line:b.line,column:b.column};Nd&&(d=Q,E=[]),E.push(m))}function Ln(m,b){return new Wl(m,null,null,b)}function Ri(m,b,N){return new Wl(Wl.buildMessage(m,b),m,b,N)}function bA(){var m,b;return m=Q,b=Mr(),b===t&&(b=null),b!==t&&(Me=m,b=s(b)),m=b,m}function Mr(){var m,b,N,U,ce;if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ca(),U!==t?(ce=ns(),ce===t&&(ce=null),ce!==t?(Me=m,b=o(b,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;if(m===t)if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ca(),U===t&&(U=null),U!==t?(Me=m,b=a(b,U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function ns(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=l(N),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function Ca(){var m;return r.charCodeAt(Q)===59?(m=c,Q++):(m=t,I===0&&Qe(u)),m===t&&(r.charCodeAt(Q)===38?(m=g,Q++):(m=t,I===0&&Qe(f))),m}function Kr(){var m,b,N;return m=Q,b=K1(),b!==t?(N=age(),N===t&&(N=null),N!==t?(Me=m,b=h(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function age(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Age(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Kr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=p(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function Age(){var m;return r.substr(Q,2)===C?(m=C,Q+=2):(m=t,I===0&&Qe(y)),m===t&&(r.substr(Q,2)===B?(m=B,Q+=2):(m=t,I===0&&Qe(v))),m}function K1(){var m,b,N;return m=Q,b=uge(),b!==t?(N=lge(),N===t&&(N=null),N!==t?(Me=m,b=D(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function lge(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=cge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=K1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=L(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function cge(){var m;return r.substr(Q,2)===H?(m=H,Q+=2):(m=t,I===0&&Qe(j)),m===t&&(r.charCodeAt(Q)===124?(m=$,Q++):(m=t,I===0&&Qe(V))),m}function HE(){var m,b,N,U,ce,Se;if(m=Q,b=Z1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t)if(U=G1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,b=A(b,U),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;else Q=m,m=t;if(m===t)if(m=Q,b=Z1(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=ae(b),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function uge(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,ss;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===40?(N=ge,Q++):(N=t,I===0&&Qe(re)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===41?(ht=O,Q++):(ht=t,I===0&&Qe(F)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Fp();hi!==t;)Jr.push(hi),hi=Fp();if(Jr!==t){for(hi=[],ss=He();ss!==t;)hi.push(ss),ss=He();hi!==t?(Me=m,b=ue(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===123?(N=he,Q++):(N=t,I===0&&Qe(ke)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===125?(ht=Fe,Q++):(ht=t,I===0&&Qe(Ne)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Fp();hi!==t;)Jr.push(hi),hi=Fp();if(Jr!==t){for(hi=[],ss=He();ss!==t;)hi.push(ss),ss=He();hi!==t?(Me=m,b=oe(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){for(N=[],U=HE();U!==t;)N.push(U),U=HE();if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t){if(ce=[],Se=H1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=H1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=le(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=HE(),U!==t)for(;U!==t;)N.push(U),U=HE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=we(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}}}return m}function U1(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=GE(),U!==t)for(;U!==t;)N.push(U),U=GE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=fe(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t;return m}function H1(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t?(N=Fp(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();b!==t?(N=GE(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t)}return m}function Fp(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(qe.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ne)),N===t&&(N=null),N!==t?(U=gge(),U!==t?(ce=GE(),ce!==t?(Me=m,b=Y(N,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function gge(){var m;return r.substr(Q,2)===pe?(m=pe,Q+=2):(m=t,I===0&&Qe(ie)),m===t&&(r.substr(Q,2)===de?(m=de,Q+=2):(m=t,I===0&&Qe(_e)),m===t&&(r.charCodeAt(Q)===62?(m=Pt,Q++):(m=t,I===0&&Qe(It)),m===t&&(r.substr(Q,3)===Or?(m=Or,Q+=3):(m=t,I===0&&Qe(ii)),m===t&&(r.substr(Q,2)===gi?(m=gi,Q+=2):(m=t,I===0&&Qe(hr)),m===t&&(r.charCodeAt(Q)===60?(m=fi,Q++):(m=t,I===0&&Qe(ni))))))),m}function GE(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(N=G1(),N!==t?(Me=m,b=Ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function G1(){var m,b,N;if(m=Q,b=[],N=Y1(),N!==t)for(;N!==t;)b.push(N),N=Y1();else b=t;return b!==t&&(Me=m,b=Os(b)),m=b,m}function Y1(){var m,b;return m=Q,b=fge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=hge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=pge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=dge(),b!==t&&(Me=m,b=pr(b)),m=b))),m}function fge(){var m,b,N,U;return m=Q,r.substr(Q,2)===Ii?(b=Ii,Q+=2):(b=t,I===0&&Qe(es)),b!==t?(N=Ege(),N!==t?(r.charCodeAt(Q)===39?(U=ua,Q++):(U=t,I===0&&Qe(pA)),U!==t?(Me=m,b=ag(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function hge(){var m,b,N,U;return m=Q,r.charCodeAt(Q)===39?(b=ua,Q++):(b=t,I===0&&Qe(pA)),b!==t?(N=Cge(),N!==t?(r.charCodeAt(Q)===39?(U=ua,Q++):(U=t,I===0&&Qe(pA)),U!==t?(Me=m,b=ag(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function pge(){var m,b,N,U;if(m=Q,r.substr(Q,2)===ts?(b=ts,Q+=2):(b=t,I===0&&Qe(dA)),b!==t&&(Me=m,b=ga()),m=b,m===t)if(m=Q,r.charCodeAt(Q)===34?(b=yp,Q++):(b=t,I===0&&Qe(CA)),b!==t){for(N=[],U=j1();U!==t;)N.push(U),U=j1();N!==t?(r.charCodeAt(Q)===34?(U=yp,Q++):(U=t,I===0&&Qe(CA)),U!==t?(Me=m,b=mA(N),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function dge(){var m,b,N;if(m=Q,b=[],N=q1(),N!==t)for(;N!==t;)b.push(N),N=q1();else b=t;return b!==t&&(Me=m,b=mA(b)),m=b,m}function j1(){var m,b;return m=Q,b=V1(),b!==t&&(Me=m,b=wr(b)),m=b,m===t&&(m=Q,b=X1(),b!==t&&(Me=m,b=kl(b)),m=b,m===t&&(m=Q,b=oS(),b!==t&&(Me=m,b=Ag(b)),m=b,m===t&&(m=Q,b=mge(),b!==t&&(Me=m,b=Io(b)),m=b))),m}function q1(){var m,b;return m=Q,b=V1(),b!==t&&(Me=m,b=lg(b)),m=b,m===t&&(m=Q,b=X1(),b!==t&&(Me=m,b=wp(b)),m=b,m===t&&(m=Q,b=oS(),b!==t&&(Me=m,b=Bp(b)),m=b,m===t&&(m=Q,b=wge(),b!==t&&(Me=m,b=vr(b)),m=b,m===t&&(m=Q,b=yge(),b!==t&&(Me=m,b=Io(b)),m=b)))),m}function Cge(){var m,b,N;for(m=Q,b=[],se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));N!==t;)b.push(N),se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));return b!==t&&(Me=m,b=kn(b)),m=b,m}function mge(){var m,b,N;if(m=Q,b=[],N=J1(),N===t&&(cg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt))),N!==t)for(;N!==t;)b.push(N),N=J1(),N===t&&(cg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt)));else b=t;return b!==t&&(Me=m,b=kn(b)),m=b,m}function J1(){var m,b,N;return m=Q,r.substr(Q,2)===Rl?(b=Rl,Q+=2):(b=t,I===0&&Qe(Rn)),b!==t&&(Me=m,b=rs()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=is,Q++):(b=t,I===0&&Qe(gt)),b!==t?(wo.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(At)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t)),m}function Ege(){var m,b,N;for(m=Q,b=[],N=W1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));N!==t;)b.push(N),N=W1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));return b!==t&&(Me=m,b=kn(b)),m=b,m}function W1(){var m,b,N;return m=Q,r.substr(Q,2)===S?(b=S,Q+=2):(b=t,I===0&&Qe(Tt)),b!==t&&(Me=m,b=ug()),m=b,m===t&&(m=Q,r.substr(Q,2)===Fl?(b=Fl,Q+=2):(b=t,I===0&&Qe(Qp)),b!==t&&(Me=m,b=bp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=is,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Sp.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(vp)),N!==t?(Me=m,b=xp(),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===G?(b=G,Q+=2):(b=t,I===0&&Qe(yt)),b!==t&&(Me=m,b=EA()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ji?(b=Ji,Q+=2):(b=t,I===0&&Qe(Nl)),b!==t&&(Me=m,b=Xe()),m=b,m===t&&(m=Q,r.substr(Q,2)===fa?(b=fa,Q+=2):(b=t,I===0&&Qe(gg)),b!==t&&(Me=m,b=FE()),m=b,m===t&&(m=Q,r.substr(Q,2)===Pp?(b=Pp,Q+=2):(b=t,I===0&&Qe(NE)),b!==t&&(Me=m,b=ar()),m=b,m===t&&(m=Q,r.substr(Q,2)===Fn?(b=Fn,Q+=2):(b=t,I===0&&Qe(Ll)),b!==t&&(Me=m,b=Dp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=is,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Ms.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ha)),N!==t?(Me=m,b=an(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Ige()))))))))),m}function Ige(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,ss,aS;return m=Q,r.charCodeAt(Q)===92?(b=is,Q++):(b=t,I===0&&Qe(gt)),b!==t?(N=iS(),N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Te?(b=Te,Q+=2):(b=t,I===0&&Qe(fg)),b!==t?(N=Q,U=Q,ce=iS(),ce!==t?(Se=Tn(),Se!==t?(ce=[ce,Se],U=ce):(Q=U,U=t)):(Q=U,U=t),U===t&&(U=iS()),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Tl?(b=Tl,Q+=2):(b=t,I===0&&Qe(Ks)),b!==t?(N=Q,U=Q,ce=Tn(),ce!==t?(Se=Tn(),Se!==t?(ht=Tn(),ht!==t?(Bt=Tn(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=An(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ol?(b=Ol,Q+=2):(b=t,I===0&&Qe(IA)),b!==t?(N=Q,U=Q,ce=Tn(),ce!==t?(Se=Tn(),Se!==t?(ht=Tn(),ht!==t?(Bt=Tn(),Bt!==t?(Jr=Tn(),Jr!==t?(hi=Tn(),hi!==t?(ss=Tn(),ss!==t?(aS=Tn(),aS!==t?(ce=[ce,Se,ht,Bt,Jr,hi,ss,aS],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=hg(N),m=b):(Q=m,m=t)):(Q=m,m=t)))),m}function iS(){var m;return pg.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(pa)),m}function Tn(){var m;return da.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rt)),m}function yge(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,r.charCodeAt(Q)===92?(U=is,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=_1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t)),N!==t)for(;N!==t;)b.push(N),N=Q,r.charCodeAt(Q)===92?(U=is,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=_1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t));else b=t;return b!==t&&(Me=m,b=kn(b)),m=b,m}function nS(){var m,b,N,U,ce,Se;if(m=Q,r.charCodeAt(Q)===45?(b=yA,Q++):(b=t,I===0&&Qe(Ml)),b===t&&(r.charCodeAt(Q)===43?(b=Us,Q++):(b=t,I===0&&Qe(Kl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;if(N!==t)if(r.charCodeAt(Q)===46?(U=LE,Q++):(U=t,I===0&&Qe(kp)),U!==t){if(ce=[],qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne));else ce=t;ce!==t?(Me=m,b=dg(b,N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;if(m===t){if(m=Q,r.charCodeAt(Q)===45?(b=yA,Q++):(b=t,I===0&&Qe(Ml)),b===t&&(r.charCodeAt(Q)===43?(b=Us,Q++):(b=t,I===0&&Qe(Kl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;N!==t?(Me=m,b=Rp(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;if(m===t&&(m=Q,b=oS(),b!==t&&(Me=m,b=TE(b)),m=b,m===t&&(m=Q,b=Hl(),b!==t&&(Me=m,b=Ul(b)),m=b,m===t)))if(m=Q,r.charCodeAt(Q)===40?(b=ge,Q++):(b=t,I===0&&Qe(re)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=z1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(Q)===41?(Se=O,Q++):(Se=t,I===0&&Qe(F)),Se!==t?(Me=m,b=OE(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t}return m}function sS(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=nS(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Cg,Q++):(Se=t,I===0&&Qe(wA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(ME))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=nS(),Bt!==t?(Me=U,ce=Hs(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Cg,Q++):(Se=t,I===0&&Qe(wA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(ME))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=nS(),Bt!==t?(Me=U,ce=Hs(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Gs(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function z1(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=sS(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Us,Q++):(Se=t,I===0&&Qe(Kl)),Se===t&&(r.charCodeAt(Q)===45?(Se=yA,Q++):(Se=t,I===0&&Qe(Ml))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=mg(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Us,Q++):(Se=t,I===0&&Qe(Kl)),Se===t&&(r.charCodeAt(Q)===45?(Se=yA,Q++):(Se=t,I===0&&Qe(Ml))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=mg(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=Gs(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function V1(){var m,b,N,U,ce,Se;if(m=Q,r.substr(Q,3)===BA?(b=BA,Q+=3):(b=t,I===0&&Qe(R)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=z1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(Q,2)===q?(Se=q,Q+=2):(Se=t,I===0&&Qe(Ce)),Se!==t?(Me=m,b=Ke(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;return m}function X1(){var m,b,N,U;return m=Q,r.substr(Q,2)===Re?(b=Re,Q+=2):(b=t,I===0&&Qe(ze)),b!==t?(N=Mr(),N!==t?(r.charCodeAt(Q)===41?(U=O,Q++):(U=t,I===0&&Qe(F)),U!==t?(Me=m,b=dt(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function oS(){var m,b,N,U,ce,Se;return m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t?(N=Hl(),N!==t?(r.substr(Q,2)===qb?(U=qb,Q+=2):(U=t,I===0&&Qe(S1)),U!==t?(ce=U1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=v1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t?(N=Hl(),N!==t?(r.substr(Q,3)===Jb?(U=Jb,Q+=3):(U=t,I===0&&Qe(x1)),U!==t?(Me=m,b=P1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t?(N=Hl(),N!==t?(r.substr(Q,2)===Wb?(U=Wb,Q+=2):(U=t,I===0&&Qe(D1)),U!==t?(ce=U1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=k1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t?(N=Hl(),N!==t?(r.substr(Q,3)===zb?(U=zb,Q+=3):(U=t,I===0&&Qe(R1)),U!==t?(Me=m,b=F1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t?(N=Hl(),N!==t?(r.charCodeAt(Q)===125?(U=Fe,Q++):(U=t,I===0&&Qe(Ne)),U!==t?(Me=m,b=Vb(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.charCodeAt(Q)===36?(b=N1,Q++):(b=t,I===0&&Qe(L1)),b!==t?(N=Hl(),N!==t?(Me=m,b=Vb(N),m=b):(Q=m,m=t)):(Q=m,m=t)))))),m}function wge(){var m,b,N;return m=Q,b=Bge(),b!==t?(Me=Q,N=T1(b),N?N=void 0:N=t,N!==t?(Me=m,b=O1(b),m=b):(Q=m,m=t)):(Q=m,m=t),m}function Bge(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,U=Q,I++,ce=$1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N!==t)for(;N!==t;)b.push(N),N=Q,U=Q,I++,ce=$1(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=an(ce),N=U):(Q=N,N=t)):(Q=N,N=t);else b=t;return b!==t&&(Me=m,b=kn(b)),m=b,m}function Z1(){var m,b,N;if(m=Q,b=[],Xb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Zb)),N!==t)for(;N!==t;)b.push(N),Xb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Zb));else b=t;return b!==t&&(Me=m,b=_b()),m=b,m}function Hl(){var m,b,N;if(m=Q,b=[],$b.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(eS)),N!==t)for(;N!==t;)b.push(N),$b.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(eS));else b=t;return b!==t&&(Me=m,b=_b()),m=b,m}function _1(){var m;return M1.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(Eg)),m}function $1(){var m;return tS.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rS)),m}function He(){var m,b;if(m=[],KE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(UE)),b!==t)for(;b!==t;)m.push(b),KE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(UE));else m=t;return m}if(k=n(),k!==t&&Q===r.length)return k;throw k!==t&&Q{"use strict";function Qfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Vl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Vl)}Qfe(Vl,Error);Vl.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new Vl(ne,null,null,Y)}function oe(ne,Y,pe){return new Vl(Vl.buildMessage(ne,Y),ne,Y,pe)}function le(){var ne,Y,pe,ie;return ne=v,Y=we(),Y!==t?(r.charCodeAt(v)===47?(pe=s,v++):(pe=t,$===0&&Fe(o)),pe!==t?(ie=we(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=we(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function we(){var ne,Y,pe,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(pe=c,v++):(pe=t,$===0&&Fe(u)),pe!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,pe,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(pe=Ae(),pe!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=Ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function Ae(){var ne,Y,pe;if(ne=v,Y=[],p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C)),pe!==t)for(;pe!==t;)Y.push(pe),p.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,pe;if(ne=v,Y=[],y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B)),pe!==t)for(;pe!==t;)Y.push(pe),y.test(r.charAt(v))?(pe=r.charAt(v),v++):(pe=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v{"use strict";function fU(r){return typeof r>"u"||r===null}function Sfe(r){return typeof r=="object"&&r!==null}function vfe(r){return Array.isArray(r)?r:fU(r)?[]:[r]}function xfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t{"use strict";function Wp(r,e){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Wp.prototype=Object.create(Error.prototype);Wp.prototype.constructor=Wp;Wp.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t};hU.exports=Wp});var CU=w((IZe,dU)=>{"use strict";var pU=Zl();function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}HS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;ot/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),pU.repeat(" ",e)+i+a+s+` +`+pU.repeat(" ",e+this.position-n+i.length)+"^"};HS.prototype.toString=function(e){var t,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`: +`+t)),i};dU.exports=HS});var si=w((yZe,EU)=>{"use strict";var mU=kg(),kfe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Rfe=["scalar","sequence","mapping"];function Ffe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Nfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(kfe.indexOf(t)===-1)throw new mU('Unknown option "'+t+'" is met in definition of "'+r+'" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Ffe(e.styleAliases||null),Rfe.indexOf(this.kind)===-1)throw new mU('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}EU.exports=Nfe});var _l=w((wZe,yU)=>{"use strict";var IU=Zl(),gI=kg(),Lfe=si();function GS(r,e,t){var i=[];return r.include.forEach(function(n){t=GS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Tfe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e{"use strict";var Ofe=si();wU.exports=new Ofe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(r){return r!==null?r:""}})});var bU=w((QZe,QU)=>{"use strict";var Mfe=si();QU.exports=new Mfe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(r){return r!==null?r:[]}})});var vU=w((bZe,SU)=>{"use strict";var Kfe=si();SU.exports=new Kfe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(r){return r!==null?r:{}}})});var fI=w((SZe,xU)=>{"use strict";var Ufe=_l();xU.exports=new Ufe({explicit:[BU(),bU(),vU()]})});var DU=w((vZe,PU)=>{"use strict";var Hfe=si();function Gfe(r){if(r===null)return!0;var e=r.length;return e===1&&r==="~"||e===4&&(r==="null"||r==="Null"||r==="NULL")}function Yfe(){return null}function jfe(r){return r===null}PU.exports=new Hfe("tag:yaml.org,2002:null",{kind:"scalar",resolve:Gfe,construct:Yfe,predicate:jfe,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var RU=w((xZe,kU)=>{"use strict";var qfe=si();function Jfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r==="true"||r==="True"||r==="TRUE")||e===5&&(r==="false"||r==="False"||r==="FALSE")}function Wfe(r){return r==="true"||r==="True"||r==="TRUE"}function zfe(r){return Object.prototype.toString.call(r)==="[object Boolean]"}kU.exports=new qfe("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Jfe,construct:Wfe,predicate:zfe,represent:{lowercase:function(r){return r?"true":"false"},uppercase:function(r){return r?"TRUE":"FALSE"},camelcase:function(r){return r?"True":"False"}},defaultStyle:"lowercase"})});var NU=w((PZe,FU)=>{"use strict";var Vfe=Zl(),Xfe=si();function Zfe(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function _fe(r){return 48<=r&&r<=55}function $fe(r){return 48<=r&&r<=57}function ehe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n==="-"||n==="+")&&(n=r[++t]),n==="0"){if(t+1===e)return!0;if(n=r[++t],n==="b"){for(t++;t=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0"+r.toString(8):"-0"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var OU=w((DZe,TU)=>{"use strict";var LU=Zl(),ihe=si(),nhe=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function she(r){return!(r===null||!nhe.test(r)||r[r.length-1]==="_")}function ohe(r){var e,t,i,n;return e=r.replace(/_/g,"").toLowerCase(),t=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var ahe=/^[-+]?[0-9]+e/;function Ahe(r,e){var t;if(isNaN(r))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(LU.isNegativeZero(r))return"-0.0";return t=r.toString(10),ahe.test(t)?t.replace("e",".e"):t}function lhe(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||LU.isNegativeZero(r))}TU.exports=new ihe("tag:yaml.org,2002:float",{kind:"scalar",resolve:she,construct:ohe,predicate:lhe,represent:Ahe,defaultStyle:"lowercase"})});var YS=w((kZe,MU)=>{"use strict";var che=_l();MU.exports=new che({include:[fI()],implicit:[DU(),RU(),NU(),OU()]})});var jS=w((RZe,KU)=>{"use strict";var uhe=_l();KU.exports=new uhe({include:[YS()]})});var YU=w((FZe,GU)=>{"use strict";var ghe=si(),UU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),HU=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function fhe(r){return r===null?!1:UU.exec(r)!==null||HU.exec(r)!==null}function hhe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=UU.exec(r),e===null&&(e=HU.exec(r)),e===null)throw new Error("Date resolve error");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function phe(r){return r.toISOString()}GU.exports=new ghe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:fhe,construct:hhe,instanceOf:Date,represent:phe})});var qU=w((NZe,jU)=>{"use strict";var dhe=si();function Che(r){return r==="<<"||r===null}jU.exports=new dhe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:Che})});var zU=w((LZe,WU)=>{"use strict";var $l;try{JU=J,$l=JU("buffer").Buffer}catch{}var JU,mhe=si(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function Ehe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0;t64)){if(e<0)return!1;i+=6}return i%8===0}function Ihe(r){var e,t,i=r.replace(/[\r\n=]/g,""),n=i.length,s=qS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),$l?$l.from?$l.from(a):new $l(a):a}function yhe(r){var e="",t=0,i,n,s=r.length,o=qS;for(i=0;i>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function whe(r){return $l&&$l.isBuffer(r)}WU.exports=new mhe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:Ehe,construct:Ihe,predicate:whe,represent:yhe})});var XU=w((TZe,VU)=>{"use strict";var Bhe=si(),Qhe=Object.prototype.hasOwnProperty,bhe=Object.prototype.toString;function She(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t{"use strict";var xhe=si(),Phe=Object.prototype.toString;function Dhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e{"use strict";var Rhe=si(),Fhe=Object.prototype.hasOwnProperty;function Nhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Fhe.call(t,e)&&t[e]!==null)return!1;return!0}function Lhe(r){return r!==null?r:{}}$U.exports=new Rhe("tag:yaml.org,2002:set",{kind:"mapping",resolve:Nhe,construct:Lhe})});var Fg=w((KZe,t2)=>{"use strict";var The=_l();t2.exports=new The({include:[jS()],implicit:[YU(),qU()],explicit:[zU(),XU(),_U(),e2()]})});var i2=w((UZe,r2)=>{"use strict";var Ohe=si();function Mhe(){return!0}function Khe(){}function Uhe(){return""}function Hhe(r){return typeof r>"u"}r2.exports=new Ohe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Mhe,construct:Khe,predicate:Hhe,represent:Uhe})});var s2=w((HZe,n2)=>{"use strict";var Ghe=si();function Yhe(r){if(r===null||r.length===0)return!1;var e=r,t=/\/([gim]*)$/.exec(r),i="";return!(e[0]==="/"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function jhe(r){var e=r,t=/\/([gim]*)$/.exec(r),i="";return e[0]==="/"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function qhe(r){var e="/"+r.source+"/";return r.global&&(e+="g"),r.multiline&&(e+="m"),r.ignoreCase&&(e+="i"),e}function Jhe(r){return Object.prototype.toString.call(r)==="[object RegExp]"}n2.exports=new Ghe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:Yhe,construct:jhe,predicate:Jhe,represent:qhe})});var A2=w((GZe,a2)=>{"use strict";var hI;try{o2=J,hI=o2("esprima")}catch{typeof window<"u"&&(hI=window.esprima)}var o2,Whe=si();function zhe(r){if(r===null)return!1;try{var e="("+r+")",t=hI.parse(e,{range:!0});return!(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function Vhe(r){var e="("+r+")",t=hI.parse(e,{range:!0}),i=[],n;if(t.type!=="Program"||t.body.length!==1||t.body[0].type!=="ExpressionStatement"||t.body[0].expression.type!=="ArrowFunctionExpression"&&t.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function Xhe(r){return r.toString()}function Zhe(r){return Object.prototype.toString.call(r)==="[object Function]"}a2.exports=new Whe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:zhe,construct:Vhe,predicate:Zhe,represent:Xhe})});var zp=w((YZe,c2)=>{"use strict";var l2=_l();c2.exports=l2.DEFAULT=new l2({include:[Fg()],explicit:[i2(),s2(),A2()]})});var P2=w((jZe,Vp)=>{"use strict";var ya=Zl(),C2=kg(),_he=CU(),m2=Fg(),$he=zp(),DA=Object.prototype.hasOwnProperty,pI=1,E2=2,I2=3,dI=4,JS=1,epe=2,u2=3,tpe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,rpe=/[\x85\u2028\u2029]/,ipe=/[,\[\]\{\}]/,y2=/^(?:!|!!|![a-z\-]+!)$/i,w2=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function g2(r){return Object.prototype.toString.call(r)}function vo(r){return r===10||r===13}function tc(r){return r===9||r===32}function un(r){return r===9||r===32||r===10||r===13}function Ng(r){return r===44||r===91||r===93||r===123||r===125}function npe(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function spe(r){return r===120?2:r===117?4:r===85?8:0}function ope(r){return 48<=r&&r<=57?r-48:-1}function f2(r){return r===48?"\0":r===97?"\x07":r===98?"\b":r===116||r===9?" ":r===110?` +`:r===118?"\v":r===102?"\f":r===114?"\r":r===101?"\x1B":r===32?" ":r===34?'"':r===47?"/":r===92?"\\":r===78?"\x85":r===95?"\xA0":r===76?"\u2028":r===80?"\u2029":""}function ape(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var B2=new Array(256),Q2=new Array(256);for(ec=0;ec<256;ec++)B2[ec]=f2(ec)?1:0,Q2[ec]=f2(ec);var ec;function Ape(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||$he,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function b2(r,e){return new C2(e,new _he(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw b2(r,e)}function CI(r,e){r.onWarning&&r.onWarning.call(null,b2(r,e))}var h2={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,"duplication of %YAML directive"),i.length!==1&&ft(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&CI(e,"unsupported YAML version of the document")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],y2.test(n)||ft(e,"ill-formed tag handle (first argument) of the TAG directive"),DA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for "'+n+'" tag handle'),w2.test(s)||ft(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function PA(r,e,t,i){var n,s,o,a;if(e1&&(r.result+=ya.repeat(` +`,e-1))}function lpe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),un(h)||Ng(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),un(n)||t&&Ng(n)))return!1;for(r.kind="scalar",r.result="",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),un(n)||t&&Ng(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),un(i))break}else{if(r.position===r.lineStart&&mI(r)||t&&Ng(h))break;if(vo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(PA(r,s,o,!1),zS(r,r.line-l),s=o=r.position,a=!1),tc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return PA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function cpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind="scalar",r.result="",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(PA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else vo(t)?(PA(r,i,n,!0),zS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&mI(r)?ft(r,"unexpected end of the document within a single quoted scalar"):(r.position++,n=r.position);ft(r,"unexpected end of the stream within a single quoted scalar")}function upe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind="scalar",r.result="",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return PA(r,t,r.position,!0),r.position++,!0;if(a===92){if(PA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),vo(a))zr(r,!1,e);else if(a<256&&B2[a])r.result+=Q2[a],r.position++;else if((o=spe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=npe(a))>=0?s=(s<<4)+o:ft(r,"expected hexadecimal character");r.result+=ape(s),r.position++}else ft(r,"unknown escape sequence");t=i=r.position}else vo(a)?(PA(r,t,i,!0),zS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&mI(r)?ft(r,"unexpected end of the document within a double quoted scalar"):(r.position++,i=r.position)}ft(r,"unexpected end of the stream within a double quoted scalar")}function gpe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?"mapping":"sequence",r.result=s,!0;t||ft(r,"missed comma between flow collection entries"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),un(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Tg(r,e,pI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Tg(r,e,pI,!1,!0),C=r.result),g?Lg(r,s,f,p,h,C):c?s.push(Lg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,"unexpected end of the stream within a flow collection")}function fpe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind="scalar",r.result="";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)JS===n?n=g===43?u2:epe:ft(r,"repeat of a chomping mode identifier");else if((u=ope(g))>=0)u===0?ft(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?ft(r,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(tc(g)){do g=r.input.charCodeAt(++r.position);while(tc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!vo(g)&&g!==0)}for(;g!==0;){for(WS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndenta&&(a=r.lineIndent),vo(g)){l++;continue}if(r.lineIndente)&&l!==0)ft(r,"bad indentation of a sequence entry");else if(r.lineIndente)&&(Tg(r,e,dI,!0,n)&&(p?f=r.result:h=r.result),p||(Lg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,"bad indentation of a mapping entry");else if(r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndente?l=1:r.lineIndent===e?l=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),g=0,f=r.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+r.kind+'"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")):ft(r,"unknown tag !<"+r.tag+">");return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||u}function mpe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,"directive name must not be less than one character in length");o!==0;){for(;tc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!vo(o));break}if(vo(o))break;for(t=r.position;o!==0&&!un(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&WS(r),DA.call(h2,i)?h2[i](r,i,n):CI(r,'unknown document directive "'+i+'"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,"directives end mark is expected"),Tg(r,r.lineIndent-1,dI,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&rpe.test(r.input.slice(e,r.position))&&CI(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&mI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position"u"&&(t=e,e=null);var i=S2(r,t);if(typeof e!="function")return i;for(var n=0,s=i.length;n"u"&&(t=e,e=null),v2(r,e,ya.extend({schema:m2},t))}function Ipe(r,e){return x2(r,ya.extend({schema:m2},e))}Vp.exports.loadAll=v2;Vp.exports.load=x2;Vp.exports.safeLoadAll=Epe;Vp.exports.safeLoad=Ipe});var _2=w((qZe,_S)=>{"use strict";var Zp=Zl(),_p=kg(),ype=zp(),wpe=Fg(),O2=Object.prototype.toString,M2=Object.prototype.hasOwnProperty,Bpe=9,Xp=10,Qpe=13,bpe=32,Spe=33,vpe=34,K2=35,xpe=37,Ppe=38,Dpe=39,kpe=42,U2=44,Rpe=45,H2=58,Fpe=61,Npe=62,Lpe=63,Tpe=64,G2=91,Y2=93,Ope=96,j2=123,Mpe=124,q2=125,Ni={};Ni[0]="\\0";Ni[7]="\\a";Ni[8]="\\b";Ni[9]="\\t";Ni[10]="\\n";Ni[11]="\\v";Ni[12]="\\f";Ni[13]="\\r";Ni[27]="\\e";Ni[34]='\\"';Ni[92]="\\\\";Ni[133]="\\N";Ni[160]="\\_";Ni[8232]="\\L";Ni[8233]="\\P";var Kpe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function Upe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n0?r.charCodeAt(s-1):null,f=f&&R2(o,a)}else{for(s=0;si&&r[g+1]!==" ",g=s);else if(!Og(o))return EI;a=s>0?r.charCodeAt(s-1):null,f=f&&R2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==" "}return!l&&!c?f&&!n(r)?W2:z2:t>9&&J2(r)?EI:c?X2:V2}function Jpe(r,e,t,i){r.dump=function(){if(e.length===0)return"''";if(!r.noCompatMode&&Kpe.indexOf(e)!==-1)return"'"+e+"'";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Gpe(r,l)}switch(qpe(e,o,r.indent,s,a)){case W2:return e;case z2:return"'"+e.replace(/'/g,"''")+"'";case V2:return"|"+F2(e,r.indent)+N2(k2(e,n));case X2:return">"+F2(e,r.indent)+N2(k2(Wpe(e,s),n));case EI:return'"'+zpe(e,s)+'"';default:throw new _p("impossible error: invalid scalar style")}}()}function F2(r,e){var t=J2(r)?String(e):"",i=r[r.length-1]===` +`,n=i&&(r[r.length-2]===` +`||r===` +`),s=n?"+":i?"":"-";return t+s+` +`}function N2(r){return r[r.length-1]===` +`?r.slice(0,-1):r}function Wpe(r,e){for(var t=/(\n+)([^\n]*)/g,i=function(){var c=r.indexOf(` +`);return c=c!==-1?c:r.length,t.lastIndex=c,L2(r.slice(0,c),e)}(),n=r[0]===` +`||r[0]===" ",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+L2(l,e),n=s}return i}function L2(r,e){if(r===""||r[0]===" ")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+r.slice(n,s),n=s+1),o=a;return l+=` +`,r.length-n>e&&o>n?l+=r.slice(n,o)+` +`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function zpe(r){for(var e="",t,i,n,s=0;s=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=D2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Og(t)?r[s]:n||D2(t)}return e}function Vpe(r,e,t){var i="",n=r.tag,s,o;for(s=0,o=t.length;s1024&&(u+="? "),u+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),rc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump="{"+i+"}"}function _pe(r,e,t,i){var n="",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys=="function")o.sort(r.sortKeys);else if(r.sortKeys)throw new _p("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(r.dump&&Xp===r.dump.charCodeAt(0)?f+="?":f+="? "),f+=r.dump,g&&(f+=VS(r,e)),rc(r,e+1,u,!0,g)&&(r.dump&&Xp===r.dump.charCodeAt(0)?f+=":":f+=": ",f+=r.dump,n+=f));r.tag=s,r.dump=n||"{}"}function T2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');r.dump=i}return!0}return!1}function rc(r,e,t,i,n,s){r.tag=null,r.dump=t,T2(r,t,!1)||T2(r,t,!0);var o=O2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!=="?"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump="*ref_"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(r.dump).length!==0?(_pe(r,e,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Zpe(r,e,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump));else if(o==="[object Array]"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(Xpe(r,u,r.dump,n),c&&(r.dump="&ref_"+l+r.dump)):(Vpe(r,u,r.dump),c&&(r.dump="&ref_"+l+" "+r.dump))}else if(o==="[object String]")r.tag!=="?"&&Jpe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new _p("unacceptable kind of an object to dump "+o)}r.tag!==null&&r.tag!=="?"&&(r.dump="!<"+r.tag+"> "+r.dump)}return!0}function $pe(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n{"use strict";var II=P2(),$2=_2();function yI(r){return function(){throw new Error("Function "+r+" is deprecated and cannot be used.")}}Fr.exports.Type=si();Fr.exports.Schema=_l();Fr.exports.FAILSAFE_SCHEMA=fI();Fr.exports.JSON_SCHEMA=YS();Fr.exports.CORE_SCHEMA=jS();Fr.exports.DEFAULT_SAFE_SCHEMA=Fg();Fr.exports.DEFAULT_FULL_SCHEMA=zp();Fr.exports.load=II.load;Fr.exports.loadAll=II.loadAll;Fr.exports.safeLoad=II.safeLoad;Fr.exports.safeLoadAll=II.safeLoadAll;Fr.exports.dump=$2.dump;Fr.exports.safeDump=$2.safeDump;Fr.exports.YAMLException=kg();Fr.exports.MINIMAL_SCHEMA=fI();Fr.exports.SAFE_SCHEMA=Fg();Fr.exports.DEFAULT_SCHEMA=zp();Fr.exports.scan=yI("scan");Fr.exports.parse=yI("parse");Fr.exports.compose=yI("compose");Fr.exports.addConstructor=yI("addConstructor")});var rH=w((WZe,tH)=>{"use strict";var tde=eH();tH.exports=tde});var nH=w((zZe,iH)=>{"use strict";function rde(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function ic(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ic)}rde(ic,Error);ic.buildMessage=function(r,e){var t={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[Ke]:Ce})))},H=function(R){return R},j=function(R){return R},$=Ms("correct indentation"),V=" ",W=ar(" ",!1),_=function(R){return R.length===BA*mg},A=function(R){return R.length===(BA+1)*mg},ae=function(){return BA++,!0},ge=function(){return BA--,!0},re=function(){return gg()},O=Ms("pseudostring"),F=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,ue=Fn(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),he=/^[^\r\n\t ,\][{}:#"']/,ke=Fn(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Fe=function(){return gg().replace(/^ *| *$/g,"")},Ne="--",oe=ar("--",!1),le=/^[a-zA-Z\/0-9]/,we=Fn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),fe=/^[^\r\n\t :,]/,Ae=Fn(["\r",` +`," "," ",":",","],!0,!1),qe="null",ne=ar("null",!1),Y=function(){return null},pe="true",ie=ar("true",!1),de=function(){return!0},_e="false",Pt=ar("false",!1),It=function(){return!1},Or=Ms("string"),ii='"',gi=ar('"',!1),hr=function(){return""},fi=function(R){return R},ni=function(R){return R.join("")},Os=/^[^"\\\0-\x1F\x7F]/,pr=Fn(['"',"\\",["\0",""],"\x7F"],!0,!1),Ii='\\"',es=ar('\\"',!1),ua=function(){return'"'},pA="\\\\",ag=ar("\\\\",!1),ts=function(){return"\\"},dA="\\/",ga=ar("\\/",!1),yp=function(){return"/"},CA="\\b",mA=ar("\\b",!1),wr=function(){return"\b"},kl="\\f",Ag=ar("\\f",!1),Io=function(){return"\f"},lg="\\n",wp=ar("\\n",!1),Bp=function(){return` +`},vr="\\r",se=ar("\\r",!1),yo=function(){return"\r"},kn="\\t",cg=ar("\\t",!1),Qt=function(){return" "},Rl="\\u",Rn=ar("\\u",!1),rs=function(R,q,Ce,Ke){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ke}`))},is=/^[0-9a-fA-F]/,gt=Fn([["0","9"],["a","f"],["A","F"]],!1,!1),wo=Ms("blank space"),At=/^[ \t]/,an=Fn([" "," "],!1,!1),S=Ms("white space"),Tt=/^[ \t\n\r]/,ug=Fn([" "," ",` +`,"\r"],!1,!1),Fl=`\r +`,Qp=ar(`\r +`,!1),bp=` +`,Sp=ar(` +`,!1),vp="\r",xp=ar("\r",!1),G=0,yt=0,EA=[{line:1,column:1}],Ji=0,Nl=[],Xe=0,fa;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function gg(){return r.substring(yt,G)}function FE(){return An(yt,G)}function Pp(R,q){throw q=q!==void 0?q:An(yt,G),Tl([Ms(R)],r.substring(yt,G),q)}function NE(R,q){throw q=q!==void 0?q:An(yt,G),fg(R,q)}function ar(R,q){return{type:"literal",text:R,ignoreCase:q}}function Fn(R,q,Ce){return{type:"class",parts:R,inverted:q,ignoreCase:Ce}}function Ll(){return{type:"any"}}function Dp(){return{type:"end"}}function Ms(R){return{type:"other",description:R}}function ha(R){var q=EA[R],Ce;if(q)return q;for(Ce=R-1;!EA[Ce];)Ce--;for(q=EA[Ce],q={line:q.line,column:q.column};CeJi&&(Ji=G,Nl=[]),Nl.push(R))}function fg(R,q){return new ic(R,null,null,q)}function Tl(R,q,Ce){return new ic(ic.buildMessage(R,q),R,q,Ce)}function Ks(){var R;return R=hg(),R}function Ol(){var R,q,Ce;for(R=G,q=[],Ce=IA();Ce!==t;)q.push(Ce),Ce=IA();return q!==t&&(yt=R,q=s(q)),R=q,R}function IA(){var R,q,Ce,Ke,Re;return R=G,q=da(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Te(a)),Ce!==t?(Ke=Rr(),Ke!==t?(Re=pa(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function hg(){var R,q,Ce;for(R=G,q=[],Ce=pg();Ce!==t;)q.push(Ce),Ce=pg();return q!==t&&(yt=R,q=c(q)),R=q,R}function pg(){var R,q,Ce,Ke,Re,ze,dt,Ft,Nn;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ke=u,G++):(Ke=t,Xe===0&&Te(g)),Ke!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=Gs(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=Gs(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Te(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ke=[Ke,Re],Ce=Ke):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ke=[],Re=Hs(),Re!==t)for(;Re!==t;)Ke.push(Re),Re=Hs();else Ke=t;Ke!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=da(),q!==t?(Ce=Ml(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=pa(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=da(),q!==t?(Ce=Us(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Te(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=pa(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=da(),q!==t)if(Ce=Us(),Ce!==t)if(Ke=Rr(),Ke!==t)if(Re=LE(),Re!==t){if(ze=[],dt=Hs(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Hs();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=da(),q!==t)if(Ce=Us(),Ce!==t){if(Ke=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Us(),Nn!==t?(yt=Re,ze=D(Ce,Nn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ke.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Te(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Nn=Us(),Nn!==t?(yt=Re,ze=D(Ce,Nn),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ke=t;Ke!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Te(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=pa(),Ft!==t?(yt=R,q=L(Ce,Ke,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function pa(){var R,q,Ce,Ke,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ke=Gs(),Ke!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Te(a)),ze!==t?(dt=Rr(),dt!==t?(Ke=[Ke,Re,ze,dt],Ce=Ke):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Hs(),Ce!==t?(Ke=Bo(),Ke!==t?(Re=Ol(),Re!==t?(ze=yA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=Gs(),q!==t?(Ce=Bo(),Ce!==t?(Ke=hg(),Ke!==t?(Re=yA(),Re!==t?(yt=R,q=H(Ke),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Kl(),q!==t){if(Ce=[],Ke=Hs(),Ke!==t)for(;Ke!==t;)Ce.push(Ke),Ke=Hs();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function da(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=_(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Te($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Te(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function Bo(){var R;return yt=G,R=ae(),R?R=void 0:R=t,R}function yA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Ml(){var R;return R=Ul(),R===t&&(R=kp()),R}function Us(){var R,q,Ce;if(R=Ul(),R===t){if(R=G,q=[],Ce=dg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=dg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Kl(){var R;return R=Rp(),R===t&&(R=TE(),R===t&&(R=Ul(),R===t&&(R=kp()))),R}function LE(){var R;return R=Rp(),R===t&&(R=Ul(),R===t&&(R=dg())),R}function kp(){var R,q,Ce,Ke,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ue)),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(he.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Te(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(O)),R}function dg(){var R,q,Ce,Ke,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Te(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Te(we)),Ce!==t){for(Ke=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Re!==t;)Ke.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Te(Ae));Ke!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function Rp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Te(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function TE(){var R,q;return R=G,r.substr(G,4)===pe?(q=pe,G+=4):(q=t,Xe===0&&Te(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===_e?(q=_e,G+=5):(q=t,Xe===0&&Te(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function Ul(){var R,q,Ce,Ke;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Te(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Te(gi)),q!==t?(Ce=OE(),Ce!==t?(r.charCodeAt(G)===34?(Ke=ii,G++):(Ke=t,Xe===0&&Te(gi)),Ke!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Te(Or)),R}function OE(){var R,q,Ce;if(R=G,q=[],Ce=Cg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Cg();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function Cg(){var R,q,Ce,Ke,Re,ze;return Os.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(pr)),R===t&&(R=G,r.substr(G,2)===Ii?(q=Ii,G+=2):(q=t,Xe===0&&Te(es)),q!==t&&(yt=R,q=ua()),R=q,R===t&&(R=G,r.substr(G,2)===pA?(q=pA,G+=2):(q=t,Xe===0&&Te(ag)),q!==t&&(yt=R,q=ts()),R=q,R===t&&(R=G,r.substr(G,2)===dA?(q=dA,G+=2):(q=t,Xe===0&&Te(ga)),q!==t&&(yt=R,q=yp()),R=q,R===t&&(R=G,r.substr(G,2)===CA?(q=CA,G+=2):(q=t,Xe===0&&Te(mA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===kl?(q=kl,G+=2):(q=t,Xe===0&&Te(Ag)),q!==t&&(yt=R,q=Io()),R=q,R===t&&(R=G,r.substr(G,2)===lg?(q=lg,G+=2):(q=t,Xe===0&&Te(wp)),q!==t&&(yt=R,q=Bp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Te(se)),q!==t&&(yt=R,q=yo()),R=q,R===t&&(R=G,r.substr(G,2)===kn?(q=kn,G+=2):(q=t,Xe===0&&Te(cg)),q!==t&&(yt=R,q=Qt()),R=q,R===t&&(R=G,r.substr(G,2)===Rl?(q=Rl,G+=2):(q=t,Xe===0&&Te(Rn)),q!==t?(Ce=wA(),Ce!==t?(Ke=wA(),Ke!==t?(Re=wA(),Re!==t?(ze=wA(),ze!==t?(yt=R,q=rs(Ce,Ke,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function wA(){var R;return is.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Te(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(an));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(wo)),R}function ME(){var R,q;if(Xe++,R=[],Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ug)),q!==t)for(;q!==t;)R.push(q),Tt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Te(ug));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Te(S)),R}function Hs(){var R,q,Ce,Ke,Re,ze;if(R=G,q=Gs(),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Gs(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=Gs(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function Gs(){var R;return r.substr(G,2)===Fl?(R=Fl,G+=2):(R=t,Xe===0&&Te(Qp)),R===t&&(r.charCodeAt(G)===10?(R=bp,G++):(R=t,Xe===0&&Te(Sp)),R===t&&(r.charCodeAt(G)===13?(R=vp,G++):(R=t,Xe===0&&Te(xp)))),R}let mg=2,BA=0;if(fa=n(),fa!==t&&G===r.length)return fa;throw fa!==t&&G{"use strict";var Ade=r=>{let e=!1,t=!1,i=!1;for(let n=0;n{if(!(typeof r=="string"||Array.isArray(r)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join("-"):r=r.trim(),r.length===0?"":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=Ade(r)),r=r.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=lH;ev.exports.default=lH});var uH=w((e_e,lde)=>{lde.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var nc=w(Mn=>{"use strict";var fH=uH(),xo=process.env;Object.defineProperty(Mn,"_vendors",{value:fH.map(function(r){return r.constant})});Mn.name=null;Mn.isPR=null;fH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return gH(i)});if(Mn[r.constant]=t,t)switch(Mn.name=r.name,typeof r.pr){case"string":Mn.isPR=!!xo[r.pr];break;case"object":"env"in r.pr?Mn.isPR=r.pr.env in xo&&xo[r.pr.env]!==r.pr.ne:"any"in r.pr?Mn.isPR=r.pr.any.some(function(i){return!!xo[i]}):Mn.isPR=gH(r.pr);break;default:Mn.isPR=null}});Mn.isCI=!!(xo.CI||xo.CONTINUOUS_INTEGRATION||xo.BUILD_NUMBER||xo.RUN_ID||Mn.name);function gH(r){return typeof r=="string"?!!xo[r]:Object.keys(r).every(function(e){return xo[e]===r[e]})}});var gn={};ut(gn,{KeyRelationship:()=>sc,applyCascade:()=>nd,base64RegExp:()=>mH,colorStringAlphaRegExp:()=>CH,colorStringRegExp:()=>dH,computeKey:()=>kA,getPrintable:()=>Vr,hasExactLength:()=>BH,hasForbiddenKeys:()=>Hde,hasKeyRelationship:()=>av,hasMaxLength:()=>Qde,hasMinLength:()=>Bde,hasMutuallyExclusiveKeys:()=>Gde,hasRequiredKeys:()=>Ude,hasUniqueItems:()=>bde,isArray:()=>pde,isAtLeast:()=>xde,isAtMost:()=>Pde,isBase64:()=>Mde,isBoolean:()=>gde,isDate:()=>hde,isDict:()=>Cde,isEnum:()=>Vi,isHexColor:()=>Ode,isISO8601:()=>Tde,isInExclusiveRange:()=>kde,isInInclusiveRange:()=>Dde,isInstanceOf:()=>Ede,isInteger:()=>Rde,isJSON:()=>Kde,isLiteral:()=>cde,isLowerCase:()=>Fde,isNegative:()=>Sde,isNullable:()=>wde,isNumber:()=>fde,isObject:()=>mde,isOneOf:()=>Ide,isOptional:()=>yde,isPositive:()=>vde,isString:()=>id,isTuple:()=>dde,isUUID4:()=>Lde,isUnknown:()=>wH,isUpperCase:()=>Nde,iso8601RegExp:()=>ov,makeCoercionFn:()=>oc,makeSetter:()=>yH,makeTrait:()=>IH,makeValidator:()=>bt,matchesRegExp:()=>sd,plural:()=>vI,pushError:()=>pt,simpleKeyRegExp:()=>pH,uuid4RegExp:()=>EH});function bt({test:r}){return IH(r)()}function Vr(r){return r===null?"null":r===void 0?"undefined":r===""?"an empty string":JSON.stringify(r)}function kA(r,e){var t,i,n;return typeof e=="number"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:"."}[${e}]`:pH.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function oc(r,e){return t=>{let i=r[e];return r[e]=t,oc(r,e).bind(null,i)}}function yH(r,e){return t=>{r[e]=t}}function vI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:"."}: ${t}`),!1}function cde(r){return bt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Vi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return bt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var pH,dH,CH,mH,EH,ov,IH,wH,id,ude,gde,fde,hde,pde,dde,Cde,mde,Ede,Ide,nd,yde,wde,Bde,Qde,BH,bde,Sde,vde,xde,Pde,Dde,kde,Rde,sd,Fde,Nde,Lde,Tde,Ode,Mde,Kde,Ude,Hde,Gde,sc,Yde,av,as=Pge(()=>{pH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,dH=/^#[0-9a-f]{6}$/i,CH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,mH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,EH=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,ov=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,IH=r=>()=>r;wH=()=>bt({test:(r,e)=>!0});id=()=>bt({test:(r,e)=>typeof r!="string"?pt(e,`Expected a string (got ${Vr(r)})`):!0});ude=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),gde=()=>bt({test:(r,e)=>{var t;if(typeof r!="boolean"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i=ude.get(r);if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),fde=()=>bt({test:(r,e)=>{var t;if(typeof r!="number"){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"){let n;try{n=JSON.parse(r)}catch{}if(typeof n=="number")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),hde=()=>bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<"u"){if(typeof(e==null?void 0:e.coercion)>"u")return pt(e,"Unbound coercion result");let i;if(typeof r=="string"&&ov.test(r))i=new Date(r);else{let n;if(typeof r=="string"){let s;try{s=JSON.parse(r)}catch{}typeof s=="number"&&(n=s)}else typeof r=="number"&&(n=r);if(typeof n<"u")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<"u")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:".",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),pde=(r,{delimiter:e}={})=>bt({test:(t,i)=>{var n;if(typeof t=="string"&&typeof e<"u"&&typeof(i==null?void 0:i.coercions)<"u"){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o{let t=BH(r.length);return bt({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e<"u"&&typeof(n==null?void 0:n.coercions)<"u"){if(typeof(n==null?void 0:n.coercion)>"u")return pt(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;abt({test:(t,i)=>{if(typeof t!="object"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o{let t=Object.keys(r);return bt({test:(i,n)=>{if(typeof i!="object"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=pt(Object.assign(Object.assign({},n),{p:kA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<"u"?a=c(u,Object.assign(Object.assign({},n),{p:kA(n,l),coercion:oc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:kA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:yH(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Ede=r=>bt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Ide=(r,{exclusive:e=!1}={})=>bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<"u"?[]:void 0;for(let c=0,u=r.length;c1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),nd=(r,e)=>bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<"u"?oc(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)<"u"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<"u")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<"u"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>"u")return pt(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),yde=r=>bt({test:(e,t)=>typeof e>"u"?!0:r(e,t)}),wde=r=>bt({test:(e,t)=>e===null?!0:r(e,t)}),Bde=r=>bt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),Qde=r=>bt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),BH=r=>bt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),bde=({map:r}={})=>bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sbt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),vde=()=>bt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),xde=r=>bt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Pde=r=>bt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),Dde=(r,e)=>bt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),kde=(r,e)=>bt({test:(t,i)=>t>=r&&tbt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),sd=r=>bt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Fde=()=>bt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),Nde=()=>bt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Lde=()=>bt({test:(r,e)=>EH.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Tde=()=>bt({test:(r,e)=>ov.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),Ode=({alpha:r=!1})=>bt({test:(e,t)=>(r?dH.test(e):CH.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),Mde=()=>bt({test:(r,e)=>mH.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),Kde=(r=wH())=>bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),Ude=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${vI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Hde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${vI(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Gde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(r){r.Forbids="Forbids",r.Requires="Requires"})(sc||(sc={}));Yde={[sc.Forbids]:{expect:!1,message:"forbids using"},[sc.Requires]:{expect:!0,message:"requires using"}},av=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Yde[e];return bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property "${r}" ${o.message} ${vI(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var UH=w((e$e,KH)=>{"use strict";KH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Yg=w((t$e,pv)=>{"use strict";var oCe=UH(),HH=r=>{if(r<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=oCe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{tnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};pv.exports=HH;pv.exports.default=HH});var cd=w((i$e,GH)=>{var aCe="2.0.0",ACe=Number.MAX_SAFE_INTEGER||9007199254740991,lCe=16;GH.exports={SEMVER_SPEC_VERSION:aCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:ACe,MAX_SAFE_COMPONENT_LENGTH:lCe}});var ud=w((n$e,YH)=>{var cCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error("SEMVER",...r):()=>{};YH.exports=cCe});var ac=w((FA,jH)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=cd(),uCe=ud();FA=jH.exports={};var gCe=FA.re=[],et=FA.src=[],tt=FA.t={},fCe=0,St=(r,e,t)=>{let i=fCe++;uCe(i,e),tt[r]=i,et[i]=e,gCe[i]=new RegExp(e,t?"g":void 0)};St("NUMERICIDENTIFIER","0|[1-9]\\d*");St("NUMERICIDENTIFIERLOOSE","[0-9]+");St("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");St("MAINVERSION",`(${et[tt.NUMERICIDENTIFIER]})\\.(${et[tt.NUMERICIDENTIFIER]})\\.(${et[tt.NUMERICIDENTIFIER]})`);St("MAINVERSIONLOOSE",`(${et[tt.NUMERICIDENTIFIERLOOSE]})\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})`);St("PRERELEASEIDENTIFIER",`(?:${et[tt.NUMERICIDENTIFIER]}|${et[tt.NONNUMERICIDENTIFIER]})`);St("PRERELEASEIDENTIFIERLOOSE",`(?:${et[tt.NUMERICIDENTIFIERLOOSE]}|${et[tt.NONNUMERICIDENTIFIER]})`);St("PRERELEASE",`(?:-(${et[tt.PRERELEASEIDENTIFIER]}(?:\\.${et[tt.PRERELEASEIDENTIFIER]})*))`);St("PRERELEASELOOSE",`(?:-?(${et[tt.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${et[tt.PRERELEASEIDENTIFIERLOOSE]})*))`);St("BUILDIDENTIFIER","[0-9A-Za-z-]+");St("BUILD",`(?:\\+(${et[tt.BUILDIDENTIFIER]}(?:\\.${et[tt.BUILDIDENTIFIER]})*))`);St("FULLPLAIN",`v?${et[tt.MAINVERSION]}${et[tt.PRERELEASE]}?${et[tt.BUILD]}?`);St("FULL",`^${et[tt.FULLPLAIN]}$`);St("LOOSEPLAIN",`[v=\\s]*${et[tt.MAINVERSIONLOOSE]}${et[tt.PRERELEASELOOSE]}?${et[tt.BUILD]}?`);St("LOOSE",`^${et[tt.LOOSEPLAIN]}$`);St("GTLT","((?:<|>)?=?)");St("XRANGEIDENTIFIERLOOSE",`${et[tt.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);St("XRANGEIDENTIFIER",`${et[tt.NUMERICIDENTIFIER]}|x|X|\\*`);St("XRANGEPLAIN",`[v=\\s]*(${et[tt.XRANGEIDENTIFIER]})(?:\\.(${et[tt.XRANGEIDENTIFIER]})(?:\\.(${et[tt.XRANGEIDENTIFIER]})(?:${et[tt.PRERELEASE]})?${et[tt.BUILD]}?)?)?`);St("XRANGEPLAINLOOSE",`[v=\\s]*(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:${et[tt.PRERELEASELOOSE]})?${et[tt.BUILD]}?)?)?`);St("XRANGE",`^${et[tt.GTLT]}\\s*${et[tt.XRANGEPLAIN]}$`);St("XRANGELOOSE",`^${et[tt.GTLT]}\\s*${et[tt.XRANGEPLAINLOOSE]}$`);St("COERCE",`(^|[^\\d])(\\d{1,${dv}})(?:\\.(\\d{1,${dv}}))?(?:\\.(\\d{1,${dv}}))?(?:$|[^\\d])`);St("COERCERTL",et[tt.COERCE],!0);St("LONETILDE","(?:~>?)");St("TILDETRIM",`(\\s*)${et[tt.LONETILDE]}\\s+`,!0);FA.tildeTrimReplace="$1~";St("TILDE",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAIN]}$`);St("TILDELOOSE",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAINLOOSE]}$`);St("LONECARET","(?:\\^)");St("CARETTRIM",`(\\s*)${et[tt.LONECARET]}\\s+`,!0);FA.caretTrimReplace="$1^";St("CARET",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAIN]}$`);St("CARETLOOSE",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAINLOOSE]}$`);St("COMPARATORLOOSE",`^${et[tt.GTLT]}\\s*(${et[tt.LOOSEPLAIN]})$|^$`);St("COMPARATOR",`^${et[tt.GTLT]}\\s*(${et[tt.FULLPLAIN]})$|^$`);St("COMPARATORTRIM",`(\\s*)${et[tt.GTLT]}\\s*(${et[tt.LOOSEPLAIN]}|${et[tt.XRANGEPLAIN]})`,!0);FA.comparatorTrimReplace="$1$2$3";St("HYPHENRANGE",`^\\s*(${et[tt.XRANGEPLAIN]})\\s+-\\s+(${et[tt.XRANGEPLAIN]})\\s*$`);St("HYPHENRANGELOOSE",`^\\s*(${et[tt.XRANGEPLAINLOOSE]})\\s+-\\s+(${et[tt.XRANGEPLAINLOOSE]})\\s*$`);St("STAR","(<|>)?=?\\s*\\*");St("GTE0","^\\s*>=\\s*0.0.0\\s*$");St("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var gd=w((s$e,qH)=>{var hCe=["includePrerelease","loose","rtl"],pCe=r=>r?typeof r!="object"?{loose:!0}:hCe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};qH.exports=pCe});var FI=w((o$e,zH)=>{var JH=/^[0-9]+$/,WH=(r,e)=>{let t=JH.test(r),i=JH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:rWH(e,r);zH.exports={compareIdentifiers:WH,rcompareIdentifiers:dCe}});var Ti=w((a$e,_H)=>{var NI=ud(),{MAX_LENGTH:VH,MAX_SAFE_INTEGER:LI}=cd(),{re:XH,t:ZH}=ac(),CCe=gd(),{compareIdentifiers:fd}=FI(),Hn=class{constructor(e,t){if(t=CCe(t),e instanceof Hn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>VH)throw new TypeError(`version is longer than ${VH} characters`);NI("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?XH[ZH.LOOSE]:XH[ZH.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>LI||this.major<0)throw new TypeError("Invalid major version");if(this.minor>LI||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>LI||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};_H.exports=Hn});var Ac=w((A$e,rG)=>{var{MAX_LENGTH:mCe}=cd(),{re:$H,t:eG}=ac(),tG=Ti(),ECe=gd(),ICe=(r,e)=>{if(e=ECe(e),r instanceof tG)return r;if(typeof r!="string"||r.length>mCe||!(e.loose?$H[eG.LOOSE]:$H[eG.FULL]).test(r))return null;try{return new tG(r,e)}catch{return null}};rG.exports=ICe});var nG=w((l$e,iG)=>{var yCe=Ac(),wCe=(r,e)=>{let t=yCe(r,e);return t?t.version:null};iG.exports=wCe});var oG=w((c$e,sG)=>{var BCe=Ac(),QCe=(r,e)=>{let t=BCe(r.trim().replace(/^[=v]+/,""),e);return t?t.version:null};sG.exports=QCe});var AG=w((u$e,aG)=>{var bCe=Ti(),SCe=(r,e,t,i)=>{typeof t=="string"&&(i=t,t=void 0);try{return new bCe(r,t).inc(e,i).version}catch{return null}};aG.exports=SCe});var As=w((g$e,cG)=>{var lG=Ti(),vCe=(r,e,t)=>new lG(r,t).compare(new lG(e,t));cG.exports=vCe});var TI=w((f$e,uG)=>{var xCe=As(),PCe=(r,e,t)=>xCe(r,e,t)===0;uG.exports=PCe});var hG=w((h$e,fG)=>{var gG=Ac(),DCe=TI(),kCe=(r,e)=>{if(DCe(r,e))return null;{let t=gG(r),i=gG(e),n=t.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in t)if((a==="major"||a==="minor"||a==="patch")&&t[a]!==i[a])return s+a;return o}};fG.exports=kCe});var dG=w((p$e,pG)=>{var RCe=Ti(),FCe=(r,e)=>new RCe(r,e).major;pG.exports=FCe});var mG=w((d$e,CG)=>{var NCe=Ti(),LCe=(r,e)=>new NCe(r,e).minor;CG.exports=LCe});var IG=w((C$e,EG)=>{var TCe=Ti(),OCe=(r,e)=>new TCe(r,e).patch;EG.exports=OCe});var wG=w((m$e,yG)=>{var MCe=Ac(),KCe=(r,e)=>{let t=MCe(r,e);return t&&t.prerelease.length?t.prerelease:null};yG.exports=KCe});var QG=w((E$e,BG)=>{var UCe=As(),HCe=(r,e,t)=>UCe(e,r,t);BG.exports=HCe});var SG=w((I$e,bG)=>{var GCe=As(),YCe=(r,e)=>GCe(r,e,!0);bG.exports=YCe});var OI=w((y$e,xG)=>{var vG=Ti(),jCe=(r,e,t)=>{let i=new vG(r,t),n=new vG(e,t);return i.compare(n)||i.compareBuild(n)};xG.exports=jCe});var DG=w((w$e,PG)=>{var qCe=OI(),JCe=(r,e)=>r.sort((t,i)=>qCe(t,i,e));PG.exports=JCe});var RG=w((B$e,kG)=>{var WCe=OI(),zCe=(r,e)=>r.sort((t,i)=>WCe(i,t,e));kG.exports=zCe});var hd=w((Q$e,FG)=>{var VCe=As(),XCe=(r,e,t)=>VCe(r,e,t)>0;FG.exports=XCe});var MI=w((b$e,NG)=>{var ZCe=As(),_Ce=(r,e,t)=>ZCe(r,e,t)<0;NG.exports=_Ce});var Cv=w((S$e,LG)=>{var $Ce=As(),eme=(r,e,t)=>$Ce(r,e,t)!==0;LG.exports=eme});var KI=w((v$e,TG)=>{var tme=As(),rme=(r,e,t)=>tme(r,e,t)>=0;TG.exports=rme});var UI=w((x$e,OG)=>{var ime=As(),nme=(r,e,t)=>ime(r,e,t)<=0;OG.exports=nme});var mv=w((P$e,MG)=>{var sme=TI(),ome=Cv(),ame=hd(),Ame=KI(),lme=MI(),cme=UI(),ume=(r,e,t,i)=>{switch(e){case"===":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r===t;case"!==":return typeof r=="object"&&(r=r.version),typeof t=="object"&&(t=t.version),r!==t;case"":case"=":case"==":return sme(r,t,i);case"!=":return ome(r,t,i);case">":return ame(r,t,i);case">=":return Ame(r,t,i);case"<":return lme(r,t,i);case"<=":return cme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};MG.exports=ume});var UG=w((D$e,KG)=>{var gme=Ti(),fme=Ac(),{re:HI,t:GI}=ac(),hme=(r,e)=>{if(r instanceof gme)return r;if(typeof r=="number"&&(r=String(r)),typeof r!="string")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(HI[GI.COERCE]);else{let i;for(;(i=HI[GI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),HI[GI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;HI[GI.COERCERTL].lastIndex=-1}return t===null?null:fme(`${t[2]}.${t[3]||"0"}.${t[4]||"0"}`,e)};KG.exports=hme});var GG=w((k$e,HG)=>{"use strict";HG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var YI=w((R$e,YG)=>{"use strict";YG.exports=Ht;Ht.Node=lc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach=="function")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i{"use strict";var mme=YI(),cc=Symbol("max"),ba=Symbol("length"),jg=Symbol("lengthCalculator"),dd=Symbol("allowStale"),uc=Symbol("maxAge"),Qa=Symbol("dispose"),jG=Symbol("noDisposeOnSet"),di=Symbol("lruList"),Vs=Symbol("cache"),JG=Symbol("updateAgeOnGet"),Ev=()=>1,yv=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let t=this[cc]=e.max||1/0,i=e.length||Ev;if(this[jg]=typeof i!="function"?Ev:i,this[dd]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[uc]=e.maxAge||0,this[Qa]=e.dispose,this[jG]=e.noDisposeOnSet||!1,this[JG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[cc]=e||1/0,pd(this)}get max(){return this[cc]}set allowStale(e){this[dd]=!!e}get allowStale(){return this[dd]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[uc]=e,pd(this)}get maxAge(){return this[uc]}set lengthCalculator(e){typeof e!="function"&&(e=Ev),e!==this[jg]&&(this[jg]=e,this[ba]=0,this[di].forEach(t=>{t.length=this[jg](t.value,t.key),this[ba]+=t.length})),pd(this)}get lengthCalculator(){return this[jg]}get length(){return this[ba]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;qG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;qG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[Qa]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Qa](e.key,e.value)),this[Vs]=new Map,this[di]=new mme,this[ba]=0}dump(){return this[di].map(e=>jI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[uc],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[jg](t,e);if(this[Vs].has(e)){if(s>this[cc])return qg(this,this[Vs].get(e)),!1;let l=this[Vs].get(e).value;return this[Qa]&&(this[jG]||this[Qa](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[ba]+=s-l.length,l.length=s,this.get(e),pd(this),!0}let o=new wv(e,t,s,n,i);return o.length>this[cc]?(this[Qa]&&this[Qa](e,t),!1):(this[ba]+=o.length,this[di].unshift(o),this[Vs].set(e,this[di].head),pd(this),!0)}has(e){if(!this[Vs].has(e))return!1;let t=this[Vs].get(e).value;return!jI(this,t)}get(e){return Iv(this,e,!0)}peek(e){return Iv(this,e,!1)}pop(){let e=this[di].tail;return e?(qg(this,e),e.value):null}del(e){qg(this,this[Vs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Vs].forEach((e,t)=>Iv(this,t,!1))}},Iv=(r,e,t)=>{let i=r[Vs].get(e);if(i){let n=i.value;if(jI(r,n)){if(qg(r,i),!r[dd])return}else t&&(r[JG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},jI=(r,e)=>{if(!e||!e.maxAge&&!r[uc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[uc]&&t>r[uc]},pd=r=>{if(r[ba]>r[cc])for(let e=r[di].tail;r[ba]>r[cc]&&e!==null;){let t=e.prev;qg(r,e),e=t}},qg=(r,e)=>{if(e){let t=e.value;r[Qa]&&r[Qa](t.key,t.value),r[ba]-=t.length,r[Vs].delete(t.key),r[di].removeNode(e)}},wv=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},qG=(r,e,t,i)=>{let n=t.value;jI(r,n)&&(qg(r,t),r[dd]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};WG.exports=yv});var ls=w((N$e,_G)=>{var gc=class{constructor(e,t){if(t=Ime(t),e instanceof gc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new gc(e.raw,t);if(e instanceof Bv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!XG(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&bme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=VG.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[Qi.HYPHENRANGELOOSE]:Oi[Qi.HYPHENRANGE];e=e.replace(o,Lme(this.options.includePrerelease)),Gr("hyphen replace",e),e=e.replace(Oi[Qi.COMPARATORTRIM],wme),Gr("comparator trim",e,Oi[Qi.COMPARATORTRIM]),e=e.replace(Oi[Qi.TILDETRIM],Bme),e=e.replace(Oi[Qi.CARETTRIM],Qme),e=e.split(/\s+/).join(" ");let a=s?Oi[Qi.COMPARATORLOOSE]:Oi[Qi.COMPARATOR],l=e.split(" ").map(f=>Sme(f,this.options)).join(" ").split(/\s+/).map(f=>Nme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Bv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(XG(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return VG.set(i,g),g}intersects(e,t){if(!(e instanceof gc))throw new TypeError("a Range is required");return this.set.some(i=>ZG(i,t)&&e.set.some(n=>ZG(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new yme(e,this.options)}catch{return!1}for(let t=0;tr.value==="<0.0.0-0",bme=r=>r.value==="",ZG=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},Sme=(r,e)=>(Gr("comp",r,e),r=Pme(r,e),Gr("caret",r),r=vme(r,e),Gr("tildes",r),r=kme(r,e),Gr("xrange",r),r=Fme(r,e),Gr("stars",r),r),Zi=r=>!r||r.toLowerCase()==="x"||r==="*",vme=(r,e)=>r.trim().split(/\s+/).map(t=>xme(t,e)).join(" "),xme=(r,e)=>{let t=e.loose?Oi[Qi.TILDELOOSE]:Oi[Qi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Gr("tilde",r,i,n,s,o,a);let l;return Zi(n)?l="":Zi(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Zi(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Gr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Gr("tilde return",l),l})},Pme=(r,e)=>r.trim().split(/\s+/).map(t=>Dme(t,e)).join(" "),Dme=(r,e)=>{Gr("caret",r,e);let t=e.loose?Oi[Qi.CARETLOOSE]:Oi[Qi.CARET],i=e.includePrerelease?"-0":"";return r.replace(t,(n,s,o,a,l)=>{Gr("caret",r,n,s,o,a,l);let c;return Zi(s)?c="":Zi(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Zi(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Gr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Gr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Gr("caret return",c),c})},kme=(r,e)=>(Gr("replaceXRanges",r,e),r.split(/\s+/).map(t=>Rme(t,e)).join(" ")),Rme=(r,e)=>{r=r.trim();let t=e.loose?Oi[Qi.XRANGELOOSE]:Oi[Qi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Gr("xRange",r,i,n,s,o,a,l);let c=Zi(s),u=c||Zi(o),g=u||Zi(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Gr("xRange return",i),i})},Fme=(r,e)=>(Gr("replaceStars",r,e),r.trim().replace(Oi[Qi.STAR],"")),Nme=(r,e)=>(Gr("replaceGTE0",r,e),r.trim().replace(Oi[e.includePrerelease?Qi.GTE0PRE:Qi.GTE0],"")),Lme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>(Zi(i)?t="":Zi(n)?t=`>=${i}.0.0${r?"-0":""}`:Zi(s)?t=`>=${i}.${n}.0${r?"-0":""}`:o?t=`>=${t}`:t=`>=${t}${r?"-0":""}`,Zi(c)?l="":Zi(u)?l=`<${+c+1}.0.0-0`:Zi(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),Tme=(r,e,t)=>{for(let i=0;i0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Cd=w((L$e,iY)=>{var md=Symbol("SemVer ANY"),Jg=class{static get ANY(){return md}constructor(e,t){if(t=Ome(t),e instanceof Jg){if(e.loose===!!t.loose)return e;e=e.value}bv("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===md?this.value="":this.value=this.operator+this.semver.version,bv("comp",this)}parse(e){let t=this.options.loose?$G[eY.COMPARATORLOOSE]:$G[eY.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new tY(i[2],this.options.loose):this.semver=md}toString(){return this.value}test(e){if(bv("Comparator.test",e,this.options.loose),this.semver===md||e===md)return!0;if(typeof e=="string")try{e=new tY(e,this.options)}catch{return!1}return Qv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Jg))throw new TypeError("a Comparator is required");if((!t||typeof t!="object")&&(t={loose:!!t,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new rY(e.value,t).test(this.value);if(e.operator==="")return e.value===""?!0:new rY(this.value,t).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=Qv(this.semver,"<",e.semver,t)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=Qv(this.semver,">",e.semver,t)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};iY.exports=Jg;var Ome=gd(),{re:$G,t:eY}=ac(),Qv=mv(),bv=ud(),tY=Ti(),rY=ls()});var Ed=w((T$e,nY)=>{var Mme=ls(),Kme=(r,e,t)=>{try{e=new Mme(e,t)}catch{return!1}return e.test(r)};nY.exports=Kme});var oY=w((O$e,sY)=>{var Ume=ls(),Hme=(r,e)=>new Ume(r,e).set.map(t=>t.map(i=>i.value).join(" ").trim().split(" "));sY.exports=Hme});var AY=w((M$e,aY)=>{var Gme=Ti(),Yme=ls(),jme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Yme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Gme(i,t))}),i};aY.exports=jme});var cY=w((K$e,lY)=>{var qme=Ti(),Jme=ls(),Wme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Jme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new qme(i,t))}),i};lY.exports=Wme});var fY=w((U$e,gY)=>{var Sv=Ti(),zme=ls(),uY=hd(),Vme=(r,e)=>{r=new zme(r,e);let t=new Sv("0.0.0");if(r.test(t)||(t=new Sv("0.0.0-0"),r.test(t)))return t;t=null;for(let i=0;i{let a=new Sv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||uY(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||uY(t,s))&&(t=s)}return t&&r.test(t)?t:null};gY.exports=Vme});var pY=w((H$e,hY)=>{var Xme=ls(),Zme=(r,e)=>{try{return new Xme(r,e).range||"*"}catch{return null}};hY.exports=Zme});var qI=w((G$e,EY)=>{var _me=Ti(),mY=Cd(),{ANY:$me}=mY,eEe=ls(),tEe=Ed(),dY=hd(),CY=MI(),rEe=UI(),iEe=KI(),nEe=(r,e,t,i)=>{r=new _me(r,i),e=new eEe(e,i);let n,s,o,a,l;switch(t){case">":n=dY,s=rEe,o=CY,a=">",l=">=";break;case"<":n=CY,s=iEe,o=dY,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(tEe(r,e,i))return!1;for(let c=0;c{h.semver===$me&&(h=new mY(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};EY.exports=nEe});var yY=w((Y$e,IY)=>{var sEe=qI(),oEe=(r,e,t)=>sEe(r,e,">",t);IY.exports=oEe});var BY=w((j$e,wY)=>{var aEe=qI(),AEe=(r,e,t)=>aEe(r,e,"<",t);wY.exports=AEe});var SY=w((q$e,bY)=>{var QY=ls(),lEe=(r,e,t)=>(r=new QY(r,t),e=new QY(e,t),r.intersects(e));bY.exports=lEe});var xY=w((J$e,vY)=>{var cEe=Ed(),uEe=As();vY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>uEe(u,g,t));for(let u of o)cEe(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var PY=ls(),JI=Cd(),{ANY:vv}=JI,Id=Ed(),xv=As(),gEe=(r,e,t={})=>{if(r===e)return!0;r=new PY(r,t),e=new PY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=fEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},fEe=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===vv){if(e.length===1&&e[0].semver===vv)return!0;t.includePrerelease?r=[new JI(">=0.0.0-0")]:r=[new JI(">=0.0.0")]}if(e.length===1&&e[0].semver===vv){if(t.includePrerelease)return!0;e=[new JI(">=0.0.0")]}let i=new Set,n,s;for(let h of r)h.operator===">"||h.operator===">="?n=DY(n,h,t):h.operator==="<"||h.operator==="<="?s=kY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=xv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Id(h,String(n),t)||s&&!Id(h,String(s),t))return null;for(let p of e)if(!Id(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=DY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===">="&&!Id(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=kY(s,h,t),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Id(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},DY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===">"&&r.operator===">="?e:r},kY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i<0?r:i>0||e.operator==="<"&&r.operator==="<="?e:r};RY.exports=gEe});var Xr=w((z$e,NY)=>{var Pv=ac();NY.exports={re:Pv.re,src:Pv.src,tokens:Pv.t,SEMVER_SPEC_VERSION:cd().SEMVER_SPEC_VERSION,SemVer:Ti(),compareIdentifiers:FI().compareIdentifiers,rcompareIdentifiers:FI().rcompareIdentifiers,parse:Ac(),valid:nG(),clean:oG(),inc:AG(),diff:hG(),major:dG(),minor:mG(),patch:IG(),prerelease:wG(),compare:As(),rcompare:QG(),compareLoose:SG(),compareBuild:OI(),sort:DG(),rsort:RG(),gt:hd(),lt:MI(),eq:TI(),neq:Cv(),gte:KI(),lte:UI(),cmp:mv(),coerce:UG(),Comparator:Cd(),Range:ls(),satisfies:Ed(),toComparators:oY(),maxSatisfying:AY(),minSatisfying:cY(),minVersion:fY(),validRange:pY(),outside:qI(),gtr:yY(),ltr:BY(),intersects:SY(),simplifyRange:xY(),subset:FY()}});var Dv=w(WI=>{"use strict";Object.defineProperty(WI,"__esModule",{value:!0});WI.VERSION=void 0;WI.VERSION="9.1.0"});var Gt=w((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i{(function(r,e){typeof define=="function"&&define.amd?define([],e):typeof zI=="object"&&zI.exports?zI.exports=e():r.regexpToAst=e()})(typeof self<"u"?self:LY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var C=this.disjunction();this.consumeChar("/");for(var y={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(y,"global");break;case"i":o(y,"ignoreCase");break;case"m":o(y,"multiLine");break;case"u":o(y,"unicode");break;case"y":o(y,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var C;switch(this.popChar()){case"=":C="Lookahead";break;case"!":C="NegativeLookahead";break}a(C);var y=this.disjunction();return this.consumeChar(")"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case"*":C={atLeast:0,atMost:1/0};break;case"+":C={atLeast:1,atMost:1/0};break;case"?":C={atLeast:0,atMost:1};break;case"{":var B=this.integerIncludingZero();switch(this.popChar()){case"}":C={atLeast:B,atMost:B};break;case",":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar("}");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)==="?"?(this.consumeChar("?"),C.greedy=!1):C.greedy=!0,C.type="Quantifier",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},r.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,C=!0;break;case"s":p=f;break;case"S":p=f,C=!0;break;case"w":p=g;break;case"W":p=g,C=!0;break}return a(p),{type:"Set",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` +`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var C=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type==="Character";if(B&&this.isRangeDash()){this.consumeChar("-");var v=this.classAtom(),D=v.type==="Character";if(D){if(v.value=this.input.length)throw Error("Unexpected end of input");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw"duplicate flag "+C;p[C]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var ZI=w(Wg=>{"use strict";Object.defineProperty(Wg,"__esModule",{value:!0});Wg.clearRegExpParserCache=Wg.getRegExpAst=void 0;var hEe=VI(),XI={},pEe=new hEe.RegExpParser;function dEe(r){var e=r.toString();if(XI.hasOwnProperty(e))return XI[e];var t=pEe.pattern(e);return XI[e]=t,t}Wg.getRegExpAst=dEe;function CEe(){XI={}}Wg.clearRegExpParserCache=CEe});var UY=w(pn=>{"use strict";var mEe=pn&&pn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(pn,"__esModule",{value:!0});pn.canMatchCharCode=pn.firstCharOptimizedIndices=pn.getOptimizedStartCodesIndices=pn.failedOptimizationPrefixMsg=void 0;var OY=VI(),cs=Gt(),MY=ZI(),Sa=Rv(),KY="Complement Sets are not supported for first char optimization";pn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function EEe(r,e){e===void 0&&(e=!1);try{var t=(0,MY.getRegExpAst)(r),i=$I(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===KY)e&&(0,cs.PRINT_WARNING)(""+pn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+r.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,cs.PRINT_ERROR)(pn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+r.toString()+` > +`)+(" Using the regexp-to-ast library version: "+OY.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}pn.getOptimizedStartCodesIndices=EEe;function $I(r,e,t){switch(r.type){case"Disjunction":for(var i=0;i=Sa.minOptimizationVal)for(var f=u.from>=Sa.minOptimizationVal?u.from:Sa.minOptimizationVal,h=u.to,p=(0,Sa.charCodeToOptimizedIndex)(f),C=(0,Sa.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case"Group":$I(o.value,e,t);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&kv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,cs.values)(e)}pn.firstCharOptimizedIndices=$I;function _I(r,e,t){var i=(0,Sa.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&IEe(r,e)}function IEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,Sa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,Sa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function TY(r,e){return(0,cs.find)(r.value,function(t){if(typeof t=="number")return(0,cs.contains)(e,t);var i=t;return(0,cs.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function kv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,cs.isArray)(r.value)?(0,cs.every)(r.value,kv):kv(r.value):!1}var yEe=function(r){mEe(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case"Lookahead":this.visitLookahead(t);return;case"NegativeLookahead":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,cs.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?TY(t,this.targetCharCodes)===void 0&&(this.found=!0):TY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(OY.BaseRegExpVisitor);function wEe(r,e){if(e instanceof RegExp){var t=(0,MY.getRegExpAst)(e),i=new yEe(r);return i.visit(t),i.found}else return(0,cs.find)(e,function(n){return(0,cs.contains)(r,n.charCodeAt(0))})!==void 0}pn.canMatchCharCode=wEe});var Rv=w(Ve=>{"use strict";var HY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,"__esModule",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var GY=VI(),ir=yd(),xe=Gt(),zg=UY(),YY=ZI(),Do="PATTERN";Ve.DEFAULT_MODE="defaultMode";Ve.MODES="modes";Ve.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function BEe(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=BEe;function QEe(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=QEe;function bEe(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(v,D){return D()}});var t=e.tracer;t("initCharCodeToOptimizedIndexMap",function(){LEe()});var i;t("Reject Lexer.NA",function(){i=(0,xe.reject)(r,function(v){return v[Do]===ir.Lexer.NA})});var n=!1,s;t("Transform Patterns",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[Do];if((0,xe.isRegExp)(D)){var L=D.source;return L.length===1&&L!=="^"&&L!=="$"&&L!=="."&&!D.ignoreCase?L:L.length===2&&L[0]==="\\"&&!(0,xe.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],L[1])?L[1]:e.useSticky?Lv(D):Nv(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,"exec"))return n=!0,D;if(typeof D=="string"){if(D.length===1)return D;var H=D.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),j=new RegExp(H);return e.useSticky?Lv(j):Nv(j)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;t("misc mapping",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error("non exhaustive match")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var L=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return L}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,"POP_MODE")})});var g;t("Line Terminator Handling",function(){var v=ij(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,"LINE_BREAKS"))return D.LINE_BREAKS;if(tj(D,v)===!1)return(0,zg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t("Misc Mapping #2",function(){f=(0,xe.map)(i,Ov),h=(0,xe.map)(s,ej),p=(0,xe.reduce)(i,function(v,D){var L=D.GROUP;return(0,xe.isString)(L)&&L!==ir.Lexer.SKIPPED&&(v[L]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t("First Char Optimization",function(){B=(0,xe.reduce)(i,function(v,D,L){if(typeof D.PATTERN=="string"){var H=D.PATTERN.charCodeAt(0),j=Tv(H);Fv(v,j,C[L])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var _=typeof W=="string"?W.charCodeAt(0):W,A=Tv(_);$!==A&&($=A,Fv(v,A,C[L]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+zg.failedOptimizationPrefixMsg+(" Unable to analyze < "+D.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,zg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){Fv(v,W,C[L])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(""+zg.failedOptimizationPrefixMsg+(" TokenType: <"+D.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t("ArrayPacking",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=bEe;function SEe(r,e){var t=[],i=jY(r);t=t.concat(i.errors);var n=qY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(vEe(s)),t=t.concat(ZY(s)),t=t.concat(_Y(s,e)),t=t.concat($Y(s)),t}Ve.validatePatterns=SEe;function vEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[Do])});return e=e.concat(JY(t)),e=e.concat(zY(t)),e=e.concat(VY(t)),e=e.concat(XY(t)),e=e.concat(WY(t)),e}function jY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,Do)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=jY;function qY(r){var e=(0,xe.filter)(r,function(n){var s=n[Do];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,"exec")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=qY;var xEe=/[^\\][\$]/;function JY(r){var e=function(n){HY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(GY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,YY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return xEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=JY;function WY(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n.test("")}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=WY;var PEe=/[^\\[][\^]|^\^/;function zY(r){var e=function(n){HY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(GY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,YY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return PEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=zY;function VY(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=VY;function XY(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=XY;function ZY(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=ZY;function _Y(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=_Y;function $Y(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&kEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=$Y;function DEe(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,"exec"))return e.exec(r,0,[],{});if(typeof e=="string")return e===r;throw Error("non exhaustive match")}}function kEe(r){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Nv(r){var e=r.ignoreCase?"i":"";return new RegExp("^(?:"+r.source+")",e)}Ve.addStartOfInput=Nv;function Lv(r){var e=r.ignoreCase?"iy":"y";return new RegExp(""+r.source,e)}Ve.addStickyFlag=Lv;function REe(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.DEFAULT_MODE+`> property in its definition +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+Ve.MODES+`> property in its definition +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+Ve.DEFAULT_MODE+": <"+r.defaultMode+`>which does not exist +`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=REe;function FEe(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[Do]===ir.Lexer.NA}),a=ij(t);return e&&(0,xe.forEach)(o,function(l){var c=tj(l,a);if(c!==!1){var u=rj(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,zg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=FEe;function NEe(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}Ve.cloneEmptyGroups=NEe;function Ov(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,"exec"))return!0;if((0,xe.isString)(e))return!1;throw Error("non exhaustive match")}Ve.isCustomPattern=Ov;function ej(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=ej;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+r.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}Ve.buildLineBreakIssueMessage=rj;function ij(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var ey=[];function Tv(r){return r255?255+~~(r/255):r}}});var Vg=w(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var Zr=Gt();function TEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=TEe;function OEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=OEe;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function MEe(r){var e=nj(r);sj(e),aj(e),oj(e),(0,Zr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=MEe;function nj(r){for(var e=(0,Zr.cloneArr)(r),t=r,i=!0;i;){t=(0,Zr.compact)((0,Zr.flatten)((0,Zr.map)(t,function(s){return s.CATEGORIES})));var n=(0,Zr.difference)(t,e);e=e.concat(n),(0,Zr.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=nj;function sj(r){(0,Zr.forEach)(r,function(e){Aj(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Mv(e)&&!(0,Zr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Mv(e)||(e.CATEGORIES=[]),lj(e)||(e.categoryMatches=[]),cj(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=sj;function oj(r){(0,Zr.forEach)(r,function(e){e.categoryMatches=[],(0,Zr.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=oj;function aj(r){(0,Zr.forEach)(r,function(e){Kv([],e)})}Nt.assignCategoriesMapProp=aj;function Kv(r,e){(0,Zr.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,Zr.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,Zr.contains)(i,t)||Kv(i,t)})}Nt.singleAssignCategoriesToksMap=Kv;function Aj(r){return(0,Zr.has)(r,"tokenTypeIdx")}Nt.hasShortKeyProperty=Aj;function Mv(r){return(0,Zr.has)(r,"CATEGORIES")}Nt.hasCategoriesProperty=Mv;function lj(r){return(0,Zr.has)(r,"categoryMatches")}Nt.hasExtendingTokensTypesProperty=lj;function cj(r){return(0,Zr.has)(r,"categoryMatchesMap")}Nt.hasExtendingTokensTypesMapProperty=cj;function KEe(r){return(0,Zr.has)(r,"tokenTypeIdx")}Nt.isTokenType=KEe});var Uv=w(ty=>{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.defaultLexerErrorProvider=void 0;ty.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return"Unable to pop Lexer Mode after encountering Token ->"+r.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return"unexpected character: ->"+r.charAt(e)+"<- at offset: "+e+","+(" skipped "+t+" characters.")}}});var yd=w(fc=>{"use strict";Object.defineProperty(fc,"__esModule",{value:!0});fc.Lexer=fc.LexerDefinitionErrorType=void 0;var Xs=Rv(),nr=Gt(),UEe=Vg(),HEe=Uv(),GEe=ZI(),YEe;(function(r){r[r.MISSING_PATTERN=0]="MISSING_PATTERN",r[r.INVALID_PATTERN=1]="INVALID_PATTERN",r[r.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",r[r.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",r[r.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",r[r.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",r[r.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",r[r.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",r[r.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",r[r.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",r[r.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",r[r.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",r[r.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(YEe=fc.LexerDefinitionErrorType||(fc.LexerDefinitionErrorType={}));var wd={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:HEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(wd);var jEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=wd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(wd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===wd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Xs.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===wd.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[Xs.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[Xs.DEFAULT_MODE]=Xs.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Xs.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Xs.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Xs.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,UEe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Xs.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Xs.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,GEe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,L=e,H=L.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),_=[],A=this.trackStartLines?1:void 0,ae=this.trackStartLines?1:void 0,ge=(0,Xs.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],he=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ii=(0,Xs.charCodeToOptimizedIndex)(pr),es=he[Ii];return es===void 0?Fe:es}var we=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ii=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);_.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ii})}else{ke.pop();var es=(0,nr.last)(ke);ue=i.patternIdxToConfig[es],he=i.charCodeToPatternIdxToConfig[es],F=ue.length;var ua=i.canModeBeOptimized[es]&&i.config.safeMode===!1;he&&ua?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),he=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ii=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;he&&Ii?Ne=le:Ne=oe}fe.call(this,t);for(var Ae;jc.length){c=a,u=g,Ae=_e;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,Ae.tokenType,A,ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,ae=this.computeNewColumn(ae,f),re===!0&&Ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,ae,f))}this.handleModes(Ae,we,fe,C)}else{for(var gi=j,hr=A,fi=ae,ni=!1;!ni&&j <"+e+">");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",r.NA=/NOT_APPLICABLE/,r}();fc.Lexer=jEe});var NA=w(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.tokenMatcher=bi.createTokenInstance=bi.EOF=bi.createToken=bi.hasTokenLabel=bi.tokenName=bi.tokenLabel=void 0;var Zs=Gt(),qEe=yd(),Hv=Vg();function JEe(r){return Ej(r)?r.LABEL:r.name}bi.tokenLabel=JEe;function WEe(r){return r.name}bi.tokenName=WEe;function Ej(r){return(0,Zs.isString)(r.LABEL)&&r.LABEL!==""}bi.hasTokenLabel=Ej;var zEe="parent",uj="categories",gj="label",fj="group",hj="push_mode",pj="pop_mode",dj="longer_alt",Cj="line_breaks",mj="start_chars_hint";function Ij(r){return VEe(r)}bi.createToken=Ij;function VEe(r){var e=r.pattern,t={};if(t.name=r.name,(0,Zs.isUndefined)(e)||(t.PATTERN=e),(0,Zs.has)(r,zEe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Zs.has)(r,uj)&&(t.CATEGORIES=r[uj]),(0,Hv.augmentTokenTypes)([t]),(0,Zs.has)(r,gj)&&(t.LABEL=r[gj]),(0,Zs.has)(r,fj)&&(t.GROUP=r[fj]),(0,Zs.has)(r,pj)&&(t.POP_MODE=r[pj]),(0,Zs.has)(r,hj)&&(t.PUSH_MODE=r[hj]),(0,Zs.has)(r,dj)&&(t.LONGER_ALT=r[dj]),(0,Zs.has)(r,Cj)&&(t.LINE_BREAKS=r[Cj]),(0,Zs.has)(r,mj)&&(t.START_CHARS_HINT=r[mj]),t}bi.EOF=Ij({name:"EOF",pattern:qEe.Lexer.NA});(0,Hv.augmentTokenTypes)([bi.EOF]);function XEe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}bi.createTokenInstance=XEe;function ZEe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}bi.tokenMatcher=ZEe});var dn=w(zt=>{"use strict";var va=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,"__esModule",{value:!0});zt.serializeProduction=zt.serializeGrammar=zt.Terminal=zt.Alternation=zt.RepetitionWithSeparator=zt.Repetition=zt.RepetitionMandatoryWithSeparator=zt.RepetitionMandatory=zt.Option=zt.Alternative=zt.Rule=zt.NonTerminal=zt.AbstractProduction=void 0;var Ar=Gt(),_Ee=NA(),ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();zt.AbstractProduction=ko;var yj=function(r){va(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(ko);zt.NonTerminal=yj;var wj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText="",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Rule=wj;var Bj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Alternative=Bj;var Qj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Option=Qj;var bj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatory=bj;var Sj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatoryWithSeparator=Sj;var vj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Repetition=vj;var xj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionWithSeparator=xj;var Pj=function(r){va(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(ko);zt.Alternation=Pj;var ry=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();zt.Terminal=ry;function $Ee(r){return(0,Ar.map)(r,Bd)}zt.serializeGrammar=$Ee;function Bd(r){function e(s){return(0,Ar.map)(s,Bd)}if(r instanceof yj){var t={type:"NonTerminal",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof Bj)return{type:"Alternative",definition:e(r.definition)};if(r instanceof Qj)return{type:"Option",idx:r.idx,definition:e(r.definition)};if(r instanceof bj)return{type:"RepetitionMandatory",idx:r.idx,definition:e(r.definition)};if(r instanceof Sj)return{type:"RepetitionMandatoryWithSeparator",idx:r.idx,separator:Bd(new ry({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof xj)return{type:"RepetitionWithSeparator",idx:r.idx,separator:Bd(new ry({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof vj)return{type:"Repetition",idx:r.idx,definition:e(r.definition)};if(r instanceof Pj)return{type:"Alternation",idx:r.idx,definition:e(r.definition)};if(r instanceof ry){var i={type:"Terminal",name:r.terminalType.name,label:(0,_Ee.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof wj)return{type:"Rule",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error("non exhaustive match")}}}zt.serializeProduction=Bd});var ny=w(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.RestWalker=void 0;var Gv=Gt(),Cn=dn(),eIe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Gv.forEach)(e.definition,function(n,s){var o=(0,Gv.drop)(e.definition,s+1);if(n instanceof Cn.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof Cn.Terminal)i.walkTerminal(n,o,t);else if(n instanceof Cn.Alternative)i.walkFlat(n,o,t);else if(n instanceof Cn.Option)i.walkOption(n,o,t);else if(n instanceof Cn.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof Cn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof Cn.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof Cn.Repetition)i.walkMany(n,o,t);else if(n instanceof Cn.Alternation)i.walkOr(n,o,t);else throw Error("non exhaustive match")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Dj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new Cn.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Dj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Gv.forEach)(e.definition,function(o){var a=new Cn.Alternative({definition:[o]});n.walk(a,s)})},r}();iy.RestWalker=eIe;function Dj(r,e,t){var i=[new Cn.Option({definition:[new Cn.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var Xg=w(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.GAstVisitor=void 0;var Ro=dn(),tIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error("non exhaustive match")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();sy.GAstVisitor=tIe});var bd=w(Mi=>{"use strict";var rIe=Mi&&Mi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Mi,"__esModule",{value:!0});Mi.collectMethods=Mi.DslMethodsCollectorVisitor=Mi.getProductionDslName=Mi.isBranchingProd=Mi.isOptionalProd=Mi.isSequenceProd=void 0;var Qd=Gt(),Qr=dn(),iIe=Xg();function nIe(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Mi.isSequenceProd=nIe;function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,Qd.some)(r.definition,function(i){return Yv(i,e)}):r instanceof Qr.NonTerminal&&(0,Qd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,Qd.every)(r.definition,function(i){return Yv(i,e)})):!1}Mi.isOptionalProd=Yv;function sIe(r){return r instanceof Qr.Alternation}Mi.isBranchingProd=sIe;function oIe(r){if(r instanceof Qr.NonTerminal)return"SUBRULE";if(r instanceof Qr.Option)return"OPTION";if(r instanceof Qr.Alternation)return"OR";if(r instanceof Qr.RepetitionMandatory)return"AT_LEAST_ONE";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(r instanceof Qr.RepetitionWithSeparator)return"MANY_SEP";if(r instanceof Qr.Repetition)return"MANY";if(r instanceof Qr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Mi.getProductionDslName=oIe;var kj=function(r){rIe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator="-",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+"Terminal";(0,Qd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+"Terminal";(0,Qd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(iIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=kj;var oy=new kj;function aIe(r){oy.reset(),r.accept(oy);var e=oy.dslMethods;return oy.reset(),e}Mi.collectMethods=aIe});var qv=w(Fo=>{"use strict";Object.defineProperty(Fo,"__esModule",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var ay=Gt(),Rj=dn(),jv=bd();function Ay(r){if(r instanceof Rj.NonTerminal)return Ay(r.referencedRule);if(r instanceof Rj.Terminal)return Lj(r);if((0,jv.isSequenceProd)(r))return Fj(r);if((0,jv.isBranchingProd)(r))return Nj(r);throw Error("non exhaustive match")}Fo.first=Ay;function Fj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,jv.isOptionalProd)(s),e=e.concat(Ay(s)),i=i+1,n=t.length>i;return(0,ay.uniq)(e)}Fo.firstForSequence=Fj;function Nj(r){var e=(0,ay.map)(r.definition,function(t){return Ay(t)});return(0,ay.uniq)((0,ay.flatten)(e))}Fo.firstForBranching=Nj;function Lj(r){return[r.terminalType]}Fo.firstForTerminal=Lj});var Jv=w(ly=>{"use strict";Object.defineProperty(ly,"__esModule",{value:!0});ly.IN=void 0;ly.IN="_~IN~_"});var Uj=w(us=>{"use strict";var AIe=us&&us.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(us,"__esModule",{value:!0});us.buildInProdFollowPrefix=us.buildBetweenProdsFollowPrefix=us.computeAllProdsFollows=us.ResyncFollowsWalker=void 0;var lIe=ny(),cIe=qv(),Tj=Gt(),Oj=Jv(),uIe=dn(),Mj=function(r){AIe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=Kj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new uIe.Alternative({definition:o}),l=(0,cIe.first)(a);this.follows[s]=l},e}(lIe.RestWalker);us.ResyncFollowsWalker=Mj;function gIe(r){var e={};return(0,Tj.forEach)(r,function(t){var i=new Mj(t).startWalking();(0,Tj.assign)(e,i)}),e}us.computeAllProdsFollows=gIe;function Kj(r,e){return r.name+e+Oj.IN}us.buildBetweenProdsFollowPrefix=Kj;function fIe(r){var e=r.terminalType.name;return e+r.idx+Oj.IN}us.buildInProdFollowPrefix=fIe});var Sd=w(xa=>{"use strict";Object.defineProperty(xa,"__esModule",{value:!0});xa.defaultGrammarValidatorErrorProvider=xa.defaultGrammarResolverErrorProvider=xa.defaultParserErrorProvider=void 0;var Zg=NA(),hIe=Gt(),_s=Gt(),Wv=dn(),Hj=bd();xa.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,Zg.hasTokenLabel)(e),o=s?"--> "+(0,Zg.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+t.image+"' <--";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o="Expecting: ",a=(0,_s.first)(t).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,_s.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,_s.map)(c,function(h){return"["+(0,_s.map)(h,function(p){return(0,Zg.tokenLabel)(p)}).join(", ")+"]"}),g=(0,_s.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: +`+g.join(` +`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s="Expecting: ",o=(0,_s.first)(t).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,_s.map)(e,function(u){return"["+(0,_s.map)(u,function(g){return(0,Zg.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(xa.defaultParserErrorProvider);xa.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+r.name+"<-";return t}};xa.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u instanceof Wv.NonTerminal?u.nonTerminalName:""}var i=r.name,n=(0,_s.first)(e),s=n.idx,o=(0,Hj.getProductionDslName)(n),a=t(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+r.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,Zg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous alternatives: <"+r.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,_s.map)(r.prefixPath,function(n){return(0,Zg.tokenLabel)(n)}).join(", "),t=r.alternation.idx===0?"":r.alternation.idx,i="Ambiguous Alternatives Detected: <"+r.ambiguityIndices.join(" ,")+"> in "+(" inside <"+r.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,Hj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t="The repetition <"+e+"> within Rule <"+r.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return"deprecated"},buildEmptyAlternationError:function(r){var e="Ambiguous empty alternative: <"+(r.emptyChoiceIdx+1)+">"+(" in inside <"+r.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+r.topLevelRule.name+`> Rule. + has `+(r.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=hIe.map(r.leftRecursionPath,function(s){return s.name}),i=e+" --> "+t.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return"deprecated"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Wv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+r.grammarName+"<-";return t}}});var jj=w(LA=>{"use strict";var pIe=LA&&LA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(LA,"__esModule",{value:!0});LA.GastRefResolverVisitor=LA.resolveGrammar=void 0;var dIe=Gn(),Gj=Gt(),CIe=Xg();function mIe(r,e){var t=new Yj(r,e);return t.resolveRefs(),t.errors}LA.resolveGrammar=mIe;var Yj=function(r){pIe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,Gj.forEach)((0,Gj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:dIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(CIe.GAstVisitor);LA.GastRefResolverVisitor=Yj});var xd=w(Nr=>{"use strict";var hc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,"__esModule",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var qj=ny(),Kt=Gt(),EIe=qv(),kt=dn(),Jj=function(r){hc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(qj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Jj;var IIe=function(r){hc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,EIe.first)(o),this.found=!0}},e}(Jj);Nr.NextAfterTokenWalker=IIe;var vd=function(r){hc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(qj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=vd;var yIe=function(r){hc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(vd);Nr.NextTerminalAfterManyWalker=yIe;var wIe=function(r){hc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(vd);Nr.NextTerminalAfterManySepWalker=wIe;var BIe=function(r){hc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(vd);Nr.NextTerminalAfterAtLeastOneWalker=BIe;var QIe=function(r){hc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(vd);Nr.NextTerminalAfterAtLeastOneSepWalker=QIe;function Wj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Wj(s(c),e,t);return i.concat(u)}for(;t.length=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(SIe(B,p,C,y));else throw Error("non exhaustive match")}}return u}Nr.nextPossibleTokensAfter=bIe;function SIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var Pd=w(Zt=>{"use strict";var Xj=Zt&&Zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Zt,"__esModule",{value:!0});Zt.areTokenCategoriesNotUsed=Zt.isStrictPrefixOfPath=Zt.containsPath=Zt.getLookaheadPathsForOptionalProd=Zt.getLookaheadPathsForOr=Zt.lookAheadSequenceFromAlternatives=Zt.buildSingleAlternativeLookaheadFunction=Zt.buildAlternativesLookAheadFunc=Zt.buildLookaheadFuncForOptionalProd=Zt.buildLookaheadFuncForOr=Zt.getProdType=Zt.PROD_TYPE=void 0;var sr=Gt(),zj=xd(),vIe=ny(),cy=Vg(),TA=dn(),xIe=Xg(),oi;(function(r){r[r.OPTION=0]="OPTION",r[r.REPETITION=1]="REPETITION",r[r.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",r[r.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",r[r.ALTERNATION=5]="ALTERNATION"})(oi=Zt.PROD_TYPE||(Zt.PROD_TYPE={}));function PIe(r){if(r instanceof TA.Option)return oi.OPTION;if(r instanceof TA.Repetition)return oi.REPETITION;if(r instanceof TA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof TA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof TA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof TA.Alternation)return oi.ALTERNATION;throw Error("non exhaustive match")}Zt.getProdType=PIe;function DIe(r,e,t,i,n,s){var o=_j(r,e,t),a=Xv(o)?cy.tokenStructuredMatcherNoCategories:cy.tokenStructuredMatcher;return s(o,i,a,n)}Zt.buildLookaheadFuncForOr=DIe;function kIe(r,e,t,i,n,s){var o=$j(r,e,n,t),a=Xv(o)?cy.tokenStructuredMatcherNoCategories:cy.tokenStructuredMatcher;return s(o[0],a,i)}Zt.buildLookaheadFuncForOptionalProd=kIe;function RIe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u{"use strict";var Zv=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,"__esModule",{value:!0});Vt.checkPrefixAlternativesAmbiguities=Vt.validateSomeNonEmptyLookaheadPath=Vt.validateTooManyAlts=Vt.RepetionCollector=Vt.validateAmbiguousAlternationAlternatives=Vt.validateEmptyOrAlternative=Vt.getFirstNoneTerminal=Vt.validateNoLeftRecursion=Vt.validateRuleIsOverridden=Vt.validateRuleDoesNotAlreadyExist=Vt.OccurrenceValidationCollector=Vt.identifyProductionForDuplicates=Vt.validateGrammar=void 0;var er=Gt(),br=Gt(),No=Gn(),_v=bd(),_g=Pd(),OIe=xd(),$s=dn(),$v=Xg();function MIe(r,e,t,i,n){var s=er.map(r,function(h){return KIe(h,i)}),o=er.map(r,function(h){return ex(h,h,i)}),a=[],l=[],c=[];(0,br.every)(o,br.isEmpty)&&(a=(0,br.map)(r,function(h){return sq(h,i)}),l=(0,br.map)(r,function(h){return oq(h,e,i)}),c=lq(r,e,i));var u=GIe(r,t,i),g=(0,br.map)(r,function(h){return Aq(h,i)}),f=(0,br.map)(r,function(h){return nq(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}Vt.validateGrammar=MIe;function KIe(r,e){var t=new iq;r.accept(t);var i=t.allProductions,n=er.groupBy(i,tq),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,_v.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=rq(l);return f&&(g.parameter=f),g});return o}function tq(r){return(0,_v.getProductionDslName)(r)+"_#_"+r.idx+"_#_"+rq(r)}Vt.identifyProductionForDuplicates=tq;function rq(r){return r instanceof $s.Terminal?r.terminalType.name:r instanceof $s.NonTerminal?r.nonTerminalName:""}var iq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.OccurrenceValidationCollector=iq;function nq(r,e,t,i){var n=[],s=(0,br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Vt.validateRuleDoesNotAlreadyExist=nq;function UIe(r,e,t){var i=[],n;return er.contains(e,r)||(n="Invalid rule override, rule: ->"+r+"<- cannot be overridden in the grammar: ->"+t+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Vt.validateRuleIsOverridden=UIe;function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Dd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),ex(r,u,t,g)});return n.concat(er.flatten(c))}Vt.validateNoLeftRecursion=ex;function Dd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof $s.NonTerminal)e.push(t.referencedRule);else if(t instanceof $s.Alternative||t instanceof $s.Option||t instanceof $s.RepetitionMandatory||t instanceof $s.RepetitionMandatoryWithSeparator||t instanceof $s.RepetitionWithSeparator||t instanceof $s.Repetition)e=e.concat(Dd(t.definition));else if(t instanceof $s.Alternation)e=er.flatten(er.map(t.definition,function(o){return Dd(o.definition)}));else if(!(t instanceof $s.Terminal))throw Error("non exhaustive match");var i=(0,_v.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(Dd(s))}else return e}Vt.getFirstNoneTerminal=Dd;var tx=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}($v.GAstVisitor);function sq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,OIe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}Vt.validateEmptyOrAlternative=sq;function oq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,_g.getLookaheadPathsForOr)(l,r,c,a),g=HIe(u,a,r,t),f=cq(u,a,r,t);return o.concat(g,f)},[]);return s}Vt.validateAmbiguousAlternationAlternatives=oq;var aq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.RepetionCollector=aq;function Aq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Vt.validateTooManyAlts=Aq;function lq(r,e,t){var i=[];return(0,br.forEach)(r,function(n){var s=new aq;n.accept(s);var o=s.allProductions;(0,br.forEach)(o,function(a){var l=(0,_g.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,_g.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,br.isEmpty)((0,br.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Vt.validateSomeNonEmptyLookaheadPath=lq;function HIe(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,br.forEach)(l,function(u){var g=[c];(0,br.forEach)(r,function(f,h){c!==h&&(0,_g.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,_g.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function cq(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(o,a,l){var c=(0,br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,br.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty($g,"__esModule",{value:!0});$g.validateGrammar=$g.resolveGrammar=void 0;var ix=Gt(),YIe=jj(),jIe=rx(),uq=Sd();function qIe(r){r=(0,ix.defaults)(r,{errMsgProvider:uq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,YIe.resolveGrammar)(e,r.errMsgProvider)}$g.resolveGrammar=qIe;function JIe(r){return r=(0,ix.defaults)(r,{errMsgProvider:uq.defaultGrammarValidatorErrorProvider}),(0,jIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}$g.validateGrammar=JIe});var ef=w(mn=>{"use strict";var kd=mn&&mn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(mn,"__esModule",{value:!0});mn.EarlyExitException=mn.NotAllInputParsedException=mn.NoViableAltException=mn.MismatchedTokenException=mn.isRecognitionException=void 0;var WIe=Gt(),fq="MismatchedTokenException",hq="NoViableAltException",pq="EarlyExitException",dq="NotAllInputParsedException",Cq=[fq,hq,pq,dq];Object.freeze(Cq);function zIe(r){return(0,WIe.contains)(Cq,r.name)}mn.isRecognitionException=zIe;var uy=function(r){kd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),VIe=function(r){kd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=fq,s}return e}(uy);mn.MismatchedTokenException=VIe;var XIe=function(r){kd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=hq,s}return e}(uy);mn.NoViableAltException=XIe;var ZIe=function(r){kd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=dq,n}return e}(uy);mn.NotAllInputParsedException=ZIe;var _Ie=function(r){kd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=pq,s}return e}(uy);mn.EarlyExitException=_Ie});var sx=w(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var gy=NA(),gs=Gt(),$Ie=ef(),eye=Jv(),tye=Gn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function nx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=nx;nx.prototype=Error.prototype;var rye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,gs.has)(e,"recoveryEnabled")?e.recoveryEnabled:tye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=mq)},r.prototype.getTokenToInsert=function(e){var t=(0,gy.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new $Ie.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,gs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new nx("sad sad panda")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,gs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,gs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,gs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,gs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,gs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,gs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,gs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[gy.EOF];var t=e.ruleName+e.idxInCallingRule+eye.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,gy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,gs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,gs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,gs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=rye;function mq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=gy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ki.attemptInRepetitionRecovery=mq});var fy=w(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<{"use strict";Object.defineProperty(hy,"__esModule",{value:!0});hy.LooksAhead=void 0;var Pa=Pd(),eo=Gt(),Eq=Gn(),Da=fy(),pc=bd(),nye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,eo.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Eq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,eo.has)(e,"maxLookahead")?e.maxLookahead:Eq.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,eo.isES2015MapSupported)()?new Map:[],(0,eo.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,eo.forEach)(e,function(i){t.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,pc.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,eo.forEach)(s,function(g){var f=g.idx===0?"":g.idx;t.TRACE_INIT(""+(0,pc.getProductionDslName)(g)+f,function(){var h=(0,Pa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Da.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Da.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,eo.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Da.MANY_IDX,Pa.PROD_TYPE.REPETITION,g.maxLookahead,(0,pc.getProductionDslName)(g))}),(0,eo.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Da.OPTION_IDX,Pa.PROD_TYPE.OPTION,g.maxLookahead,(0,pc.getProductionDslName)(g))}),(0,eo.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Da.AT_LEAST_ONE_IDX,Pa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,pc.getProductionDslName)(g))}),(0,eo.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Da.AT_LEAST_ONE_SEP_IDX,Pa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,pc.getProductionDslName)(g))}),(0,eo.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Da.MANY_SEP_IDX,Pa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,pc.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(t===0?"":t),function(){var l=(0,Pa.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Da.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,Pa.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,Pa.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Da.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();hy.LooksAhead=nye});var yq=w(Lo=>{"use strict";Object.defineProperty(Lo,"__esModule",{value:!0});Lo.addNoneTerminalToCst=Lo.addTerminalToCst=Lo.setNodeLocationFull=Lo.setNodeLocationOnlyOffset=void 0;function sye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset{"use strict";Object.defineProperty(OA,"__esModule",{value:!0});OA.defineNameProp=OA.functionName=OA.classNameFromInstance=void 0;var lye=Gt();function cye(r){return Bq(r.constructor)}OA.classNameFromInstance=cye;var wq="name";function Bq(r){var e=r.name;return e||"anonymous"}OA.functionName=Bq;function uye(r,e){var t=Object.getOwnPropertyDescriptor(r,wq);return(0,lye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,wq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}OA.defineNameProp=uye});var xq=w(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.validateRedundantMethods=Si.validateMissingCstMethods=Si.validateVisitor=Si.CstVisitorDefinitionError=Si.createBaseVisitorConstructorWithDefaults=Si.createBaseSemanticVisitorConstructor=Si.defaultVisit=void 0;var fs=Gt(),Rd=ox();function Qq(r,e){for(var t=(0,fs.keys)(r),i=t.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Si.createBaseSemanticVisitorConstructor=gye;function fye(r,e,t){var i=function(){};(0,Rd.defineNameProp)(i,r+"BaseSemanticsWithDefaults");var n=Object.create(t.prototype);return(0,fs.forEach)(e,function(s){n[s]=Qq}),i.prototype=n,i.prototype.constructor=i,i}Si.createBaseVisitorConstructorWithDefaults=fye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",r[r.MISSING_METHOD=1]="MISSING_METHOD"})(ax=Si.CstVisitorDefinitionError||(Si.CstVisitorDefinitionError={}));function bq(r,e){var t=Sq(r,e),i=vq(r,e);return t.concat(i)}Si.validateVisitor=bq;function Sq(r,e){var t=(0,fs.map)(e,function(i){if(!(0,fs.isFunction)(r[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,Rd.functionName)(r.constructor)+" CST Visitor.",type:ax.MISSING_METHOD,methodName:i}});return(0,fs.compact)(t)}Si.validateMissingCstMethods=Sq;var hye=["constructor","visit","validateVisitor"];function vq(r,e){var t=[];for(var i in r)(0,fs.isFunction)(r[i])&&!(0,fs.contains)(hye,i)&&!(0,fs.contains)(e,i)&&t.push({msg:"Redundant visitor method: <"+i+"> on "+(0,Rd.functionName)(r.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:ax.REDUNDANT_METHOD,methodName:i});return t}Si.validateRedundantMethods=vq});var Dq=w(py=>{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.TreeBuilder=void 0;var tf=yq(),_r=Gt(),Pq=xq(),pye=Gn(),dye=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,_r.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:pye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=_r.NOOP,this.cstFinallyStateUpdate=_r.NOOP,this.cstPostTerminal=_r.NOOP,this.cstPostNonTerminal=_r.NOOP,this.cstPostRule=_r.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=tf.setNodeLocationFull,this.setNodeLocationFromNode=tf.setNodeLocationFull,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=tf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=tf.setNodeLocationOnlyOffset,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=_r.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,tf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,tf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,_r.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Pq.createBaseSemanticVisitorConstructor)(this.className,(0,_r.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,_r.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Pq.createBaseVisitorConstructorWithDefaults)(this.className,(0,_r.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();py.TreeBuilder=dye});var Rq=w(dy=>{"use strict";Object.defineProperty(dy,"__esModule",{value:!0});dy.LexerAdapter=void 0;var kq=Gn(),Cye=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):kq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?kq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();dy.LexerAdapter=Cye});var Nq=w(Cy=>{"use strict";Object.defineProperty(Cy,"__esModule",{value:!0});Cy.RecognizerApi=void 0;var Fq=Gt(),mye=ef(),Ax=Gn(),Eye=Sd(),Iye=rx(),yye=dn(),wye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG),(0,Fq.contains)(this.definedRulesNames,e)){var n=Eye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Ax.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Iye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,mye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,yye.serializeGrammar)((0,Fq.values)(this.gastProductionsCache))},r}();Cy.RecognizerApi=wye});var Mq=w(Ey=>{"use strict";Object.defineProperty(Ey,"__esModule",{value:!0});Ey.RecognizerEngine=void 0;var Pr=Gt(),Yn=fy(),my=ef(),Lq=Pd(),rf=xd(),Tq=Gn(),Bye=sx(),Oq=NA(),Fd=Vg(),Qye=ox(),bye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,Qye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Fd.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,"modes")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Fd.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Oq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Fd.tokenStructuredMatcherNoCategories:Fd.tokenStructuredMatcher,(0,Fd.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,"resyncEnabled")?i.resyncEnabled:Tq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:Tq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(Yn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new my.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,my.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new my.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Bye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Oq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();Ey.RecognizerEngine=bye});var Uq=w(Iy=>{"use strict";Object.defineProperty(Iy,"__esModule",{value:!0});Iy.ErrorHandler=void 0;var lx=ef(),cx=Gt(),Kq=Pd(),Sye=Gn(),vye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,"errorMessageProvider")?e.errorMessageProvider:Sye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,lx.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,cx.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(r.prototype,"errors",{get:function(){return(0,cx.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,Kq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new lx.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,Kq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new lx.NoViableAltException(c,this.LA(1),l))},r}();Iy.ErrorHandler=vye});var Yq=w(yy=>{"use strict";Object.defineProperty(yy,"__esModule",{value:!0});yy.ContentAssist=void 0;var Hq=xd(),Gq=Gt(),xye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,Gq.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,Hq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,Gq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new Hq.NextAfterTokenWalker(n,e).startWalking();return s},r}();yy.ContentAssist=xye});var Zq=w(Qy=>{"use strict";Object.defineProperty(Qy,"__esModule",{value:!0});Qy.GastRecorder=void 0;var En=Gt(),To=dn(),Pye=yd(),Wq=Vg(),zq=NA(),Dye=Gn(),kye=fy(),By={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(By);var jq=!0,qq=Math.pow(2,kye.BITS_FOR_OCCURRENCE_IDX)-1,Vq=(0,zq.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:Pye.Lexer.NA});(0,Wq.augmentTokenTypes)([Vq]);var Xq=(0,zq.createTokenInstance)(Vq,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(Xq);var Rye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Fye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var t=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var t=0;t<10;t++){var i=t>0?t:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Dye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new To.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Nd.call(this,To.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Nd.call(this,To.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Nd.call(this,To.RepetitionMandatoryWithSeparator,t,e,jq)},r.prototype.manyInternalRecord=function(e,t){Nd.call(this,To.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Nd.call(this,To.RepetitionWithSeparator,t,e,jq)},r.prototype.orInternalRecord=function(e,t){return Nye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(wy(t),!e||(0,En.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=e.ruleName,a=new To.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Rye:By},r.prototype.consumeInternalRecord=function(e,t,i){if(wy(t),!(0,Wq.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,En.peek)(this.recordingProdStack),o=new To.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),Xq},r}();Qy.GastRecorder=Fye;function Nd(r,e,t,i){i===void 0&&(i=!1),wy(t);var n=(0,En.peek)(this.recordingProdStack),s=(0,En.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,En.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),By}function Nye(r,e){var t=this;wy(e);var i=(0,En.peek)(this.recordingProdStack),n=(0,En.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new To.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,En.has)(r,"MAX_LOOKAHEAD")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,En.some)(s,function(l){return(0,En.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,En.forEach)(s,function(l){var c=new To.Alternative({definition:[]});o.definition.push(c),(0,En.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,En.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),By}function Jq(r){return r===0?"":""+r}function wy(r){if(r<0||r>qq){var e=new Error("Invalid DSL Method idx value: <"+r+`> + `+("Idx value must be a none negative value smaller than "+(qq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var $q=w(by=>{"use strict";Object.defineProperty(by,"__esModule",{value:!0});by.PerformanceTracer=void 0;var _q=Gt(),Lye=Gn(),Tye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,_q.has)(e,"traceInitPerf")){var t=e.traceInitPerf,i=typeof t=="number";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Lye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,_q.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return t()},r}();by.PerformanceTracer=Tye});var eJ=w(Sy=>{"use strict";Object.defineProperty(Sy,"__esModule",{value:!0});Sy.applyMixins=void 0;function Oye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Sy.applyMixins=Oye});var Gn=w(dr=>{"use strict";var iJ=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,"__esModule",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var _i=Gt(),Mye=Uj(),tJ=NA(),nJ=Sd(),rJ=gq(),Kye=sx(),Uye=Iq(),Hye=Dq(),Gye=Rq(),Yye=Nq(),jye=Mq(),qye=Uq(),Jye=Yq(),Wye=Zq(),zye=$q(),Vye=eJ();dr.END_OF_FILE=(0,tJ.createTokenInstance)(tJ.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:nJ.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var Xye;(function(r){r[r.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",r[r.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",r[r.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",r[r.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",r[r.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",r[r.LEFT_RECURSION=5]="LEFT_RECURSION",r[r.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",r[r.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",r[r.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",r[r.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",r[r.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",r[r.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(Xye=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function Zye(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=Zye;var vy=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,_i.has)(t,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,_i.has)(t,"skipValidations")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,_i.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,_i.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,rJ.resolveGrammar)({rules:(0,_i.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,_i.isEmpty)(n)&&e.skipValidations===!1){var s=(0,rJ.validateGrammar)({rules:(0,_i.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,_i.values)(e.tokensMap),errMsgProvider:nJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,_i.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,Mye.computeAllProdsFollows)((0,_i.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,_i.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,_i.isEmpty)(e.definitionErrors))throw t=(0,_i.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+t.join(` +------------------------------- +`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=vy;(0,Vye.applyMixins)(vy,[Kye.Recoverable,Uye.LooksAhead,Hye.TreeBuilder,Gye.LexerAdapter,jye.RecognizerEngine,Yye.RecognizerApi,qye.ErrorHandler,Jye.ContentAssist,Wye.GastRecorder,zye.PerformanceTracer]);var _ye=function(r){iJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(vy);dr.CstParser=_ye;var $ye=function(r){iJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,_i.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(vy);dr.EmbeddedActionsParser=$ye});var oJ=w(xy=>{"use strict";Object.defineProperty(xy,"__esModule",{value:!0});xy.createSyntaxDiagramsCode=void 0;var sJ=Dv();function ewe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+sJ.VERSION+"/diagrams/":i,s=t.css,o=s===void 0?"https://unpkg.com/chevrotain@"+sJ.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` +\n`; + } + + return html.replace('', `\n${escapeReplaceString(injectHtml)}`); + }, + + _injectMeta(html, res) { + const metas = _.extend({}, Inject.metaList, res.Inject && res.Inject.metaList); + if (_.isEmpty(metas)) return html; + + let injectHtml = ''; + for (id in metas) { + const meta = this._evalToText(metas[id], res, html); + (injectHtml += ` \n`), res; + } + + return html.replace('', `\n${escapeReplaceString(injectHtml)}`); + }, + + _injectHeads(html, res) { + const heads = _.extend({}, Inject.rawHeads, res.Inject && res.Inject.rawHeads); + if (_.isEmpty(heads)) return html; + + let injectHtml = ''; + for (id in heads) { + const head = this._evalToText(heads[id], res, html); + injectHtml += `${head}\n`; + } + + return html.replace('', `\n${escapeReplaceString(injectHtml)}`); + }, + + _injectBodies(html, res) { + const bodies = _.extend({}, Inject.rawBodies, res.Inject && res.Inject.rawBodies); + if (_.isEmpty(bodies)) return html; + + let injectHtml = ''; + for (id in bodies) { + const body = this._evalToText(bodies[id], res, html); + injectHtml += `${body}\n`; + } + + return html.replace('', `\n${escapeReplaceString(injectHtml)}`); + }, + + // ensure object exists and store there + _resAssign(res, key, id, value) { + if (!res.Inject) res.Inject = {}; + if (!res.Inject[key]) res.Inject[key] = {}; + res.Inject[key][id] = value; + }, + + _checkForTextOrFunction(arg, message) { + if (!(_.isString(arg) || _.isFunction(arg))) { + throw new Error(message); + } + }, + + _checkForObjOrFunction(arg, message) { + if (!(_.isObject(arg) || _.isFunction(arg))) { + throw new Error(message); + } + }, + + // we don't handle errors here. Let them to handle in a higher level + _evalToText(textOrFunc, res, html) { + if (_.isFunction(textOrFunc)) { + return textOrFunc(res, html); + } + return textOrFunc; + }, +}; + +Inject.rawModHtml('injectHeads', Inject._injectHeads.bind(Inject)); +Inject.rawModHtml('injectMeta', Inject._injectMeta.bind(Inject)); +Inject.rawModHtml('injectBodies', Inject._injectBodies.bind(Inject)); +Inject.rawModHtml('injectObjects', Inject._injectObjects.bind(Inject)); diff --git a/apps/meteor/packages/meteor-inject-initial/package.js b/apps/meteor/packages/meteor-inject-initial/package.js new file mode 100644 index 000000000000..5ae6f530aa60 --- /dev/null +++ b/apps/meteor/packages/meteor-inject-initial/package.js @@ -0,0 +1,16 @@ +Package.describe({ + summary: 'Allow injection of arbitrary data to initial Meteor HTML page', + version: '1.0.5', + git: 'https://github.com/meteorhacks/meteor-inject-initial.git', + name: 'meteorhacks:inject-initial', +}); + +Package.onUse(function (api) { + api.use(['routepolicy', 'webapp'], 'server'); + api.use(['ejson', 'underscore'], ['server']); + + api.addFiles('lib/inject-server.js', 'server'); + api.addFiles('lib/inject-core.js', 'server'); + + api.export('Inject', 'server'); +}); diff --git a/apps/meteor/packages/meteor-run-as-user/lib/collection.overwrites.js b/apps/meteor/packages/meteor-run-as-user/lib/collection.overwrites.js new file mode 100644 index 000000000000..01603673d4c7 --- /dev/null +++ b/apps/meteor/packages/meteor-run-as-user/lib/collection.overwrites.js @@ -0,0 +1,54 @@ +// This file overwrites the default metoer Mongo.Collection modifiers: "insert", +// "update", "remove" +// +// The new methods are checking if Meteor is in "restricted" mode to apply +// allow and deny rules if needed. +// +// This will allow us to run the modifiers inside of a "Meteor.runAsUser" with +// security checks. +_.each(['insert', 'update', 'remove'], function (method) { + + var _super = Mongo.Collection.prototype[method]; + + Mongo.Collection.prototype[method] = function ( /* arguments */ ) { + var self = this; + var args = _.toArray(arguments); + + // Check if this method is run in restricted mode and collection is + // restricted. + if (Meteor.isRestricted() && self._restricted) { + + var generatedId = null; + if (method === 'insert' && !_.has(args[0], '_id')) { + generatedId = self._makeNewID(); + } + + // short circuit if there is no way it will pass. + if (self._validators[method].allow.length === 0) { + throw new Meteor.Error( + 403, 'Access denied. No allow validators set on restricted ' + + 'collection for method \'' + method + '\'.'); + } + + var validatedMethodName = + '_validated' + method.charAt(0).toUpperCase() + method.slice(1); + args.unshift(Meteor.userId()); + + if (method === 'insert') { + args.push(generatedId); + + self[validatedMethodName].apply(self, args); + // xxx: for now we return the id since self._validatedInsert doesn't + // yet return the new id + return generatedId || args[0]._id; + + } + + return self[validatedMethodName].apply(self, args); + + } + + return _super.apply(self, args); + }; + +}); diff --git a/apps/meteor/packages/meteor-run-as-user/lib/common.js b/apps/meteor/packages/meteor-run-as-user/lib/common.js new file mode 100644 index 000000000000..e12269db2630 --- /dev/null +++ b/apps/meteor/packages/meteor-run-as-user/lib/common.js @@ -0,0 +1,109 @@ +// This file adds the actual "Meteor.runAsUser" and "Meteor.isRestricted" api +// +// It's done by using a DDP method invocation, setting a user id and a +// "isRestricted" flag on it. +// +// If run inside of an existing DDP invocation a nested version will be created. + +var restrictedMode = new Meteor.EnvironmentVariable(); + +/** + * Returns true if inside a runAsUser user scope + * @return {Boolean} True if in a runAsUser user scope + */ +Meteor.isRestricted = function () { + return !!restrictedMode.get(); +}; + +/** + * Run code restricted + * @param {Function} f Code to run in restricted mode + * @return {Any} Result of code running + */ +Meteor.runRestricted = function(f) { + if (Meteor.isRestricted()) { + return f(); + } else { + return restrictedMode.withValue(true, f); + } +}; + +/** + * Run code unrestricted + * @param {Function} f Code to run in restricted mode + * @return {Any} Result of code running + */ +Meteor.runUnrestricted = function(f) { + if (Meteor.isRestricted()) { + return restrictedMode.withValue(false, f); + } else { + f(); + } +}; + +/** + * Run as a user + * @param {String} userId The id of user to run as + * @param {Function} f Function to run as user + * @return {Any} Returns function result + */ +Meteor.runAsUser = function (userId, f) { + var currentInvocation = DDP._CurrentInvocation.get(); + + // Create a new method invocation + var invocation = new DDPCommon.MethodInvocation( + (currentInvocation) ? currentInvocation : { + connection: null + } + ); + + // Now run as user on this invocation + invocation.setUserId(userId); + + return DDP._CurrentInvocation.withValue(invocation, function () { + return f.apply(invocation, [userId]); + }); +}; + +/** + * Run as restricted user + * @param {Function} f Function to run unrestricted + * @return {Any} Returns function result + */ +Meteor.runAsRestrictedUser = function(userId, f) { + return Meteor.runRestricted(function() { + return Meteor.runAsUser(userId, f); + }); +}; + +var adminMode = new Meteor.EnvironmentVariable(); + +/** + * Check if code is running isside an invocation / method + */ +Meteor.isAdmin = function() { + return !!adminMode.get(); +}; + +/** + * Make the function run outside invocation + */ +Meteor.runAsAdmin = function(f) { + if (Meteor.isAdmin()) { + return f(); + } else { + return adminMode.withValue(false, f); + } +}; + +/** + * Make sure code runs outside an invocation on the + * server + */ +Meteor.runOutsideInvocation = function(f) { + if (Meteor.isServer && DDP._CurrentInvocation.get()) { + DDP._CurrentInvocation.withValue(null, f); + } else { + f(); + } +}; diff --git a/apps/meteor/packages/meteor-run-as-user/lib/pre.1.0.3.js b/apps/meteor/packages/meteor-run-as-user/lib/pre.1.0.3.js new file mode 100644 index 000000000000..f707a1128b62 --- /dev/null +++ b/apps/meteor/packages/meteor-run-as-user/lib/pre.1.0.3.js @@ -0,0 +1,96 @@ +// This code will go away in later versions of Meteor, this is just a "polyfill" +// until the next release of Meteor maybe 1.0.3? +// +if (typeof DDPCommon === 'undefined') { + DDPCommon = {}; + + DDPCommon.MethodInvocation = function (options) { + var self = this; + + // true if we're running not the actual method, but a stub (that is, + // if we're on a client (which may be a browser, or in the future a + // server connecting to another server) and presently running a + // simulation of a server-side method for latency compensation + // purposes). not currently true except in a client such as a browser, + // since there's usually no point in running stubs unless you have a + // zero-latency connection to the user. + + /** + * @summary Access inside a method invocation. Boolean value, true if this invocation is a stub. + * @locus Anywhere + * @name isSimulation + * @memberOf MethodInvocation + * @instance + * @type {Boolean} + */ + this.isSimulation = options.isSimulation; + + // call this function to allow other method invocations (from the + // same client) to continue running without waiting for this one to + // complete. + this._unblock = options.unblock || function () {}; + this._calledUnblock = false; + + // current user id + + /** + * @summary The id of the user that made this method call, or `null` if no user was logged in. + * @locus Anywhere + * @name userId + * @memberOf MethodInvocation + * @instance + */ + this.userId = options.userId; + + // sets current user id in all appropriate server contexts and + // reruns subscriptions + this._setUserId = options.setUserId || function () {}; + + // On the server, the connection this method call came in on. + + /** + * @summary Access inside a method invocation. The [connection](#meteor_onconnection) that this method was received on. `null` if the method is not associated with a connection, eg. a server initiated method call. + * @locus Server + * @name connection + * @memberOf MethodInvocation + * @instance + */ + this.connection = options.connection; + + // The seed for randomStream value generation + this.randomSeed = options.randomSeed; + + // This is set by RandomStream.get; and holds the random stream state + this.randomStream = null; + }; + + _.extend(DDPCommon.MethodInvocation.prototype, { + /** + * @summary Call inside a method invocation. Allow subsequent method from this client to begin running in a new fiber. + * @locus Server + * @memberOf MethodInvocation + * @instance + */ + unblock: function () { + var self = this; + self._calledUnblock = true; + self._unblock(); + }, + + /** + * @summary Set the logged in user. + * @locus Server + * @memberOf MethodInvocation + * @instance + * @param {String | null} userId The value that should be returned by `userId` on this connection. + */ + setUserId: function (userId) { + var self = this; + if (self._calledUnblock) + throw new Error("Can't call setUserId in a method after calling unblock"); + self.userId = userId; + // self._setUserId(userId); + } + + }); +} diff --git a/apps/meteor/packages/meteor-run-as-user/package.js b/apps/meteor/packages/meteor-run-as-user/package.js new file mode 100644 index 000000000000..a9958fa76ec8 --- /dev/null +++ b/apps/meteor/packages/meteor-run-as-user/package.js @@ -0,0 +1,29 @@ +Package.describe({ + name: 'dispatch:run-as-user', + version: '1.1.1', + summary: 'Adds Meteor.runAsUser(user, f) and Meteor.isRestricted()', + git: 'https://github.com/DispatchMe/Meteor-run-as-user.git', + documentation: 'README.md', +}); + +Package.onUse(function (api) { + + api.use([ + 'meteor', + 'check', + 'underscore', + 'mongo', + 'ddp', + // 'ddp-common', + // 'ddp-client' + ]); + + api.addFiles( + [ + 'lib/pre.1.0.3.js', // Waiting for ddp-common and ddp-client + 'lib/common.js', + 'lib/collection.overwrites.js', + ], + ['client', 'server'], + ); +}); diff --git a/apps/meteor/packages/rocketchat-coverage/.npm/package/.gitignore b/apps/meteor/packages/rocketchat-coverage/.npm/package/.gitignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/apps/meteor/packages/rocketchat-coverage/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/apps/meteor/packages/rocketchat-coverage/.npm/package/README b/apps/meteor/packages/rocketchat-coverage/.npm/package/README new file mode 100644 index 000000000000..3d492553a438 --- /dev/null +++ b/apps/meteor/packages/rocketchat-coverage/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/apps/meteor/packages/rocketchat-coverage/.npm/package/npm-shrinkwrap.json b/apps/meteor/packages/rocketchat-coverage/.npm/package/npm-shrinkwrap.json new file mode 100644 index 000000000000..526c4cbd2d5c --- /dev/null +++ b/apps/meteor/packages/rocketchat-coverage/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,52 @@ +{ + "lockfileVersion": 1, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + } + } +} diff --git a/apps/meteor/packages/rocketchat-coverage/package.js b/apps/meteor/packages/rocketchat-coverage/package.js new file mode 100644 index 000000000000..55dde32fec3d --- /dev/null +++ b/apps/meteor/packages/rocketchat-coverage/package.js @@ -0,0 +1,18 @@ +Package.describe({ + name: 'rocketchat:coverage', + summary: '', + version: '1.0.0', +}); + +Package.onUse(function (api) { + api.use('ecmascript'); + api.use('isobuild:compiler-plugin@1.0.0'); + + api.mainModule('plugin/compile-version.js', 'server'); +}); + +Npm.depends({ + 'istanbul-lib-report': '3.0.0', + 'istanbul-reports': '3.0.2', + 'istanbul-lib-coverage': '3.0.0', +}); diff --git a/apps/meteor/packages/rocketchat-coverage/plugin/compile-version.js b/apps/meteor/packages/rocketchat-coverage/plugin/compile-version.js new file mode 100644 index 000000000000..869fbcbf15d3 --- /dev/null +++ b/apps/meteor/packages/rocketchat-coverage/plugin/compile-version.js @@ -0,0 +1,54 @@ +import { exec } from 'child_process'; +import os from 'os'; +import util from 'util'; + +import libReport from 'istanbul-lib-report'; +import reports from 'istanbul-reports'; +import libCoverage from 'istanbul-lib-coverage'; + +const dir = process.env.COVERAGE_DIR; +const reporter = process.env.COVERAGE_REPORTER || 'lcov'; + +console.log('Coverage plugin started'); + +if (!dir && !reporter) { + return console.log('Coverage plugin not configured'); +} + +if (!dir || !reporter) { + console.log('Coverage plugin not fully configured'); + return; +} + +process.on('exit', async () => { + try { + if (!dir) { + throw new Error('No coverage dir'); + } + + if (!reporter) { + throw new Error('No coverage reporter'); + } + console.log('Coverage plugin triggered'); + + const coverageMap = libCoverage.createCoverageMap(globalThis['__coverage__']); + + const configWatermarks = { + statements: [50, 80], + functions: [50, 80], + branches: [50, 80], + lines: [50, 80], + }; + + const context = libReport.createContext({ + dir, + coverageMap, + }); + + const report = reports.create(reporter); + + report.execute(context); + } catch (e) { + console.log('Error', e); + } +}); diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json index c1322ebab0af..90db76e13637 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json @@ -973,7 +973,6 @@ "Enter_name_here": "Voer naam hier in", "Enter_Normal": "Normale modus (stuur met Enter)", "Enter_to": "Tik in", - "Enterprise": "onderneming", "Entertainment": "Vermaak", "Error": "fout", "Error_404": "Fout: 404", @@ -2757,5 +2756,7 @@ "registration.component.form.reasonToJoin": "Rede om deel te neem", "registration.component.form.invalidConfirmPass": "Die wagwoord bevestiging pas nie by die wagwoord nie", "registration.component.form.confirmPassword": "Bevestig jou wagwoord", - "registration.component.form.sendConfirmationEmail": "Stuur bevestiging e-pos" + "registration.component.form.sendConfirmationEmail": "Stuur bevestiging e-pos", + "Enterprise": "onderneming", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json index 392b4a99b3ad..6060705de4d3 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -426,6 +426,7 @@ "App_author_homepage": "الصفحة الرئيسية للمؤلف", "App_Details": "تفاصيل التطبيق", "App_Information": "معلومات التطبيق", + "Apps_context_enterprise": "مؤسسة", "App_Installation": "تثبيت التطبيق", "App_status_auto_enabled": "تم التمكين", "App_status_constructed": "تم الإنشاء", @@ -449,7 +450,6 @@ "Apply": "تطبيق", "Apply_and_refresh_all_clients": "التطبيق وتحديث جميع العملاء", "Apps": "التطبيقات", - "Apps_context_enterprise": "مؤسسة", "Apps_context_installed": "تم التثبيت", "Apps_Engine_Version": "إصدار محرك التطبيقات", "Apps_Essential_Alert": "هذا التطبيق ضروري للأحداث التالية:", @@ -840,8 +840,6 @@ "Close": "إغلاق", "Close_chat": "إغلاق الدردشة", "Close_room_description": "إنك توشك على إغلاق هذه الدردشة. هل تريد فعلاً المتابعة؟", - "Close_to_seat_limit_banner_warning": "*تبقى لديك [{{seats}}] من المقاعد* \nتقترب مساحة العمل هذه من حد المقاعد الخاص بها. بمجرد استيفاء الحد، لا يمكن إضافة أعضاء جدد. *‎[Request More Seats]({{url}})‎*", - "Close_to_seat_limit_warning": "لا يمكن إنشاء أعضاء جدد بمجرد استيفاء حد المقاعد.", "close-livechat-room": "إغلاق Room القناة متعددة الاتجاهات", "close-livechat-room_description": "إذن لإغلاق غرفة القناة متعددة الاتجاهات الحالية", "Close_menu": "إغلاق القائمة", @@ -875,8 +873,6 @@ "Cloud_register_offline_finish_helper": "بعد الانتهاء من عملية التسجيل في وحدة التحكم السحابية، يجب عرض بعض النصوص عليك. يُرجى لصقها هنا لإنهاء التسجيل.", "Cloud_register_offline_helper": "يمكن تسجيل مساحات العمل يدويًا إذا كانت معزولة بفجوة هواء أو تم تقييد الوصول إلى الشبكة. انسخ النص أدناه وانتقل إلى وحدة التحكم السحابية لإكمال العملية.", "Cloud_register_success": "تم تسجيل مساحة العمل الخاصة بك بنجاح!", - "Cloud_registration_pending_html": "لن تعمل الإشعارات المنبثقة حتى يتم الانتهاء من التسجيل. تعرف على المزيد ", - "Cloud_registration_pending_title": "التسجيل السحابي لا يزال معلقًا", "Cloud_registration_required": "التسجيل مطلوب", "Cloud_registration_required_description": "يبدو أنك لم تختر تسجيل مساحة العمل الخاصة بك أثناء الإعداد.", "Cloud_registration_required_link_text": "انقر هنا لتسجيل مساحة العمل الخاصة بك.", @@ -1493,7 +1489,7 @@ "E2E_key_reset_email": "إشعار إعادة تعيين مفتاح التشفير بين الطرفيات", "E2E_message_encrypted_placeholder": "هذه الرسالة مشفرة من طرف إلى طرف. لعرضه ، يجب عليك إدخال مفتاح التشفير في إعدادات حسابك.", "E2E_password_request_text": "للوصول إلى مجموعاتك الخاصة المشفرة والرسائل المباشرة، أدخل كلمة مرور التشفير.
سيلزمك إدخال كلمة المرور هذه لتشفير/فك تشفير رسائلك على كل عميل تستخدمه، نظرًا إلى أن المفتاح غير مخزن على الخادم.", - "E2E_password_reveal_text": "يمكنك الآن إنشاء مجموعات خاصة مشفرة ورسائل مباشرة. يمكنك أيضًا تغيير المجموعات الخاصة الموجودة أو الرسائل المباشرة إلى مشفرة.

هذا تشفير بين الطرفيات حتى لا يتم حفظ مفتاح تشفير/فك تشفير رسائلك على الخادم. لهذا السبب سيلزمك تخزين كلمة المرور هذه في مكان آمن. سيُطلب منك إدخالها على الأجهزة الأخرى التي ترغب في استخدام التشفير بين الطرفيات عليها. تعرف على المزيد هنا!

كلمة المرور الخاصة بك هي: ‎%s‎

هذه كلمة مرور تم إنشاؤها تلقائيًا، يمكنك إعداد كلمة مرور جديدة لمفتاح التشفير الخاص بك في أي وقت من أي متصفح قمت بإدخال كلمة المرور الحالية فيه.
يتم تخزين كلمة المرور هذه على هذا المستعرض فقط حتى تقوم بتخزين كلمة المرور ورفض هذه الرسالة.", + "E2E_password_reveal_text": "يمكنك الآن إنشاء مجموعات خاصة مشفرة ورسائل مباشرة. يمكنك أيضًا تغيير المجموعات الخاصة الموجودة أو الرسائل المباشرة إلى مشفرة.

هذا تشفير بين الطرفيات حتى لا يتم حفظ مفتاح تشفير/فك تشفير رسائلك على الخادم. لهذا السبب سيلزمك تخزين كلمة المرور هذه في مكان آمن. سيُطلب منك إدخالها على الأجهزة الأخرى التي ترغب في استخدام التشفير بين الطرفيات عليها. تعرف على المزيد هنا!

كلمة المرور الخاصة بك هي: ‎{{randomPassword}}‎

هذه كلمة مرور تم إنشاؤها تلقائيًا، يمكنك إعداد كلمة مرور جديدة لمفتاح التشفير الخاص بك في أي وقت من أي متصفح قمت بإدخال كلمة المرور الحالية فيه.
يتم تخزين كلمة المرور هذه على هذا المستعرض فقط حتى تقوم بتخزين كلمة المرور ورفض هذه الرسالة.", "E2E_Reset_Email_Content": "لقد تم تسجيل خروجك تلقائيًا. عند تسجيل الدخول مرة أخرى، سيقوم Rocket.Chat بإنشاء مفتاح جديد ويستعيد وصولك إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت. نظرًا إلى طبيعة التشفير بين الطرفيات، لن يتمكن Rocket.Chat من استعادة الوصول إلى أي غرفة مشفرة ليس بها أي عضو على الإنترنت.", "E2E_Reset_Key_Explanation": "ستترتب على هذا الخيار إزالة المفتاح الحالي للتشفير بين الطرفيات الخاص بك وتسجيل خروجك.
عند تسجيل الدخول مرة أخرى، سينشئ لك Rocket.Chat مفتاحًا جديدًا وتستعيد وصولك إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت.
نظرًا إلى طبيعة التشفير بين الطرفيات، فإن Rocket.Chat لن يتمكن من استعادة الوصول إلى أي غرفة مشفرة ليس بها عضو على الإنترنت.", "E2E_Reset_Other_Key_Warning": "سيترتب على إعادة تعيين المفتاح الحالي للتشفير بين الطرفيات تسجيل خروج المستخدم. عندما يقوم المستخدم بتسجيل الدخول مرة أخرى، سيقوم Rocket.Chat بإنشاء مفتاح جديد واستعادة وصول المستخدم إلى أي غرفة مشفرة بها عضو واحد أو أكثر على الإنترنت. نظرًا إلى طبيعة التشفير بين الطرفيات، فإن Rocket.Chat لن يتمكن من استعادة الوصول إلى أي غرفة مشفرة ليس بها أي عضو على الإنترنت.", @@ -1575,6 +1571,8 @@ "email_style_description": "تجنب المحدِّدات المتداخلة", "email_style_label": "نمط البريد الإلكتروني", "Email_subject": "موضوع البريد الإلكتروني", + "Enterprise_License": "ترخيص المؤسسة", + "Enterprise_License_Description": "إذا تم تسجيل مساحة العمل الخاصة بك وتم توفير الترخيص بواسطة Rocket.Chat Cloud، فلن تحتاج إلى تحديث الترخيص يدويًا هنا.", "Email_verified": "تم التحقق من البريد الإلكتروني", "Email_sent": "تم إرسال البريد الإلكتروني", "Emoji": "رمز تعبيري", @@ -1627,9 +1625,6 @@ "Enter_Normal": "الوضع العادي (إرسال باستخدام إنتر)", "Enter_to": "إدخال إلى", "Enter_your_E2E_password": "أدخل كلمة مرور التشفير بين الطرفيات", - "Enterprise": "مؤسسة", - "Enterprise_License": "ترخيص المؤسسة", - "Enterprise_License_Description": "إذا تم تسجيل مساحة العمل الخاصة بك وتم توفير الترخيص بواسطة Rocket.Chat Cloud، فلن تحتاج إلى تحديث الترخيص يدويًا هنا.", "Entertainment": "الترفيه", "Error": "خطأ", "Error_something_went_wrong": "أُووبس! هناك خطأ ما. يرجى إعادة تحميل الصفحة أو الاتصال بالمسؤول.", @@ -1652,7 +1647,7 @@ "error-avatar-invalid-url": "عنوان URL:‏ {{url}} للصورة الرمزية غير صالح", "error-avatar-url-handling": "خطأ أثناء ضبط إعداد الصورة الرمزية من عنوان URL‏ ({{url}}) لـ {{username}}", "error-business-hours-are-closed": "ساعات العمل مغلقة", - "error-blocked-username": "{{field}} محظور ولا يمكن استخدامه!", + "error-blocked-username": "**{{field}}** محظور ولا يمكن استخدامه!", "error-canned-response-not-found": "لم يتم العثور على ردود مسجلة", "error-cannot-delete-app-user": "غير مسموح بحذف مستخدم التطبيق، قم بإلغاء تثبيت التطبيق المقابل لإزالته.", "error-cant-invite-for-direct-room": "لا يمكن دعوة المستخدم في الغرفة المباشرة", @@ -2580,7 +2575,7 @@ "leave-c_description": "إذن لمغادرة القنوات", "leave-p": "مغادرة المجموعات الخاصة", "leave-p_description": "إذن لمغادرة المجموعات الخاصة", - "Lets_get_you_new_one": "دعنا نحضر لك واحدة جديدة!", + "Lets_get_you_new_one_": "دعنا نحضر لك واحدة جديدة!", "Link_Preview": "رابط المعاينة", "List_of_Channels": "قائمة Channels", "List_of_departments_for_forward": "قائمة الأقسام المسموح بإعادة توجيهها (اختياري)", @@ -3419,7 +3414,6 @@ "Random": "عشوائي", "Rate_Limiter_Limit_RegisterUser": "مكالمات الرقم الافتراضي إلى محدد المعدل لتسجيل المستخدم", "Rate_Limiter_Limit_RegisterUser_Description": "عدد المكالمات الافتراضية لنقاط النهاية الخاصة بتسجيل المستخدم (REST وواجهة برمجة التطبيقات في الوقت الفعلي)، المسموح بها ضمن النطاق الزمني المحدد في قسم محدِّد معدل واجهة برمجة التطبيقات.", - "Reached_seat_limit_banner_warning": "*لا يتوافر المزيد من المقاعد* \nوصلت مساحة العمل هذه إلى الحد الأقصى لعدد المقاعد المخصصة لها لذلك لا يمكن لأعضاء آخرين الانضمام. *[طلب المزيد من المقاعد]({{url}})*", "React_when_read_only": "السماح بالتفاعل", "React_when_read_only_changed_successfully": "السماح بالتفاعل عند تغيير وضع القراءة فقط بنجاح", "Reacted_with": "تم التفاعل مع", @@ -3513,11 +3507,6 @@ "Report_this_message_question_mark": "هل أبلغ عن هذه الرسالة؟", "Reporting": "يتم الإبلاغ الآن", "Request": "طلب", - "Request_seats": "طلب مقاعد", - "Request_more_seats": "طلب المزيد من المقاعد.", - "Request_more_seats_out_of_seats": "لا يمكنك إضافة أعضاء لأن مساحة العمل هذه ليس بها مقاعد، يرجى طلب المزيد من المقاعد.", - "Request_more_seats_sales_team": "بمجرد تقديم طلبك، سينظر فريق المبيعات لدينا في الأمر وسيتواصل معك في غضون اليومين المقبلين.", - "Request_more_seats_title": "طلب المزيد من المقاعد", "Request_comment_when_closing_conversation": "طلب التعليق عند إغلاق المحادثة", "Request_comment_when_closing_conversation_description": "في حال التمكين، سيحتاج الوكيل إلى تعيين تعليق قبل إغلاق المحادثة.", "Request_tag_before_closing_chat": "طلب علامة (علامات) قبل إغلاق المحادثة", @@ -3769,6 +3758,7 @@ "Security": "الأمان", "See_full_profile": "مشاهدة الملف الشخصي الكامل", "See_on_Engagement_Dashboard": "العرض على لوحة معلومات المشاركة", + "Select": "تحديد", "Select_a_department": "تحديد قسم", "Select_a_room": "تحديد غرفة", "Select_a_user": "تحديد مستخدم", @@ -4117,8 +4107,12 @@ "Teams_Search_teams": "البحث عن الفِرَق", "Teams_New_Read_only_Label": "القراءة فقط", "Technology_Services": "الخدمات التكنولوجية", + "Upgrade_tab_connection_error_description": "يبدو أنه ليس لديك اتصال بالإنترنت. قد يكون هذا بسبب أن مساحة العمل الخاصة بك مثبتة على خادم مؤمن بالكامل ومفصول.", "Terms": "الشروط", + "Upgrade_tab_connection_error_restore": "قم باستعادة الاتصال الخاص بك للتعرف على الميزات التي فاتتك.", "Test_Connection": "اختبار الاتصال", + "Upgrade_tab_go_fully_featured": "انتقل إلى الميزات الكاملة", + "Upgrade_tab_trial_guide": "دليل التجربة", "Test_Desktop_Notifications": "اختبار إشعارات سطح المكتب", "Test_LDAP_Search": "اختبار بحث LDAP", "test-admin-options": "خيارات الاختبار على لوحة الإدارة مثل تسجيل الدخول إلى LDAP والإشعارات الفورية", @@ -4378,10 +4372,6 @@ "Update_to_version": "التحديث إلى {{version}}", "Update_your_RocketChat": "تحديث Rocket.Chat الخاص بك", "Updated_at": "تم التحديث في ", - "Upgrade_tab_connection_error_description": "يبدو أنه ليس لديك اتصال بالإنترنت. قد يكون هذا بسبب أن مساحة العمل الخاصة بك مثبتة على خادم مؤمن بالكامل ومفصول.", - "Upgrade_tab_connection_error_restore": "قم باستعادة الاتصال الخاص بك للتعرف على الميزات التي فاتتك.", - "Upgrade_tab_go_fully_featured": "انتقل إلى الميزات الكاملة", - "Upgrade_tab_trial_guide": "دليل التجربة", "Upgrade_tab_upgrade_your_plan": "قم بترقية اشتراكك", "Upload": "تحميل", "Uploads": "تحميلات", @@ -4574,6 +4564,7 @@ "view-l-room": "عرض Rooms القناة متعددة الاتجاهات", "view-l-room_description": "إذن لعرض غرف القناة متعددة الاتجاهات", "view-livechat-analytics": "عرض تحليلات القناة متعددة الاتجاهات", + "onboarding.page.awaitingConfirmation.subtitle": "لقد أرسلنا إليك رسالة بريد إلكتروني إلى {{emailAddress}} مع رابط تأكيد. يرجى التحقق من أن رمز الأمان أدناه يطابق الرمز الموجود في رسالة البريد الإلكتروني.", "view-livechat-analytics_description": "إذن لعرض تحليلات الدردشة المباشرة", "view-livechat-appearance": "عرض مظهر القناة متعددة الاتجاهات", "view-livechat-appearance_description": "إذن لعرض مظهر الدردشة المباشرة", @@ -4822,11 +4813,10 @@ "onboarding.component.form.action.skip": "تخطي هذه الخطوة", "onboarding.component.form.action.register": "تسجيل", "onboarding.component.form.action.confirm": "تأكيد", + "onboarding.component.form.action.pasteHere": "لصق هنا...", "onboarding.component.form.termsAndConditions": "أوافق على <1>البنود والشروط و<3>سياسة الخصوصية", "onboarding.component.emailCodeFallback": "ألم تتلق رسالة بريد إلكتروني؟ <1>إعادة الإرسال or <3>تغيير البريد الإلكتروني", "onboarding.page.form.title": "دعنا <1>نطلق مساحة العمل الخاصة بك", - "onboarding.page.awaitingConfirmation.title": "بانتظار التأكيد", - "onboarding.page.awaitingConfirmation.subtitle": "لقد أرسلنا إليك رسالة بريد إلكتروني إلى {{emailAddress}} مع رابط تأكيد. يرجى التحقق من أن رمز الأمان أدناه يطابق الرمز الموجود في رسالة البريد الإلكتروني.", "onboarding.page.emailConfirmed.title": "تم تأكيد البريد الإلكتروني!", "onboarding.page.emailConfirmed.subtitle": "يمكنك العودة إلى تطبيق Rocket.Chat الخاص بك - لقد أطلقنا مساحة العمل الخاصة بك سابقًا.", "onboarding.page.checkYourEmail.title": "تحقق من بريدك الالكتروني", @@ -4862,6 +4852,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "كلمة المرور", "onboarding.form.adminInfoForm.fields.password.placeholder": "إنشاء كلمة مرور", "onboarding.form.adminInfoForm.fields.keepPosted.label": "أبقني على اطلاع بتحديثات Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "بانتظار التأكيد", "onboarding.form.organizationInfoForm.title": "معلومات المؤسسة", "onboarding.form.organizationInfoForm.subtitle": "نرجو أن تتعاون معنا. ستساعدنا هذه المعلومات على تخصيص مساحة عملك", "onboarding.form.organizationInfoForm.fields.organizationName.label": "اسم المؤسسة", @@ -4874,6 +4865,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "تحديد", "onboarding.form.organizationInfoForm.fields.country.label": "البلد", "onboarding.form.organizationInfoForm.fields.country.placeholder": "تحديد", + "onboarding.form.registerOfflineForm.title": "التسجيل دون اتصال", "onboarding.form.registeredServerForm.title": "تسجيل الخادم الخاص بك", "onboarding.form.registeredServerForm.included.push": "الإشعارات المرسلة عبر الهاتف المحمول", "onboarding.form.registeredServerForm.included.externalProviders": "التكامل مع مقدمي الخدمات الخارجيين (WhatsApp وFacebook وTelegram وTwitter)", @@ -4890,5 +4882,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "السوق", "RegisterWorkspace_Features_Omnichannel_Title": "قناة متعددة الاتجاهات", "RegisterWorkspace_Setup_Label": "البريد الإلكتروني لحساب السحابة", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "أوافق على <1>البنود والشروط و<3>سياسة الخصوصية" + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "أوافق على <1>البنود والشروط و<3>سياسة الخصوصية", + "Enterprise": "مؤسسة", + "UpgradeToGetMore_engagement-dashboard_Title": "التحليلات", + "UpgradeToGetMore_auditing_Title": "تدقيق الرسائل" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json index d63adf27a952..d3c9146f868f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json @@ -973,7 +973,6 @@ "Enter_name_here": "Bura ad daxil edin", "Enter_Normal": "Normal rejim (Enter ilə göndərin)", "Enter_to": "Daxil ol", - "Enterprise": "Müəssisə", "Entertainment": "Əyləncə", "Error": "Səhv", "Error_404": "Hata: 404", @@ -2757,5 +2756,7 @@ "registration.component.form.reasonToJoin": "Qoşulma səbəbi", "registration.component.form.invalidConfirmPass": "Şifrənin təsdiqlənməsi şifrə uyğun gəlmir", "registration.component.form.confirmPassword": "Şifrənizi təsdiqləyin", - "registration.component.form.sendConfirmationEmail": "Təsdiq e-poçt göndər" + "registration.component.form.sendConfirmationEmail": "Təsdiq e-poçt göndər", + "Enterprise": "Müəssisə", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json index f46d3ea22b1d..84af45c446ff 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json @@ -992,7 +992,6 @@ "Enter_name_here": "Калі ласка, увядзіце імя тут", "Enter_Normal": "Нармальны рэжым (адпраўка з Enter)", "Enter_to": "увядзіце ў", - "Enterprise": "прадпрыемства", "Entertainment": "забавы", "Error": "памылка", "Error_404": "Памылка: 404", @@ -2775,5 +2774,7 @@ "registration.component.form.reasonToJoin": "прычына рэгістрацыі", "registration.component.form.invalidConfirmPass": "Пацвярджэнне пароля не супадае пароль", "registration.component.form.confirmPassword": "Пацвердзіць пароль", - "registration.component.form.sendConfirmationEmail": "Адправіць па электроннай пошце пацвярджэнне" + "registration.component.form.sendConfirmationEmail": "Адправіць па электроннай пошце пацвярджэнне", + "Enterprise": "прадпрыемства", + "UpgradeToGetMore_engagement-dashboard_Title": "аналітыка" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json index b4bd9d07a849..a4bdc836a471 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json @@ -973,7 +973,6 @@ "Enter_name_here": "Въведете име тук", "Enter_Normal": "Нормален режим (изпратете с Enter)", "Enter_to": "Влезте в", - "Enterprise": "начинание", "Entertainment": "забавление", "Error": "Грешка", "Error_404": "Грешка: 404", @@ -2749,5 +2748,7 @@ "registration.component.form.reasonToJoin": "Причина за присъединяване", "registration.component.form.invalidConfirmPass": "Потвърждението на паролата не съвпада с паролата", "registration.component.form.confirmPassword": "Потвърдите паролата", - "registration.component.form.sendConfirmationEmail": "Изпратете имейл за потвърждение" + "registration.component.form.sendConfirmationEmail": "Изпратете имейл за потвърждение", + "Enterprise": "начинание", + "UpgradeToGetMore_engagement-dashboard_Title": "анализ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json index 81135ed5fa0d..ff757e76e6ca 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json @@ -970,7 +970,6 @@ "Enter_name_here": "Unesite ime", "Enter_Normal": "Normalni način rada (pošalji s Enterom)", "Enter_to": "Uđi u ", - "Enterprise": "Poduzeće", "Entertainment": "Zabava", "Error": "Pogreška", "Error_404": "Pogreška: 404", @@ -2745,5 +2744,7 @@ "registration.component.form.reasonToJoin": "Razlog pridruživanja", "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", - "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email" + "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email", + "Enterprise": "Poduzeće", + "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json index 9f0ef2e27a74..f61d28735fe6 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -426,6 +426,7 @@ "App_author_homepage": "pàgina d'inici de l'autor", "App_Details": "Detalls de l’Aplicació", "App_Information": "Informació de l'aplicació", + "Apps_context_enterprise": "Empresa", "App_Installation": "Instal·lació de l'aplicació", "App_status_auto_enabled": "Actiu", "App_status_constructed": "Construït", @@ -449,7 +450,6 @@ "Apply": "Aplicar", "Apply_and_refresh_all_clients": "Aplicar i refrescar tots els clients", "Apps": "Aplicacions", - "Apps_context_enterprise": "Empresa", "Apps_context_installed": "Instal·lat", "Apps_Engine_Version": "Versió del Motor d'Aplicacions", "Apps_Essential_Alert": "Aquesta aplicació és essencial per als següents esdeveniments:", @@ -835,8 +835,6 @@ "Close": "Tanca", "Close_chat": "Tancar xat", "Close_room_description": "Esteu a punt de tancar aquest xat. Esteu segur que voleu continuar?", - "Close_to_seat_limit_banner_warning": "* Et queden [{{seats}}] llocs * \nAquest espai de treball s'acosta al seu límit de llocs. Una vegada que s'aconsegueix el límit, no es poden afegir nous membres. * [Sol·licitar més llocs] ({{url}}) *", - "Close_to_seat_limit_warning": "No es poden crear nous membres una vegada que s'arriba al límit de seients.", "close-livechat-room": "Tancar Room de Livechat", "close-livechat-room_description": "Permís per tancar la sala d'LiveChat actual", "Close_menu": "Tanca el menú", @@ -870,8 +868,6 @@ "Cloud_register_offline_finish_helper": "Després de completar el procés de registre en Cloud Console, hauria d'aparèixer un text. Enganxeu-lo aquí per finalitzar el registre.", "Cloud_register_offline_helper": "Els espais de treball es poden registrar manualment si restringiu l'accés a la xarxa o l'espai d'aire. Copieu el text a continuació i aneu a la nostra consola al núvol per completar el procés.", "Cloud_register_success": "El seu espai de treball s'ha registrat correctament!", - "Cloud_registration_pending_html": " Les notificacions en dispositius mòbils no funcionessin fins que el registre hagi finalitzat. Llegir més ", - "Cloud_registration_pending_title": "El registre en el núvol encara està pendent", "Cloud_registration_required": "Cal registrar-se", "Cloud_registration_required_description": "Sembla que durant la configuració no va triar registrar el seu espai de treball.", "Cloud_registration_required_link_text": "Feu clic aquí per registrar el vostre espai de treball.", @@ -1485,7 +1481,7 @@ "E2E_Encryption_Password_Explanation": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar la contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e.", "E2E_key_reset_email": "Notificació de reinici de clau E2E", "E2E_password_request_text": "Per accedir als seus grups privats xifrats i als missatges directes, introdueixi la contrasenya de xifrat.
Necessites introduir aquesta contrasenya per xifrar / desxifrar els teus missatges en cada client que utilitzis, ja que la clau no s'emmagatzema en el servidor.", - "E2E_password_reveal_text": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar aquesta contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e. Obtingueu més informació aquí!

La vostra contrasenya és:%s

Aquesta és una contrasenya generada automàticament, podeu configurar una nova contrasenya per a la vostra clau de xifrat en qualsevol moment des de qualsevol navegador que hagi introduït la contrasenya existent.
Aquesta contrasenya només s'emmagatzema en aquest navegador fins que la deseu i descarteu aquest missatge.", + "E2E_password_reveal_text": "Ara podeu crear grups privats xifrats i missatges directes. També podeu canviar els grups privats o DM existents a xifrats.

Aquest és un xifratge d'extrem a extrem, de manera que la clau per codificar / descodificar els seus missatges no es desarà al servidor. Per això, heu de desar aquesta contrasenya en un lloc segur. Se us demanarà que l'introduïu en altres dispositius on vulgueu utilitzar el xifratge e2e. Obtingueu més informació aquí!

La vostra contrasenya és:{{randomPassword}}

Aquesta és una contrasenya generada automàticament, podeu configurar una nova contrasenya per a la vostra clau de xifrat en qualsevol moment des de qualsevol navegador que hagi introduït la contrasenya existent.
Aquesta contrasenya només s'emmagatzema en aquest navegador fins que la deseu i descarteu aquest missatge.", "E2E_Reset_Email_Content": "S'ha desconnectat automàticament. Quan torneu a iniciar sessió, Rocket.Chat generarà una nova clau i restaurarà el vostre accés a qualsevol sala xifrada que tingui un o més membres en línia. A causa de la naturalesa del xifratge E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", "E2E_Reset_Key_Explanation": "Aquesta opció eliminarà la clau E2E actual i tancarà la sessió.
Quan torneu a iniciar sessió, Rocket.Chat us generarà una nova clau i restaurarà l'accés a qualsevol sala xifrada que tingui un o més membres en línia.
A causa de la naturalesa del xifratge E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", "E2E_Reset_Other_Key_Warning": "Restablir la clau E2E actual tancarà la sessió de l'usuari. Quan l'usuari torna a iniciar sessió, Rocket.Chat generarà una nova clau i restaurarà l'accés de l'usuari a qualsevol sala xifrada que tingui un o més membres en línia. A causa de la naturalesa de l'xifrat E2E, Rocket.Chat no podrà restaurar l'accés a cap sala xifrada que no tingui membres en línia.", @@ -1567,6 +1563,8 @@ "email_style_description": "Eviteu els selectors imbricats", "email_style_label": "Estil de correu electrònic", "Email_subject": "Assumpte", + "Enterprise_License": "Llicència d’empresa", + "Enterprise_License_Description": "Si el vostre espai de treball està registrat i la llicència la proporciona Rocket.Chat Cloud, no cal que actualitzeu manualment la llicència aquí.", "Email_verified": "Adreça de correu-e verificada", "Email_sent": "Correu electrònic enviat", "Emoji": "Emoji", @@ -1618,9 +1616,6 @@ "Enter_Normal": "Mode normal (envia amb Enter)", "Enter_to": "Entra a", "Enter_your_E2E_password": "Introduïu la vostra contrasenya E2E", - "Enterprise": "Empresa", - "Enterprise_License": "Llicència d’empresa", - "Enterprise_License_Description": "Si el vostre espai de treball està registrat i la llicència la proporciona Rocket.Chat Cloud, no cal que actualitzeu manualment la llicència aquí.", "Entertainment": "Entreteniment", "Error": "Error", "Error_404": "Error: 404", @@ -1642,7 +1637,7 @@ "error-avatar-invalid-url": "URL de l'avatar no vàlid: {{url}}", "error-avatar-url-handling": "Error durant la configuració d'avatar d'usuari des de l'adreça URL ({{url}}) per a l'usuari {{username}}", "error-business-hours-are-closed": "L'horari comercial està tancat", - "error-blocked-username": "{{field}} està bloquejat i no es pot utilitzar.", + "error-blocked-username": "**{{field}}** està bloquejat i no es pot utilitzar.", "error-canned-response-not-found": "Resposta predefinida no trobada", "error-cannot-delete-app-user": "No es permet esborrar l'usuari de l'aplicació, desinstal l'aplicació corresponent per eliminar-la.", "error-cant-invite-for-direct-room": "No es pot convidar a l'usuari a sales directes", @@ -2554,7 +2549,7 @@ "leave-c_description": "Permís per sortir de canals", "leave-p": "Sortir de grups privats", "leave-p_description": "Permís per sortir de grups privats", - "Lets_get_you_new_one": "Et portem un de nou!", + "Lets_get_you_new_one_": "Et portem un de nou!", "List_of_Channels": "Llista de canals", "List_of_departments_for_forward": "Llista de departaments permesos per reenviament (opcional)", "List_of_departments_for_forward_description": "Permetre establir una llista restringida de departaments que poden rebre xats d'aquest departament", @@ -3375,7 +3370,6 @@ "Random": "Aleatori", "Rate_Limiter_Limit_RegisterUser": "Trucades de números predeterminats al limitador de velocitat per registrar un usuari", "Rate_Limiter_Limit_RegisterUser_Description": "Nombre de trucades predeterminades per a usuaris que registren punts finals (REST i API en temps real), permeses dins del rang de temps definit a la secció API Rate Limiter.", - "Reached_seat_limit_banner_warning": "* No hi ha més llocs disponibles * \nAquest espai de treball ha arribat al seu límit de llocs, per la qual cosa no poden unir-se més membres. * [Sol·licitar més llocs] ({{url}}) *", "React_when_read_only": "Permetre reaccions", "React_when_read_only_changed_successfully": "Permetre reaccions en 'només lectura'", "Reacted_with": "es fa reaccionar amb", @@ -3459,11 +3453,6 @@ "Report_this_message_question_mark": "Informar d'aquest missatge?", "Reporting": "Informes", "Request": "Sol·licitud", - "Request_seats": "Sol.licitar llocs", - "Request_more_seats": "Sol·licita més llocs.", - "Request_more_seats_out_of_seats": "No podeu afegir membres perquè aquest espai de treball no té lloc, demani més llocs.", - "Request_more_seats_sales_team": "Una vegada que enviï la seva sol·licitud, el nostre equip de vendes l'analitzarà i es comunicarà amb vostè en els pròxims dies.", - "Request_more_seats_title": "Sol·licitar més llocs", "Request_comment_when_closing_conversation": "Sol·licitar un comentari al tancar la conversa", "Request_comment_when_closing_conversation_description": "Si està activat, l'agent haurà de fer un comentari abans que es tanqui la conversa.", "Request_tag_before_closing_chat": "Sol·licitar etiqueta(es) abans de tancar la conversa", @@ -4694,6 +4683,11 @@ "registration.component.form.confirmPassword": "Confirma la contrasenya", "registration.component.form.confirmation": "Confirmació", "registration.component.form.sendConfirmationEmail": "Envia correu-e de confirmació", + "onboarding.component.form.action.pasteHere": "Enganxa aquí ...", + "onboarding.form.registerOfflineForm.title": "Registra't sense connexió", "RegisterWorkspace_Features_Marketplace_Title": "Mercat", - "RegisterWorkspace_Features_Omnichannel_Title": "LiveChat" + "RegisterWorkspace_Features_Omnichannel_Title": "LiveChat", + "Enterprise": "Empresa", + "UpgradeToGetMore_engagement-dashboard_Title": "Analítiques", + "UpgradeToGetMore_auditing_Title": "Auditoria de missatges" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json index c2fbddd26d29..1c5931521c91 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -713,8 +713,6 @@ "Cloud_register_offline_finish_helper": "Po dokončení procesu registrace v cloudové konzoli obdržíte textový řežězec. Pro dokončení registrace jej vložte sem.", "Cloud_register_offline_helper": "Pracovní prostory lze ručně zaregistrovat, pokud je k nim omezen síťový přístup. Zkopírujte níže uvedený text a dokončete proces pomocí naší cloudové konzole.", "Cloud_register_success": "Váš pracovní prostor byl úspěšně zaregistrován!", - "Cloud_registration_pending_html": "Mobilní oznámení nebudou fungovat, dokud není registrace dokončena. Další informace ", - "Cloud_registration_pending_title": "Cloudová registrace stále čeká", "Cloud_registration_required": "Povinná registrace", "Cloud_registration_required_description": "Vypadá to, že jste se nevybral/a zaregistraci svého pracovního prostoru během instalace .", "Cloud_registration_required_link_text": "Klikněte zde pro registraci svého pracovního prostoru.", @@ -1271,7 +1269,7 @@ "E2E_Encryption_Password_Change": "Změnit heslo pro šifrování", "E2E_Encryption_Password_Explanation": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro šifrování/dešifrování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte své heslo uložit na bezpečné místo. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E.", "E2E_password_request_text": "Chcete-li získat přístup k šifrovaným soukromým skupinám a přímým zprávám, zadejte své šifrovací heslo.
Toto heslo musíte zadat, abyste mohli šifrovat/dešifrovat zprávy u každého klienta, který používáte, protože klíč není uložen na serveru.", - "E2E_password_reveal_text": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro kódování / dekódování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte toto heslo uložit někde v bezpečí. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E. Více informací zde

Vaše heslo je: %s

Jedná se o automaticky generované heslo. Nové heslo pro šifrovací klíč můžete nastavit kdykoli z jakéhokoli prohlížeče, do kterého jste zadali existující heslo.
Toto heslo je uloženo pouze v tomto prohlížeči dokud heslo neuložíte a nepotvrdíte tuto zprávu.", + "E2E_password_reveal_text": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro kódování / dekódování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte toto heslo uložit někde v bezpečí. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E. Více informací zde

Vaše heslo je: {{randomPassword}}

Jedná se o automaticky generované heslo. Nové heslo pro šifrovací klíč můžete nastavit kdykoli z jakéhokoli prohlížeče, do kterého jste zadali existující heslo.
Toto heslo je uloženo pouze v tomto prohlížeči dokud heslo neuložíte a nepotvrdíte tuto zprávu.", "E2E_Reset_Key_Explanation": "Tato možnost odstraní váš aktuální E2E klíč a odhlásí vás.
Když se znovu přihlásíte, Rocket.Chat vygeneruje nový klíč a obnoví váš přístup do jakékoli šifrované místnosti, která má jednoho nebo více členů online.
Kvůli povaze šifrování E2E nebude Rocket.Chat schopen obnovit přístup do šifrované místnosti, která nemá žádného člena online.", "E2E_Reset_Other_Key_Warning": "Odstraněním E2E klíče současně odhlásíte uživatele. Poté co se znovu přihlásí Rocket.Chat vygeneruje nový klíč a obnoví přístup do šifrovaných místností kde je alespoň jeden uživatel připoje. Vzhledem k povaze koncového šifrování, Rocket.Chat nelze obnovit přístup do místnosti kde není ani jeden uživatel právě připojen", "Edit": "Editovat", @@ -1336,6 +1334,8 @@ "email_style_description": "Vyhnout se vnořeným selektorům", "email_style_label": "Styl e-mailu", "Email_subject": "Předmět", + "Enterprise_License": "Enterprise licence", + "Enterprise_License_Description": "Pokud je vaše prostředí registrováno a máte od Rocket.Chat licenci není potřeba ji zde ručně doplňovat", "Email_verified": "Email ověřen", "Emoji": "Emotikony", "EmojiCustomFilesystem": "Vlastní filesystem pro emotikony", @@ -1372,9 +1372,6 @@ "Enter_Normal": "Normální mód (odeslání po stisku klávesy enter)", "Enter_to": "Enter", "Enter_your_E2E_password": "Zadejte heslo E2E", - "Enterprise": "Korporace", - "Enterprise_License": "Enterprise licence", - "Enterprise_License_Description": "Pokud je vaše prostředí registrováno a máte od Rocket.Chat licenci není potřeba ji zde ručně doplňovat", "Entertainment": "Zábava", "Error": "Chyba", "Error_404": "Chyba: 404 nenalezeno", @@ -2172,7 +2169,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "Pokud nechcete zobrazovat roli, ponechte pole popisu prázdné", "leave-c": "Odejít z místností", "leave-p": "Opustit soukromé skupiny", - "Lets_get_you_new_one": "Pojďme si pořídit nový!", + "Lets_get_you_new_one_": "Pojďme si pořídit nový!", "List_of_Channels": "Seznam místností", "List_of_departments_for_forward": "Seznam oddělení povolených pro přesměrování (volitelné)", "List_of_departments_for_forward_description": "Omezit oddělení do kterých je možné přesměrovat konverzace z aktuálního", @@ -3962,5 +3959,10 @@ "registration.component.form.reasonToJoin": "Důvod připojení", "registration.component.form.invalidConfirmPass": "Hesla nesouhlasí", "registration.component.form.confirmPassword": "Potvrďte heslo", - "registration.component.form.sendConfirmationEmail": "Zaslat potvrzovací e-mail" + "registration.component.form.sendConfirmationEmail": "Zaslat potvrzovací e-mail", + "onboarding.component.form.action.pasteHere": "Vložte sem ...", + "onboarding.form.registerOfflineForm.title": "Registrovat ručně", + "Enterprise": "Korporace", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytika", + "UpgradeToGetMore_auditing_Title": "Audit zpráv" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json index 0f939e6b345e..c3b473dab7ce 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json @@ -972,7 +972,6 @@ "Enter_name_here": "Rhowch enw yma", "Enter_Normal": "Modd arferol (anfonwch â Enter)", "Enter_to": "Rhowch i", - "Enterprise": "Menter", "Entertainment": "Adloniant", "Error": "Gwall", "Error_404": "Gwall: 404", @@ -2748,5 +2747,7 @@ "registration.component.form.reasonToJoin": "Rheswm i Ymuno", "registration.component.form.invalidConfirmPass": "Nid yw'r cadarnhad cyfrinair yn cyfateb i'r cyfrinair", "registration.component.form.confirmPassword": "Cadarnhau eich cyfrinair", - "registration.component.form.sendConfirmationEmail": "Anfon ebost cadarnhad" + "registration.component.form.sendConfirmationEmail": "Anfon ebost cadarnhad", + "Enterprise": "Menter", + "UpgradeToGetMore_engagement-dashboard_Title": "Dadansoddiadau" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json index 66e3bb1f035e..d9aaf3f0a003 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json @@ -717,8 +717,6 @@ "Cloud_register_offline_finish_helper": "Efter afslutningen af registreringsprocessen i Cloud Console, skal du præsenteres for noget tekst. Indsæt det her for at afslutte registreringen.", "Cloud_register_offline_helper": "Arbejdsområder kan registreres manuelt, hvis der ikke er netværksadgang eller den er begrænset. Kopier teksten nedenfor og gå til vores Cloud Console for at afslutte processen.", "Cloud_register_success": "Dit workspace er blevet registreret!", - "Cloud_registration_pending_html": " Mobil-notifikationer fungerer ikke før registreringen er afsluttet. Lær mere ", - "Cloud_registration_pending_title": "Cloudregistrering afventer stadig", "Cloud_registration_required": "Registrering er påkrævet", "Cloud_registration_required_description": "Under opsætningen valgte du tilsyneladende ikke at registrere dit workspace.", "Cloud_registration_required_link_text": "Tryk her for at registrere dit workspace.", @@ -1277,7 +1275,7 @@ "E2E_Encryption_Password_Explanation": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er ende-til-ende-kryptering så nøglen til at kode/afkode dine beskeder gemmes ikke på serveren. Derfor skal du gemme dit kodeord et sikkert sted. Du bliver bedt om at indtaste det på andre enheder hvor du vil bruge ende-til-ende-kryptering på.", "E2E_key_reset_email": "E2E Key nulstilning notifikation", "E2E_password_request_text": "For at få adgang til dine krypterede private grupper og direkte beskeder, skal du indtaste dit krypteringsadgangskode.
Du skal indtaste denne adgangskode for at kryptere/dekryptere dine meddelelser på hver klient du bruger, da nøglen ikke er gemt på serveren.", - "E2E_password_reveal_text": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er end-to-end-kryptering, så nøglen til at kryptere/dekryptere dine beskeder gemmes ikke på serveren. Derfor skal du gemme denne kode et sikkert sted. Du bliver bedt om at indtaste det på andre enheder du vil bruge end-to-end-kryptering på. Lær mere her!

Dit kodeord er: %s

Dette er en automatisk genereret kode. Du kan angive en ny kode til din krypteringsnøgle når som helst fra en hvilken som helst browser, hvor du har indtastet den eksisterende kode.
Dette kodeord gemmes kun i denne browser indtil du gemmer koden og afslutter denne meddelelse.", + "E2E_password_reveal_text": "Du kan nu oprette krypterede private grupper og direkte beskeder. Du kan også ændre eksisterende private grupper eller direkte beskeder til at være krypteret.

Dette er end-to-end-kryptering, så nøglen til at kryptere/dekryptere dine beskeder gemmes ikke på serveren. Derfor skal du gemme denne kode et sikkert sted. Du bliver bedt om at indtaste det på andre enheder du vil bruge end-to-end-kryptering på. Lær mere her!

Dit kodeord er: {{randomPassword}}

Dette er en automatisk genereret kode. Du kan angive en ny kode til din krypteringsnøgle når som helst fra en hvilken som helst browser, hvor du har indtastet den eksisterende kode.
Dette kodeord gemmes kun i denne browser indtil du gemmer koden og afslutter denne meddelelse.", "E2E_Reset_Email_Content": "Du er automatisk blevet logget ud. Når du logger ind igen, genererer Rocket.Chat en ny nøgle og gendanner din adgang til ethvert krypteret rum, der har et eller flere medlemmer online. På grund af E2E-krypteringens art, er Rocket.Chat ikke i stand til at gendanne adgang til krypterede rum, der ikke har noget medlem online.", "E2E_Reset_Key_Explanation": "Denne mulighed fjerner din nuværende E2E-nøgle og logger dig ud.
Når du logger ind igen vil Rocket.Chat generere dig en ny nøgle og gendanne din adgang til ethvert krypteret rum der har et eller flere medlemmer online.
På grund af E2E-krypteringens natur, vil Rocket.Chat ikke være i stand til at gendanne adgang til nogen krypterede rum der ikke har noget medlem online.", "E2E_Reset_Other_Key_Warning": "Nulstilling af den aktuelle E2E-nøgle logge brugeren ud. Når brugeren logger på igen, vil Rocket.Chat generere en ny nøgle og gendanne brugeradgangen til alle krypterede rum, der har et eller flere medlemmer online. På grund af E2E-krypteringens, er Rocket.Chat ikke i stand til at gendanne adgang til noget krypteret rum, der ikke har noget medlem online.", @@ -1344,6 +1342,8 @@ "email_style_description": "Undgå nedarvede valg", "email_style_label": "E-mail-Style", "Email_subject": "Emne", + "Enterprise_License": "Koncernlicens", + "Enterprise_License_Description": "Hvis dit workspace er registreret og en licens er tildelt af Rocket.Chat Cloud, behøver du ikke manuelt at opdatere licensen her", "Email_verified": "Email bekræftet", "Emoji": "Emoji", "EmojiCustomFilesystem": "Brugerdefineret emoji-filsystem", @@ -1380,9 +1380,6 @@ "Enter_Normal": "Normal mode (send med Enter)", "Enter_to": "Indtast til", "Enter_your_E2E_password": "Indtast din E2E adgangskode", - "Enterprise": "Firma", - "Enterprise_License": "Koncernlicens", - "Enterprise_License_Description": "Hvis dit workspace er registreret og en licens er tildelt af Rocket.Chat Cloud, behøver du ikke manuelt at opdatere licensen her", "Entertainment": "Underholdning", "Error": "Fejl", "Error_404": "Fejl: 404", @@ -2183,7 +2180,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "Lad beskrivelsesfeltet være tomt, hvis du ikke vil vise rollen", "leave-c": "Forlad kanaler", "leave-p": "Forlad private grupper", - "Lets_get_you_new_one": "Lad os finde en ny til dig!", + "Lets_get_you_new_one_": "Lad os finde en ny til dig!", "List_of_Channels": "Liste over kanaler", "List_of_departments_for_forward": "Liste over tilladte afdelinger til videresendelse (valgfrit)", "List_of_departments_for_forward_description": "Tillad at indstille en begrænset liste over afdelinger der kan modtage chats fra denne afdeling", @@ -3984,5 +3981,10 @@ "registration.component.form.reasonToJoin": "Årsag til at deltage", "registration.component.form.invalidConfirmPass": "Adgangskodebekræftelsen stemmer ikke overens med adgangskoden", "registration.component.form.confirmPassword": "Bekræft dit kodeord", - "registration.component.form.sendConfirmationEmail": "Send bekræftelses-email" + "registration.component.form.sendConfirmationEmail": "Send bekræftelses-email", + "onboarding.component.form.action.pasteHere": "Indsæt her ...", + "onboarding.form.registerOfflineForm.title": "Registrer offline", + "Enterprise": "Firma", + "UpgradeToGetMore_engagement-dashboard_Title": "Analyse", + "UpgradeToGetMore_auditing_Title": "Meddelelsesovervågning" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json index 68b45bb97714..18325e65a0f9 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -976,7 +976,6 @@ "Enter_name_here": "Namen hier eingeben", "Enter_Normal": "Normaler Modus (mit Eingabetaste senden)", "Enter_to": "Enter-Taste: ", - "Enterprise": "Unternehmen", "Entertainment": "Unterhaltung", "Error": "Fehler", "Error_404": "Fehler 404", @@ -2757,5 +2756,7 @@ "registration.component.form.reasonToJoin": "Grund zu Join", "registration.component.form.invalidConfirmPass": "Die Passwörter stimmen nicht überein.", "registration.component.form.confirmPassword": "Bestätigen Sie Ihr Passwort.", - "registration.component.form.sendConfirmationEmail": "Bestätigungsmail versenden" + "registration.component.form.sendConfirmationEmail": "Bestätigungsmail versenden", + "Enterprise": "Unternehmen", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json index c5248fc959b9..2248f5ef3022 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de-IN.i18n.json @@ -192,8 +192,10 @@ "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Das maximale Delta bestimmt, wie viele Token zu einem bestimmten Zeitpunkt gültig sind. Token werden alle 30 Sekunden generiert und gelten für (30 * Maximum Delta) Sekunden. \nBeispiel: Wenn ein maximales Delta auf 10 gesetzt ist, kann jedes Token bis zu 300 Sekunden vor oder nach dem Zeitstempel verwendet werden. Dies ist nützlich, wenn die Uhr des Clients nicht richtig mit dem Server synchronisiert ist.", "Accounts_UseDefaultBlockedDomainsList": "Standardliste für blockierte Domains verwenden", "Accounts_UseDNSDomainCheck": "DNS-Domain-Check verwenden", + "API_EmbedDisabledFor": "Einbettungen für Benutzer deaktivieren", "Accounts_UserAddedEmail_Default": "

Willkommen zu [Site_Name]

Besuche [Site_URL] und probiere noch heute die beste Open-Source-Chat-Lösung aus.

Du kannst Dich mit den folgenden Daten anmelden: E-Mail-Adresse: [email] Passwort: [password]Es kann sein, dass Du Dein Passwort nach der ersten Anmeldung ändern musst.", "Accounts_UserAddedEmail_Description": "Du kannst folgenden Platzhalter verwenden: \n - `[name]`, `[fname]`, `[lname]` für den vollständigen Namen des Benutzers, Vornamen oder Nachnamen. \n - [email] für die E-Mail-Adresse des Benutzers. \n - [password] für das Kennwort des Benutzers. \n - [Site_Name] und `[Site_URL]` für den Anwendungsname und die URL. ", + "API_EmbedDisabledFor_Description": "Kommaseparierte Liste von Benutzernamen zum Einbetten von Link-Vorschauen", "Accounts_UserAddedEmailSubject_Default": "Du wurdest zu [Site_Name] hinzugefügt", "Activate": "Aktivieren", "Activity": "Aktivität", @@ -217,6 +219,7 @@ "add-user-to-any-p-room_description": "Berechtigung, Benutzer jedem privaten Kanal hinzuzufügen", "add-user-to-joined-room": "Benutzer jedem beigetretenen Kanal hinzufügen", "add-user-to-joined-room_description": "Berechtigung, Benutzer jedem beigetretenen Kanal hinzuzufügen", + "Apps_Framework_enabled": "Das App Framework aktivieren", "Adding_OAuth_Services": "Hinzufügen von OAuth-Services", "Adding_permission": "Berechtigung hinzufügen", "Adding_user": "Füge BenutzerIn hinzu", @@ -236,11 +239,20 @@ "Alias_Format": "Alias-Format", "Alias_Format_Description": "Nachricht von Slack mit einem Alias importieren; %s wird mit dem Benutzernamen ersetzt. Wenn Feld leer bleibt, wird kein Alias benutzt.", "Alias_Set": "Alias setzen", + "AutoLinker_Email": "AutoLinker für E-Mail-Adressen", "Aliases": "Aliase", + "AutoLinker_Phone": "AutoLinker für Telefonnummern", + "AutoLinker_Phone_Description": "Telefonnummern automatisch verlinken. z.B. `(123) 456-7890`", "All": "Alle", + "AutoLinker_StripPrefix": "AutoLinker Präfix entfernen", + "AutoLinker_StripPrefix_Description": "Kurze Anzeige. z.B. https://rocket.chat => rocket.chat", "All_added_tokens_will_be_required_by_the_user": "Alle hinzugefügten Tokens werden vom Benutzer verlangt werden", + "AutoLinker_Urls_Scheme": "Schema des AutoLinkers: // URLs", "All_channels": "Alle Kanäle", + "AutoLinker_Urls_TLD": "AutoLinker TLD-URLs", + "AutoLinker_Urls_www": "AutoLinker \"www\"-URLs", "All_logs": "Alle Protokolle", + "AutoLinker_UrlsRegExp": "AutoLinker RegExp für URLs", "All_messages": "Alle Nachrichten", "All_users": "Alle Benutzer", "All_users_in_the_channel_can_write_new_messages": "Alle Benutzer in diesem Kanal dürfen Nachrichten schreiben", @@ -252,6 +264,7 @@ "Allow_switching_departments": "Erlaube Besuchern, Abteilungen zu wechseln", "Almost_done": "Fast geschafft", "Alphabetical": "alphabetisch", + "bold": "fett", "Always_open_in_new_window": "Immer in neuem Fenster öffnen", "Analytics": "Analytics", "Analytics_features_enabled": "Aktivierte Funktionen", @@ -276,14 +289,12 @@ "API_Drupal_URL_Description": "Beispiel: https://domain.de (ohne abschließenden /)", "API_Embed": "Link-Vorschauen einbetten", "API_Embed_Description": "Eingebettete Link-Vorschau für Links, die von Benutzern gepostet wurden.", - "API_Embed_UserAgent": "User Agent des Requests übermitteln", - "API_EmbedCacheExpirationDays": "Tage bis zum Ablauf den eingebetteten Caches", - "API_EmbedDisabledFor": "Einbettungen für Benutzer deaktivieren", - "API_EmbedDisabledFor_Description": "Kommaseparierte Liste von Benutzernamen zum Einbetten von Link-Vorschauen", "API_EmbedIgnoredHosts": "Einbettungen für Hosts deaktivieren", "API_EmbedIgnoredHosts_Description": "Kommagetrennte Liste von Hosts oder CIDR-Adressen, z. B. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "Sichere Ports", "API_EmbedSafePorts_Description": "Kommagetrennte Liste der Ports, für die eine Vorschau erlaubt ist.", + "API_Embed_UserAgent": "User Agent des Requests übermitteln", + "API_EmbedCacheExpirationDays": "Tage bis zum Ablauf den eingebetteten Caches", "API_Enable_CORS": "CORS", "API_Enable_Direct_Message_History_EndPoint": "Endpunkt für den Verlauf von Direktnachrichten", "API_Enable_Direct_Message_History_EndPoint_Description": "Aktiviere `/api/v1/im.history.others`. Hierüber ist es möglich, Direktnachrichten einzusehen, an denen der Benutzer nicht beteiligt ist.", @@ -309,7 +320,9 @@ "API_Personal_Access_Tokens_To_REST_API": "Persönlicher Zugangsschlüssel für die REST API", "API_Shield_Types": "Shield Typen", "API_Shield_Types_Description": "Shield Typen. Konfiguration mit einer komma-separierten Liste. Optionen: `online`, `channel` oder `*` für \"Alles\"", + "Apps_Framework_Development_Mode": "Entwicklungsmodus aktivieren", "API_Token": "API-Token", + "Apps_Framework_Development_Mode_Description": "Im Entwicklungsmodus können Apps installiert werden, die nicht vom Rocketchat Marketplace stammen.", "API_Tokenpass_URL": "Url des Tokenpass Servers", "API_Tokenpass_URL_Description": "Beispiel: `https://domain.com` (ohne Schrägstrich am Ende)", "API_Upper_Count_Limit": "Maximales Limit", @@ -343,12 +356,10 @@ "Apply_and_refresh_all_clients": "Anwenden und alle Clients aktualisieren", "Apps": "Apps", "Apps_Engine_Version": "Version der Anwendungsumgebung", - "Apps_Framework_Development_Mode": "Entwicklungsmodus aktivieren", - "Apps_Framework_Development_Mode_Description": "Im Entwicklungsmodus können Apps installiert werden, die nicht vom Rocketchat Marketplace stammen.", - "Apps_Framework_enabled": "Das App Framework aktivieren", "Apps_Marketplace_Login_Required_Description": "Um Apps aus dem Rocket.Chat Marketplace herunterladen zu können, muss der Arbeitsbereich registriert sein.", "Apps_Marketplace_Login_Required_Title": "Marketplace Login benötigt", "Apps_Settings": "App-Einstellungen", + "AutoLinker": "Auto Linker", "Apps_WhatIsIt": "Apps: Was ist das?", "Apps_WhatIsIt_paragraph1": "Ein neues Icon im Administrationsbereich! Was bedeutet das und was sind Apps?", "Apps_WhatIsIt_paragraph2": "Zunächst einmal beziehen sich Apps in diesem Zusammenhang nicht auf die mobilen Anwendungen. Tatsächlich wäre es am besten, sie in Form von Plugins oder fortgeschrittenen Integrationen zu betrachten.", @@ -387,16 +398,6 @@ "Auto_Translate": "Automatische Übersetzung", "auto-translate": "Automatische Übersetzung", "auto-translate_description": "Berechtigung, die automatische Überstzung zu verwenden", - "AutoLinker": "Auto Linker", - "AutoLinker_Email": "AutoLinker für E-Mail-Adressen", - "AutoLinker_Phone": "AutoLinker für Telefonnummern", - "AutoLinker_Phone_Description": "Telefonnummern automatisch verlinken. z.B. `(123) 456-7890`", - "AutoLinker_StripPrefix": "AutoLinker Präfix entfernen", - "AutoLinker_StripPrefix_Description": "Kurze Anzeige. z.B. https://rocket.chat => rocket.chat", - "AutoLinker_Urls_Scheme": "Schema des AutoLinkers: // URLs", - "AutoLinker_Urls_TLD": "AutoLinker TLD-URLs", - "AutoLinker_Urls_www": "AutoLinker \"www\"-URLs", - "AutoLinker_UrlsRegExp": "AutoLinker RegExp für URLs", "Automatic_Translation": "Automatische Übersetzung", "AutoTranslate": "Automatische Übersetzung", "AutoTranslate_APIKey": "API Key", @@ -437,7 +438,6 @@ "Blockstack_ButtonLabelText": "Text des Button-Labels", "Blockstack_Generate_Username": "Benutzernamen generieren", "Body": "Textkörper", - "bold": "fett", "bot_request": "Bot-Anfrage", "BotHelpers_userFields": "Benutzerfelder", "BotHelpers_userFields_Description": "CSV-Datei mit Benutzerfeldern die von Bot-Methoden genutzt werden dürfen.", @@ -801,6 +801,7 @@ "Country_Saudi_Arabia": "Saudi Arabien", "Country_Senegal": "Senegal", "Country_Serbia_and_Montenegro": "Serbien und Montenegro", + "inline_code": "Code", "Country_Seychelles": "Seychellen", "Country_Sierra_Leone": "Sierra Leone", "Country_Singapore": "Singapur", @@ -900,7 +901,6 @@ "Custom_Sound_Has_Been_Deleted": "Der eigene Ton wurde gelöscht.", "Custom_Sound_Info": "Info zu eigenen Tönen", "Custom_Sound_Saved_Successfully": "Der eigene Ton wurde erfolgreich gespeichert", - "Custom_Sounds": "Benutzerdefinierte Töne", "Custom_Translations": "Benutzerdefinierte Übersetzungen", "Custom_Translations_Description": "Ein gültiges JSON, in dem die Schlüssel Sprachkürzel sind, die wiederum Tupel von Schlüssel und Übersetzungen enthalten. Beispiel: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "anpassen", @@ -967,6 +967,7 @@ "Desktop_Notifications_Enabled": "Desktop-Benachrichtigungen sind aktiviert.", "Desktop_Notifications_Not_Enabled": "Desktopbenachrichtigungen sind nicht aktiviert", "Details": "Details", + "line": "Zeile", "Different_Style_For_User_Mentions": "Anderer Stil für Benutzer-Erwähnungen", "Direct_message_someone": "Jemandem eine Direktnachricht schicken", "Direct_Messages": "Direktnachrichten", @@ -1030,23 +1031,36 @@ "Dry_run": "Probelauf", "Dry_run_description": "Es wird nur eine E-Mail an die Adresse aus dem Feld \"Absender\" geschickt. Die E-Mail-Adresse muss zu einem gültigen Benutzer gehören.", "Duplicate_archived_channel_name": "Ein archivierter Kanal mit dem Namen '%s' existiert bereits.", + "Markdown_Headers": "Markdown-Überschriften", + "Markdown_Marked_Breaks": "Formatierte Umbrüche", "Duplicate_archived_private_group_name": "Eine archivierter private Gruppe mit dem Namen '%s' existiert bereits.", "Duplicate_channel_name": "Ein Kanal mit dem Namen '%s' existiert bereits", + "Markdown_Marked_GFM": "Formatierung mit Github Flavoured Markdown (GFM)", + "Markdown_Marked_Pedantic": "Pedantisch Formatieren", + "Markdown_Marked_SmartLists": "Formatierte smarte Listen", "Duplicate_private_group_name": "Eine private Gruppe mit dem Namen '%s' existiert bereits.", + "Markdown_Marked_Smartypants": "Formatiere mit intelligenter Punktsetzung (\"Smartypants\")", "Duplicated_Email_address_will_be_ignored": "Doppelte E-Mail_Adressen werden ignoriert.", + "Markdown_Marked_Tables": "Formatierte Tabellen", "duplicated-account": "Doppeltes Konto", "E2E Encryption": "Ende-zu-Ende-Verschlüsselung", + "Markdown_Parser": "Markdown Parser", + "Markdown_SupportSchemesForLink": "Unterstützte Markdown- Schemata für Links", + "Markdown_SupportSchemesForLink_Description": "Kommata getrennte Liste von erlaubten Schemata", "E2E_Enable_alert": "Dieses Feature ist derzeit im Beta-Test. Bitte melde Fehler unter github.com/RocketChat/Rocket.Chat/issues und beachte folgende Auswirkungen:
- Verschlüsselte Nachrichten werden durch die Suche nicht gefunden werden.
- Die mobilen Apps unterstützen derzeit noch keine verschlüsselten Nachrichten.
- Bots werden wahrscheinlich keine verschlüsselten Nachrichten verarbeiten können.
- Uploads werden in dieser Version nicht verschlüsselt werden.", "E2E_Enable_description": "Aktiviere diese Option, um Direktnachrichten und private Gruppen verschlüsseln zu können.", "E2E_Enabled": "E2E aktiviert", "E2E_Encryption_Password_Explanation": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Bitte bewahre Dein Passwort an einem sicheren Ort auf - Du musst ihn auf anderen Geräten eingeben, auf denen Du die Ende-zu-Ende-Verschlüsselung verwenden möchtest.", "E2E_password_request_text": "Gib Dein Verschlüsselungskennwort ein, um auf Deine verschlüsselten privaten Gruppen und Direktnachrichten zuzugreifen.
Du musst dieses Kennwort eingeben, da der Schlüssel nirgends gespeichert ist.", - "E2E_password_reveal_text": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher musst Du den Schlüssel an einem sicheren Ort aufbewahren - Du musst ihn auf anderen Geräten eingeben, auf denen Due die Ende-zu-Ende-Verschlüsselung verwenden möchtest.Erfahre hier mehr!

Dein Passwort lautet: %s

Es handelt sich um ein generiertes Passwort. Du kannst jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Deinem Browser nur so lange zwischengespeichert, bis Du ein neues Passwort vergeben und diese Nachricht bestätigt hast.", + "E2E_password_reveal_text": "Du kannst jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Du kannst auch vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher musst Du den Schlüssel an einem sicheren Ort aufbewahren - Du musst ihn auf anderen Geräten eingeben, auf denen Due die Ende-zu-Ende-Verschlüsselung verwenden möchtest.Erfahre hier mehr!

Dein Passwort lautet: {{randomPassword}}

Es handelt sich um ein generiertes Passwort. Du kannst jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Deinem Browser nur so lange zwischengespeichert, bis Du ein neues Passwort vergeben und diese Nachricht bestätigt hast.", "Edit": "Bearbeiten", "Edit_Custom_Field": "Benutzerdefinierte Felder bearbeiten", "Edit_Department": "Abteilung bearbeiten", + "Message_AllowSnippeting": "Erlauben, Snippets aus Nachrichten zu erstellen", "Edit_previous_message": "`%s` - Bearbeite vorherige Nachricht", "Edit_Trigger": "Trigger bearbeiten", + "Message_Attachments_GroupAttach": "Schaltflächen für Anhänge gruppieren", + "Message_Attachments_GroupAttachDescription": "Dies sorgt dafür, dass die Schaltflächen in einem erweiterbaren Menü untergebracht werden. So wird weniger Bildschirmplatz benötigt.", "edit-message": "Nachricht bearbeiten", "edit-message_description": "Berechtigung, eine Nachricht in einem Raum zu bearbeiten", "edit-other-user-active-status": "Online-Status anderer Benutzer ändern", @@ -1063,10 +1077,13 @@ "edit-room_description": "Berechtigung, einen Raum zu bearbeiten (Name, Thema, Sichtbarkeit, Archivierung)", "edit-room-retention-policy": "Bearbeiten der Aufbewahrungsrichtlinie für Räume", "edit-room-retention-policy_description": "Berechtigung zum Bearbeiten der Aufbewahrungsrichtlinie eines Raums, um darin enthaltene Nachrichten automatisch zu löschen", + "multi_line": "Mehrzeilig", "edited": "bearbeitet", "Editing_room": "Raum bearbeiten", "Editing_user": "BenutzerIn bearbeiten", + "Message_ShowEditedStatus": "Bearbeitungsstatus anzeigen", "Education": "Bildung", + "Message_ShowFormattingTips": "Formatierungshilfe anzeigen", "Email": "E-Mail", "Email_address_to_send_offline_messages": "E-Mail-Adresse zum Senden von Offline-Nachrichten", "Email_already_exists": "Die E-Mail-Adresse existiert bereits.", @@ -1113,7 +1130,6 @@ "Enter_Normal": "Normaler Modus (mit Eingabetaste senden)", "Enter_to": "Eingabetaste: ", "Enter_your_E2E_password": "Gib Dein Passwort für die Ende-Zu-Ende-Verschlüsselung ein", - "Enterprise": "Unternehmen", "Entertainment": "Unterhaltung", "Error": "Fehler", "Error_404": "Fehler: 404(nicht gefunden)", @@ -1259,6 +1275,7 @@ "FEDERATION_Status": "Status", "FEDERATION_Test_Setup_Error": "Ich konnte Deinen Server mit dieser Konfiguration nicht finden. Bitte überprüfe Deine Einstellungen.", "FEDERATION_Test_Setup_Success": "Dein Föderations-Setup funktioniert - andere Server können diesen Server nun finden!", + "Retry_Count": "Anzahl der Wiederholungsversuche", "Field": "Feld", "Field_removed": "Feld entfernt", "Field_required": "Feld erforderlich", @@ -1363,9 +1380,9 @@ "Full_Screen": "Vollbild", "Gaming": "Spiele", "General": "Allgemeines", - "Get_link": "Link abrufen", "github_no_public_email": "Du hast keine öffentliche E-Mail-Adresse in Deinem GitHub-Account.", "Give_a_unique_name_for_the_custom_oauth": "Gib dem benutzerdefinierten OAuth-Konto einen eindeutigen Namen.", + "strike": "durchgestrichen", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Gib der Anwendung einen Namen. Alle Nutzer können diesen Namen sehen.", "Global": "Global", "Global Policy": "Globale Policy", @@ -1379,7 +1396,10 @@ "Graphql_CORS": "GraphQL CORS", "Graphql_Enabled": "GraphQL aktiviert", "Graphql_Subscription_Port": "GraphQL Subscription Port", + "Snippet_Messages": "Nachrichten-Snippets", "Group_by_Type": "Gruppieren nach Typ", + "snippet-message": "Nachrichten-Snippet", + "snippet-message_description": "Berechtigung, ein Nachrichten-Snippet zu erstellen", "Group_discussions": "Gruppendiskussionen", "Group_favorites": "Gruppenfavoriten", "Group_mentions_disabled_x_members": "Die Gruppenerwähnungen `@all` und `@here` wurden für Räume mit mehr als {{total}} Mitgliedern deaktiviert.", @@ -1419,8 +1439,6 @@ "Idle_Time_Limit_Description": "Zeitraum bis sich der Status in away ändert. Der Wert muss in Sekunden angegeben werden.", "if_they_are_from": "(wenn sie von %s sind)", "If_this_email_is_registered": "Wenn es sich um eine registrierte E-Mail-Adresse handelt, werden wir an diese eine Anleitung zum Zurücksetzen des Passworts senden. Solltest Du zeitnah keine E-Mail erhalten, versuche es noch einmal.", - "If_you_are_sure_type_in_your_password": "Wenn Du Dir sicher bist, gib Dein Passwort ein:", - "If_you_are_sure_type_in_your_username": "Wenn Du Dir sicher bist, gib Deinen Benutzernamen ein:", "If_you_didnt_ask_for_reset_ignore_this_email": "Wenn Du das Zurücksetzen des Kennworts nicht angefordert hast, kannst Du diese E-Mail ignorieren.", "Iframe_Integration": "Iframe-Integration", "Iframe_Integration_receive_enable": "Empfang zulassen", @@ -1475,7 +1493,6 @@ "Industry": "Industrie", "Info": "Info", "initials_avatar": "Avatar aus Initialien", - "inline_code": "Code", "Install": "Installieren", "Install_Extension": "Erweiterung installieren", "Install_FxOs": "Rocket.Chat in Deinen Firefox installieren", @@ -1585,7 +1602,6 @@ "IssueLinks_LinkTemplate": "Vorlage für Issue-Verknüpfungen", "IssueLinks_LinkTemplate_Description": "Vorlage für Issue-Verknüpfungen; %s wird mit der Issue-Nummer ersetzt werden.", "It_works": "Es funktioniert", - "italic": "Kursiv", "italics": "kursiv", "Job_Title": "Berufsbezeichnung", "Join_audio_call": "Anruf beitreten", @@ -1751,8 +1767,7 @@ "Leave_the_current_channel": "Aktuellen Kanal verlassen", "leave-c": "Kanäle verlassen", "leave-p": "Verlasse private Gruppen", - "Lets_get_you_new_one": "Lass mich Ihnen ein neues geben!", - "line": "Zeile", + "Lets_get_you_new_one_": "Lass mich Ihnen ein neues geben!", "List_of_Channels": "Liste der Kanäle", "List_of_Direct_Messages": "Liste der Direktnachrichten", "Livechat": "Livechat", @@ -1862,16 +1877,6 @@ "Mark_as_unread": "Als ungelesen markieren", "Mark_read": "Als gelesen markieren", "Mark_unread": "Als ungelesen markieren", - "Markdown_Headers": "Markdown-Überschriften", - "Markdown_Marked_Breaks": "Formatierte Umbrüche", - "Markdown_Marked_GFM": "Formatierung mit Github Flavoured Markdown (GFM)", - "Markdown_Marked_Pedantic": "Pedantisch Formatieren", - "Markdown_Marked_SmartLists": "Formatierte smarte Listen", - "Markdown_Marked_Smartypants": "Formatiere mit intelligenter Punktsetzung (\"Smartypants\")", - "Markdown_Marked_Tables": "Formatierte Tabellen", - "Markdown_Parser": "Markdown Parser", - "Markdown_SupportSchemesForLink": "Unterstützte Markdown- Schemata für Links", - "Markdown_SupportSchemesForLink_Description": "Kommata getrennte Liste von erlaubten Schemata", "Marketplace_view_marketplace": "Marketplace anzeigen", "Max_length_is": "Maximale Länge ist %s", "Media": "Medien", @@ -1898,14 +1903,11 @@ "Message_AllowEditing_BlockEditInMinutesDescription": "Gib 0 ein, um das Bearbeiten von Nachrichten unbegrenzt zu erlauben.", "Message_AllowPinning": "Das Anheften von Nachrichten erlauben", "Message_AllowPinning_Description": "Benutzern das Anheften von Nachrichten in Kanälen erlauben", - "Message_AllowSnippeting": "Erlauben, Snippets aus Nachrichten zu erstellen", "Message_AllowStarring": "Erlaube es, Nachrichten als Favoriten zu markieren", "Message_AllowUnrecognizedSlashCommand": "Unerkannte Slash-Kommandos erlauben", "Message_AlwaysSearchRegExp": "Beim Suchen immer reguläre Ausdrücke verwenden", "Message_AlwaysSearchRegExp_Description": "Wir empfehlen diese Option, wenn Deine Sprache in der [MongoDB-Textsuche](https://docs.mongodb.org/manual/reference/text-search-languages/#text-search-languages) nicht unterstützt wird.", "Message_Attachments": "Nachrichten-Anhänge", - "Message_Attachments_GroupAttach": "Schaltflächen für Anhänge gruppieren", - "Message_Attachments_GroupAttachDescription": "Dies sorgt dafür, dass die Schaltflächen in einem erweiterbaren Menü untergebracht werden. So wird weniger Bildschirmplatz benötigt.", "Report_sent": "Bericht gesendet", "Message_Audio": "Audio Nachricht", "Message_Audio_bitRate": "Audio-Nachrichten-Bitrate", @@ -1943,8 +1945,6 @@ "Message_removed": "Die Nachricht wurde entfernt", "Message_sent_by_email": "Nachricht per E-Mail versendet", "Message_ShowDeletedStatus": "Löschstatus anzeigen", - "Message_ShowEditedStatus": "Bearbeitungsstatus anzeigen", - "Message_ShowFormattingTips": "Formatierungshilfe anzeigen", "Message_starring": "Markieren von favorisierten Nachrichten", "Message_Time": "Zeitpunkt der Nachricht", "Message_TimeAndDateFormat": "Zeit- und Datumsformat", @@ -1983,7 +1983,6 @@ "Move_end_message": "`%s` - Zum Ende der Nachricht springen", "Msgs": "Nachrichten", "multi": "mehrere", - "multi_line": "Mehrzeilig", "Mute_all_notifications": "Alle Benachrichtigungen stummschalten", "Mute_Focused_Conversations": "Stumm geschaltete Gespräche", "Mute_Group_Mentions": "Mute @all und @here erwähnt", @@ -2071,9 +2070,7 @@ "Number_of_events": "Anzahl der Ereignisse", "Number_of_federated_users": "Anzahl föderierter Benutzer", "Number_of_messages": "Nachrichtenanzahl", - "OAuth Apps": "OAuth-Apps", "OAuth_Application": "OAuth-Anwendung", - "OAuth_Applications": "OAuth-Anwendungen", "Objects": "Objekte", "Off": "Aus", "Off_the_record_conversation": "Off-the-record-Gespräche", @@ -2376,7 +2373,6 @@ "RetentionPolicyRoom_MaxAge": "Maximales Nachrichtenalter in Tagen (Standard: {{max}})", "RetentionPolicyRoom_OverrideGlobal": "Globale Aufbewahrungsrichtlinie außer Kraft setzen", "RetentionPolicyRoom_ReadTheDocs": "Achtung! Das Anpassen dieser Einstellungen ohne große Sorgfalt kann den gesamten Nachrichtenverlauf zerstören. Bitte lies die Dokumentation, bevor Du das Feature unter hieraktivierst.", - "Retry_Count": "Anzahl der Wiederholungsversuche", "Return_to_home": "Zurück zur Startseite", "Return_to_previous_page": "zur vorherigen Seite zurückkehren", "Robot_Instructions_File_Content": "Inhalt von Robots.txt", @@ -2511,6 +2507,7 @@ "Set_as_leader": "Zum Diskussionsleiter ernennen", "Set_as_moderator": "Zum Moderator ernennen", "Set_as_owner": "Zum Besitzer machen", + "Upload_app": "App hochladen", "set-leader": "Diskussionsleiter ernennen", "set-moderator": "Moderator ernennen", "set-moderator_description": "Berechtigung, andere Benutzer zum Moderator eines Kanals zu ernennen", @@ -2592,10 +2589,7 @@ "SMTP_Test_Button": "SMTP-Einstellungen testen", "SMTP_Username": "SMTP-Benutzername", "Snippet_Added": "Erstellt am %s", - "Snippet_Messages": "Nachrichten-Snippets", "Snippet_name": "Snippet-Name", - "snippet-message": "Nachrichten-Snippet", - "snippet-message_description": "Berechtigung, ein Nachrichten-Snippet zu erstellen", "Snippeted_a_message": "Ein Snippet wurde erstellt: {{snippetLink}}", "Social_Network": "Soziales Netzwerk", "Sorry_page_you_requested_does_not_exist_or_was_deleted": "Entschuldigung, die angeforderte Seite existiert nicht oder wurde gelöscht!", @@ -2653,7 +2647,6 @@ "Stream_Cast": "Stream Cast", "Stream_Cast_Address": "Stream Cast Adresse", "Stream_Cast_Address_Description": "IP oder Host Deines zentralen Stream Cast Servers inkl. Port, bspw. `192.168.1.1:3000` oder `localhost:4000`", - "strike": "durchgestrichen", "Style": "Stil", "Subject": "Betreff", "Submit": "Abssenden", @@ -2819,7 +2812,6 @@ "Type_your_job_title": "Gib Deine Job-Bezeichnung ein", "Type_your_message": "Gib Deine Nachricht ein", "Type_your_name": "Gib Deinen Namen ein", - "Type_your_new_password": "Gib ein neues Passwort ein", "Type_your_password": "Gib Dein Passwort ein", "Type_your_username": "Gib Deinen Benutzernamen ein", "UI_Allow_room_names_with_special_chars": "Sonderzeichen im Raumnamen erlauben", @@ -2858,7 +2850,6 @@ "Update_to_version": "Auf Version {{version}} aktualisieren", "Update_your_RocketChat": "Aktualisiere Dein Rocket.Chat", "Updated_at": "Aktualisiert am", - "Upload_app": "App hochladen", "Upload_file_description": "Dateibeschreibung", "Upload_file_name": "Dateiname", "Upload_file_question": "Datei hochladen?", @@ -3112,4 +3103,4 @@ "Your_question": "Deine Frage", "Your_server_link": "Dein Server-Link", "Your_workspace_is_ready": "Dein Arbeitsbereich ist einsatzbereit 🎉" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json index ce6dd453b8c7..d60d08f4c832 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json @@ -468,6 +468,7 @@ "App_Details": "Anwendungs-Details", "App_Info": "App Info", "App_Information": "App-Informationen", + "Apps_context_enterprise": "Unternehmen", "App_Installation": "App-Installation", "App_not_enabled": "App nicht aktiviert", "App_not_found": "Anwendung nicht gefunden", @@ -495,7 +496,6 @@ "Apply_and_refresh_all_clients": "Anwenden und alle Clients aktualisieren", "Apps": "Anwendungen", "Apps_context_explore": "Erkunden", - "Apps_context_enterprise": "Unternehmen", "Apps_context_installed": "Installiert", "Apps_context_requested": "Angefordert", "Apps_Engine_Version": "Version der Anwendungs-Engine", @@ -769,6 +769,7 @@ "Broadcasting_media_server_url": "Broadcasting Media Server-URL", "Browse_Files": "Dateien durchsuchen", "Browser_does_not_support_audio_element": "Ihr Browser unterstützt das Audioelement nicht.", + "Call_number_enterprise_only": "Rufnummer (nur Enterprise Edition)", "Browser_does_not_support_video_element": "Ihr Browser unterstützt das Videoelement nicht.", "Browser_does_not_support_recording_video": "Ihr Browser unterstützt keine Videoaufzeichnung", "Bugsnag_api_key": "Bugsnag API-Schlüssel", @@ -805,7 +806,6 @@ "Call_provider": "Anrufserive-Anbieter", "Call_Already_Ended": "Anruf bereits beendet", "Call_number": "Rufnummer", - "Call_number_enterprise_only": "Rufnummer (nur Enterprise Edition)", "call-management": "Anrufverwaltung", "call-management_description": "Erlaubnis zum Starten einer Besprechung", "Call_ongoing": "Anruf laufend", @@ -951,8 +951,6 @@ "Close": "Schließen", "Close_chat": "Chat schließen", "Close_room_description": "Sie sind im Begriff, diesen Chat zu schließen. Sind Sie sicher, dass Sie fortfahren möchten?", - "Close_to_seat_limit_banner_warning": "*Es sind noch [{{seats}}] Plätze übrig* \nDieser Arbeitsbereich nähert sich seinem Platzlimit. Wenn das Limit erreicht ist, können keine neuen Mitglieder mehr hinzugefügt werden. *[Weitere Plätze anfordern]({{url}})*", - "Close_to_seat_limit_warning": "Wenn das Platzlimit erreicht ist, können keine weiteren neuen Mitglieder erstellt werden.", "close-livechat-room": "Livechat-Room schließen", "close-livechat-room_description": "Berechtigung, den aktuellen Livechat-Raum zu schließen", "Close_menu": "Menü schließen", @@ -987,8 +985,6 @@ "Cloud_register_offline_finish_helper": "Nach Abschluss des Registrierungsvorgangs in der Cloud-Konsole sollte ein Text angezeigt werden. Bitte hier einfügen, um die Registrierung abzuschließen.", "Cloud_register_offline_helper": "Arbeitsbereiche können manuell registriert werden, wenn ein Airgap besteht oder der Netzwerkzugriff eingeschränkt ist. Kopieren Sie den folgenden Text und rufen Sie unsere Cloud-Konsole auf, um den Vorgang abzuschließen.", "Cloud_register_success": "Ihr Arbeitsbereich wurde erfolgreich registriert!", - "Cloud_registration_pending_html": "Push-Benachrichtigungen funktionieren nicht, bis die Registrierung abgeschlossen ist. Mehr erfahren", - "Cloud_registration_pending_title": "Die Cloud-Registrierung steht noch aus", "Cloud_registration_required": "Registrierung erforderlich", "Cloud_registration_required_description": "Es sieht aus, als hätten Sie sich während des Setups nicht für die Registrierung Ihres Arbeitsbereichs entschieden.", "Cloud_registration_required_link_text": "Klicken Sie hier, um Ihren Arbeitsbereich zu registrieren.", @@ -1482,7 +1478,6 @@ "Delete_message": "Nachricht löschen", "Delete_my_account": "Mein Konto löschen", "Delete_Role_Warning": "Wenn Sie eine Rolle löschen, wird sie für immer gelöscht. Dies kann nicht rückgängig gemacht werden.", - "Delete_Role_Warning_Community_Edition": "Dies kann nicht rückgängig gemacht werden. Beachten Sie, dass es in der Community Edition nicht möglich ist, neue benutzerdefinierte Rollen zu erstellen.", "Delete_Room_Warning": "Beim Löschen eines Raumes werden alle Nachrichten in diesem Raum unwiderruflich gelöscht.", "Delete_User_Warning": "Beim Löschen eines Benutzers werden alle Nachrichten des Benutzers unwiderruflich gelöscht.", "Delete_User_Warning_Delete": "Beim Löschen eines Benutzers werden alle Nachrichten des Benutzers unwiderruflich gelöscht.", @@ -1677,7 +1672,7 @@ "E2E_key_reset_email": "E2E-Schlüssel-Reset-Benachrichtigung", "E2E_message_encrypted_placeholder": "Diese Nachricht ist Ende-zu-Ende verschlüsselt. Um sie anzusehen, müssen Sie Ihren Verschlüsselungscode in Ihren Kontoeinstellungen eingeben.", "E2E_password_request_text": "Geben Sie Ihr Verschlüsselungskennwort ein, um auf Ihre verschlüsselten privaten Gruppen und Direktnachrichten zuzugreifen.
Sie müssen dieses Kennwort eingeben, da der Schlüssel nicht auf dem Server gespeichert ist.", - "E2E_password_reveal_text": "Sie können jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Sie können auch bereits vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher müssen Sie den Schlüssel an einem sicheren Ort aufbewahren - Sie müssen ihn auf anderen Geräten eingeben, auf denen Sie die Ende-zu-Ende-Verschlüsselung verwenden möchten.Erfahren Sie mehr hier!

Ihr Passwort lautet: %s

Es handelt sich um ein automatisch erzeugtes Passwort. Sie können jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Ihrem Browser nur so lange zwischengespeichert, bis Sie dies speichern und diese Nachricht bestätigen.", + "E2E_password_reveal_text": "Sie können jetzt verschlüsselte private Gruppen und Direktnachrichten erstellen. Sie können auch bereits vorhandene private Gruppen oder Direktnachrichten verschlüsseln.

Da dies eine Ende-zu-Ende-Verschlüsselung ist, werden die Schlüssel auf keinem Server gespeichert. Daher müssen Sie den Schlüssel an einem sicheren Ort aufbewahren - Sie müssen ihn auf anderen Geräten eingeben, auf denen Sie die Ende-zu-Ende-Verschlüsselung verwenden möchten.Erfahren Sie mehr hier!

Ihr Passwort lautet: {{randomPassword}}

Es handelt sich um ein automatisch erzeugtes Passwort. Sie können jederzeit unter Angabe des existierenden Passworts ein neues Passwort vergeben.
Das Passwort wird in Ihrem Browser nur so lange zwischengespeichert, bis Sie dies speichern und diese Nachricht bestätigen.", "E2E_Reset_Email_Content": "Sie wurden automatisch abgemeldet. Wenn Sie sich erneut anmelden, wird Rocket.Chat einen neuen Schlüssel generieren und IHren Zugang zu allen verschlüsselten Räumen wiederherstellen, in denen ein oder mehrere Mitglieder online sind. Aufgrund der Natur der E2E-Verschlüsselung ist Rocket.Chat nicht in der Lage, den Zugang zu einem verschlüsselten Raum wiederherzustellen, in dem kein Mitglied online ist.", "E2E_Reset_Key_Explanation": "Diese Option entfernt Ihren aktuelle Ende-zu-Ende-Schlüssel und meldet Sie ab.
Wenn Sie sich erneut anmelden, generiert Rocket.Chat einen neuen Schlüssel und stellt Ihren Zugriff auf einen verschlüsselten Raum wieder her, in dem mindestens ein Mitglied online ist.
Aufgrund der Art der Ende-zu-Ende Verschlüsselung, kann Rocket.Chat den Zugriff auf verschlüsselte Räume, mit kein Mitglied online, nicht wiederherstellen. ", "E2E_Reset_Other_Key_Warning": "Wenn Sie den aktuellen E2E-Schlüssel zurücksetzt, wird der Benutzer abgemeldet. Wenn sich der Benutzer erneut anmeldet, generiert Rocket.Chat einen neuen Schlüssel und stellt den Zugang des Benutzers zu allen verschlüsselten Räumen wieder her, in denen ein oder mehrere Mitglieder online sind. Aufgrund der Natur der E2E-Verschlüsselung ist Rocket.Chat nicht in der Lage, den Zugang zu einem verschlüsselten Raum wiederherzustellen, in dem kein Mitglied online ist.", @@ -1765,11 +1760,15 @@ "Email_Notifications_Change_Disabled": "Der Rocket.Chat Administrator hat Offline-E-Mail-Benachrichtigungen deaktiviert", "Email_or_username": "E-Mail-Adresse oder Nutzername", "Email_Placeholder": "Bitte geben Sie Ihre E-Mail-Adresse ein", + "Enterprise_capabilities": "Enterprise-Funktionen", "Email_Placeholder_any": "Bitte geben Sie E-Mail-Adressen ein ...", "email_plain_text_only": "Nur reine Text-E-Mails senden", "email_style_description": "Verschachtelte Selektoren vermeiden", "email_style_label": "E-Mail-Stil", + "Enterprise_Description": "Aktualisieren Sie Ihre Enterprise-Lizenz manuell.", "Email_subject": "Betreff", + "Enterprise_License": "Unternehmenslizenz", + "Enterprise_License_Description": "Wenn dein Arbeitsbereich registriert ist und die Lizenz von Rocket.Chat Cloud zur Verfügung gestellt wird, brauchest du die Lizenz hier nicht manuell zu aktualisieren.", "Email_verified": "Die E-Mail-Adresse wurde bestätigt.", "Email_sent": "E-Mail gesendet", "Emoji": "Emoji", @@ -1827,11 +1826,6 @@ "Enter_Normal": "Normaler Modus (mit Eingabetaste senden)", "Enter_to": "Eingabetaste: ", "Enter_your_E2E_password": "Geben Sie ihr Passwort für die Ende-Zu-Ende-Verschlüsselung ein", - "Enterprise": "Unternehmen", - "Enterprise_capabilities": "Enterprise-Funktionen", - "Enterprise_Description": "Aktualisieren Sie Ihre Enterprise-Lizenz manuell.", - "Enterprise_License": "Unternehmenslizenz", - "Enterprise_License_Description": "Wenn dein Arbeitsbereich registriert ist und die Lizenz von Rocket.Chat Cloud zur Verfügung gestellt wird, brauchest du die Lizenz hier nicht manuell zu aktualisieren.", "Entertainment": "Unterhaltung", "Error": "Fehler", "Error_something_went_wrong": "Huch! Ein Fehler ist aufgetreten. Bitte laden Sie die Seite neu oder kontaktieren Sie einen Administrator.", @@ -1854,7 +1848,7 @@ "error-avatar-invalid-url": "Ungültige Avatar-URL: {{url}}", "error-avatar-url-handling": "Fehler beim Übernehmen des Avatars- von URL ({{url}}) für {{username}}", "error-business-hours-are-closed": "Geschäftszeiten sind geschlossen", - "error-blocked-username": "{{field}} ist blockiert und kann nicht verwendet werden!", + "error-blocked-username": "**{{field}}** ist blockiert und kann nicht verwendet werden!", "error-canned-response-not-found": "Vorformulierte Antwort nicht gefunden", "error-cannot-delete-app-user": "Das Löschen von App-Benutzern ist nicht erlaubt, deinstallieren Sie die entsprechende App, um sie zu entfernen.", "error-cant-add-federated-users": "Es können keine Verbund-Benutzer zu einem Nicht-Verbundraum hinzugefügt werden", @@ -1903,6 +1897,7 @@ "error-invalid-email-address": "Ungültige E-Mail-Adresse", "error-invalid-email-inbox": "Ungültiger E-Mail-Posteingang", "error-email-inbox-not-found": "E-Mail-Posteingang nicht gefunden", + "error-this-is-an-ee-feature": "Dies ist eine Funktion der Enterprise Edition", "error-invalid-file-height": "Ungültige Bildhöhe der Datei", "error-invalid-file-type": "Ungültiges Dateiformat", "error-invalid-file-width": "Ungültige Bildhöhe der Datei", @@ -1976,7 +1971,6 @@ "error-tags-must-be-assigned-before-closing-chat": "Tags müssen vor dem Schließen des Chats zugewiesen werden", "error-the-field-is-required": "Das Feld {{field}} ist erforderlich.", "error-this-is-not-a-livechat-room": "Dies ist kein Livechat-Raum", - "error-this-is-an-ee-feature": "Dies ist eine Funktion der Enterprise Edition", "error-token-already-exists": "Ein Zugangsschlüssel mit diesem Namen existiert bereits", "error-token-does-not-exists": "Der Zugangsschlüssel existiert nicht", "error-too-many-requests": "Fehler, zu viele Anfragen. Bitte fahren Sie langsamer fort. Sie müssen {{seconds}} Sekunden warten, bevor Sie es erneut versuchen können.", @@ -2176,10 +2170,12 @@ "FileUpload_S3_BucketURL": "Bucket-URL", "FileUpload_S3_CDN": "CDN-Domain für Downloads", "FileUpload_S3_ForcePathStyle": "Pfad-Stil erzwingen", + "Google_Meet_Enterprise_only": "Google Meet (nur Enterprise)", "FileUpload_S3_Proxy_Avatars": "Proxy-Zugriff auf Avatare", "FileUpload_S3_Proxy_Avatars_Description": "Der Zugriff auf alle Avatare erfolgt über den Rocket.Chat Server als Proxy, anstatt direkt die Asset-URL an den Client weiterzureichen", "FileUpload_S3_Proxy_Uploads": "Proxy-Zugriff auf Datei-Uploads", "FileUpload_S3_Proxy_Uploads_Description": "Der Zugriff auf alle hochgelanden Dateien erfolgt über den Rocket.Chat Server als Proxy, anstatt direkt die Asset-URL an den Client weiterzureichen", + "Hold_Call_EE_only": "Anruf halten (nur Enterprise Edition)", "FileUpload_S3_Region": "Region", "FileUpload_S3_SignatureVersion": "Signaturversion", "FileUpload_S3_URLExpiryTimeSpan": "Verfallsdatum für URLs", @@ -2234,6 +2230,7 @@ "Forgot_Password_Email": "Hier klicken, um das Passwort zurückzusetzen.", "Forgot_Password_Email_Subject": "[Site_Name] - Passwort-Wiederherstellung", "Forgot_password_section": "Passwort vergessen", + "Hold_EE_only": "Halten (nur Enterprise Edition)", "Format": "Format", "Forward": "Weiterleiten", "Forward_chat": "Chat weiterleiten", @@ -2277,10 +2274,8 @@ "Global_purge_override_warning": "Eine globale Aufbewahrungsrichtlinie ist vorhanden. Wenn Sie die globale Aufbewahrungsrichtlinie außer Kraft setzen, können Sie nur eine Richtlinie anwenden, die strenger ist als die globale Richtlinie.", "Global_Search": "Globale Suche", "Go_to_your_workspace": "Auf zu Ihrem Arbeitsbereich!", - "Google_Meet_Enterprise_only": "Google Meet (nur Enterprise)", "Google_Play": "Google Play", "Hold_Call": "Gespräch halten", - "Hold_Call_EE_only": "Anruf halten (nur Enterprise Edition)", "GoogleCloudStorage": "Google Cloud-Speicher", "GoogleNaturalLanguage_ServiceAccount_Description": "Service-Konto SchlüsselDatei (JSON). Weiterführende Informationen dazu [hier](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google-Tag-Manager-ID", @@ -2335,7 +2330,6 @@ "History": "Chronik", "Hold_Time": "Haltezeit", "Hold": "Halten", - "Hold_EE_only": "Halten (nur Enterprise Edition)", "Home": "Startseite", "Homepage": "Startseite", "Host": "Host", @@ -2869,7 +2863,7 @@ "leave-c_description": "Berechtigung, Channels zu verlassen", "leave-p": "Private Gruppen verlassen", "leave-p_description": "Erlaubnis, private Gruppen zu verlassen", - "Lets_get_you_new_one": "Geben wir Ihnen ein neues!", + "Lets_get_you_new_one_": "Geben wir Ihnen ein neues!", "License": "Lizenz", "Link_Preview": "Link-Vorschau", "List_of_Channels": "Liste der Channels", @@ -2977,15 +2971,27 @@ "Load_Rotation": "Rotation laden", "Loading": "Wird geladen", "Loading_more_from_history": "Weitere Nachrichten aus dem Verlauf anzeigen", + "marketplace_featured_section_community_featured": "Ausgewählte von der Gemeinschaft unterstützt Apps", "Loading_suggestion": "Vorschläge werden geladen", + "marketplace_featured_section_community_supported": "Von der Gemeinschaft unterstützte Apps", "Loading...": "Wird geladen...", + "marketplace_featured_section_enterprise": "Ausgewählte Enterprise-Apps", + "marketplace_featured_section_featured": "Ausgewählte Apps", + "marketplace_featured_section_most_popular": "Beliebteste Apps", "Local_Domains": "Lokale Domains", + "marketplace_featured_section_new_arrivals": "Neu eingetroffen", "Local_Password": "Lokales Passwort", + "marketplace_featured_section_popular_this_month": "Beliebte Apps in diesem Monat", "Local_Time": "Lokalzeit", + "marketplace_featured_section_recommended": "Empfohlene Apps", "Local_Timezone": "Lokale Zeitzone", + "marketplace_featured_section_social": "Soziale Apps", "Local_Time_time": "Lokalzeit: {{time}}", + "marketplace_featured_section_trending": "Aktuelle Apps", "Localization": "Lokalisierung", "Location": "Standort", + "marketplace_featured_section_omnichannel": "Omnichannel-Apps", + "marketplace_featured_section_video_conferencing": "Apps für Videokonferenzen", "Log_Exceptions_to_Channel": "Ausnahmen in einen Channel schreiben", "Log_Exceptions_to_Channel_Description": "Name eines Channels, der alle abgefangenen Ausnahmen aufnimmt. Leer lassen, um sie nur ins Anwendungslog zu schreiben.", "Log_File": "Datei und Zeile anzeigen", @@ -3119,18 +3125,6 @@ "Marketplace_app_last_updated": "Zuletzt aktualisiert {{lastUpdated}}", "Marketplace_view_marketplace": "Marketplace anzeigen", "Marketplace_error": "Keine Verbindung zum Internet oder zu Ihrem Arbeitsbereich möglich, möglicherweise handelt es sich um eine Offline-Installation.", - "marketplace_featured_section_community_featured": "Ausgewählte von der Gemeinschaft unterstützt Apps", - "marketplace_featured_section_community_supported": "Von der Gemeinschaft unterstützte Apps", - "marketplace_featured_section_enterprise": "Ausgewählte Enterprise-Apps", - "marketplace_featured_section_featured": "Ausgewählte Apps", - "marketplace_featured_section_most_popular": "Beliebteste Apps", - "marketplace_featured_section_new_arrivals": "Neu eingetroffen", - "marketplace_featured_section_popular_this_month": "Beliebte Apps in diesem Monat", - "marketplace_featured_section_recommended": "Empfohlene Apps", - "marketplace_featured_section_social": "Soziale Apps", - "marketplace_featured_section_trending": "Aktuelle Apps", - "marketplace_featured_section_omnichannel": "Omnichannel-Apps", - "marketplace_featured_section_video_conferencing": "Apps für Videokonferenzen", "MAU_value": "MAU {{value}}", "Max_length_is": "Maximale Länge ist %s", "Max_number_incoming_livechats_displayed": "Maximale Anzahl der in der Warteschlange angezeigten Elemente", @@ -3212,7 +3206,7 @@ "Message_has_been_edited": "Die Nachricht wurde bearbeitet", "Message_has_been_edited_at": "Die Nachricht wurde am {{date}} bearbeitet", "Message_has_been_edited_by": "Die Nachricht wurde editiert von {{username}}", - "Message_has_been_edited_by_at": "Die Nachricht wurde bearbeitet von __Benutzername__ am __datum__", + "Message_has_been_edited_by_at": "Die Nachricht wurde bearbeitet von {{username}} am {{date}}", "Message_has_been_pinned": "Nachricht wurde angeheftet", "Message_has_been_starred": "Nachricht wurde als Favorit gekennzeichnet", "Message_has_been_unpinned": "Nachricht wurde entpinnt", @@ -3239,6 +3233,7 @@ "Message_HideType_subscription_role_removed": "Meldungen „Rolle nicht länger definiert“ ausblenden", "Message_HideType_uj": "\"Benutzer beigetreten\"-Nachricht deaktivieren", "Message_HideType_ujt": "Nachrichten \"Benutzer ist Team beigetreten\" ausblenden", + "New_Call_Enterprise_Edition_Only": "Neuer Anruf (nur Enterprise Edition)", "Message_HideType_ul": "Meldungen \"Benutzer verlassen\" ausblenden", "Message_HideType_ult": "Nachrichten \"Benutzer hat Team verlassen\" ausblenden", "Message_HideType_user_added_room_to_team": "Meldungen \"Benutzer hat Room zu Team hinzugefügt\" ausblenden", @@ -3335,7 +3330,7 @@ "Moderation_Delete_message": "Nachricht löschen", "Moderation_Dismiss_and_delete": "Ablehnen und löschen", "Moderation_Delete_this_message": "Diese Nachricht löschen", - "Moderation_Message_context_header": "Nachricht(en) von __displayName__", + "Moderation_Message_context_header": "Nachricht(s) gemeldet", "Moderation_Action_View_reports": "Gemeldete Nachrichten anzeigen", "Moderation_Deactivate_User": "Nutzer deaktivieren", "Moderation_Delete_all_messages": "Alle Nachrichten löschen", @@ -3403,7 +3398,6 @@ "New_Application": "Neue Anwendung", "New_Business_Hour": "Neue Öffnungszeiten", "New_Call": "Neuer Aufruf", - "New_Call_Enterprise_Edition_Only": "Neuer Anruf (nur Enterprise Edition)", "New_chat_in_queue": "Neuer Chat in der Warteschlange", "New_chat_priority": "Priorität geändert: {{user}} hat die Priorität in {{priority}} geändert", "New_chat_transfer": "Neue Chatübertragung: {{transfer}}", @@ -3844,7 +3838,6 @@ "Rate Limiter_Description": "Kontrollieren Sie die Rate der von Ihrem Server gesendeten oder empfangenen Anfragen, um Cyberangriffe und Scraping zu verhindern.", "Rate_Limiter_Limit_RegisterUser": "Rate-Limit für die Registrierung eines Benutzers", "Rate_Limiter_Limit_RegisterUser_Description": "Anzahl der erlaubten Standardaufrufe der Benutzerregistrierungs Endpunkte (REST and real-time API's), innherhalb der, im API Rate Limiter Absschnitt definierten, Zeitspanne.", - "Reached_seat_limit_banner_warning": "*Keine Plätze mehr vrefügbar* \nDieser Arbeitsbereich hat sein Platzlimit erreicht, es können also keine Mitglieder mehr beitreten. *[Mehr Plätze anfordern]({{url}})*", "React_when_read_only": "Reaktionen erlauben", "React_when_read_only_changed_successfully": "Reaktionen erlauben, wenn ein Kanal schreibgeschützt wurde", "Reacted_with": "Reagierten mit", @@ -3955,11 +3948,6 @@ "Report_this_message_question_mark": "Diese Nachricht melden?", "Reporting": "Berichtswesen", "Request": "Anfordern", - "Request_seats": "Plätze anfordern", - "Request_more_seats": "Mehr Plätze anfordern", - "Request_more_seats_out_of_seats": "Sie können keine Mitglieder hinzufügen, weil dieser Arbeitsplätze keine Plätze mehr hat, bitte fordern Sie mehr Plätze an.", - "Request_more_seats_sales_team": "Nachdem Sie Ihre Anforderung übergeben haben, wird sich unser Sales Team darum kümmern und sich in den nächsten Tagen bei Ihnen melden.", - "Request_more_seats_title": "Mehr Plätze anfordern", "Request_comment_when_closing_conversation": "Kommentar beim Schließen der Konversation anfordern", "Request_comment_when_closing_conversation_description": "Wenn dies aktiviert ist, muss der Agent einen Kommentar eingeben, bevor das Gespräch geschlossen wird.", "Request_tag_before_closing_chat": "Fordern Sie Tags an, bevor Sie die Unterhaltung beenden", @@ -4245,6 +4233,7 @@ "See_full_profile": "Gesamtes Profil ansehen", "See_history": "Verlauf anzeigen", "See_on_Engagement_Dashboard": "Auf Einsatz-Dashboard anzeigen", + "Select": "Auswählen", "Select_a_department": "Abteilung wählen", "Select_a_room": "Einen Raum auswählen", "Select_a_user": "Einen Benutzer wählen", @@ -4626,9 +4615,13 @@ "Teams_Search_teams": "Teams suchen", "Teams_New_Read_only_Label": "Schreibgeschützt", "Technology_Services": "Technologie-Dienstleistungen", + "Upgrade_tab_connection_error_description": "Sieht so aus, als hätten Sie keine Internetverbindung. Das kann daran liegen, dass Ihr Arbeitsbereich auf einem vollständig gesicherten Server mit Air Gap installiert ist", "Terms": "Allgemeine Geschäftsbedingungen", "Terms_of_use": "Nutzungsbedingungen", + "Upgrade_tab_connection_error_restore": "Stellen Sie Ihre Verbindung wieder her, um mehr über die Funktionen zu erfahren, die Ihnen entgehen.", "Test_Connection": "Verbindung testen", + "Upgrade_tab_go_fully_featured": "Erhalte vollen Funktionsumfang", + "Upgrade_tab_trial_guide": "Leitfaden für Versuche", "Test_Desktop_Notifications": "Desktop-Benachrichtigungen testen", "Test_LDAP_Search": "LDAP-Testsuche", "test-admin-options": "Testen Sie die Optionen im Verwaltungsbereich wie LDAP-Anmeldung und Push-Benachrichtigungen", @@ -4903,10 +4896,6 @@ "Update_to_version": "Auf Version {{version}} aktualisieren", "Update_your_RocketChat": "Aktualisieren Sie Ihr Rocket.Chat", "Updated_at": "Aktualisiert am", - "Upgrade_tab_connection_error_description": "Sieht so aus, als hätten Sie keine Internetverbindung. Das kann daran liegen, dass Ihr Arbeitsbereich auf einem vollständig gesicherten Server mit Air Gap installiert ist", - "Upgrade_tab_connection_error_restore": "Stellen Sie Ihre Verbindung wieder her, um mehr über die Funktionen zu erfahren, die Ihnen entgehen.", - "Upgrade_tab_go_fully_featured": "Erhalte vollen Funktionsumfang", - "Upgrade_tab_trial_guide": "Leitfaden für Versuche", "Upgrade_tab_upgrade_your_plan": "Aktualisieren Sie Ihren Plan", "Upload": "Hochladen", "Uploads": "Uploads", @@ -5003,7 +4992,7 @@ "User_Settings": "Kontoeinstellungen", "User_started_a_new_conversation": "{{username}} hat ein neues Gespräch begonnen", "User_unmuted_by": "Benutzer {{user_unmuted}} wurde das Chatten von {{user_by}} wieder erlaubt", - "User_has_been_unmuted": "__user_muted__ nicht mehr stummgeschaltet", + "User_has_been_unmuted": "{{user_unmuted}} nicht mehr stummgeschaltet", "User_unmuted_in_room": "Dem Benutzer wurde das Chatten wieder erlaubt", "User_updated_successfully": "Benutzer wurde erfolgreich aktualisiert", "User_uploaded_a_file_on_channel": "{{username}} hat eine Datei in {{channel}} hochgeladen", @@ -5148,6 +5137,7 @@ "view-l-room": "Omnichannel-Rooms anzeigen", "view-l-room_description": "Berechtigung, Omnichannel-Rooms anzuzeigen", "view-livechat-analytics": "Omnichannel-Analytics anzeigen", + "onboarding.page.awaitingConfirmation.subtitle": "Wir haben dir eine E-Mail zur Bestätigung an {{emailAddress}} geschickt. Bitte stelle sicher, dass der Bestätigungscode unten dem in der E-Mail entspricht", "view-livechat-analytics_description": "Berechtigung zum Anzeigen von Live-Chat-Analysen", "view-livechat-appearance": "Omnichannel-Darstellung ansehen", "view-livechat-appearance_description": "Berechtigung zum Anzeigen der Live-Chat-Darstellung", @@ -5433,11 +5423,10 @@ "onboarding.component.form.action.skip": "Überspringen", "onboarding.component.form.action.register": "Registrieren", "onboarding.component.form.action.confirm": "Bestätigen", + "onboarding.component.form.action.pasteHere": "Hier einfügen...", "onboarding.component.form.termsAndConditions": "Ich bin mit den Nutzungsvereinbarung und den Datenschutzbestimmungen einverstanden", "onboarding.component.emailCodeFallback": "Keine E-Mail erhalten? Noch einemal versenden oder E-Mailadresse ändern", - "onboarding.page.form.title": "<1>Starten wir Ihren Arbeitsbereich", - "onboarding.page.awaitingConfirmation.title": "Warten auf Bestätigung", - "onboarding.page.awaitingConfirmation.subtitle": "Wir haben dir eine E-Mail zur Bestätigung an {{emailAddress}} geschickt. Bitte stelle sicher, dass der Bestätigungscode unten dem in der E-Mail entspricht", + "onboarding.page.form.title": "Starten wir Ihren Arbeitsbereich", "onboarding.page.emailConfirmed.title": "E-Mail bestätigt", "onboarding.page.emailConfirmed.subtitle": "Sie können zu Ihrer Rocket.Chat-Anwendung zurückkehren - wir haben Ihren Arbeitsbereich bereits gestartet.", "onboarding.page.checkYourEmail.title": "Bitte prüfe Deine E-Mail", @@ -5473,6 +5462,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Passwort", "onboarding.form.adminInfoForm.fields.password.placeholder": "Passwort erstellen", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Halten Sie mich über Rocket.Chat-Updates auf dem Laufenden", + "onboarding.form.awaitConfirmationForm.title": "Warten auf Bestätigung", "onboarding.form.organizationInfoForm.title": "Organisations-Info", "onboarding.form.organizationInfoForm.subtitle": "Bitte, haben Sie Verständnis. Diese Informationen helfen uns, Ihren Arbeitsbereich zu personalisieren.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Name der Organisation", @@ -5485,6 +5475,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Auswählen", "onboarding.form.organizationInfoForm.fields.country.label": "Land", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Auswählen", + "onboarding.form.registerOfflineForm.title": "Manuell registrieren", "onboarding.form.registeredServerForm.title": "Registrieren Sie Ihren Server", "onboarding.form.registeredServerForm.included.push": "Mobile Push-Benachrichtigungen", "onboarding.form.registeredServerForm.included.externalProviders": "Integration mit externen Anbietern (WhatsApp, Facebook, Telegram, Twitter)", @@ -5521,5 +5512,8 @@ "RegisterWorkspace_Syncing_Complete": "Synchronisierung abgeschlossen", "RegisterWorkspace_Connection_Error": "Beim Verbinden ist ein Fehler aufgetreten", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ich bin mit den Nutzungsvereinbarung und den Datenschutzbestimmungen einverstanden", - "Uninstall_grandfathered_app": "{{appName}} deinstallieren?" + "Uninstall_grandfathered_app": "{{appName}} deinstallieren?", + "Enterprise": "Unternehmen", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", + "UpgradeToGetMore_auditing_Title": "Nachrichtenüberprüfung" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json index b51fa54a97af..57c07c0b8129 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json @@ -980,7 +980,6 @@ "Enter_name_here": "Πληκτρολογήστε το όνομα εδώ", "Enter_Normal": "Κανονική λειτουργία (αποστολή με Enter)", "Enter_to": "Enter για να", - "Enterprise": "Επιχείρηση", "Entertainment": "Ψυχαγωγία", "Error": "Λάθος", "Error_404": "Σφάλμα 404", @@ -2766,5 +2765,7 @@ "registration.component.form.reasonToJoin": "Λόγος για συμμετοχή", "registration.component.form.invalidConfirmPass": "Η επιβεβαίωση κωδικού δεν ταιριάζει με τον αρχικό κωδικό", "registration.component.form.confirmPassword": "Επιβεβαιώστε τον κωδικό σας", - "registration.component.form.sendConfirmationEmail": "Αποστολή email επιβεβαίωσης" + "registration.component.form.sendConfirmationEmail": "Αποστολή email επιβεβαίωσης", + "Enterprise": "Επιχείρηση", + "UpgradeToGetMore_engagement-dashboard_Title": "Αναλυτικά στοιχεία" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 389fb52f4e59..770545a1f056 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -22,6 +22,7 @@ "This_room_encryption_has_been_disabled_by__username_": "This room's encryption has been disabled by {{username}}", "Third_party_login": "Third-party login", "Enabled_E2E_Encryption_for_this_room": "enabled E2E Encryption for this room", + "Enable_business_hours": "Enable business hours", "disabled": "disabled", "Disabled_E2E_Encryption_for_this_room": "disabled E2E Encryption for this room", "@username": "@username", @@ -282,6 +283,8 @@ "Accounts_TwoFactorAuthentication_MaxDelta_Description": "The Maximum Delta determines how many tokens are valid at any given time. Tokens are generated every 30 seconds, and are valid for (30 * Maximum Delta) seconds. \nExample: With a Maximum Delta set to 10, each token can be used up to 300 seconds before or after it's timestamp. This is useful when the client's clock is not properly synced with the server.", "Accounts_TwoFactorAuthentication_RememberFor": "Remember Two Factor for (seconds)", "Accounts_TwoFactorAuthentication_RememberFor_Description": "Do not request two factor authorization code if it was already provided before in the given time.", + "Accounts_TwoFactorAuthentication_Max_Invalid_Email_Code_Attempts": "Maximun Invalid Email OTP Codes Allowed", + "Accounts_TwoFactorAuthentication_Max_Invalid_Email_Code_Attempts_Description": "The system allows a maximum number of invalid email OTP codes, after which a new code is automatically generated. We highly recommend using this setting along with 'Block failed login attempts by Username'.", "Accounts_UseDefaultBlockedDomainsList": "Use Default Blocked Domains List", "Accounts_UseDNSDomainCheck": "Use DNS Domain Check", "API_EmbedDisabledFor": "Disable Embed for Users", @@ -328,6 +331,7 @@ "add-team-channel_description": "Permission to add a channel to a team", "add-team-member": "Add Team Member", "add-team-member_description": "Permission to add members to a team", + "Add_them": "Add them", "add-user": "Add User", "add-user_description": "Permission to add new users to the server via users screen", "add-user-to-any-c-room": "Add User to Any Public Channel", @@ -500,6 +504,7 @@ "App_Details": "App details", "App_Info": "App Info", "App_Information": "App Information", + "Apps_context_enterprise": "Enterprise", "App_Installation": "App Installation", "App_not_enabled": "App not enabled", "App_not_found": "App not found", @@ -509,6 +514,7 @@ "App_status_error_disabled": "Disabled: Uncaught Error", "App_status_initialized": "Initialized", "App_status_invalid_license_disabled": "Disabled: Invalid License", + "Apps_disabled_when_Enterprise_trial_ended": "Apps disabled when Enterprise trial ended", "App_status_invalid_settings_disabled": "Disabled: Configuration Needed", "App_status_manually_disabled": "Disabled: Manually", "App_status_manually_enabled": "Enabled", @@ -527,19 +533,18 @@ "Apply_and_refresh_all_clients": "Apply and refresh all clients", "Apps": "Apps", "Apps_context_explore": "Explore", - "Apps_context_enterprise": "Enterprise", "Apps_context_installed": "Installed", "Apps_context_requested": "Requested", "Apps_context_private": "Private Apps", "Apps_context_premium": "Premium", - "Apps_Count_Enabled": "{{counter}} app enabled", - "Apps_Count_Enabled_plural": "{{counter}} apps enabled", - "Private_Apps_Count_Enabled": "{{counter}} private app enabled", - "Private_Apps_Count_Enabled_plural": "{{counter}} private apps enabled", - "Apps_Count_Enabled_tooltip": "Community Edition workspaces can enable up to {{number}} {{context}} apps", - "Apps_disabled_when_Enterprise_trial_ended": "Apps disabled when Enterprise trial ended", - "Apps_disabled_when_Enterprise_trial_ended_description": "Workspaces on Community Edition can have up to 5 marketplace apps and 3 private apps enabled. Ask your workspace admin to reenable apps.", - "Apps_disabled_when_Enterprise_trial_ended_description_admin": "Workspaces on Community Edition can have up to 5 marketplace apps and 3 private apps enabled. Reenable the apps you require.", + "Apps_Count_Enabled": "{{count}} app enabled", + "Apps_Count_Enabled_plural": "{{count}} apps enabled", + "Private_Apps_Count_Enabled": "{{count}} private app enabled", + "Private_Apps_Count_Enabled_plural": "{{count}} private apps enabled", + "Apps_Count_Enabled_tooltip": "Community workspaces can enable up to {{number}} {{context}} apps", + "Apps_disabled_when_Premium_trial_ended": "Apps disabled when Premium plan trial ended", + "Apps_disabled_when_Premium_trial_ended_description": "Workspaces on Community can have up to 5 marketplace apps and 3 private apps enabled. Ask your workspace admin to reenable apps.", + "Apps_disabled_when_Premium_trial_ended_description_admin": "Workspaces on Community can have up to 5 marketplace apps and 3 private apps enabled. Reenable the apps you require.", "Apps_Engine_Version": "Apps Engine Version", "Apps_Error_private_app_install_disabled": "Private app installation and updates are disabled in this workspace", "Apps_Essential_Alert": "This app is essential for the following events:", @@ -667,6 +672,7 @@ "Are_you_sure_you_want_to_delete_this_record": "Are you sure you want to delete this record?", "Are_you_sure_you_want_to_delete_your_account": "Are you sure you want to delete your account?", "Are_you_sure_you_want_to_disable_Facebook_integration": "Are you sure you want to disable Facebook integration?", + "Are_you_sure_you_want_to_pin_this_message": "Are you sure you want to pin this message?", "Are_you_sure_you_want_to_reset_the_name_of_all_priorities": "Are you sure you want to reset the name of all priorities?", "Assets": "Assets", "Assets_Description": "Modify your workspace's logo, icon, favicon and more.", @@ -823,6 +829,7 @@ "Broadcasting_media_server_url": "Broadcasting Media Server URL", "Browse_Files": "Browse Files", "Browser_does_not_support_audio_element": "Your browser does not support the audio element.", + "Call_number_enterprise_only": "Call number (Enterprise Edition only)", "Browser_does_not_support_video_element": "Your browser does not support the video element.", "Browser_does_not_support_recording_video": "Your browser does not support recording video", "Bugsnag_api_key": "Bugsnag API Key", @@ -836,6 +843,8 @@ "Business_Hour_Removed": "Business Hour Removed", "Business_Hours": "Business Hours", "Business_hours_enabled": "Business hours enabled", + "Business_hours_is_disabled": "Business hours is disabled", + "Business_hours_is_disabled_description": "Enable business hours at the workspace admin panel to let customers know when you're available and when can they expect a response.", "Business_hours_updated": "Business hours updated", "busy": "busy", "Busy": "Busy", @@ -865,7 +874,7 @@ "Call_provider": "Call Provider", "Call_Already_Ended": "Call Already Ended", "Call_number": "Call number", - "Call_number_enterprise_only": "Call number (Enterprise Edition only)", + "Call_number_premium_only": "Call number (Premium plans only)", "call-management": "Call Management", "call-management_description": "Permission to start a meeting", "Call_ongoing": "Call ongoing", @@ -884,6 +893,7 @@ "Cancel": "Cancel", "Cancel_message_input": "Cancel", "Canceled": "Canceled", + "Cancel_subscription": "Cancel subscription", "Canned_Response_Created": "Canned Response created", "Canned_Response_Updated": "Canned Response updated", "Canned_Response_Delete_Warning": "Deleting a canned response cannot be undone.", @@ -1018,8 +1028,6 @@ "Close": "Close", "Close_chat": "Close chat", "Close_room_description": "You are about to close this chat. Are you sure you want to continue?", - "Close_to_seat_limit_banner_warning": "*You have [{{seats}}] seats left* \nThis workspace is nearing its seat limit. Once the limit is met no new members can be added. *[Request More Seats]({{url}})*", - "Close_to_seat_limit_warning": "New members cannot be created once the seat limit is met.", "close-livechat-room": "Close Omnichannel Room", "close-livechat-room_description": "Permission to close the current Omnichannel room", "Close_menu": "Close menu", @@ -1058,8 +1066,6 @@ "Cloud_register_offline_finish_helper": "After completing the registration process in the Cloud Console you should be presented with some text. Please paste it here to finish the registration.", "Cloud_register_offline_helper": "Workspaces can be manually registered if airgapped or network access is restricted. Copy the text below and go to our Cloud Console to complete the process.", "Cloud_register_success": "Your workspace has been successfully registered!", - "Cloud_registration_pending_html": "Push notifications will not work until the registration is finished. Learn more", - "Cloud_registration_pending_title": "Cloud registration is still pending", "Cloud_registration_required": "Registration Required", "Cloud_registration_required_description": "Looks like during setup you didn't chose to register your workspace.", "Cloud_registration_required_link_text": "Click here to register your workspace.", @@ -1144,6 +1150,7 @@ "Contact_Info": "Contact Information", "Content": "Content", "Continue": "Continue", + "Continue_Adding": "Continue Adding?", "Continuous_sound_notifications_for_new_livechat_room": "Continuous sound notifications for new omnichannel room", "convert-team": "Convert Team", "convert-team_description": "Permission to convert team to channel", @@ -1453,6 +1460,7 @@ "CROWD_Reject_Unauthorized": "Reject Unauthorized", "Crowd_Remove_Orphaned_Users": "Remove Orphaned Users", "Crowd_sync_interval_Description": "The interval between synchronizations. Example `every 24 hours` or `on the first day of the week`, more examples at [Cron Text Parser](http://bunkat.github.io/later/parsers.html#text)", + "CSV": "CSV", "Current_Chats": "Current Chats", "Current_File": "Current File", "Current_Import_Operation": "Current Import Operation", @@ -1562,7 +1570,7 @@ "Delete_message": "Delete message", "Delete_my_account": "Delete my account", "Delete_Role_Warning": "This cannot be undone", - "Delete_Role_Warning_Community_Edition": "This cannot be undone. Note that it's not possible to create new custom roles in Community Edition", + "Delete_Role_Warning_Not_Enterprise": "This cannot be undone. You won't be able to create a new custom role, since that feature is no longer available for your current plan.", "Delete_Room_Warning": "Deleting a room will delete all messages posted within the room. This cannot be undone.", "Delete_User_Warning": "Deleting a user will delete all messages from that user as well. This cannot be undone.", "Delete_User_Warning_Delete": "Deleting a user will delete all messages from that user as well. This cannot be undone.", @@ -1645,7 +1653,7 @@ "Direct_message_creation_description": "You are about to create a chat with multiple users. Add the ones you would like to talk, everyone in the same place, using direct messages.", "Direct_message_someone": "Direct message someone", "Direct_message_you_have_joined": "You have joined a new direct message with", - "Direct_Messages": "Direct Messages", + "Direct_Messages": "Direct messages", "Direct_Reply": "Direct Reply", "Direct_Reply_Advice": "You can directly reply to this email. Do not modify previous emails in the thread.", "Direct_Reply_Debug": "Debug Direct Reply", @@ -1704,6 +1712,7 @@ "Do_not_display_unread_counter": "Do not display any counter of this channel", "Do_not_provide_this_code_to_anyone": "Do not provide this code to anyone.", "Do_Nothing": "Do Nothing", + "Do_nothing": "Do nothing", "Do_you_have_any_notes_for_this_conversation": "Do you have any notes for this conversation?", "Do_you_want_to_accept": "Do you want to accept?", "Do_you_want_to_change_to_s_question": "Do you want to change to %s?", @@ -1719,7 +1728,7 @@ "Dont_ask_me_again_list": "Don't ask me again list", "Download": "Download", "Download_Destkop_App": "Download Desktop App", - "Download_Info": "Download Info", + "Download_Info": "Download info", "Download_My_Data": "Download My Data (HTML)", "Download_Pending_Avatars": "Download Pending Avatars", "Download_Pending_Files": "Download Pending Files", @@ -1850,13 +1859,21 @@ "Email_notification_show_message": "Show Message in Email Notification", "Email_Notifications_Change_Disabled": "Your Rocket.Chat administrator has disabled email notifications", "Email_or_username": "Email or username", + "Enterprise_capability": "Enterprise capability", "Email_Placeholder": "Please enter your email address...", + "Enterprise_capabilities": "Enterprise capabilities", "Email_Placeholder_any": "Please enter email addresses...", "email_plain_text_only": "Send only plain text emails", + "Enterprise_Departments_description_upgrade": "Workspaces on Community Edition can create just one department. Upgrade to Enterprise to remove limits and supercharge your workspace.", + "Enterprise_Departments_description_free_trial": "Workspaces on Community Edition can create one department. Start a free Enterprise trial to create multiple departments today!", "email_style_description": "Avoid nested selectors", "email_style_label": "Email Style", + "Enterprise_Description": "Manually update your Premium license.", "Email_subject": "Email Subject", + "Enterprise_License": "Enterprise License", + "Enterprise_License_Description": "If your workspace is registered and license is provided by Rocket.Chat cloud you don't need to manually update the license here.", "Email_verified": "Email verified", + "Enterprise_Only": "Enterprise only", "Email_sent": "Email sent", "Emoji": "Emoji", "Emoji_picker": "Emoji picker", @@ -1901,7 +1918,7 @@ "End_OTR": "End OTR", "Engagement": "Engagement", "Engagement_Dashboard": "Engagement dashboard", - "Enrich_your_workspace": "Enrich your workspace perspective with the engagement dashboard. Analyze practical usage statistics about your users, messages and channels. Included with Rocket.Chat Enterprise.", + "Enrich_your_workspace": "Enrich your workspace perspective with the engagement dashboard. Analyze practical usage statistics about your users, messages and channels. Included in Premium plans.", "Ensure_secure_workspace_access": "Ensure secure workspace access", "Enter": "Enter", "Enter_a_custom_message": "Enter a custom message", @@ -1922,16 +1939,13 @@ "Enter_your_E2E_password": "Enter your E2E password", "Enter_your_password_to_delete_your_account": "Enter your password to delete your account. This cannot be undone.", "Enter_your_username_to_delete_your_account": "Enter your username to delete your account. This cannot be undone.", - "Enterprise": "Enterprise", - "Enterprise_capability": "Enterprise capability", - "Enterprise_capabilities": "Enterprise capabilities", - "Enterprise_Departments_title": "Assign customers to queues and improve agent productivity", - "Enterprise_Departments_description_upgrade": "Workspaces on Community Edition can create just one department. Upgrade to Enterprise to remove limits and supercharge your workspace.", - "Enterprise_Departments_description_free_trial": "Workspaces on Community Edition can create one department. Start a free Enterprise trial to create multiple departments today!", - "Enterprise_Description": "Manually update your Enterprise license.", - "Enterprise_License": "Enterprise License", - "Enterprise_License_Description": "If your workspace is registered and license is provided by Rocket.Chat Cloud you don't need to manually update the license here.", - "Enterprise_Only": "Enterprise only", + "Premium_capabilities": "Premium capabilities", + "Premium_Departments_title": "Assign customers to queues and improve agent productivity", + "Premium_Departments_description_upgrade": "Workspaces on Community can create just one department. Upgrade to a Premium plan to remove limits and supercharge your workspace.", + "Premium_Departments_description_free_trial": "Workspaces on Community can create one department. Start a free Premium trial to create multiple departments today!", + "Premium_License": "Premium License", + "Premium_License_alert": "If a license is removed the workspace must be restarted to take effect.
If the workspace is connected to the cloud the license should be canceled there first otherwise cloud will provide the license to the workspace again during the restart.", + "Premium_only": "Premium only", "Entertainment": "Entertainment", "Error": "Error", "Error_something_went_wrong": "Oops! Something went wrong. Please reload the page or contact an administrator.", @@ -1956,7 +1970,7 @@ "error-business-hours-are-closed": "Business Hours are closed", "error-business-hour-finish-time-before-start-time": "Finish time must be after start time", "error-business-hour-finish-time-equals-start-time": "Start and Finish time cannot be the same", - "error-blocked-username": "{{field}} is blocked and can't be used!", + "error-blocked-username": "**{{field}}** is blocked and can't be used!", "error-canned-response-not-found": "Canned Response Not Found", "error-cannot-delete-app-user": "Deleting app user is not allowed, uninstall the corresponding app to remove it.", "error-cant-add-federated-users": "Can't add federated users to a non-federated room", @@ -2010,6 +2024,7 @@ "error-invalid-email-address": "Invalid email address", "error-invalid-email-inbox": "Invalid Email Inbox", "error-email-inbox-not-found": "Email Inbox not found", + "error-this-is-an-ee-feature": "This is an enterprise edition feature", "error-invalid-file-height": "Invalid file height", "error-invalid-file-type": "Invalid file type", "error-invalid-file-width": "Invalid file width", @@ -2045,6 +2060,7 @@ "error-max-guests-number-reached": "You reached the maximum number of guest users allowed by your license. Contact sale@rocket.chat for a new license.", "error-max-number-simultaneous-chats-reached": "The maximum number of simultaneous chats per agent has been reached.", "error-max-rooms-per-guest-reached": "The maximum number of rooms per guest has been reached.", + "error-mac-limit-reached": "The maximum number of monthly active contacts for this workspace has been reached.", "error-message-deleting-blocked": "Message deleting is blocked", "error-message-editing-blocked": "Message editing is blocked", "error-message-size-exceeded": "Message size exceeds Message_MaxAllowedSize", @@ -2087,7 +2103,7 @@ "error-tags-must-be-assigned-before-closing-chat": "Tag(s) must be assigned before closing the chat", "error-the-field-is-required": "The field {{field}} is required.", "error-this-is-not-a-livechat-room": "This is not a Omnichannel room", - "error-this-is-an-ee-feature": "This is an enterprise edition feature", + "error-this-is-a-premium-feature": "This is from a premium feature", "error-token-already-exists": "A token with this name already exists", "error-token-does-not-exists": "Token does not exists", "error-too-many-requests": "Error, too many requests. Please slow down. You must wait {{seconds}} seconds before trying again.", @@ -2110,10 +2126,13 @@ "error-you-are-last-owner": "You are the last owner. Please set new owner before leaving the room.", "error-saving-sla": "An error ocurred while saving the SLA", "error-duplicated-sla": "An SLA with the same name or due time already exists", + "error-cannot-place-chat-on-hold": "You cannot place chat on-hold", "error-contact-sent-last-message-so-cannot-place-on-hold": "You cannot place chat on-hold, when the Contact has sent the last message", "error-unserved-rooms-cannot-be-placed-onhold": "Room cannot be placed on hold before being served", + "Workspace_exceeded_MAC_limit_disclaimer": "The workspace has exceeded the monthly limit of active contacts. Talk to your workspace admin to address this issue.", "You_do_not_have_permission_to_do_this": "You do not have permission to do this", "You_do_not_have_permission_to_execute_this_command": "You do not have enough permissions to execute command: `/{{command}}`", + "You_have_reached_the_limit_active_costumers_this_month": "You have reached the limit of active customers this month", "Errors_and_Warnings": "Errors and Warnings", "Esc_to": "Esc to", "Estimated_wait_time": "Estimated wait time", @@ -2139,6 +2158,7 @@ "Exact": "Exact", "Example_payload": "Example payload", "Example_s": "Example: %s", + "Federation_Matrix_join_public_rooms_is_enterprise": "Join federated rooms is an Enterprise Edition feature", "except_pinned": "(except those that are pinned)", "Exclude_Botnames": "Exclude Bots", "Exclude_Botnames_Description": "Do not propagate messages from bots whose name matches the regular expression above. If left empty, all messages from bots will be propagated.", @@ -2175,6 +2195,7 @@ "Failed_To_Load_Import_History": "Failed to load import history", "Failed_To_Load_Import_Operation": "Failed to load import operation", "Failed_To_Start_Import": "Failed to start import operation", + "Failed_To_upload_Import_File": "Failed to upload import file", "Failed_to_validate_invite_token": "Failed to validate invite token", "Failure": "Failure", "False": "False", @@ -2236,7 +2257,7 @@ "Federation_Matrix_losing_privileges_warning": "You won't be able to undo this action, as you're demoting yourself. If you're the last privileged user you won't be able to regain this privilege. Do you want to proceed still?", "Federation_Matrix_not_allowed_to_change_moderator": "You are not allowed to change the moderator", "Federation_Matrix_not_allowed_to_change_owner": "You are not allowed to change the owner", - "Federation_Matrix_join_public_rooms_is_enterprise": "Join federated rooms is an Enterprise Edition feature", + "Federation_Matrix_join_public_rooms_is_premium": "Join federated rooms is a Premium feature", "Federation_Matrix_max_size_of_public_rooms_users": "Maximum number of users when joining a public room in a remote server", "Federation_Matrix_max_size_of_public_rooms_users_desc": "The number of the maximum users when joining a public room in a remote server. Public Rooms with more users will be ignored in the list of Public Rooms to join.", "Federation_Matrix_max_size_of_public_rooms_users_Alert": "Keep in mind, that the bigger the room you allow for users to join, the more time it will take to join that room, besides the amount of resource it will use. Read more", @@ -2245,7 +2266,7 @@ "Field_required": "Field required", "File": "File", "File_Downloads_Started": "File Downloads Started", - "File_exceeds_allowed_size_of_bytes": "File exceeds allowed size of {{size}}.", + "File_exceeds_allowed_size_of_bytes": "File size exceeds upload limit of {{size}}.", "File_name_Placeholder": "Search files...", "File_not_allowed_direct_messages": "File sharing not allowed in direct messages.", "File_Path": "File Path", @@ -2312,10 +2333,12 @@ "FileUpload_S3_BucketURL": "Bucket URL", "FileUpload_S3_CDN": "CDN Domain for Downloads", "FileUpload_S3_ForcePathStyle": "Force Path Style", + "Google_Meet_Enterprise_only": "Google Meet (Enterprise only)", "FileUpload_S3_Proxy_Avatars": "Proxy Avatars", "FileUpload_S3_Proxy_Avatars_Description": "Proxy avatar file transmissions through your server instead of direct access to the asset's URL", "FileUpload_S3_Proxy_Uploads": "Proxy Uploads", "FileUpload_S3_Proxy_Uploads_Description": "Proxy upload file transmissions through your server instead of direct access to the asset's URL", + "Hold_Call_EE_only": "Hold Call (Enterprise Edition only)", "FileUpload_S3_Region": "Region", "FileUpload_S3_SignatureVersion": "Signature Version", "FileUpload_S3_URLExpiryTimeSpan": "URLs Expiration Timespan", @@ -2371,6 +2394,7 @@ "Forgot_Password_Email": "Click here to reset your password.", "Forgot_Password_Email_Subject": "[Site_Name] - Password Recovery", "Forgot_password_section": "Forgot password", + "Hold_EE_only": "Hold (Enterprise Edition only)", "Format": "Format", "Forward": "Forward", "Forward_chat": "Forward chat", @@ -2424,10 +2448,10 @@ "Global_Search": "Global search", "Go_to_your_workspace": "Go to your workspace", "Go_to_accessibility_and_appearance": "Go to accessibility and appearance", - "Google_Meet_Enterprise_only": "Google Meet (Enterprise only)", + "Google_Meet_Premium_only": "Google Meet (Premium only)", "Google_Play": "Google Play", "Hold_Call": "Hold Call", - "Hold_Call_EE_only": "Hold Call (Enterprise Edition only)", + "Hold_Call_Premium_only": "Hold Call (Premium plans only)", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "Service account key JSON file. More information can be found [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google Tag Manager Id", @@ -2480,10 +2504,11 @@ "Highlights": "Highlights", "Highlights_How_To": "To be notified when someone mentions a word or phrase, add it here. You can separate words or phrases with commas. Highlight Words are not case sensitive.", "Highlights_List": "Highlight words", + "HipChat (tar.gz)": "HipChat (tar.gz)", "History": "History", "Hold_Time": "Hold Time", "Hold": "Hold", - "Hold_EE_only": "Hold (Enterprise Edition only)", + "Hold_Premium_only": "Hold (Premium plans only)", "Home": "Home", "Homepage": "Homepage", "Homepage_Custom_Content_Default_Message": "Admins may insert content html to be rendered in this white space.", @@ -2535,6 +2560,7 @@ "Impersonate_user_description": "When enabled, integration posts as the user that triggered integration", "Import": "Import", "Import_New_File": "Import New File", + "Import_Operation_Failed": "Import operation failed", "Import_requested_successfully": "Import Requested Successfully", "Import_Type": "Import Type", "Importer_Archived": "Archived", @@ -2855,7 +2881,7 @@ "Layout_Login_Template_Vertical": "Vertical", "Layout_Login_Template_Horizontal": "Horizontal", "Layout_Description": "Customize the look of your workspace.", - "Layout_Home_Body": "Block content", + "Layout_Home_Body": "Content block", "Layout_Home_Page_Content": "Layout / Home page content", "Layout_Home_Page_Content_Title": "Home page content", "Layout_Home_Title": "Home Title", @@ -2864,7 +2890,7 @@ "Layout_Login_Terms_Content": "By proceeding you are agreeing to our Terms of Service, Privacy Policy and Legal Notice.", "Layout_Privacy_Policy": "Privacy Policy", "Layout_Show_Home_Button": "Show home page button on sidebar header", - "Layout_Custom_Content_Description": "Here goes your custom content. It may be placed inside a white block or may take the all space available in the homepage, if you’re on Enterprise.", + "Layout_Custom_Content_Description": "Here goes your custom content. It may be placed inside a white block or may take the all space available in the homepage, if you’re on a Premium plan.", "Layout_Home_Custom_Block_Visible": "Show custom content to homepage", "Layout_Custom_Body_Only": "Show custom content only", "Layout_Custom_Body_Only_Description": "It will hide all other content blocks in the homepage.", @@ -2891,7 +2917,7 @@ "LDAP_DataSync_Roles": "Sync Roles", "LDAP_DataSync_Channels": "Sync Channels", "LDAP_DataSync_Teams": "Sync Teams", - "LDAP_Enterprise": "Enterprise", + "LDAP_Enterprise": "Premium", "LDAP_DataSync_BackgroundSync": "Background Sync", "LDAP_Server_Type": "Server Type", "LDAP_Server_Type_AD": "Active Directory", @@ -3027,6 +3053,7 @@ "Lead_capture_phone_regex": "Lead capture phone regex", "Learn_more": "Learn more", "Learn_more_about_agents": "Learn more about agents", + "Learn_more_about_business_hours": "Learn more about business hours", "Learn_more_about_canned_responses": "Learn more about canned responses", "Learn_more_about_contacts": "Learn more about contacts", "Learn_more_about_current_chats": "Learn more about current chats", @@ -3055,7 +3082,8 @@ "leave-c_description": "Permission to leave channels", "leave-p": "Leave Private Groups", "leave-p_description": "Permission to leave private groups", - "Lets_get_you_new_one": "Let's get you a new one!", + "Lets_get_you_new_one_": "Let's get you a new one!", + "Let_them_know": "Let them know", "License": "License", "Line": "Line", "Link": "Link", @@ -3072,7 +3100,9 @@ "Livechat_agents": "Omnichannel agents", "Livechat_Agents": "Agents", "Livechat_allow_manual_on_hold": "Allow agents to manually place chat On Hold", - "Livechat_allow_manual_on_hold_Description": "If enabled, the agent will get a new option to place a chat On Hold, provided the agent has sent the last message", + "Livechat_allow_manual_on_hold_Description": "If enabled, the agent will get the option to place a chat On Hold", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only": "Chats on hold only after agent engagement", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only_Description": "Only allow chats to be put on hold if the agent is the one who sent the last message in the conversation.", "Livechat_AllowedDomainsList": "Livechat Allowed Domains", "Livechat_Appearance": "Livechat Appearance", "Livechat_auto_close_on_hold_chats_custom_message": "Custom message for closed chats in On Hold queue", @@ -3169,16 +3199,28 @@ "Load_Rotation": "Load Rotation", "Loading": "Loading", "Loading_more_from_history": "Loading more from history", + "marketplace_featured_section_community_featured": "Featured Community Apps", "Loading_suggestion": "Loading suggestions", + "marketplace_featured_section_community_supported": "Community Supported Apps", "Loading...": "Loading...", + "marketplace_featured_section_enterprise": "Featured Enterprise Apps", "Local": "Local", + "marketplace_featured_section_featured": "Featured Apps", + "marketplace_featured_section_most_popular": "Most Popular Apps", "Local_Domains": "Local Domains", + "marketplace_featured_section_new_arrivals": "New Arrivals", "Local_Password": "Local Password", + "marketplace_featured_section_popular_this_month": "Apps Popular this Month", "Local_Time": "Local Time", + "marketplace_featured_section_recommended": "Recommended Apps", "Local_Timezone": "Local Timezone", + "marketplace_featured_section_social": "Social Apps", "Local_Time_time": "Local Time: {{time}}", + "marketplace_featured_section_trending": "Trending Apps", "Localization": "Localization", "Location": "Location", + "marketplace_featured_section_omnichannel": "Omnichannel Apps", + "marketplace_featured_section_video_conferencing": "Video Conferencing Apps", "Log_Exceptions_to_Channel": "Log Exceptions to Channel", "Log_Exceptions_to_Channel_Description": "A channel that will receive all captured exceptions. Leave empty to ignore exceptions.", "Log_File": "Show File and Line", @@ -3321,18 +3363,6 @@ "Marketplace_app_last_updated": "Last updated {{lastUpdated}}", "Marketplace_view_marketplace": "View Marketplace", "Marketplace_error": "Cannot connect to internet or your workspace may be an offline install.", - "marketplace_featured_section_community_featured": "Featured Community Apps", - "marketplace_featured_section_community_supported": "Community Supported Apps", - "marketplace_featured_section_enterprise": "Featured Enterprise Apps", - "marketplace_featured_section_featured": "Featured Apps", - "marketplace_featured_section_most_popular": "Most Popular Apps", - "marketplace_featured_section_new_arrivals": "New Arrivals", - "marketplace_featured_section_popular_this_month": "Apps Popular this Month", - "marketplace_featured_section_recommended": "Recommended Apps", - "marketplace_featured_section_social": "Social Apps", - "marketplace_featured_section_trending": "Trending Apps", - "marketplace_featured_section_omnichannel": "Omnichannel Apps", - "marketplace_featured_section_video_conferencing": "Video Conferencing Apps", "MAU_value": "MAU {{value}}", "Max_length_is": "Max length is %s", "Max_number_incoming_livechats_displayed": "Max number of items displayed in the queue", @@ -3452,6 +3482,7 @@ "Message_HideType_subscription_role_removed": "Hide \"Role No Longer Defined\" messages", "Message_HideType_uj": "Hide \"User Join\" messages", "Message_HideType_ujt": "Hide \"User Joined Team\" messages", + "New_Call_Enterprise_Edition_Only": "New Call (Enterprise Edition Only)", "Message_HideType_ul": "Hide \"User Leave\" messages", "Message_HideType_ult": "Hide \"User Left Team\" messages", "Message_HideType_user_added_room_to_team": "Hide \"User Added Room to Team\" messages", @@ -3593,6 +3624,7 @@ "Monitors": "Monitors", "Monthly_Active_Users": "Monthly Active Users", "More": "More", + "More_actions": "More actions", "More_channels": "More channels", "More_direct_messages": "More direct messages", "More_groups": "More private groups", @@ -3607,7 +3639,7 @@ "Msgs": "Msgs", "multi": "multi", "Multi_line": "Multi line", - "Multiple_monolith_instances_alert": "You are operating multiple instances without an active enterprise license - some features may not behave as designed", + "Multiple_monolith_instances_alert": "You are operating multiple instances without an active Premium license - some features may not behave as designed", "Mute": "Mute", "Mute_and_dismiss": "Mute and dismiss", "Mute_all_notifications": "Mute all notifications", @@ -3639,7 +3671,7 @@ "New_Application": "New Application", "New_Business_Hour": "New Business Hour", "New_Call": "New Call", - "New_Call_Enterprise_Edition_Only": "New Call (Enterprise Edition Only)", + "New_Call_Premium_Only": "New Call (Premium Plans Only)", "New_chat_in_queue": "New chat in queue", "New_chat_priority": "Priority Changed: {{user}} changed the priority to {{priority}}", "New_chat_transfer": "New Chat Transfer: {{transfer}}", @@ -3669,6 +3701,7 @@ "New_Trigger": "New Trigger", "New_Unit": "New Unit", "New_users": "New users", + "New_user": "New user", "New_version_available_(s)": "New version available (%s)", "New_videocall_request": "New Video Call Request", "New_visitor_navigation": "New Navigation: {{history}}", @@ -3752,6 +3785,7 @@ "None": "None", "Nonprofit": "Nonprofit", "Not_authorized": "Not authorized", + "Pexip_Enterprise_only": "Pexip (Enterprise only)", "Normal": "Normal", "Not_Available": "Not Available", "Not_assigned": "Not assigned", @@ -3990,11 +4024,13 @@ "pdf_success_message": "PDF Transcript successfully generated", "pdf_error_message": "Error generating PDF Transcript", "Peer_Password": "Peer Password", + "Pending Avatars": "Pending Avatars", + "Pending Files": "Pending Files", "People": "People", "Permalink": "Permalink", "Permissions": "Permissions", "Personal_Access_Tokens": "Personal Access Tokens", - "Pexip_Enterprise_only": "Pexip (Enterprise only)", + "Pexip_Premium_only": "Pexip (Premium only)", "Phone": "Phone", "Phone_call": "Phone Call", "Phone_Number": "Phone Number", @@ -4009,6 +4045,7 @@ "pin-message_description": "Permission to pin a message in a channel", "Pinned_a_message": "Pinned a message:", "Pinned_Messages": "Pinned Messages", + "Pinned_messages_are_visible_to_everyone": "Pinned messages are visible to everyone", "Pinned_messages_unavailable_for_federation": "Pinned Messages are not available for federated rooms.", "pinning-not-allowed": "Pinning is not allowed", "PiwikAdditionalTrackers": "Additional Piwik Sites", @@ -4062,6 +4099,9 @@ "post-readonly_description": "Permission to post a message in a read-only channel", "Powered_by_JoyPixels": "Powered by JoyPixels", "Powered_by_RocketChat": "Powered by Rocket.Chat", + "powers-of-ten": "powers of ten", + "powers-of-two": "powers of two", + "increments-of-two": "increments of two", "Preferences": "Preferences", "Preferences_saved": "Preferences saved", "Preparing_data_for_import_process": "Preparing data for import process", @@ -4092,7 +4132,7 @@ "Private_Channels": "Private channels", "Private_Chats": "Private Chats", "Private_Group": "Private Group", - "Private_Groups": "Private Groups", + "Private_Groups": "Private groups", "Private_Groups_list": "List of Private Groups", "Private_Team": "Private Team", "Productivity": "Productivity", @@ -4143,7 +4183,7 @@ "Push_gcm_project_number": "GCM Project Number", "Push_production": "Production", "Push_request_content_from_server": "Hide message content from Apple and Google (and the Gateway, if enabled)", - "Push_request_content_from_server_Description": "Instead of exposing the message content to Apple/Google by including it in the push notification data, push only a message id. The mobile client will dynamically fetch the content from the server and update the notification before displaying it. In the event of an API error, it will display “You have a new message”. This setting takes effect only on the Enterprise Edition.", + "Push_request_content_from_server_Description": "Instead of exposing the message content to Apple/Google by including it in the push notification data, push only a message id. The mobile client will dynamically fetch the content from the server and update the notification before displaying it. In the event of an API error, it will display “You have a new message”. This setting takes effect only on a Premium plan.", "Push_Setting_Requires_Restart_Alert": "Changing this value requires restarting Rocket.Chat.", "Push_show_message": "Show Message in Notification", "Push_show_username_room": "Show Channel/Group/Username in Notification", @@ -4163,17 +4203,16 @@ "Quote": "Quote", "Random": "Random", "Rate Limiter": "Rate Limiter", - "Rate Limiter_Description": "Control the rate of requests sent or recieved by your server to prevent cyber attacks and scraping.", + "Rate Limiter_Description": "Control the rate of requests sent or received by your server to prevent cyber attacks and scraping.", "Rate_Limiter_Limit_RegisterUser": "Default number calls to the rate limiter for registering a user", "Rate_Limiter_Limit_RegisterUser_Description": "Number of default calls for user registering endpoints(REST and real-time API's), allowed within the time range defined in the API Rate Limiter section.", - "Reached_seat_limit_banner_warning": "*No more seats available* \nThis workspace has reached its seat limit so no more members can join. *[Request More Seats]({{url}})*", "React_when_read_only": "Allow Reacting", "React_when_read_only_changed_successfully": "Allow reacting when read only changed successfully", "Reacted_with": "Reacted with", "Reactions": "Reactions", "Read_by": "Read by", "Read_only": "Read Only", - "Read_Receipts": "Read Receipts", + "Read_Receipts": "Read receipts", "Readability": "Readability", "This_room_is_read_only": "This room is read only", "Only_people_with_permission_can_send_messages_here": "Only people with permission can send messages here", @@ -4191,6 +4230,7 @@ "Receive_Login_Detection_Emails_Description": "Receive an email each time a new login is detected on your account.", "Recent_Import_History": "Recent Import History", "Record": "Record", + "Records": "Records", "recording": "recording", "Redirect_URI": "Redirect URI", "Redirect_URL_does_not_match": "Redirect URL does not match", @@ -4283,17 +4323,13 @@ "Report_User": "Report user", "Reporting": "Reporting", "Request": "Request", - "Request_seats": "Request Seats", - "Request_more_seats": "Request more seats.", - "Request_more_seats_out_of_seats": "You can not add members because this Workspace is out of seats, please request more seats.", - "Request_more_seats_sales_team": "Once your request is submitted, our Sales Team will look into it and will reach out to you within the next couple of days.", - "Request_more_seats_title": "Request More Seats", "Request_comment_when_closing_conversation": "Request comment when closing conversation", "Request_comment_when_closing_conversation_description": "If enabled, the agent will need to set a comment before the conversation is closed.", "Request_tag_before_closing_chat": "Request tag(s) before closing conversation", "request": "request", "requests": "requests", "Requests": "Requests", + "Search_Enterprise_Apps": "Search Enterprise apps", "Requested": "Requested", "Requested_apps_will_appear_here": "Requested apps will appear here", "request-pdf-transcript": "Request PDF Transcript", @@ -4306,6 +4342,7 @@ "Require_all_tokens": "Require all tokens", "Require_any_token": "Require any token", "Require_password_change": "Require password change", + "Require_Two_Factor_Authentication": "Require Two Factor Authentication", "Resend_verification_email": "Resend verification email", "Reset": "Reset", "Reset_priorities": "Reset priorities", @@ -4427,6 +4464,7 @@ "Room_password_changed_successfully": "Room password changed successfully", "room_removed_read_only": "Room added writing permission by {{user_by}}", "room_set_read_only": "Room set as Read Only by {{user_by}}", + "Room_Status_Open": "Open", "room_removed_read_only_permission": "removed read only permission", "room_set_read_only_permission": "set room to read only", "Room_topic_changed_successfully": "Room topic changed successfully", @@ -4458,7 +4496,7 @@ "SAML_AuthnRequest_Template": "AuthnRequest Template", "SAML_AuthnRequest_Template_Description": "The following variables are available: \n- **\\_\\_newId\\_\\_**: Randomly generated id string \n- **\\_\\_instant\\_\\_**: Current timestamp \n- **\\_\\_callbackUrl\\_\\_**: The Rocket.Chat callback URL. \n- **\\_\\_entryPoint\\_\\_**: The value of the {{Custom Entry Point}} setting. \n- **\\_\\_issuer\\_\\_**: The value of the {{Custom Issuer}} setting. \n- **\\_\\_identifierFormatTag\\_\\_**: The contents of the {{NameID Policy Template}} if a valid {{Identifier Format}} is configured. \n- **\\_\\_identifierFormat\\_\\_**: The value of the {{Identifier Format}} setting. \n- **\\_\\_authnContextTag\\_\\_**: The contents of the {{AuthnContext Template}} if a valid {{Custom Authn Context}} is configured. \n- **\\_\\_authnContextComparison\\_\\_**: The value of the {{Authn Context Comparison}} setting. \n- **\\_\\_authnContext\\_\\_**: The value of the {{Custom Authn Context}} setting.", "SAML_Connection": "Connection", - "SAML_Enterprise": "Enterprise", + "SAML_Enterprise": "Premium", "SAML_General": "General", "SAML_Custom_Authn_Context": "Custom Authn Context", "SAML_Custom_Authn_Context_Comparison": "Authn Context Comparison", @@ -4555,7 +4593,6 @@ "Search": "Search", "Searchable": "Searchable", "Search_Apps": "Search apps", - "Search_Enterprise_Apps": "Search Enterprise apps", "Search_Installed_Apps": "Search installed apps", "Search_Private_apps": "Search private apps", "Search_Requested_Apps": "Search requested apps", @@ -4581,7 +4618,10 @@ "Search_rooms": "Search rooms", "Search_Rooms": "Search Rooms", "Search_Users": "Search Users", - "Seats_Available": "{{seatsLeft}} Seats Available", + "Seats_Available": "{{seatsLeft, number}} Seats Available", + "MAC_Available": "{{macLeft, number}} MAC's Available", + "used_limit": "{{used, number}} / {{limit, number}}", + "used_limit_infinite": "{{used, number}} / ∞", "Seats_usage": "Seats Usage", "seconds": "seconds", "Secret_token": "Secret Token", @@ -4594,6 +4634,7 @@ "See_full_profile": "See full profile", "See_history": "See history", "See_on_Engagement_Dashboard": "See on Engagement Dashboard", + "Select": "Select", "Select_a_department": "Select a department", "Select_a_room": "Select a room", "Select_a_user": "Select a user", @@ -4612,6 +4653,7 @@ "Select_atleast_one_channel_to_forward_the_messsage_to": "Select at least one channel to forward the message to", "Select_user": "Select user", "Select_users": "Select users", + "Select_period": "Select period", "Selected_agents": "Selected agents", "Selected_by_default": "Selected by default", "Selected_departments": "Selected Departments", @@ -4755,12 +4797,21 @@ "Size": "Size", "Skin_tone": "Skin tone", "Skip": "Skip", + "Skip_to_main_content": "Skip to main content", "SLA_Policy": "SLA Policy", "SLA_Policies": "SLA Policies", "SLA_removed": "SLA removed", + "Slack": "Slack", "Slack_Users": "Slack's Users CSV", - "SlackBridge_APIToken": "API Tokens", + "SlackBridge_APIToken": "API Tokens (Legacy)", + "SlackBridge_UseLegacy": "Use Legacy API Tokens", "SlackBridge_APIToken_Description": "You can configure multiple slack servers by adding one API Token per line.", + "SlackBridge_BotToken": "Bot Tokens", + "SlackBridge_BotToken_Description": "You can configure multiple slack servers by adding one Bot Token per line.", + "SlackBridge_AppToken": "App Tokens", + "SlackBridge_AppToken_Description": "You can configure multiple slack servers by adding one App Token per line.", + "SlackBridge_SigningSecret": "Signing Secret", + "SlackBridge_SigningSecret_Description": "You can configure multiple slack servers by adding one signing secret per line.", "Slackbridge_channel_links_removed_successfully": "The slackbridge channel links have been removed successfully.", "SlackBridge_Description": "Enable Rocket.Chat to communicate directly with Slack.", "SlackBridge_error": "SlackBridge got an error while importing your messages at %s: %s", @@ -4835,6 +4886,7 @@ "Star": "Star", "Star_Message": "Star Message", "Starred_Messages": "Starred Messages", + "Starred_messages_are_only_visible_to_you": "Starred messages are only visible to you", "Start": "Start", "Start_a_call": "Start a call", "Start_a_call_with": "Start a call with", @@ -4874,17 +4926,18 @@ "Stats_Total_Active_Outgoing_Integrations": "Total Active Outgoing Integrations", "Stats_Total_Channels": "Channels", "Stats_Total_Connected_Users": "Total Connected Users", - "Stats_Total_Direct_Messages": "Direct Message Rooms", + "Stats_Total_Direct_Messages": "Direct messages", "Stats_Total_Incoming_Integrations": "Total Incoming Integrations", "Stats_Total_Installed_Apps": "Total Installed Apps", "Stats_Total_Integrations": "Total Integrations", "Stats_Total_Integrations_With_Script_Enabled": "Total Integrations With Script Enabled", "Stats_Total_Livechat_Rooms": "Omnichannel Rooms", "Stats_Total_Messages": "Messages", - "Stats_Total_Messages_Channel": "Messages in Channels", - "Stats_Total_Messages_Direct": "Messages in Direct Messages", - "Stats_Total_Messages_Livechat": "Messages in Omnichannel", - "Stats_Total_Messages_PrivateGroup": "Messages in Private Groups", + "Stats_Total_Messages_Channel": "In channels", + "Stats_Total_Messages_Direct": "In direct messages", + "Stats_Total_Messages_Livechat": "In omnichannel", + "Stats_Total_Messages_PrivateGroup": "In private groups", + "Stats_Total_Messages_Discussions": "In discussions", "Stats_Total_Outgoing_Integrations": "Total Outgoing Integrations", "Stats_Total_Private_Groups": "Private Groups", "Stats_Total_Rooms": "Rooms", @@ -4939,6 +4992,7 @@ "Talk_to_an_expert": "Talk to an expert", "Talk_to_sales": "Talk to sales", "Talk_to_your_workspace_administrator_about_enabling_video_conferencing": "Talk to your workspace administrator about enabling video conferencing", + "Talk_to_your_workspace_admin_to_address_this_issue": "Talk to your workspace admin to address this issue.", "Target user not allowed to receive messages": "Target user not allowed to receive messages", "TargetRoom": "Target Room", "TargetRoom_Description": "The room where messages will be sent which are a result of this event being fired. Only one target room is allowed and it must exist.", @@ -5008,13 +5062,19 @@ "Teams_Search_teams": "Search Teams", "Teams_New_Read_only_Label": "Read Only", "Technology_Services": "Technology Services", + "Upgrade_tab_connection_error_description": "Looks like you have no internet connection. This may be because your workspace is installed on a fully-secured air-gapped server", "Terms": "Terms", "Terms_of_use": "Terms of use", + "Upgrade_tab_connection_error_restore": "Restore your connection to learn about features you are missing out on.", "Test_Connection": "Test Connection", + "Upgrade_tab_go_fully_featured": "Go fully featured", + "Upgrade_tab_trial_guide": "Trial guide", "Test_Desktop_Notifications": "Test Desktop Notifications", "Test_LDAP_Search": "Test LDAP Search", "test-admin-options": "Test options on admin panel", - "test-admin-options_description": "Permission to test options on admin panel such as LDAP login and push notifications", + "test-admin-options_description": "Permission to test options on admin panel such as LDAP login.", + "test-push-notifications": "Test push notifications", + "test-push-notifications_description": "Permission to test push notifications", "Texts": "Texts", "Thank_you_for_your_feedback": "Thank you for your feedback", "The_application_name_is_required": "The application name is required", @@ -5036,6 +5096,7 @@ "The_user_s_will_be_removed_from_role_s": "The user %s will be removed from role %s", "The_user_will_be_removed_from_s": "The user will be removed from %s", "The_user_wont_be_able_to_type_in_s": "The user won't be able to type in %s", + "The_workspace_has_exceeded_the_monthly_limit_of_active_contacts": "The workspace has exceeded the monthly limit of active contacts.", "Theme": "Theme", "Themes": "Themes", "Choose_theme_description": "Choose the interface appearance that best suits your needs.", @@ -5109,7 +5170,7 @@ "There_has_been_an_error_installing_the_app": "There has been an error installing the app", "These_notes_will_be_available_in_the_call_summary": "These notes will be available in the call summary", "This_agent_was_already_selected": "This agent was already selected", - "this_app_is_included_with_subscription": "This app is included with {{bundleName}} subscription", + "this_app_is_included_with_subscription": "This app is included with {{bundleName}} plans", "This_cant_be_undone": "This can't be undone.", "This_conversation_is_already_closed": "This conversation is already closed.", "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "This email has already been used and has not been verified. Please change your password.", @@ -5118,6 +5179,7 @@ "This_is_a_deprecated_feature_alert": "This is a deprecated feature. It may not work as expected and will not get new updates.", "Zapier_integration_has_been_deprecated": "The Zapier integration has been deprecated, may not work as expected and will not receive updates", "Install_Zapier_from_marketplace": "Install the Zapier app from Marketplace to avoid disruptions", + "Input": "Input", "This_is_a_push_test_messsage": "This is a push test message", "This_message_was_rejected_by__peer__peer": "This message was rejected by {{peer}} peer.", "This_monitor_was_already_selected": "This monitor was already selected", @@ -5181,6 +5243,7 @@ "totp-disabled": "You do not have 2FA login enabled for your user", "totp-invalid": "Code or password invalid", "totp-required": "TOTP Required", + "totp-max-attempts": "Maximum OTP failed attempts reached. A new code will be generated.", "Transcript": "Transcript", "Transcript_Enabled": "Ask Visitor if They Would Like a Transcript After Chat Closed", "Transcript_message": "Message to Show When Asking About Transcript", @@ -5215,6 +5278,8 @@ "Troubleshoot_Disable_Sessions_Monitor_Alert": "This setting stops the processing of user sessions causing the statistics to stop working correctly!", "Troubleshoot_Disable_Teams_Mention": "Disable Teams mention", "Troubleshoot_Disable_Teams_Mention_Alert": "This setting disables the teams mention feature. User's won't be able to mention a Team by name in a message and get its members notified.", + "Troubleshoot_Force_Caching_Version": "Force browsers to clear networking cache based on version change", + "Troubleshoot_Force_Caching_Version_Alert": "If the value provided is not empty and different from previous one the browsers will try to clear the cache. This setting should not be set for a long period since it affects the browser performance, please clear it as soon as possible.", "True": "True", "Try_now": "Try now", "Try_searching_in_the_marketplace_instead": "Try searching in the Marketplace instead", @@ -5311,15 +5376,12 @@ "Update_to_version": "Update to {{version}}", "Update_your_RocketChat": "Update your Rocket.Chat", "Updated_at": "Updated at", - "Upgrade_tab_connection_error_description": "Looks like you have no internet connection. This may be because your workspace is installed on a fully-secured air-gapped server", - "Upgrade_tab_connection_error_restore": "Restore your connection to learn about features you are missing out on.", - "Upgrade_tab_go_fully_featured": "Go fully featured", - "Upgrade_tab_trial_guide": "Trial guide", "Upgrade_tab_upgrade_your_plan": "Upgrade your plan", "Upload": "Upload", "Uploads": "Uploads", "Upload_private_app": "Upload private app", "Upload_file_description": "File description", + "Upload_file": "Upload file", "Upload_file_name": "File name", "Upload_file_question": "Upload file?", "Upload_Folder_Path": "Upload Folder Path", @@ -5567,6 +5629,7 @@ "view-full-other-user-info_description": "Permission to view full profile of other users including account creation date, last login, etc.", "view-history": "View History", "view-history_description": "Permission to view the channel history", + "onboarding.component.form.action.registerNow": "Register now", "view-join-code": "View Join Code", "view-join-code_description": "Permission to view the channel join code", "view-joined-room": "View Joined Room", @@ -5574,6 +5637,7 @@ "view-l-room": "View Omnichannel Rooms", "view-l-room_description": "Permission to view Omnichannel rooms", "view-livechat-analytics": "View Omnichannel Analytics", + "onboarding.page.awaitingConfirmation.subtitle": "We have sent you an email to {{emailAddress}} with a confirmation link. Please verify that the security code below matches the one in the email.", "view-livechat-analytics_description": "Permission to view live chat analytics", "view-livechat-appearance": "View Omnichannel Appearance", "view-livechat-appearance_description": "Permission to view live chat appearance", @@ -5677,8 +5741,10 @@ "Wait_activation_warning": "Before you can login, your account must be manually activated by an administrator.", "Waiting_for_answer": "Waiting for answer", "Waiting_queue": "Waiting queue", + "Enterprise_cap_description": "Enterprise workspaces have no cap on the presence service.", "Waiting_queue_message": "Waiting queue message", "Waiting_queue_message_description": "Message that will be displayed to the visitors when they get in the queue", + "More_about_Enterprise_Edition": "More about Enterprise Edition", "Waiting_Time": "Waiting Time", "Waiting_for_server_connection": "Waiting for server connection", "Warning": "Warning", @@ -5745,6 +5811,7 @@ "Would_you_like_to_return_the_inquiry": "Would you like to return the inquiry?", "Would_you_like_to_return_the_queue": "Would you like to move back this room to the queue? All conversation history will be kept on the room.", "Would_you_like_to_place_chat_on_hold": "Would you like to place this chat On-Hold?", + "multiple_instance_solutions": "multiple instance solutions", "Wrap_up_the_call": "Wrap-up the call", "Wrap_Up_Notes": "Wrap-Up Notes", "Workspace": "Workspace", @@ -5758,6 +5825,7 @@ "Yes_leave_it": "Yes, leave it!", "Yes_mute_user": "Yes, mute user!", "Yes_prune_them": "Yes, prune them!", + "Yes_pin_message": "Yes, pin message", "Yes_remove_user": "Yes, remove user!", "Yes_unarchive_it": "Yes, unarchive it!", "yesterday": "yesterday", @@ -5791,6 +5859,9 @@ "You_have_not_verified_your_email": "You have not verified your email.", "You_have_successfully_unsubscribed": "You have successfully unsubscribed from our Mailling List.", "You_must_join_to_view_messages_in_this_channel": "You must join to view messages in this channel", + "You_mentioned___mentions__but_theyre_not_in_this_room": "You mentioned {{mentions}}, but they're not in this room.", + "You_mentioned___mentions__but_theyre_not_in_this_room_You_can_ask_a_room_admin_to_add_them": "You mentioned {{mentions}}, but they're not in this room. You can ask a room admin to add them.", + "You_mentioned___mentions__but_theyre_not_in_this_room_You_let_them_know_via_dm": "You mentioned {{mentions}}, but they're not in this room. You let them know via DM.", "You_need_confirm_email": "You need to confirm your email to login!", "You_need_install_an_extension_to_allow_screen_sharing": "You need install an extension to allow screen sharing", "You_need_to_change_your_password": "You need to change your password", @@ -5822,13 +5893,14 @@ "Your_password_is_wrong": "Your password is wrong!", "Your_password_was_changed_by_an_admin": "Your password was changed by an admin.", "Your_push_was_sent_to_s_devices": "Your push was sent to %s devices", - "Your_request_to_join__roomName__has_been_made_it_could_take_up_to_15_minutes_to_be_processed": "Your request to join __roomName__ has been made, it could take up to 15 minutes to be processed. You'll be notified when it's ready to go.", + "Your_request_to_join__roomName__has_been_made_it_could_take_up_to_15_minutes_to_be_processed": "Your request to join {{roomName}} has been made, it could take up to 15 minutes to be processed. You'll be notified when it's ready to go.", "Your_question": "Your question", "Your_server_link": "Your server link", "Your_temporary_password_is_password": "Your temporary password is [password].", "Your_TOTP_has_been_reset": "Your Two Factor TOTP has been reset.", "Your_web_browser_blocked_Rocket_Chat_from_opening_tab": "Your web browser blocked Rocket.Chat from opening a new tab.", "Your_workspace_is_ready": "Your workspace is ready to use 🎉", + "Youre_not_a_part_of__channel__and_I_mentioned_you_there": "You're not a part of {{channel}} and I mentioned you there", "Zapier": "Zapier", "registration.page.login.errors.wrongCredentials": "User not found or incorrect password", "registration.page.login.errors.invalidEmail": "Invalid Email", @@ -5883,17 +5955,18 @@ "onboarding.component.form.action.next": "Next", "onboarding.component.form.action.skip": "Skip this step", "onboarding.component.form.action.register": "Register", - "onboarding.component.form.action.registerNow": "Register now", + "onboarding.component.form.action.registerWorkspace": "Register workspace", + "onboarding.component.form.action.registerOffline": "Register offline", "onboarding.component.form.action.confirm": "Confirm", + "onboarding.component.form.action.pasteHere": "Paste here...", + "onboarding.component.form.action.completeRegistration": "Complete registration", "onboarding.component.form.termsAndConditions": "I agree with <1>Terms and Conditions and <3>Privacy Policy", - "onboarding.component.emailCodeFallback": "Didn’t receive email? <1>Resend or <3>Change email", + "onboarding.component.emailCodeFallback": "Didn’t receive email? <1>Resend or <3>Change email.", "onboarding.page.form.title": "Let's launch your workspace", - "onboarding.page.awaitingConfirmation.title": "Awaiting confirmation", - "onboarding.page.awaitingConfirmation.subtitle": "We have sent you an email to {{emailAddress}} with a confirmation link. Please verify that the security code below matches the one in the email.", "onboarding.page.emailConfirmed.title": "Email Confirmed!", "onboarding.page.emailConfirmed.subtitle": "You can return to your Rocket.Chat application – we have launched your workspace already.", "onboarding.page.checkYourEmail.title": "Check your email", - "onboarding.page.checkYourEmail.subtitle": "Your request has been sent successfully.<1>Check your email inbox to launch your Enterprise trial.<1>The link will expire in 30 minutes.", + "onboarding.page.checkYourEmail.subtitle": "Your request has been sent successfully.<1>Check your email inbox to launch your Premium plan trial.<1>The link will expire in 30 minutes.", "onboarding.page.confirmationProcess.title": "Confirmation in Process", "onboarding.page.cloudDescription.title": "Let's launch your workspace and <1>14-day trial", "onboarding.page.cloudDescription.tryGold": "Try our best Gold plan for 14 days for free", @@ -5911,7 +5984,7 @@ "onboarding.page.invalidLink.content": "Seems like you have already used invite link. It’s generated for a single sign in. Request a new one to join your workspace.", "onboarding.page.invalidLink.button.text": "Request new link", "onboarding.page.requestTrial.title": "Request a <1>30-day Trial", - "onboarding.page.requestTrial.subtitle": "Try our best Enterprise Edition plan for 30 days for free", + "onboarding.page.requestTrial.subtitle": "Try our best Premium plan for 30 days for free", "onboarding.page.magicLinkEmail.title": "We emailed you a login link", "onboarding.page.magicLinkEmail.subtitle": "Click the link in the email we just sent you to sign in to your workspace. <1>The link will expire in 30 minutes.", "onboarding.form.adminInfoForm.title": "Admin Info", @@ -5925,6 +5998,9 @@ "onboarding.form.adminInfoForm.fields.password.label": "Password", "onboarding.form.adminInfoForm.fields.password.placeholder": "Create password", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Keep me posted about Rocket.Chat updates", + "onboarding.form.awaitConfirmationForm.title": "Awaiting confirmation", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Security code", + "onboarding.form.awaitConfirmationForm.content.sentEmail": "Email sent to <1>{{emailAddress}} with a confirmation link.Please verify that the security code below matches the one in the email.", "onboarding.form.organizationInfoForm.title": "Organization Info", "onboarding.form.organizationInfoForm.subtitle": "We need to know who you are.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organization name", @@ -5937,6 +6013,10 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Select", "onboarding.form.organizationInfoForm.fields.country.label": "Country", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Select", + "onboarding.form.registerOfflineForm.title": "Register Offline", + "onboarding.form.registerOfflineForm.copyStep.description": "If for any reason your workspace can’t be connected to the internet, follow these steps:<1>1. Go to: <2>cloud.rocket.chat > Workspaces and click “<3>Register self-managed”<4>2. Click “<5>Continue offline”<6>3. In the <7>Register offline workspace dialog in cloud.rocket.chat, paste the token in the box below", + "onboarding.form.registerOfflineForm.pasteStep.description": "1. In <1>cloud.rocket.chat get the generated text and paste below to complete your registration process", + "onboarding.form.registerOfflineForm.fields.registrationToken.inputLabel": "Registration token", "onboarding.form.registeredServerForm.title": "Register your workspace", "onboarding.form.registeredServerForm.included.push": "Mobile push notifications", "onboarding.form.registeredServerForm.included.externalProviders": "Integration with external providers (WhatsApp, Facebook, Telegram, Twitter)", @@ -5946,29 +6026,44 @@ "onboarding.form.registeredServerForm.keepInformed": "Keep me informed about news and events", "onboarding.form.registeredServerForm.registerLater": "Register later", "onboarding.form.registeredServerForm.notConnectedToInternet": "The server is not connected to the internet, so you’ll have to do an offline registration for this workspace.", - "onboarding.form.registeredServerForm.registrationEngagement": "Registration allows automatic license updates, notifications of critical vulnerabilities and access to Rocket.Chat Cloud services. No sensitive workspace data is shared; statistics sent to Rocket.Chat is made visible to you within the administration area.", + "onboarding.form.registeredServerForm.registrationEngagement": "Registration allows automatic license updates, notifications of critical vulnerabilities and access to Rocket.Chat Cloud services. No sensitive workspace data is shared; statistics sent to Rocket.Chat are made visible to you within the administration area.", + "onboarding.form.registeredServerForm.registrationKeepInformed": "By submitting this form you consent to receive more information about Rocket.Chat products, events and updates, according to our <1>privacy policy. You may unsubscribe at any time.", "onboarding.form.standaloneServerForm.title": "Standalone Server Confirmation", "onboarding.form.standaloneServerForm.servicesUnavailable": "Some of the services will be unavailable or will require manual setup", "onboarding.form.standaloneServerForm.publishOwnApp": "In order to send push notitications you need to compile and publish your own app to Google Play and App Store", "onboarding.form.standaloneServerForm.manuallyIntegrate": "Need to manually integrate with external services", + "subscription.callout.servicesDisruptionsMayOccur": "Services disruptions may occur", + "subscription.callout.servicesDisruptionsOccurring": "Services disruptions occurring", + "subscription.callout.capabilitiesDisabled": "Capabilities disabled", + "subscription.callout.description.limitsExceeded_one": "Your workspace exceeded the <1>{{val}} license limit. <3>Manage your subscription to increase limits.", + "subscription.callout.description.limitsExceeded_other": "Your workspace exceeded the <1>{{val, list}} license limits. <3>Manage your subscription to increase limits.", + "subscription.callout.description.limitsReached_one": "Your workspace reached the <1>{{val}} license limit. <3>Manage your subscription to increase limits.", + "subscription.callout.description.limitsReached_other": "Your workspace reached the <1>{{val, list}} license limits. <3>Manage your subscription to increase limits.", + "subscription.callout.allPremiumCapabilitiesDisabled": "All premium capabilities disabled", + "subscription.callout.activeUsers": "seats", + "subscription.callout.guestUsers": "guests", + "subscription.callout.roomsPerGuest": "max guest per room", + "subscription.callout.privateApps": "installed private apps", + "subscription.callout.marketplaceApps": "installed marketplace apps", + "subscription.callout.monthlyActiveContacts": "monthly active contacts", "Something_Went_Wrong": "Something went wrong", "Toolbox_room_actions": "Primary Room actions", "Theme_light": "Light", "Theme_light_description": "More accessible for individuals with visual impairments and a good choice for well-lit environments.", "Theme_dark": "Dark", "Theme_dark_description": "Reduce eye strain and fatigue in low-light conditions by minimizing the amount of light emitted by the screen.", - "Enable_of_limit_apps_currently_enabled": "**{{enabled}} of {{limit}} {{context}} apps currently enabled.** \n \nWorkspaces on Community Edition can have up to {{limit}} {{context}} apps enabled. \n \n**{{appName}} will be disabled by default.** Disable another {{context}} app or upgrade to Premium to enable this app.", - "Enable_of_limit_apps_currently_enabled_exceeded": "**{{enabled}} of {{limit}} {{context}} apps currently enabled.** \n \nCommunity edition app limit has been exceeded. \n \nWorkspaces on Community Edition can have up to {{limit}} {{context}} apps enabled. \n \n**{{appName}} will be disabled by default.** You will need to disable at least {{exceed}} other {{context}} apps or upgrade to Premium to enable this app.", - "Workspaces_on_Community_edition_install_app": "Workspaces on Community Edition can have up to {{limit}} {{context}} apps enabled. Upgrade to Premium to enable unlimited apps.", - "Apps_Currently_Enabled": "{{enabled}} of {{limit}} {{context}} apps currently enabled.", - "Disable_another_app": "Disable another app or upgrade to Enterprise to enable this app.", + "Enable_of_limit_apps_currently_enabled": "**{{enabled}} of {{limit}} {{context}} apps currently enabled.** \n \nWorkspaces on Community can have up to {{limit}} {{context}} apps enabled. \n \n**{{appName}} will be disabled by default.** Disable another {{context}} app or upgrade to Premium to enable this app.", + "Enable_of_limit_apps_currently_enabled_exceeded": "**{{enabled}} of {{limit}} {{context}} apps currently enabled.** \n \nCommunity app limit has been exceeded. \n \nWorkspaces on Community can have up to {{limit}} {{context}} apps enabled. \n \n**{{appName}} will be disabled by default.** You will need to disable at least {{exceed}} other {{context}} apps or upgrade to a Premium plan to enable this app.", + "Workspaces_on_Community_edition_install_app": "Community workspaces can have up to {{limit}} {{context}} apps enabled. Upgrade to a Premium plan to enable unlimited apps.", + "Apps_Currently_Enabled": "{{enabled}} of {{limit}} {{context}} apps currently enabled", + "Disable_another_app": "Disable another app or upgrade to a Premium plan to enable this app.", "Upload_anyway": "Upload anyway", "App_limit_reached": "App limit reached", "App_limit_exceeded": "App limit exceeded", "Private_apps_limit_reached": "Private apps limit reached", "Private_apps_limit_exceeded": "Private apps limit exceeded", - "Disable_at_least_more_apps": "You will need to disable at least {{numberOfExceededApps}} other apps or upgrade to Enterprise to enable this app.", - "Community_Private_apps_limit_exceeded": "Community edition app limit has been exceeded.", + "Disable_at_least_more_apps": "You will need to disable at least {{numberOfExceededApps}} other apps or upgrade to a Premium plan to enable this app.", + "Community_Private_apps_limit_exceeded": "Community app limit has been exceeded.", "Theme_match_system": "Match system", "Theme_match_system_description": "Automatically match the appearance of your system.", "Theme_high_contrast": "High contrast", @@ -5978,8 +6073,8 @@ "Create_a_password": "Create a password", "Create_an_account": "Create an account", "Get_all_apps": "Get all the apps your team needs", - "Workspaces_on_community_edition_trial_on": "Workspaces on Community Edition can have up to 5 marketplace apps and 3 private apps enabled. Start a free Premium trial to remove these limits today!", - "Workspaces_on_community_edition_trial_off": "Workspaces on Community Edition can have up to 5 marketplace apps and 3 private apps enabled. Upgrade to Premium to remove limits and supercharge your workspace.", + "Workspaces_on_community_edition_trial_on": "Workspaces on Community can have up to 5 marketplace apps and 3 private apps enabled. Start a free Premium trial to remove these limits today!", + "Workspaces_on_community_edition_trial_off": "Workspaces on Community can have up to 5 marketplace apps and 3 private apps enabled. Upgrade to Premium to remove limits and supercharge your workspace.", "No_private_apps_installed": "No private apps installed", "Private_apps_are_side-loaded": "Private apps are side-loaded and are not available on the Marketplace.", "Chat_transcript": "Chat transcript", @@ -6004,17 +6099,17 @@ "Send_transcript": "Send transcript", "Undo_request": "Undo request", "No_permission": "No permission", - "Community_cap_description": "Community workspaces have a cap of 200 concurrent connections, although you can have more connections active, once you hit that limit you won't be able to see users' status. This doesn't affect their ability to send & receive messages.", - "Enterprise_cap_description": "Enterprise workspaces have no cap on the presence service.", + "Community_cap_description": "Community workspaces have a limit of 200 concurrent connections. If this limit is exceeded it will no longer be possible for users to see each others status. This does not affect sending and receiving of messages.", + "Premium_cap_description": "Premium plans do not have a presence service limit.", "Service_status": "Service status", - "More_about_Enterprise_Edition": "More about Enterprise Edition", + "More_about_Premium_plans": "More about Premium plans", "Presence_service_cap": "Presence service cap", "User_Status": "User status", "User_status_menu": "User status menu", "Active_connections": "Active connections", "Presence_service": "Presence service", "Presence_broadcast_disabled": "Presence broadcast disabled internally", - "Presence_broadcast_disabled_Description": "This shows if the presence broadcast has been disabled automatically. This can happen if you don't have an Enterprise License and have more than 200 concurrent connections.", + "Presence_broadcast_disabled_Description": "This shows if the presence broadcast has been disabled automatically. This can happen if you don't have an Premium License and have more than 200 concurrent connections.", "New_custom_status": "New custom status", "Service_disabled": "The service is now disabled", "Service_disabled_description": "You can't reenable it again until there's less than 200 active connections at the same time", @@ -6073,10 +6168,9 @@ "RegisterWorkspace_Connection_Error": "An error occured connecting", "cloud.RegisterWorkspace_Token_Step_One": "1. Go to: <1>cloud.rocket.chat > Workspaces and click <3>'Register self-managed'.", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "I agree with <1>Terms and Conditions and <3>Privacy Policy", - "Larger_amounts_of_active_connections": "For larger amounts of active connections you can consider our", - "multiple_instance_solutions": "multiple instance solutions", + "Larger_amounts_of_active_connections": "For larger amounts of active connections you can consider our <1>multiple instance solutions.", "Uninstall_grandfathered_app": "Uninstall {{appName}}?", - "App_will_lose_grandfathered_status": "**This {{context}} app will lose its grandfathered status.** \n \nWorkspaces on Community Edition can have up to {{limit}} {{context}} apps enabled. Grandfathered apps count towards the limit but the limit is not applied to them.", + "App_will_lose_grandfathered_status": "**This {{context}} app will lose its grandfathered status.** \n \nWorkspaces on Community can have up to {{limit}} {{context}} apps enabled. Grandfathered apps count towards the limit but the limit is not applied to them.", "All_rooms": "All rooms", "All_visible": "All visible", "Filter_by_room": "Filter by room type", @@ -6091,5 +6185,84 @@ "unread_messages_counter": "{{counter}} unread message", "unread_messages_counter_plural": "{{counter}} unread messages", "Premium": "Premium", - "Premium_capability": "Premium capability" + "Enterprise": "Premium", + "Premium_capability": "Premium capability", + "Operating_withing_plan_limits": "Operating within plan limits", + "Plan_limits_reached": "Plan limits reached", + "Workspace_not_registered": "Workspace not registered", + "Users_Connected": "Users connected", + "Solve_issues": "Solve issues", + "Update_version": "Update version", + "Version_not_supported": "Version <1>not supported", + "Version_supported_until": "Version <1>supported until {{date}}", + "Check_support_availability": "Check <1>support availability", + "Outdated": "Outdated", + "Latest": "Latest", + "New_version_available": "New version available", + "trial": "trial", + "Subscription": "Subscription", + "Manage_subscription": "Manage subscription", + "ActiveSessionsPeak": "Active sessions peak", + "ActiveSessionsPeak_InfoText": "Highest amount of active connections in the past 30 days", + "ActiveSessions": "Active sessions", + "ActiveSessions_available": "sessions available", + "Monthly_active_contacts": "Monthly active contacts", + "Upgrade": "Upgrade", + "Seats": "Seats", + "Marketplace_apps": "Marketplace apps", + "Private_apps": "Private apps", + "Finish_your_purchase_trial": "Finish your purchase to avoid <1>downgrade consequences.", + "Contact_sales_trial": "Contact sales to finish your purchase and avoid <1>downgrade consequences.", + "Why_has_a_trial_been_applied_to_this_workspace": "<0>Why has a trial been applied to this workspace?", + "Compare_plans": "Compare plans", + "n_days_left": "{{n}} days left", + "Contact_sales": "Contact sales", + "Finish_purchase": "Finish purchase", + "Self_managed_hosting": "Self-managed hosting", + "Cloud_hosting": "Rocket.Chat cloud hosting", + "free_per_month_user": "$0 per month/user", + "Trial_active": "Trial active", + "Contact_sales_renew_date": "<0>Contact sales to check plan renew date", + "Renews_DATE": "Renews {{date}}", + "UpgradeToGetMore_Headline": "Upgrade to get more", + "UpgradeToGetMore_Subtitle": "Supercharge your workspace with advanced capabilities.", + "UpgradeToGetMore_scalability_Title": "High scalabaility", + "UpgradeToGetMore_scalability_Body": "Improve efficiency, decrease costs and increase concurrent users usage by switching from monolithic to microservices or multi-instance.", + "UpgradeToGetMore_accessibility-certification_Title": "WCAG 2.1 and BITV 2.0", + "UpgradeToGetMore_accessibility-certification_Body": "Comply with WCAG and BITV standards with Rocket.Chat's accessibility program.", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", + "UpgradeToGetMore_engagement-dashboard_Body": "Gain insights into user, message, and channel usage through the engagement dashboard.", + "UpgradeToGetMore_oauth-enterprise_Title": "Advanced authentication", + "UpgradeToGetMore_oauth-enterprise_Body": "Ensure proper access permissions through LDAP/SAML/Oauth with group roles mapping, channel subscription, auto logout and more.", + "UpgradeToGetMore_custom-roles_Title": "Custom roles", + "UpgradeToGetMore_custom-roles_Body": "Ensure a safe and productive work environment by setting specific roles and permissions for people in your workspace.", + "UpgradeToGetMore_auditing_Title": "Message auditing", + "UpgradeToGetMore_auditing_Body": "Audit conversations in one single place to ensure communication quality with customers, suppliers, and internal teams.", + "Seats_InfoText": "Each unique user occupies one seat. Deactivated users do not occupy seats. Total number of seats is defined by active license type.", + "CountSeats_InfoText": "Each unique user occupies one seat. Deactivated users do not occupy seats.", + "MAC_InfoText": "(MAC) the number of unique omnichannel contacts engaged with during the billing month.", + "CountMAC_InfoText": "(MAC) the number of unique omnichannel contacts engaged with during the calendar month.", + "ActiveSessions_InfoText": "Total concurrent connections. A single user can be connected multiple times. User presence service is disabled at 200 or more to prevent performance issues.", + "Apps_InfoText": "Community allows up to 3 private apps and 5 marketplace apps to be enabled", + "Remove_RocketChat_Watermark_InfoText": "Watermark is automatically removed when a paid license is active.", + "Remove_RocketChat_Watermark": "Remove Rocket.Chat watermark", + "High_scalabaility": "High scalabaility", + "Premium_and_unlimited_apps": "Premium and unlimited apps", + "Message_audit": "Message auditing", + "Premium_omnichannel_capabilities": "Premium omnichannel capabilities", + "Video_call_manager": "Video call manager", + "Unlimited_push_notifications": "Unlimited push notifications", + "Buy_more": "Buy more", + "Upgrade_to_Pro": "Upgrade to Pro", + "Sync_license_update": "Sync license update", + "Sync_license_update_Callout_Title": "We're updating your license", + "Sync_license_update_Callout": "If you don't notice any changes in your workspace within a few minutes, sync the license update.", + "Includes": "Includes", + "Unlock_premium_capabilities": "Unlock premium capabilities", + "Unlimited_seats": "Unlimited seats", + "Unlimited_MACs": "Unlimited MACs", + "Unlimited_seats_MACs": "Unlimited seats and MACs", + "Seat_limit_reached": "Seat limit reached", + "Seat_limit_reached_Description": "Your workspace reached its contractual seat limit. Buy more seats to add more users.", + "Buy_more_seats": "Buy more seats" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json index 9c9501c8a174..68ec0dbe60f3 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json @@ -973,7 +973,6 @@ "Enter_name_here": "Enmetu nomon ĉi tie", "Enter_Normal": "Normala reĝimo (sendu kun Eniri)", "Enter_to": "Eniri al", - "Enterprise": "Entrepreno", "Entertainment": "Amuzaĵo", "Error": "Eraro", "Error_404": "Eraro: 404", @@ -2758,5 +2757,7 @@ "registration.component.form.reasonToJoin": "Kialo por aliĝi", "registration.component.form.invalidConfirmPass": "La konfirmilo de pasvorto ne kongruas kun pasvorto", "registration.component.form.confirmPassword": "Konfirmu vian pasvorton", - "registration.component.form.sendConfirmationEmail": "Sendu konfirman retpoŝton" + "registration.component.form.sendConfirmationEmail": "Sendu konfirman retpoŝton", + "Enterprise": "Entrepreno", + "UpgradeToGetMore_engagement-dashboard_Title": "Analitiko" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json index aac9f8bfa4db..9e1fed728dce 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json @@ -1,11 +1,28 @@ { "500": "Error interno del servidor", + "__agents__agents_and__count__conversations__period__": "{{agents}} agentes y {{count}} conversaciones, {{period}}", "__count__empty_rooms_will_be_removed_automatically": "{{count}} salas vacías se eliminarán automáticamente.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} salas vacías se eliminarán automáticamente.
{{rooms}}.", + "__count__message_pruned": "{{count}} mensaje borrado", + "__count__message_pruned_plural": "{{count}} mensajes borrados", + "__count__conversations__period__": "{{count}} conversaciones, {{period}}", + "__count__tags__and__count__conversations__period__": "{{count}} etiquetas y {{conversations}} conversaciones, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} departamentos y {{count}} conversaciones, {{period}}", + "__usersCount__member_joined": "{{usersCount}} miembro se ha unido", + "__usersCount__member_joined_plural": "{{usersCount}} miembros se han unido", + "__usersCount__people_will_be_invited": "{{usersCount}} miembros sern invitados", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} ya no es {{role}} (por {{user_by}})", "__username__was_set__role__by__user_by_": "{{username}} se ha establecido como {{role}} por {{user_by}}", + "__count__without__department__": "{{count}} sin departamentos", + "__count__without__tags__": "{{count}} sin etiquetas", + "__count__without__assignee__": "{{count}} sin un agente asignado", + "removed__username__as__role_": "se removió {{username}} como {{role}}", + "set__username__as__role_": " se estableció a {{username}} como {{role}}", "This_room_encryption_has_been_enabled_by__username_": "El cifrado de esta sala ha sido habilitado por {{username}}", "This_room_encryption_has_been_disabled_by__username_": "El cifrado de esta sala ha sido deshabilitado por {{username}}", + "Enabled_E2E_Encryption_for_this_room": "El cifrado de punto a punto fue habilitado para esta sala", + "disabled": "Deshabilitado", + "Disabled_E2E_Encryption_for_this_room": "El cifrado de punto a punto fue deshabilitado para esta sala", "@username": "@usuario", "@username_message": "@usuario ", "#channel": "#canal", @@ -424,6 +441,7 @@ "App_author_homepage": "página de inicio del autor", "App_Details": "Detalles de la aplicación", "App_Information": "Información de la aplicación", + "Apps_context_enterprise": "Empresa", "App_Installation": "Instalación de la aplicación", "App_status_auto_enabled": "Habilitada", "App_status_constructed": "Construida", @@ -447,7 +465,6 @@ "Apply": "Aplicar", "Apply_and_refresh_all_clients": "Aplicar y actualizar todos los clientes", "Apps": "Aplicaciones", - "Apps_context_enterprise": "Empresa", "Apps_context_installed": "Instalada", "Apps_Engine_Version": "Versión de motor de aplicaciones", "Apps_Essential_Alert": "Esta aplicación es esencial para los siguientes eventos:", @@ -830,8 +847,6 @@ "Close": "Cerrar", "Close_chat": "Cerrar chat", "Close_room_description": "Estás a punto de cerrar este chat. ¿Seguro que quieres continuar?", - "Close_to_seat_limit_banner_warning": "*Te quedan [{{seats}}] puestos* \nEste espacio de trabajo se acerca a su límite de puestos. Una vez que se alcanza el límite, no se pueden añadir nuevos miembros. *[Request More Seats]({{url}})*", - "Close_to_seat_limit_warning": "No se pueden crear nuevos miembros una vez que se alcanza el límite de puestos.", "close-livechat-room": "Cerrar Room de Omnichannel", "close-livechat-room_description": "Permiso para cerrar la sala de Omnichannel actual", "Close_menu": "Cerrar menú", @@ -865,8 +880,6 @@ "Cloud_register_offline_finish_helper": "Después de completar el proceso de registro en Cloud Console, debería aparecer un texto. Pégalo aquí para finalizar el registro.", "Cloud_register_offline_helper": "Los espacios de trabajo se pueden registrar manualmente si el espacio está aislado o el acceso de red está restringido. Copia el texto que aparece a continuación y ve a Cloud Console para completar el proceso.", "Cloud_register_success": "Tu espacio de trabajo se ha registrado correctamente", - "Cloud_registration_pending_html": "Las notificaciones push no funcionarán hasta que el registro haya finalizado. Más información", - "Cloud_registration_pending_title": "El registro en la nube aún está pendiente", "Cloud_registration_required": "Registro obligatorio", "Cloud_registration_required_description": "Parece que durante la configuración decidiste no registrar tu espacio de trabajo.", "Cloud_registration_required_link_text": "Haz clic aquí para registrar tu espacio de trabajo.", @@ -1565,6 +1578,8 @@ "email_style_description": "Evitar selectores anidados", "email_style_label": "Estilo de correo electrónico", "Email_subject": "Asunto de correo electrónico", + "Enterprise_License": "Licencia de empresa", + "Enterprise_License_Description": "Si tu espacio de trabajo está registrado y la licencia la proporciona Rocket.Chat Cloud, no es necesario que actualices la licencia manualmente aquí.", "Email_verified": "Correo electrónico verificado", "Email_sent": "Correo electrónico enviado", "Emoji": "Emoji", @@ -1616,9 +1631,6 @@ "Enter_Normal": "Modo normal (enviar con Intro)", "Enter_to": "Intro para", "Enter_your_E2E_password": "Introduzca su contraseña E2E", - "Enterprise": "Empresa", - "Enterprise_License": "Licencia de empresa", - "Enterprise_License_Description": "Si tu espacio de trabajo está registrado y la licencia la proporciona Rocket.Chat Cloud, no es necesario que actualices la licencia manualmente aquí.", "Entertainment": "Entretenimiento", "Error": "Error", "Error_404": "Error 404", @@ -1640,7 +1652,7 @@ "error-avatar-invalid-url": "URL de avatar no válida: {{url}}", "error-avatar-url-handling": "Error al gestionar el ajuste de avatar desde una dirección URL ({{url}}) para {{username}}", "error-business-hours-are-closed": "El horario comercial ha finalizado", - "error-blocked-username": "{{field}} está bloqueado y no se puede usar.", + "error-blocked-username": "**{{field}}** está bloqueado y no se puede usar.", "error-canned-response-not-found": "Respuesta predefinida no encontrada", "error-cannot-delete-app-user": "No se permite eliminar el usuario de la aplicación; desinstale la aplicación correspondiente para que se elimine.", "error-cant-invite-for-direct-room": "No se puede invitar al usuario a salas directas", @@ -1719,6 +1731,7 @@ "error-logged-user-not-in-room": "No estás en la sala \"%s\"", "error-max-guests-number-reached": "Has alcanzado la cantidad máxima de usuarios invitados que permite tu licencia. Escribe a sale@rocket.chat para obtener una nueva licencia.", "error-max-number-simultaneous-chats-reached": "Se ha alcanzado el máximo de chats simultáneos por agente.", + "error-mac-limit-reached": "Se ha alcanzado el máximo de contactos activos por mes para este espacio de trabajo.", "error-message-deleting-blocked": "La eliminación de mensajes está bloqueada", "error-message-editing-blocked": "La edición de mensajes está bloqueada", "error-message-size-exceeded": "El tamaño de mensaje excede el máximo: Message_MaxAllowedSize", @@ -2557,7 +2570,7 @@ "leave-c_description": "Permiso para salir de canales", "leave-p": "Salir de grupos privados", "leave-p_description": "Permiso para salir de grupos privados", - "Lets_get_you_new_one": "Vamos a darte uno nuevo", + "Lets_get_you_new_one_": "Vamos a darte uno nuevo", "List_of_Channels": "Lista de Channels", "List_of_departments_for_forward": "Lista de departamentos permitidos para reenvío (opcional)", "List_of_departments_for_forward_description": "Permitir establecer una lista restringida de departamentos que pueden recibir chats de este departamento", @@ -3394,7 +3407,6 @@ "Random": "Aleatorio", "Rate_Limiter_Limit_RegisterUser": "Número de llamadas por defecto al limitador de frecuencia para registrar un usuario", "Rate_Limiter_Limit_RegisterUser_Description": "Número de llamadas por defecto para los usuarios que registran puntos finales (REST y API en tiempo real) que se permiten dentro del rango de tiempo definido en la sección Limitador de frecuencia de API.", - "Reached_seat_limit_banner_warning": "*No hay más puestos disponibles* \nEste espacio de trabajo ha alcanzado su límite de puestos, por lo que no pueden unirse más miembros. *[Request More Seats]({{url}})*", "React_when_read_only": "Permitir reacciones", "React_when_read_only_changed_successfully": "Permitir reacciones cuando solo lectura ha cambiado correctamente", "Reacted_with": "Ha reaccionado con", @@ -3484,11 +3496,6 @@ "Report_this_message_question_mark": "¿Denunciar este mensaje?", "Reporting": "Denuncia", "Request": "Solicitar", - "Request_seats": "Solicitar puestos", - "Request_more_seats": "Solicitar más puestos.", - "Request_more_seats_out_of_seats": "No puedes añadir miembros porque este espacio de trabajo se ha quedado sin puestos libres. Solicita más puestos.", - "Request_more_seats_sales_team": "Una vez que se envíe tu solicitud, nuestro equipo de ventas la analizará y contactará contigo en un par de días.", - "Request_more_seats_title": "Solicitar más puestos", "Request_comment_when_closing_conversation": "Solicitar comentario al cerrar la conversación", "Request_comment_when_closing_conversation_description": "Si esta opción está habilitada, el agente tendrá que escribir un comentario antes de que se cierre la conversación.", "Request_tag_before_closing_chat": "Solicitar etiquetas antes de cerrar la conversación", @@ -3739,6 +3746,7 @@ "See_documentation": "Ver documentación", "See_full_profile": "Ver perfil completo", "See_on_Engagement_Dashboard": "Ver en Panel de interacción", + "Select": "Seleccionar", "Select_a_department": "Seleccionar un departamento", "Select_a_room": "Seleccionar una sala", "Select_a_user": "Seleccionar un usuario", @@ -4535,6 +4543,7 @@ "view-l-room": "Ver Rooms de Omnichannel", "view-l-room_description": "Permiso para ver las salas de Omnichannel", "view-livechat-analytics": "Ver análisis de Omnichannel", + "onboarding.page.awaitingConfirmation.subtitle": "Hemos enviado un correo electrónico a {{emailAddress}} con un enlace de confirmación. Verifica que el siguiente código de seguridad coincide con el del mensaje.", "view-livechat-analytics_description": "Permiso para ver análisis de Livechat", "view-livechat-appearance": "Ver apariencia de Omnichannel", "view-livechat-appearance_description": "Permiso para ver la apariencia de Livechat", @@ -4612,17 +4621,24 @@ "Voip_call_wrapup": "Se han añadido notas de cierre: {{comment}}", "VoIP_JWT_Secret": "Secreto JWT VoIP", "VoIP_JWT_Secret_description": "Te permite definir una clave secreta para compartir datos de extensión de servidor a cliente como JWT en vez de en texto sin formato. Si no lo configuras, los datos de registro de la extensión se enviarán como texto sin formato.", + "Voip_is_disabled": "VoIP desactivado", + "Voip_is_disabled_description": "Para ver la lista de extensiones es necesario activar VoIP, hágalo en la pestaña Configuración.", + "VoIP_Toggle": "Activar/desactivar VoIP", "Chat_opened_by_visitor": "Chat abierto por el visitante", "Wait_activation_warning": "Antes de poder iniciar sesión, un administrador debe activar tu cuenta manualmente.", + "Waiting_for_answer": "Esperando respuesta", "Waiting_queue": "Cola de espera", + "Enterprise_cap_description": "Los espacios de trabajo para empresas no tienen límite en el servicio de presencia.", "Waiting_queue_message": "Mensaje de cola de espera", "Waiting_queue_message_description": "Mensaje que se mostrará a los visitantes cuando entren en la cola", "Waiting_Time": "Tiempo de espera", + "Waiting_for_server_connection": "Esperando la conexión del servidor,", "Warning": "Advertencia", "Warnings": "Advertencias", "WAU_value": "WAU: {{value}}", "We_appreciate_your_feedback": "Agradecemos tus comentarios", "We_are_offline_Sorry_for_the_inconvenience": "Estamos fuera de línea. Disculpa las molestias.", + "We_Could_not_retrive_any_data": "No pudimos recuperar ningún dato", "We_have_sent_password_email": "Te hemos enviado un correo electrónico con instrucciones para restablecer la contraseña. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", "We_have_sent_registration_email": "Te hemos enviado un correo electrónico para confirmar tu registro. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", "Webdav Integration": "Integración con WebDAV", @@ -4637,8 +4653,11 @@ "webdav-account-updated": "Cuenta de WebDAV actualizada", "Webhook_Details": "Detalles de webhook", "Webhook_URL": "URL de webhook", + "Webhook_URL_not_set": "La URL del webhook no está configurada", "Webhooks": "Webhooks", + "WebRTC": "WebRTC", "WebRTC_Call": "Llamada WebRTC", + "WebRTC_Call_unavailable_for_federation": "La llamada WebRTC no está disponible para las salas federadas", "WebRTC_direct_audio_call_from_%s": "Llamada de audio directa de %s", "WebRTC_direct_video_call_from_%s": "Videollamada directa de %s", "WebRTC_Enable_Channel": "Habilitar para Channels públicos", @@ -4668,14 +4687,18 @@ "will_be_able_to": "será capaz de", "Will_be_available_here_after_saving": "Estará disponible aquí después de guardar.", "Without_priority": "Sin prioridad", + "Without_SLA": "Sin SLA", "Worldwide": "En todo el mundo", "Would_you_like_to_return_the_inquiry": "¿Quieres devolver la solicitud?", "Would_you_like_to_return_the_queue": "¿Quieres devolver esta sala a la cola? Todo el historial de conversaciones se conservará en la sala.", "Would_you_like_to_place_chat_on_hold": "¿Quieres poner este chat en espera?", + "Wrap_up_the_call": "Cierre de llamada", "Wrap_Up_Notes": "Notas de cierre", + "Workspace": "Espacio de trabajo", "Yes": "Sí", "Yes_archive_it": "Sí, archivarlo", "Yes_clear_all": "Sí, borrar todo", + "Yes_continue": "Sí, ¡continúe!", "Yes_deactivate_it": "Sí, desactivar", "Yes_delete_it": "Sí, eliminar", "Yes_hide_it": "Sí, ocultar", @@ -4687,8 +4710,15 @@ "yesterday": "ayer", "Yesterday": "Ayer", "You": "Tú", + "You_reacted_with": "Has reaccionado con {{emoji}}", + "Users_reacted_with": "{{users}} reaccionaron con {{emoji}}", + "Users_and_more_reacted_with": "{{users}} y {{counter}} más reaccionaron con {{emoji}}", + "You_and_users_Reacted_with": "Tú y {{users}} reaccionaron con {{emoji}}", + "You_users_and_more_Reacted_with": "Tú, {{users}} y {{counter}} más reaccionaron con {{emoji}}", "You_are_converting_team_to_channel": "Vas a convertir este equipo en un Channel.", "you_are_in_preview_mode_of": "Estás en modo de vista previa del canal #{{room_name}}", + "you_are_in_preview": "Estás en el modo de vista previa", + "you_are_in_preview_please_insert_the_password": "Introduzca la contraseña", "you_are_in_preview_mode_of_incoming_livechat": "Estás en el modo de vista previa de este chat", "You_are_logged_in_as": "Has iniciado sesión como", "You_are_not_authorized_to_view_this_page": "No tienes autorización para ver esta página.", @@ -4702,6 +4732,7 @@ "You_followed_this_message": "Sigues este mensaje.", "You_have_a_new_message": "Tienes un nuevo mensaje", "You_have_been_muted": "Se te ha silenciado y no puedes hablar en esta sala", + "You_have_been_removed_from__roomName_": "Usted ha sido eliminado de la sala {{roomName}}", "You_have_joined_a_new_call_with": "Te has unido a una nueva llamada con", "You_have_n_codes_remaining": "Te quedan {{number}} códigos.", "You_have_not_verified_your_email": "Aún no has verificado tu correo electrónico.", @@ -4744,23 +4775,45 @@ "Your_TOTP_has_been_reset": "Tu TOTP de segundo factor se ha restablecido.", "Your_workspace_is_ready": "Tu espacio de trabajo está listo para usar 🎉", "Zapier": "Zapier", + "registration.page.login.errors.wrongCredentials": "Usuario no encontrado o contraseña incorrecta.", + "registration.page.login.errors.invalidEmail": "Correo electrónico no válido", "registration.page.login.errors.loginBlockedForIp": "El inicio de sesión se ha bloqueado temporalmente para esta IP", "registration.page.login.errors.loginBlockedForUser": "El inicio de sesión se ha bloqueado temporalmente para este usuario", "registration.page.login.errors.licenseUserLimitReached": "Se ha alcanzado el número máximo de usuarios.", "registration.page.login.errors.AppUserNotAllowedToLogin": "Los usuarios de la aplicación no pueden iniciar sesión directamente.", "registration.page.registration.waitActivationWarning": "Antes de poder iniciar sesión, un administrador debe activar tu cuenta manualmente.", + "registration.page.login.register": "¿Nuevo aquí? <1>Crear una cuenta", + "registration.page.login.forgot": "¿Has olvidado tu contraseña?", + "registration.page.register.back": "Volver al inicio de sesión", + "registration.page.emailVerification.subTitle": "Este servidor requiere direcciones de correo electrónico verificadas. Por favor, compruebe su bandeja de entrada de correo electrónico para un enlace de verificación.", + "registration.page.emailVerification.sent": "Correo electrónico de verificación enviado, por favor revise su bandeja de entrada.", "registration.page.resetPassword.sent": "Si este correo electrónico está registrado, te enviaremos instrucciones para restablecer tu contraseña. Si no recibes un correo en breve, vuelve e inténtalo de nuevo.", + "registration.page.resetPassword.sendInstructions": "Enviar instrucciones", + "registration.page.resetPassword.errors.invalidEmail": "Correo electrónico no válido", + "registration.page.poweredBy": "Desarrollado por <1>Rocket.Chat", + "registration.page.guest.chooseHowToJoin": "Elige cómo quieres unirte.", + "registration.page.guest.loginWithRocketChat": "Iniciar sesión con Rocket.Chat", + "registration.page.guest.continueAsGuest": "Continuar como invitado", + "registration.component.welcome": "Bienvenido al espacio de trabajo de <1>Rocket.Chat ", "registration.component.login": "Iniciar sesión", + "registration.component.login.userNotFound": "Usuario no encontrado", + "registration.component.login.incorrectPassword": "Contraseña incorrecta", + "registration.component.switchLanguage": "Cambiar a <1>{{name}}", + "registration.component.resetPassword": "Reestablecer contraseña", "registration.component.form.username": "Nombre de usuario", "registration.component.form.name": "Nombre", + "registration.component.form.createAnAccount": "Crear una cuenta", + "registration.component.form.userAlreadyExist": "El nombre de usuario ya existe. Pruebe con otro.", "registration.component.form.emailAlreadyExists": "El correo electrónico ya existe", "registration.component.form.usernameAlreadyExists": "El nombre de usuario ya existe. Prueba a usar otro nombre.", "registration.component.form.invalidEmail": "El correo electrónico introducido no es válido", "registration.component.form.email": "Correo electrónico", + "registration.component.form.emailPlaceholder": "ejemplo@ejemplo.com", "registration.component.form.password": "Contraseña", "registration.component.form.divider": "o", "registration.component.form.submit": "Enviar", "registration.component.form.requiredField": "Este campo es obligatorio", + "registration.component.form.joinYourTeam": "Únete a tu equipo", "registration.component.form.reasonToJoin": "Motivo para unirse", "registration.component.form.confirmPassword": "Confirma tu contraseña", "registration.component.form.confirmation": "Confirmación", @@ -4771,12 +4824,14 @@ "onboarding.component.form.action.next": "Siguiente", "onboarding.component.form.action.skip": "Omitir este paso", "onboarding.component.form.action.register": "Registrar", + "onboarding.component.form.action.registerWorkspace": "Registrar espacio de trabajo", + "onboarding.component.form.action.registerOffline": "Registro offline", "onboarding.component.form.action.confirm": "Confirmar", + "onboarding.component.form.action.pasteHere": "Pegar aquí...", + "onboarding.component.form.action.completeRegistration": "Completar registro.", "onboarding.component.form.termsAndConditions": "Acepto los <1>términos y condiciones y la <3>política de privacidad", "onboarding.component.emailCodeFallback": "¿No has recibido el correo electrónico? <1>Volver a enviar o <3>cambiar correo electrónico", - "onboarding.page.form.title": "Vamos a <1>Iniciar tu espacio de trabajo", - "onboarding.page.awaitingConfirmation.title": "Esperando confirmación", - "onboarding.page.awaitingConfirmation.subtitle": "Hemos enviado un correo electrónico a {{emailAddress}} con un enlace de confirmación. Verifica que el siguiente código de seguridad coincide con el del mensaje.", + "onboarding.page.form.title": "Vamos a Iniciar tu espacio de trabajo", "onboarding.page.emailConfirmed.title": "Correo electrónico confirmado", "onboarding.page.emailConfirmed.subtitle": "Puedes volver a la aplicación de Rocket.Chat. Ya hemos iniciado tu espacio de trabajo.", "onboarding.page.checkYourEmail.title": "Comprueba tu correo electrónico", @@ -4812,6 +4867,9 @@ "onboarding.form.adminInfoForm.fields.password.label": "Contraseña", "onboarding.form.adminInfoForm.fields.password.placeholder": "Crear contraseña", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Recibir información sobre Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "Esperando confirmación", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Código de seguridad", + "onboarding.form.awaitConfirmationForm.content.sentEmail": "Correo electrónico enviado a <1>{{emailAddress}} con un enlace de confirmación. Compruebe que el código de seguridad que aparece a continuación coincide con el del correo electrónico.", "onboarding.form.organizationInfoForm.title": "Información de organización", "onboarding.form.organizationInfoForm.subtitle": "Ya falta poco. Esta información nos ayudará a personalizar tu espacio de trabajo", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nombre de la organización", @@ -4824,6 +4882,9 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Seleccionar", "onboarding.form.organizationInfoForm.fields.country.label": "País", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Seleccionar", + "onboarding.form.registerOfflineForm.title": "Registrarse fuera de línea", + "onboarding.form.registerOfflineForm.pasteStep.description": "1. En <1>cloud.rocket.chat obtenga el texto generado y péguelo a continuación para completar su proceso de registro", + "onboarding.form.registerOfflineForm.fields.registrationToken.inputLabel": "Token de registro", "onboarding.form.registeredServerForm.title": "Registrar tu servidor", "onboarding.form.registeredServerForm.included.push": "Notificaciones push para móviles", "onboarding.form.registeredServerForm.included.externalProviders": "Integración con proveedores externos (WhatsApp, Facebook, Telegram, Twitter)", @@ -4831,15 +4892,196 @@ "onboarding.form.registeredServerForm.fields.accountEmail.inputLabel": "Cuenta de correo electrónico en la nube", "onboarding.form.registeredServerForm.fields.accountEmail.inputPlaceholder": "Introduce tu correo electrónico", "onboarding.form.registeredServerForm.keepInformed": "Recibir información sobre noticias y eventos", + "onboarding.form.registeredServerForm.registerLater": "Registrarse más tarde", + "onboarding.form.registeredServerForm.notConnectedToInternet": "El servidor no está conectado a Internet, por lo que tendrás que hacer un registro offline para este espacio de trabajo.", + "onboarding.form.registeredServerForm.registrationEngagement": "El registro permite actualizaciones automáticas de la licencia, notificaciones de vulnerabilidades críticas y acceso a los servicios de Rocket.Chat Cloud. No se comparten datos confidenciales del espacio de trabajo; las estadísticas enviadas a Rocket.Chat son visibles para usted dentro del área de administración.", + "onboarding.form.registeredServerForm.registrationKeepInformed": "Al enviar este formulario, acepta recibir más información sobre los productos, eventos y actualizaciones de Rocket.Chat, de acuerdo con nuestra <1>política de privacidad. Puede darse de baja en cualquier momento.", "onboarding.form.standaloneServerForm.title": "Confirmación de servidor independiente", "onboarding.form.standaloneServerForm.servicesUnavailable": "Algunos servicios no estarán disponibles o requerirán configuración manual", "onboarding.form.standaloneServerForm.publishOwnApp": "Para enviarte notificaciones push, debes compilar y publicar tu propia aplicación en Google Play y App Store", "onboarding.form.standaloneServerForm.manuallyIntegrate": "Necesita integrarse manualmente con servicios externos", + "subscription.callout.servicesDisruptionsMayOccur": "Pueden ocurrir interrupciones en los servicios.", + "subscription.callout.servicesDisruptionsOccurring": "Se están produciendo interrupciones en los servicios.", + "subscription.callout.capabilitiesDisabled": "Características desactivadas", + "subscription.callout.description.limitsExceeded_one": "Su espacio de trabajo ha superado el límite de <1> {{val}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsExceeded_other": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsReached_one": "Su espacio de trabajo ha alcanzado el límite <1> {{val}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsReached_other": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", + "subscription.callout.allPremiumCapabilitiesDisabled": "Todas las funciones premium desactivadas", + "subscription.callout.activeUsers": "puestos", + "subscription.callout.guestUsers": "invitados", + "subscription.callout.monthlyActiveContacts": "Contactos Activos Mensuales (MAC)", + "Something_Went_Wrong": "Algo salió mal", + "Theme_light": "Claro", + "Theme_light_description": "Más accesible para personas con discapacidad visual y una buena opción para entornos bien iluminados.", + "Theme_dark": "Oscuro", + "Theme_dark_description": "Reduzca la fatiga ocular en condiciones de poca luz minimizando la cantidad de luz emitida por la pantalla.", + "Workspaces_on_Community_edition_install_app": "Los espacios de trabajo comunitarios pueden tener hasta {{limit}} {{context}} aplicaciones habilitadas. Actualiza a un plan Premium para habilitar un número ilimitado de aplicaciones.", + "Private_apps_limit_reached": "Límite de aplicaciones privadas alcanzado", + "Private_apps_limit_exceeded": "Límite de aplicaciones privadas superado", + "Disable_at_least_more_apps": "Tendrás que desactivar al menos {{numberOfExceededApps}} aplicaciones o actualizar a un plan Premium para activar esta aplicación.", + "Join_your_team": "Únete a tu equipo", + "Create_a_password": "Crear una contraseña", + "Create_an_account": "Crear una cuenta", + "Workspaces_on_community_edition_trial_on": "Los espacios de trabajo en Comunidad pueden tener hasta 5 aplicaciones de la tienda y 3 aplicaciones privadas habilitadas. Inicia una prueba premium gratuita para eliminar estos límites hoy mismo!", + "Chat_transcript": "Transcripción del chat", + "Conversational_transcript": "Transcripción conversacional", + "Conversations_by_agents": "Conversaciones por agente", + "Conversations_by_channel": "Conversaciones por canal", + "Conversations_by_department": "Conversaciones por departamento", + "Conversations_by_status": "Conversaciones por estado", + "Conversations_by_tag": "Conversaciones por etiqueta", + "Send_conversation_transcript_via_email": "Enviar la transcripción de la conversación por correo electrónico", + "Always_send_the_transcript_to_contacts_at_the_end_of_the_conversations": "Envía siempre la transcripción a los contactos al final de las conversaciones.", + "Export_conversation_transcript_as_PDF": "Exportar la transcripción de la conversación en PDF", + "Omnichannel_transcript_email": "Enviar la transcripción del chat por correo electrónico.", + "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Envía siempre la transcripción a los contactos al final de las conversaciones.", + "Omnichannel_transcript_pdf": "Exporta la transcripción del chat en PDF.", + "Accounts_Default_User_Preferences_omnichannelTranscriptPDF_Description": "Exporte siempre la transcripción en PDF al final de las conversaciones.", + "Customer": "Cliente", "This_attachment_is_not_supported": "El formato de archivo no es soportado", + "Send_transcript": "Enviar transcripción", + "Undo_request": "Deshacer solicitud", + "No_permission": "Sin permiso", + "Community_cap_description": "Los espacios de trabajo Comunidad tienen un límite de 200 conexiones concurrentes. Si este límite es sobrepasado ya no será posible para los usuarios ver el estado de otros usuarios. Esto no afecta el enviar y recibir mensajes", + "Premium_cap_description": "Planes premium no tienen un límite en el servicio de presencia", + "Service_status": "Estado del servicio", + "More_about_Premium_plans": "Más sobre los planes premium", + "Active_connections": "Conexiones activas", + "Presence_service": "Servicio de presencia", + "New_custom_status": "Nuevo estado personalizado", + "Service_disabled": "El servicio esta deshabilitado", + "Service_disabled_description": "No puede habilitar de nuevo hasta que hayan menos de 200 conexiones activas al mismo tiempo.", + "User_status_disabled": "Estados de usuario deshabilitados temporalmente para mantener el rendimiento.", + "User_status_disabled_learn_more": "Estados de usuario deshabilitados", + "User_status_disabled_learn_more_description": "Debido al alto volumen de conexiones activas, el servicio que maneja los estados de usuario se ha deshabilitado. Los administradores pueden habilitarlo manualmente en la configuración del espacio de trabajo", + "Go_to_workspace_settings": "Vaya a la configuración del espacio de trabajo", + "User_status_temporarily_disabled": "Estados de usuario deshabilitados temporalmente.", + "Use_token": "Usar token", + "Disconnected": "Desconectado", + "Disconnect_workspace": "Desconectar espacio de trabajo", "Awaiting_confirmation": "Esperando confirmación", + "Security_code": "Código de seguridad", + "Registration_Token": "Token de registro", + "RegisterWorkspace_Button": "Registrar espacio de trabajo", + "ConnectWorkspace_Button": "Conectar espacio de trabajo", + "Workspace_registered": "Espacio de trabajo registrado", + "Workspace_not_connected": "Espacio de trabajo no conectado", + "Token_Not_Recognized": "Token no reconocido", + "RegisterWorkspace_Registered_Description": "Estos servicios estan habilitados", + "RegisterWorkspace_Registered_Subtitle": "Porque este espacio de trabajo está registrado, los siguientes servicios estan habilitados", + "RegisterWorkspace_Registered_Benefits": "El registro permite actualizaciones de licencia automáticas, notificaciones de vulnerabilidades críticas y acceso a los servicios de Rocket.Chat Cloud. No se comparte información sensible con Rocket.Chat", + "RegisterWorkspace_NotRegistered_Title": "Espacio de trabajo no registrado", + "RegisterWorkspace_NotRegistered_Subtitle": "Registre este espacio de trabajo y obtenga", + "RegisterWorkspace_NotConnected_Title": "Espacio de trabajo desconectado", + "RegisterWorkspace_NotConnected_Subtitle": "Conecte este espacio de trabajo y obtenga", + "RegisterWorkspace_NotRegistered_Description": "Beneficios de registrar el espacio de trabajo", + "RegisterWorkspace_Disconnect_Subtitle": "Desconectar su espacio de trabajo resultará en perder lo siguiente", + "RegisterWorkspace_Disconnect_Error": "Un error ocurrió durante la desconexión", "RegisterWorkspace_Features_MobileNotifications_Title": "Notificaciones push para móviles", + "RegisterWorkspace_Features_MobileNotifications_Description": "Permite a los miembros del espacio de trabajo recibir notificaciones en sus móviles", + "RegisterWorkspace_Features_MobileNotifications_Disconnect": "Miembros del espacio de trabajo no recibirán más notificaciones en sus móviles", "RegisterWorkspace_Features_Marketplace_Title": "Marketplace", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", + "RegisterWorkspace_Features_Omnichannel_Description": "Habla a tu audiencia, donde estén, a través de los canales sociales más populares del mundo.", + "RegisterWorkspace_Features_Omnichannel_Disconnect": "Características Omnichannel ya no estarán disponibles", + "RegisterWorkspace_Features_ThirdPartyLogin_Description": "Permite a los miembros del espacio de trabajo iniciar sesión usando aplicaciones de terceros", + "RegisterWorkspace_Features_ThirdPartyLogin_Disconnect": "Opciones de inicio de sesión con terceros no estarán disponibles", + "RegisterWorkspace_Token_Title": "Registrar espacio de trabajo con token", + "RegisterWorkspace_Token_Step_Two": "Copia el token y pégalo abajo", + "RegisterWorkspace_with_email": "Registrar espacio de trabajo con correo electrónico.", + "RegisterWorkspace_Setup_Subtitle": "Para registrar este espacio de trabajo, debe estar asociado con una cuenta de Rocket.Chat Cloud.", + "RegisterWorkspace_Setup_Steps": "Paso {{step}} de {{numberOfSteps}}", "RegisterWorkspace_Setup_Label": "Cuenta de correo electrónico en la nube", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Acepto los <1>términos y condiciones y la <3>política de privacidad" + "RegisterWorkspace_Setup_Have_Account_Title": "¿Tiene una cuenta?", + "RegisterWorkspace_Setup_Have_Account_Subtitle": "Ingrese su correo electrónico de Rocket.Chat Cloud para asociar este espacio de trabajo con su cuenta.", + "RegisterWorkspace_Setup_No_Account_Title": "¿No tiene una cuenta?", + "RegisterWorkspace_Setup_No_Account_Subtitle": "Ingrese su correo electrónico para crear una nueva cuenta en Rocket.Chat Cloud y asociarla a este espacio de trabajo.", + "cloud.RegisterWorkspace_Setup_Email_Confirmation": "Correo electrónico enviado a <1>correo electrónico con un enlace de confirmación.", + "RegisterWorkspace_Setup_Email_Verification": "Por favor, verifique que el código de seguridad abajo es el mismo que el enviado en el correo electrónico", + "RegisterWorkspace_Syncing_Error": "Un error ocurrió al sincronizar su espacio de trabajo", + "RegisterWorkspace_Syncing_Complete": "Sincronizacion completa", + "RegisterWorkspace_Connection_Error": "Un error ocurrió al conectarse", + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Acepto los <1>términos y condiciones y la <3>política de privacidad", + "Uninstall_grandfathered_app": "¿Desinstalar {{appName}}?", + "mentions_counter": "{{count}} mención", + "mentions_counter_plural": "{{count}} menciones", + "threads_counter": "{{count}} mensaje en hilo sin leer", + "threads_counter_plural": "{{count}} mensajes en hilo sin leer", + "unread_messages_counter": "{{count}} mensaje sin leer", + "unread_messages_counter_plural": "{{count}} mensajes sin leer", + "Premium": "Premium", + "Enterprise": "Premium", + "Premium_capability": "Característica premium", + "Operating_withing_plan_limits": "Operando dentro de los límites del plan", + "Plan_limits_reached": "Límites del plan alcanzados", + "Workspace_not_registered": "Espacio de trabajo no registrado", + "Users_Connected": "Usuarios conectados", + "Solve_issues": "Soluciona problemas", + "Update_version": "Actualiza tu versión", + "Version_not_supported": "Versión <1>no soportada", + "Version_supported_until": "Versión <1>soportada hasta {{date}}", + "Outdated": "Desactualizada", + "Latest": "Última", + "New_version_available": "Nueva versión disponible", + "trial": "Periodo de prueba", + "Subscription": "Suscripción", + "Manage_subscription": "Administra tu suscripción", + "ActiveSessionsPeak": "Pico de sesiones activas", + "ActiveSessionsPeak_InfoText": "El número más alto de conexiones activas en los úlitmos 30 días", + "ActiveSessions": "Sesiones activas", + "ActiveSessions_available": "Sesiones disponibles", + "Monthly_active_contacts": "Contactos Activos Mensuales (MAC)", + "Upgrade": "Mejora", + "Seats": "Puestos", + "Marketplace_apps": "Aplicaciones de la tienda", + "Private_apps": "Aplicaciones privadas", + "Finish_your_purchase_trial": "Finaliza tu compra para evitar las <1>consecuencias de regresar a tu licencia anterior.", + "Contact_sales_trial": "Contacta a ventas para finalizar tu compra y evita las <1>consecuencias de regresar a tu licencia anterior.", + "Why_has_a_trial_been_applied_to_this_workspace": "<0>¿Por qué se aplic un periodo de prueba a este espacio de trabajo?", + "Compare_plans": "Compara los planes", + "n_days_left": "{{n}} días restantes", + "Contact_sales": "Contacta a ventas", + "Finish_purchase": "Finalizar compra", + "Self_managed_hosting": "Alojamiento autogestionado", + "Cloud_hosting": "Alojamiento en Rocket.Chat Cloud", + "free_per_month_user": "$0 por usuario/mes", + "Trial_active": "Periodo de prueba activo", + "Contact_sales_renew_date": "<0>Contacta a ventas para conocer la fecha de renovación de tu plan", + "Renews_DATE": "Renueva en {{date}}", + "UpgradeToGetMore_Headline": "Mejora para obtener más", + "UpgradeToGetMore_Subtitle": "Sobrealimenta tu espacio de trabajo con capacidades avanzadas", + "UpgradeToGetMore_scalability_Title": "Alta escalabilidad", + "UpgradeToGetMore_scalability_Body": "Mejora la eficiencia, reduce costos e incrementa el uso concurrente de usuarios al cambiar de usar un monolito a usar micro servicios o multi-instancia", + "UpgradeToGetMore_accessibility-certification_Title": "WCAG 2.1 y BITV 2.0", + "UpgradeToGetMore_accessibility-certification_Body": "Cumple con los estándares WCAG y BITV con el programa de accesibilidad de Rocket.Chat", + "UpgradeToGetMore_engagement-dashboard_Title": "Anál", + "UpgradeToGetMore_oauth-enterprise_Title": "Autenticación avanzada", + "UpgradeToGetMore_auditing_Title": "Auditoría de mensajes", + "Seats_InfoText": "Cada usuario único usa un puesto. Usuarios desactivados no usan ningún puesto. El número total de puestos es definido por el tipo de licencia activa", + "CountSeats_InfoText": "Cada usuario único usa un puesto. Usuarios desactivados no usan ningún puesto.", + "MAC_InfoText": "Contactos Activos Mensuales (MAC). El número de contactos únicos de Omnichannel con quienes se interactuó durante un mes de facturación", + "CountMAC_InfoText": "Contactos Activos Mensuales (MAC). El número de contactos únicos de Omnichannel con quienes se interactuó durante un mes calendario", + "ActiveSessions_InfoText": "Total de conexiones concurrentes. Un usuario puede estar conectado varias veces. El servicio de presencia de usuario se deshabilita cuando el total llega a 200 conexiones para prevenir problemas de rendimiento", + "Apps_InfoText": "Comunidad permite hasta 3 aplicaciones privadas y 5 aplicaciones de la tienda ser habilitadas", + "Remove_RocketChat_Watermark_InfoText": "La marca de agua es removida automticamente cuando una licencia de paga es activada", + "Remove_RocketChat_Watermark": "Remover marca de agua de Rocket.Chat", + "High_scalabaility": "Alta escalabilidad", + "Premium_and_unlimited_apps": "Apps premium ilimitadas", + "Message_audit": "Auditoría de mensajes", + "Premium_omnichannel_capabilities": "Características premium de Omnichannel", + "Video_call_manager": "Administrador de video llamadas", + "Unlimited_push_notifications": "Notificaciones push ilimitadas", + "Buy_more": "Compre más", + "Upgrade_to_Pro": "Mejore a Pro", + "Sync_license_update": "Sincronice su licencia", + "Sync_license_update_Callout_Title": "Estamos actualizando su licencia", + "Sync_license_update_Callout": "Si no nota cambios en su espacio de trabajo tras unos minutos, sincronice de nuevo", + "Includes": "Incluye", + "Unlock_premium_capabilities": "Desbloquea características premium", + "Unlimited_seats": "Puestos ilimitados", + "Unlimited_MACs": "Contactos Activos por Mes (MAC) ilimitados", + "Unlimited_seats_MACs": "Puestos y Contactos Activos por Mes (MAC) ilimitados" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json index dba68fa6b255..a4a6d7e4e879 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json @@ -1190,6 +1190,7 @@ "Email_Placeholder": "لطفا آدرس ایمیل خود را وارد کنید...", "Email_Placeholder_any": "لطفا آدرسهای ایمیل را وارد کنید ...", "Email_subject": "موضوع", + "Enterprise_License": "مجوز سازمانی", "Email_verified": "ایمیل تایید شد", "Emoji": "شکلک", "EmojiCustomFilesystem": "سیستم فایل Emoji سفارشی", @@ -1214,8 +1215,6 @@ "Enter_name_here": "نام را اینجا وارد کنید", "Enter_Normal": "حالت عادی (ارسال با Enter)", "Enter_to": "ورود به ", - "Enterprise": "شرکت، پروژه", - "Enterprise_License": "مجوز سازمانی", "Entertainment": "سرگرمی", "Error": "خطا", "Error_404": "خطای 404", @@ -1668,6 +1667,7 @@ "Job_Title": "عنوان شغلی", "Join": "پیوستن", "Join_audio_call": "پیوستن به تماس صوتی", + "Join_call":"پیوستن به تماس.", "Join_Chat": "عضویت در چت", "Join_default_channels": "پیوستن به کانال های پیشفرض", "Join_the_Community": "پیوستن به جامعه", @@ -2950,6 +2950,7 @@ "Video_Conference": "ویدیو کنفرانس", "Video_message": "پیام ویدویی", "Videocall_declined": "تماس ویدیویی رد شد", + "video_livechat_started": "شروع یک تماس ویدیویی." , "View_mode": "شیوه نمایش", "View_All": "مشاهده همه", "View_Logs": "نمایش سیاهههای مربوط", @@ -3102,5 +3103,8 @@ "registration.component.form.invalidConfirmPass": "تأییدیه رمز عبور با رمز عبور اصلی مطابقت ندارد.", "registration.component.form.confirmPassword": "رمز عبور خود را تأیید کنید", "registration.component.form.sendConfirmationEmail": "ارسال ایمیل تایید", - "RegisterWorkspace_Features_Omnichannel_Title": "کانال همه‌کاره" + "onboarding.form.registerOfflineForm.title": "ثبت دستی", + "RegisterWorkspace_Features_Omnichannel_Title": "کانال همه‌کاره", + "Enterprise": "شرکت، پروژه", + "UpgradeToGetMore_engagement-dashboard_Title": "تجزیه و تحلیل ترافیک" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json index dc30394b18ae..ce89e21e6328 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -30,6 +30,7 @@ "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "Suojattu ja vahvasti yksityinen itsepalveluratkaisu neuvottelupuheluille.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "Työtilan järjestelmänvalvojan on asennettava ja määritettävä neuvottelupuhelusovellus.", "An_app_needs_to_be_installed_and_configured": "Sovellus on asennettavaa ja määritettävä.", + "Accessibility_and_Appearance": "Helppokäyttöisyys ja ulkoasu", "Accept_Call": "Hyväksy puhelu", "Accept": "Hyväksy", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Hyväksy saapuvat monikanavapyynnöt, vaikka agentteja ei ole paikalla", @@ -323,6 +324,7 @@ "Added__username__to_this_team": "lisäsi käyttäjän @{{user_added}} tähän tiimiin", "Adding_OAuth_Services": "Lisätään OAuth-palveluja", "Adding_permission": "Lisätään oikeutta", + "Adjustable_layout": "Säädettävä ulkoasu", "Adding_user": "Lisätään käyttäjää", "Additional_emails": "Lisäsähköposti", "Additional_Feedback": "Lisäpalaute", @@ -334,6 +336,8 @@ "admin-no-videoconf-provider-app": "**Neuvottelupuhelu ei ole käytössä**: Neuvottelupuhelusovelluksia on saatavilla Rocket.Chat-kaupassa.", "Administration": "Hallinta", "Address": "Osoite", + "Adjustable_font_size": "Säädettävä fonttikoko", + "Adjustable_font_size_description": "Suunniteltu niille, jotka pitävät suuremmasta tai pienemmästä tekstistä luettavuuden parantamiseksi. Tämä edistää inklusiivisuutta antamalla käyttäjille mahdollisuuden räätälöidä ohjelmiston käyttöliittymä omien tarpeidensa mukaan.", "Adult_images_are_not_allowed": "Aikuisviihdekuvat eivät ole sallittuja", "Aerospace_and_Defense": "Ilmailu ja puolustus", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "OAuth2-todennuksen jälkeen käyttäjät ohjataan tässä luettelossa olevaan URL-osoitteeseen. Kullekin riville voi lisätä yhden URL-osoitteen.", @@ -471,6 +475,7 @@ "App_Details": "Sovelluksen tiedot", "App_Info": "Sovelluksen tiedot", "App_Information": "Sovellustiedot", + "Apps_context_enterprise": "Yritys", "App_Installation": "Sovelluksen asennus", "App_not_enabled": "Sovellus ei käytössä", "App_not_found": "Sovellusta ei löydy", @@ -480,6 +485,7 @@ "App_status_error_disabled": "Ei käytössä: tuntematon virhe", "App_status_initialized": "Alustettu", "App_status_invalid_license_disabled": "Ei käytössä: virheellinen käyttöoikeus", + "Apps_disabled_when_Enterprise_trial_ended": "Sovellukset poistuivat käytöstä, kun yritysversion kokeilujakso päättyi", "App_status_invalid_settings_disabled": "Ei käytössä: määrityksiä tarvitaan", "App_status_manually_disabled": "Ei käytössä: manuaalisesti", "App_status_manually_enabled": "Käytössä", @@ -498,7 +504,6 @@ "Apply_and_refresh_all_clients": "Tallenna ja päivitä kaikki asiakkaat", "Apps": "Sovellukset", "Apps_context_explore": "Tutustu", - "Apps_context_enterprise": "Yritys", "Apps_context_installed": "Asennettu", "Apps_context_requested": "Pyydetty", "Apps_context_private": "Yksityiset sovellukset", @@ -507,9 +512,8 @@ "Private_Apps_Count_Enabled": "{{counter}} yksityistä sovellusta käytössä", "Private_Apps_Count_Enabled_plural": "{{counter}} yksityistä sovellusta käytössä", "Apps_Count_Enabled_tooltip": "Yhteisöversion työtiloissa voi ottaa käyttöön enintään {{number}} {{context}}sovellusta", - "Apps_disabled_when_Enterprise_trial_ended": "Sovellukset poistuivat käytöstä, kun yritysversion kokeilujakso päättyi", - "Apps_disabled_when_Enterprise_trial_ended_description": "Yhteisöversion työtiloissa voi olla käytössä enintään 5 markkinapaikkasovellusta ja 3 yksityistä sovellusta. Pyydä työtilan järjestelmänvalvojaa ottamaan sovelluksia käyttöön uudelleen.", - "Apps_disabled_when_Enterprise_trial_ended_description_admin": "Yhteisöversion työtiloissa voi olla käytössä enintään 5 markkinapaikkasovellusta ja 3 yksityistä sovellusta. Ota tarvitsemasi sovellukset käyttöön uudelleen.", + "Apps_disabled_when_Premium_trial_ended_description": "Yhteisöversion työtiloissa voi olla käytössä enintään 5 markkinapaikkasovellusta ja 3 yksityistä sovellusta. Pyydä työtilan järjestelmänvalvojaa ottamaan sovelluksia käyttöön uudelleen.", + "Apps_disabled_when_Premium_trial_ended_description_admin": "Yhteisöversion työtiloissa voi olla käytössä enintään 5 markkinapaikkasovellusta ja 3 yksityistä sovellusta. Ota tarvitsemasi sovellukset käyttöön uudelleen.", "Apps_Engine_Version": "Sovellusmoottorin versio", "Apps_Essential_Alert": "Tämä sovellus on välttämätön seuraavissa tapahtumissa:", "Apps_Essential_Disclaimer": "Edellä mainitut tapahtumat keskeytyvät, jos sovellus poistetaan käytöstä. Jos haluat Rocket.Chatin toimivan ilman tämän sovelluksen toimintoja, sinun on poistettava sovellus", @@ -782,6 +786,7 @@ "Broadcasting_media_server_url": "Lähettävän mediapalvelimen URL-osoite", "Browse_Files": "Selaa tiedostoja", "Browser_does_not_support_audio_element": "Selain ei tue äänielementtiä.", + "Call_number_enterprise_only": "Soittajanumero (vain Enterprise Edition)", "Browser_does_not_support_video_element": "Selain ei tue videoelementtiä.", "Browser_does_not_support_recording_video": "Selain ei tue videon tallentamista", "Bugsnag_api_key": "Bugsnag API -avain", @@ -821,7 +826,6 @@ "Call_provider": "Puhelun palveluntarjoaja", "Call_Already_Ended": "Puhelu on jo päättynyt", "Call_number": "Soita numeroon", - "Call_number_enterprise_only": "Soittajanumero (vain Enterprise Edition)", "call-management": "Puhelujen hallinta", "call-management_description": "Oikeus aloittaa kokous", "Call_ongoing": "Puhelu käynnissä", @@ -966,8 +970,6 @@ "Close": "Sulje", "Close_chat": "Sulje keskustelu", "Close_room_description": "Olet sulkemassa keskustelun. Haluatko varmasti jatkaa?", - "Close_to_seat_limit_banner_warning": "*Sinulla on [{{seats}}] käyttäjää jäljellä* \nTämä työtila lähestyy käyttäjämäärän rajaa. Kun raja on saavutettu, uusia jäseniä ei voida lisätä. *[Request More Seats]({{url}})*", - "Close_to_seat_limit_warning": "Uusia jäseniä ei voida luoda, kun käyttäjämäärä on saavutettu.", "close-livechat-room": "Sulje Omnichannel-huone", "close-livechat-room_description": "Lupa nykyisen monikanavahuoneen sulkemiseen", "Close_menu": "Sulje valikko", @@ -1005,8 +1007,6 @@ "Cloud_register_offline_finish_helper": "Kun olet rekisteröitynyt pilvikonsolissa, näet tekstiä. Viimeistele rekisteröinti liittämällä teksti tähän.", "Cloud_register_offline_helper": "Työtiloja voidaan rekisteröidä manuaalisesti, jos verkko on suojattu ilmaraolla tai verkon käyttöä on rajoitettu. Kopioi alla oleva teksti ja viimeistele prosessi pilvikonsolissamme.", "Cloud_register_success": "Työtilasi on rekisteröity!", - "Cloud_registration_pending_html": "Push-ilmoitukset eivät toimi, ennen kuin rekisteröinti on valmis. Lisätietoja", - "Cloud_registration_pending_title": "Pilvirekisteröinti on vielä kesken", "Cloud_registration_required": "Rekisteröinti on pakollinen", "Cloud_registration_required_description": "Näyttää siltä, ettet rekisteröinyt työtilaa määrityksen aikana.", "Cloud_registration_required_link_text": "Rekisteröi työtila napsauttamalla tätä.", @@ -1496,7 +1496,6 @@ "Delete_message": "Poista viesti", "Delete_my_account": "Poista tilini", "Delete_Role_Warning": "Roolin poisto poistaa sen lopullisesti. Tätä ei voi kumota.", - "Delete_Role_Warning_Community_Edition": "Tätä ei voi kumota. Huomioi, että yhteisöversiossa ei voi luoda uusia mukautettuja rooleja", "Delete_Room_Warning": "Huoneen poisto poistaa kaikki huoneessa olevat viestit. Tätä ei voi kumota.", "Delete_User_Warning": "Käyttäjän poisto poistaa myös kaikki käyttäjän lähettämät viestit. Tätä ei voi kumota.", "Delete_User_Warning_Delete": "Käyttäjän poisto poistaa myös kaikki käyttäjän lähettämät viestit. Tätä ei voi kumota.", @@ -1691,7 +1690,7 @@ "E2E_key_reset_email": "E2E-avaimen nollausilmoitus", "E2E_message_encrypted_placeholder": "Tämä viesti on täysin salattu. Jos haluat tarkastella sitä, sinun on annettava salausavain tilisi asetuksissa.", "E2E_password_request_text": "Jos haluat käyttää salattuja yksityisiä ryhmiäsi ja suoria viestejäsi, anna salauksen salasana.
Sinun on annettava tämä salasana, jos haluat koodata tai purkaa viestejäsi jokaisella käyttämälläsi sovelluksella, koska avainta ei tallenneta palvelimeen.", - "E2E_password_reveal_text": "Nyt voit luoda salattuja yksityisiä ryhmiä ja suoria viestejä. Voit myös muuttaa olemassa olevia yksityisiä ryhmiä tai suoria viestejä salatuiksi.

Tämä on täysi salaus, joten viestien koodaus- ja purkuavainta ei tallenneta palvelimeen. Säilytä siksi salasanaa turvallisessa paikassa. Sinun on annettava se muissa laitteissa, joissa haluat käyttää e2e-salausta. Lue lisää täältä!

Salasanasi on: %s

Tämä on automaattisesti luotu salasana, voit asettaa uuden salasanan salausavaimellesi milloin tahansa missä tahansa selaimessa, johon olet antanut nykyisen salasanan.
Tämä salasana tallennetaan vain tähän selaimeen, kunnes tallennat salasanan ja kuittaat tämän ilmoituksen.", + "E2E_password_reveal_text": "Nyt voit luoda salattuja yksityisiä ryhmiä ja suoria viestejä. Voit myös muuttaa olemassa olevia yksityisiä ryhmiä tai suoria viestejä salatuiksi.

Tämä on täysi salaus, joten viestien koodaus- ja purkuavainta ei tallenneta palvelimeen. Säilytä siksi salasanaa turvallisessa paikassa. Sinun on annettava se muissa laitteissa, joissa haluat käyttää e2e-salausta. Lue lisää täältä!

Salasanasi on: {{randomPassword}}

Tämä on automaattisesti luotu salasana, voit asettaa uuden salasanan salausavaimellesi milloin tahansa missä tahansa selaimessa, johon olet antanut nykyisen salasanan.
Tämä salasana tallennetaan vain tähän selaimeen, kunnes tallennat salasanan ja kuittaat tämän ilmoituksen.", "E2E_Reset_Email_Content": "Sinut on kirjattu ulos automaattisesti. Kun kirjaudut uudelleen sisään, Rocket.Chat luo uuden avaimen ja palauttaa pääsysi kaikkiin salattuihin huoneisiin, joissa on aktiivisia käyttäjiä. E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", "E2E_Reset_Key_Explanation": "Tämä asetus poistaa nykyisen E2E-avaimesi ja kirjaa sinut ulos.
Kun kirjaudut uudelleen sisään, Rocket.Chat luo sinulle uuden avaimen ja palauttaa pääsysi kaikkiin salattuihin huoneisiin, joissa on aktiivisia jäseniä.
E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", "E2E_Reset_Other_Key_Warning": "Nykyisen E2E-avaimen nollaus kirjaa käyttäjän ulos. Kun käyttäjä kirjautuu uudelleen sisään, Rocket.Chat luo uuden avaimen ja palauttaa käyttäjän pääsyn kaikkiin salattuihin huoneisiin, joissa on aktiivisia jäseniä. E2E-salauksen luonteen vuoksi Rocket.Chat ei pysty palauttamaan pääsyä salattuihin huoneisiin, joissa ei ole aktiivisia jäseniä.", @@ -1780,13 +1779,21 @@ "Email_notification_show_message": "Näytä viesti sähköposti-ilmoituksessa", "Email_Notifications_Change_Disabled": "Rocker.Chatin järjestelmänvalvoja on poistanut käytöstä sähköposti-ilmoitukset", "Email_or_username": "Sähköpostiosoite tai käyttäjätunnus", + "Enterprise_capability": "Yritysominaisuudet", "Email_Placeholder": "Anna sähköpostiosoitteesi...", + "Enterprise_capabilities": "Yritysominaisuudet", "Email_Placeholder_any": "Anna sähköpostiosoitteita...", "email_plain_text_only": "Lähetä sähköposti vain tavallisena tekstinä", + "Enterprise_Departments_description_upgrade": "Yhteisöversion työtiloissa voidaan luoda vain yksi osasto. Poista rajat ja tehosta työtilaasi päivittämällä yritysversioon.", + "Enterprise_Departments_description_free_trial": "Yhteisöversion työtiloissa voi luoda yhden osaston. Aloita maksuton yritysversion kokeilu, jotta voit luoda useita osastoja heti!", "email_style_description": "Vältä sisäkkäisiä valitsimia", "email_style_label": "Sähköpostin tyyli", + "Enterprise_Description": "Päivitä yrityskäyttöoikeus manuaalisesti.", "Email_subject": "Sähköpostin aihe", + "Enterprise_License": "Yrityskäyttöoikeus", + "Enterprise_License_Description": "Jos työtilasi on rekisteröity ja sinulla on Rocket.Chat-pilven käyttöoikeus, sinun ei tarvitse päivittää käyttöoikeutta manuaalisesti tässä.", "Email_verified": "Sähköposti vahvistettu", + "Enterprise_Only": "Vain yritysversio", "Email_sent": "Sähköposti lähetetty", "Emoji": "Emoji", "EmojiCustomFilesystem": "Mukautettujen emojien tiedostojärjestelmä", @@ -1846,16 +1853,7 @@ "Enter_Normal": "Normaali tila (Enter lähettää viestin)", "Enter_to": "Siirry", "Enter_your_E2E_password": "Anna E2E-salasanasi", - "Enterprise": "Yritys", - "Enterprise_capability": "Yritysominaisuudet", - "Enterprise_capabilities": "Yritysominaisuudet", - "Enterprise_Departments_title": "Liitä asiakkaat jonoihin ja paranna agenttien tuottavuutta", - "Enterprise_Departments_description_upgrade": "Yhteisöversion työtiloissa voidaan luoda vain yksi osasto. Poista rajat ja tehosta työtilaasi päivittämällä yritysversioon.", - "Enterprise_Departments_description_free_trial": "Yhteisöversion työtiloissa voi luoda yhden osaston. Aloita maksuton yritysversion kokeilu, jotta voit luoda useita osastoja heti!", - "Enterprise_Description": "Päivitä yrityskäyttöoikeus manuaalisesti.", - "Enterprise_License": "Yrityskäyttöoikeus", - "Enterprise_License_Description": "Jos työtilasi on rekisteröity ja sinulla on Rocket.Chat-pilven käyttöoikeus, sinun ei tarvitse päivittää käyttöoikeutta manuaalisesti tässä.", - "Enterprise_Only": "Vain yritysversio", + "Premium_Departments_title": "Liitä asiakkaat jonoihin ja paranna agenttien tuottavuutta", "Entertainment": "Viihde", "Error": "Virhe", "Error_something_went_wrong": "Oho! Jokin meni pieleen. Lataa sivu uudelleen tai ota yhteys järjestelmänvalvojaan.", @@ -1878,7 +1876,7 @@ "error-avatar-invalid-url": "Virheellinen avatarin URL-osoite: {{url}}", "error-avatar-url-handling": "Virhe käsiteltäessä avatar-asetusta URL-osoitteesta ({{url}}) käyttäjälle {{username}}", "error-business-hours-are-closed": "Aukioloaika on suljettu", - "error-blocked-username": "{{field}} on estetty eikä sitä voi käyttää!", + "error-blocked-username": "**{{field}}** on estetty eikä sitä voi käyttää!", "error-canned-response-not-found": "Valmista vastausta ei löydy", "error-cannot-delete-app-user": "Sovelluskäyttäjän poistaminen ei ole sallittua. Poista käyttäjä poistamalla kyseinen sovellus.", "error-cant-add-federated-users": "Liittoutuneita käyttäjiä ei voi lisätä organisaation sisäiseen huoneeseen", @@ -1930,6 +1928,7 @@ "error-invalid-email-address": "Virheellinen sähköpostiosoite", "error-invalid-email-inbox": "Virheellinen sähköpostin Saapuneet-kansio", "error-email-inbox-not-found": "Sähköpostin Saapuneet-kansiota ei löydy", + "error-this-is-an-ee-feature": "Tämä ominaisuus on yritysversiossa", "error-invalid-file-height": "Virheellinen tiedoston korkeus", "error-invalid-file-type": "Virheellinen tiedostotyyppi", "error-invalid-file-width": "Virheellinen tiedoston leveys", @@ -2004,7 +2003,6 @@ "error-tags-must-be-assigned-before-closing-chat": "Tunnisteet on määritettävä ennen keskustelun sulkemista", "error-the-field-is-required": "Kenttä {{field}} on pakollinen.", "error-this-is-not-a-livechat-room": "Tämä ei ole monikanavahuone", - "error-this-is-an-ee-feature": "Tämä ominaisuus on yritysversiossa", "error-token-already-exists": "Tällä nimellä oleva tunnus on jo olemassa", "error-token-does-not-exists": "Tunnusta ei ole olemassa", "error-too-many-requests": "Virhe, liikaa pyyntöjä. Hidasta vähän. Odota {{seconds}} sekuntia ennen uutta yritystä.", @@ -2045,6 +2043,7 @@ "Exact": "Tarkka", "Example_payload": "Esimerkkikuorma", "Example_s": "Esimerkki: %s", + "Federation_Matrix_join_public_rooms_is_enterprise": "Liittyminen liittoutuneisiin huoneisiin on yritysversion ominaisuus", "except_pinned": "(paitsi kiinnitetyt)", "Exclude_Botnames": "Älä sisällytä botteja", "Exclude_Botnames_Description": "Älä levitä viestejä boteilta, joiden nimi vastaa edellä mainittua säännöllistä lauseketta. Jos jätät tämän tyhjäksi, kaikkien bottien viestit levitetään.", @@ -2137,7 +2136,6 @@ "Federation_Matrix_losing_privileges_warning": "Et voi kumota tätä toimenpidettä, koska alennat itsesi. Jos olet viimeinen käyttäjä, jolla on laajat oikeudet, et voi saada tätä oikeutta takaisin. Haluatko silti jatkaa?", "Federation_Matrix_not_allowed_to_change_moderator": "Et saa vaihtaa moderaattoria", "Federation_Matrix_not_allowed_to_change_owner": "Et saa vaihtaa omistajaa", - "Federation_Matrix_join_public_rooms_is_enterprise": "Liittyminen liittoutuneisiin huoneisiin on yritysversion ominaisuus", "Field": "Kenttä", "Field_removed": "Kenttä poistettu", "Field_required": "Kenttä pakollinen", @@ -2209,10 +2207,12 @@ "FileUpload_S3_BucketURL": "Säilön URL-osoite", "FileUpload_S3_CDN": "CDN-toimialue latauksille", "FileUpload_S3_ForcePathStyle": "Pakota polkutyyli", + "Google_Meet_Enterprise_only": "Google Meet (vain yritysversio)", "FileUpload_S3_Proxy_Avatars": "Välityspalvelimen avatarit", "FileUpload_S3_Proxy_Avatars_Description": "Välityspalvelimen avatartiedostojen siirto palvelimen kautta käyttämättä resurssin URL-osoitetta suoraan", "FileUpload_S3_Proxy_Uploads": "Välityspalvelinlataukset", "FileUpload_S3_Proxy_Uploads_Description": "Välityspalvelin lataa tiedostonsiirrot palvelimen kautta käyttämättä resurssin URL-osoitetta suoraan", + "Hold_Call_EE_only": "Aseta puhelu pitoon (vain yritysversio)", "FileUpload_S3_Region": "Alue", "FileUpload_S3_SignatureVersion": "Allekirjoitusversio", "FileUpload_S3_URLExpiryTimeSpan": "URL-osoitteiden vanhenemisaika", @@ -2262,11 +2262,13 @@ "Force_visitor_to_accept_data_processing_consent_enabled_alert": "Tietojenkäsittelyn hyväksynnän on perustuttava käsittelysyyn selkeään ymmärtämiseen. Määritä siksi alla oleva asetus, joka näkyy käyttäjille, jotta he tietävät, miksi keräät ja käsittelet henkilötietoja.", "force-delete-message": "Pakota viestin poisto", "force-delete-message_description": "Oikeus poistaa viesti ohittaen kaikki rajoitukset", + "Font_size": "Fonttikoko", "Forgot_password": "Unohditko salasanasi?", "Forgot_Password_Description": "Voit käyttää seuraavia paikkamerkkejä: \n - `[Forgot_Password_Url]` salasanan palautus-URL-osoitteen paikalla. \n - `[name]`, `[fname]`, `[lname]` käyttäjän koko nimen, etunimen tai sukunimen paikalla. \n - `[email]` käyttäjän sähköpostiosoitteen paikalla. \n - `[Site_Name]` ja `[Site_URL]` sovelluksen nimen ja URL-osoitteen paikalla.", "Forgot_Password_Email": "Nollaa salasanasi napsauttamalla tätä.", "Forgot_Password_Email_Subject": "[Site_Name] - Salasanan palautus", "Forgot_password_section": "Unohtunut salasana", + "Hold_EE_only": "Pidä (vain yritysversio)", "Format": "Muotoile", "Forward": "Välitä", "Forward_chat": "Välitä keskustelu", @@ -2310,10 +2312,8 @@ "Global_purge_override_warning": "Yleinen säilytyskäytäntö on käytössä. Jos jätät asetuksen Ohita yleinen säilytyskäytäntö pois käytöstä, voit käyttää ainoastaan yleistä käytäntöä tiukempaa käytäntöä.", "Global_Search": "Yleinen haku", "Go_to_your_workspace": "Siirry työtilaasi", - "Google_Meet_Enterprise_only": "Google Meet (vain yritysversio)", "Google_Play": "Google Play", "Hold_Call": "Aseta puhelu pitoon", - "Hold_Call_EE_only": "Aseta puhelu pitoon (vain yritysversio)", "GoogleCloudStorage": "Google-pilvitallennus", "GoogleNaturalLanguage_ServiceAccount_Description": "Palvelutiliavaimen JSON-tiedosto. Lisätietoja on [täällä](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google Tag Manager -tunnus", @@ -2369,7 +2369,6 @@ "History": "Historia", "Hold_Time": "Pitoaika", "Hold": "Pidä", - "Hold_EE_only": "Pidä (vain yritysversio)", "Home": "Koti", "Homepage": "Aloitussivu", "Homepage_Custom_Content_Default_Message": "Järjestelmänvalvojat voivat lisätä html-sisältöä hahmonnettavaksi tähän valkoiseen tilaan.", @@ -2909,7 +2908,7 @@ "leave-c_description": "Oikeus poistua kanavilta", "leave-p": "Poistu yksityisistä ryhmistä", "leave-p_description": "Oikeus poistua yksityisistä ryhmistä", - "Lets_get_you_new_one": "Hankitaan uusi!", + "Lets_get_you_new_one_": "Hankitaan uusi!", "License": "Käyttöoikeus", "Line": "Rivi", "Link": "Linkki", @@ -3020,16 +3019,28 @@ "Load_Rotation": "Kuorman kierto", "Loading": "Ladataan", "Loading_more_from_history": "Ladataan lisää historiasta", + "marketplace_featured_section_community_featured": "Esitellyt yhteisön sovellukset", "Loading_suggestion": "Ladataan ehdotuksia", + "marketplace_featured_section_community_supported": "Yhteisön tukemat sovellukset", "Loading...": "Ladataan...", + "marketplace_featured_section_enterprise": "Esitellyt yrityssovellukset", "Local": "Paikallinen", + "marketplace_featured_section_featured": "Esitellyt sovellukset", + "marketplace_featured_section_most_popular": "Suosituimmat sovellukset", "Local_Domains": "Paikalliset toimialueet", + "marketplace_featured_section_new_arrivals": "Uutuudet", "Local_Password": "Paikallinen salasana", + "marketplace_featured_section_popular_this_month": "Kuukauden suosituimmat sovellukset", "Local_Time": "Paikallinen aika", + "marketplace_featured_section_recommended": "Suositellut sovellukset", "Local_Timezone": "Paikallinen aikavyöhyke", + "marketplace_featured_section_social": "Sosiaaliset sovellukset", "Local_Time_time": "Paikallinen aika: {{time}}", + "marketplace_featured_section_trending": "Trendaavat sovellukset", "Localization": "Lokalisointi", "Location": "Sijainti", + "marketplace_featured_section_omnichannel": "Omnichannel-sovellukset", + "marketplace_featured_section_video_conferencing": "Videoneuvottelusovellukset", "Log_Exceptions_to_Channel": "Kirjaa poikkeukset kanavalle Channel", "Log_Exceptions_to_Channel_Description": "Kanava, joka vastaanottaa kaikki tallennetut poikkeukset. Jättämällä tyhjäksi voit ohittaa poikkeukset.", "Log_File": "Näytä tiedosto ja rivi", @@ -3168,18 +3179,6 @@ "Marketplace_app_last_updated": "Viimeksi päivitetty {{lastUpdated}}", "Marketplace_view_marketplace": "Näytä kauppapaikka", "Marketplace_error": "Yhteyttä internetiin ei voi muodostaa, tai työtilasi on offline-asennus.", - "marketplace_featured_section_community_featured": "Esitellyt yhteisön sovellukset", - "marketplace_featured_section_community_supported": "Yhteisön tukemat sovellukset", - "marketplace_featured_section_enterprise": "Esitellyt yrityssovellukset", - "marketplace_featured_section_featured": "Esitellyt sovellukset", - "marketplace_featured_section_most_popular": "Suosituimmat sovellukset", - "marketplace_featured_section_new_arrivals": "Uutuudet", - "marketplace_featured_section_popular_this_month": "Kuukauden suosituimmat sovellukset", - "marketplace_featured_section_recommended": "Suositellut sovellukset", - "marketplace_featured_section_social": "Sosiaaliset sovellukset", - "marketplace_featured_section_trending": "Trendaavat sovellukset", - "marketplace_featured_section_omnichannel": "Omnichannel-sovellukset", - "marketplace_featured_section_video_conferencing": "Videoneuvottelusovellukset", "MAU_value": "MAU {{value}}", "Max_length_is": "Maksimi pituus on %s", "Max_number_incoming_livechats_displayed": "Jonossa näytettävien kohteiden enimmäismäärä", @@ -3202,6 +3201,8 @@ "Mentions": "Maininnat", "Mentions_default": "Maininnat (oletus)", "Mentions_only": "Vain maininnat", + "Mentions_with_@_symbol": "Maininnat @ merkillä", + "Mentions_with_@_symbol_description": "Maininnat huomauttavat käyttäjiä ja korostavat tietyille ryhmille tai käyttäjille tarkoitettuja viestejä, mikä helpottaa kohdennettua viestintää.\n\nNäytönlukuohjelman toiminnallisuus on optimoitu, kun \"@\"-symbolia käytetään mainintaominaisuuteen. Tämä varmistaa, että näytönlukuohjelmia käyttävät käyttäjät voivat helposti tulkita maininnat ja reagoida niihin.", "Merge_Channels": "Yhdistä kanavat Channel", "message": "viesti", "Message": "Viesti", @@ -3288,6 +3289,7 @@ "Message_HideType_subscription_role_removed": "Piilota \"Rooliasetus poistettu\"-viestit", "Message_HideType_uj": "Piilota \"Käyttäjä liittyi\"-viestit", "Message_HideType_ujt": "Piilota \"Käyttäjä liittyi tiimiin\"-viestit", + "New_Call_Enterprise_Edition_Only": "Uusi puhelu (vain yritysversio)", "Message_HideType_ul": "Piilota \"Käyttäjän poistui\"-viestit", "Message_HideType_ult": "Piilota \"Käyttäjä poistui tiimistä\"-viestit", "Message_HideType_user_added_room_to_team": "Piilota \"Käyttäjä lisäsi huoneen Room Tiimiin\"-viestit", @@ -3439,7 +3441,6 @@ "New_Application": "Uusi sovellus", "New_Business_Hour": "Uusi aukioloaika", "New_Call": "Uusi puhelu", - "New_Call_Enterprise_Edition_Only": "Uusi puhelu (vain yritysversio)", "New_chat_in_queue": "Uusi keskustelu jonossa", "New_chat_priority": "Prioriteetti muutettu: {{user}} prioriteettti muutettu {{priority}}", "New_chat_transfer": "Uusi chat-siirto: {{transfer}}", @@ -3523,6 +3524,7 @@ "None": "Ei mitään", "Nonprofit": "Voittoa tavoittelematon", "Not_authorized": "Ei valtuutettu", + "Pexip_Enterprise_only": "Pexip (vain yritysversio)", "Normal": "Normaali", "Not_Available": "Ei saatavilla", "Not_assigned": "Ei määritetty", @@ -3740,7 +3742,6 @@ "Permalink": "Pysyvä linkki", "Permissions": "Oikeudet", "Personal_Access_Tokens": "Henkilökohtaiset pääsykoodit", - "Pexip_Enterprise_only": "Pexip (vain yritysversio)", "Phone": "Puhelin", "Phone_call": "Puhelu", "Phone_Number": "Puhelinnumero", @@ -3906,7 +3907,6 @@ "Rate Limiter_Description": "Hallitse palvelimesi lähettämien tai vastaanottamien pyyntöjen tiheyttä verkkohyökkäysten ja kaapimisen estämiseksi.", "Rate_Limiter_Limit_RegisterUser": "Pyyntöjen oletusmäärä nopeusrajoittimelle kun rekisteröidään käyttäjä", "Rate_Limiter_Limit_RegisterUser_Description": "Käyttäjärekisteröivien päätepisteiden (REST- ja reaaliaikaiset API:t) oletuspyyntöjen määrä, joka sallitaan API Rate Limiter-osiossa määritellyn aikavälien sisällä.", - "Reached_seat_limit_banner_warning": "*Paikkoja ei ole enää saatavilla* \nTämä työtila on saavuttanut paikkarajansa, joten siihen ei voi liittyä enää lisää jäseniä. *[Pyydä lisää paikkoja]({{url}})*", "React_when_read_only": "Salli reaktiot", "React_when_read_only_changed_successfully": "Salli reagointi, kun vain luku on muutettu onnistuneesti", "Reacted_with": "Reagoi:", @@ -4019,17 +4019,13 @@ "Report_this_message_question_mark": "Haluatko ilmoittaa tästä viestistä?", "Reporting": "Ilmoitetaan", "Request": "Pyyntö", - "Request_seats": "Pyydä paikkoja", - "Request_more_seats": "Pyydä lisää paikkoja.", - "Request_more_seats_out_of_seats": "Et voi lisätä jäseniä, koska tässä työtilassa ei ole enää paikkoja, pyydä lisää paikkoja.", - "Request_more_seats_sales_team": "Kun pyyntösi on lähetetty, myyntitiimimme selvittää sitä ja ottaa sinuun yhteyttä lähipäivinä.", - "Request_more_seats_title": "Pyydä lisää paikkoja", "Request_comment_when_closing_conversation": "Pyydä kommenttia keskustelun päättämisen yhteydessä", "Request_comment_when_closing_conversation_description": "Jos tämä on käytössä, agentin on määritettävä kommentti ennen keskustelun sulkemista.", "Request_tag_before_closing_chat": "Pyydä tunniste(et) ennen keskustelun päättämistä", "request": "pyyntö", "requests": "pyyntöä", "Requests": "Pyynnöt", + "Search_Enterprise_Apps": "Hae yrityssovelluksia", "Requested": "Pyydetty", "Requested_apps_will_appear_here": "Pyydetyt sovellukset näkyvät tässä", "request-pdf-transcript": "Pyydä PDF-tekstitallennetta", @@ -4191,7 +4187,7 @@ "SAML_AuthnContext_Template": "AuthnContext-malli", "SAML_AuthnContext_Template_Description": "Voit käyttää tässä mitä tahansa muuttujaa AuthnRequest-mallista. \n \n Jos haluat lisätä lisää authn-konteksteja, kopioi {{AuthnContextClassRef}}-tunniste ja korvaa {{\\_\\_authnContext\\_\\}}-muuttuja uudella kontekstilla.", "SAML_AuthnRequest_Template": "AuthnRequest-malli", - "SAML_AuthnRequest_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_newId\\__\\_**: Satunnaisesti luotu id-merkkijono \n- **\\__\\_instant\\_\\_\\_**: Nykyinen aikaleima \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chatin takaisinkutsun URL-osoite. \n- **\\_\\_entryPoint\\_\\_**: {{Custom Entry Point}} -asetuksen arvo. \n- **\\____________**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormatTag\\_\\_**: __NameID-käytäntömallin__ sisältö, jos voimassa oleva {{Identifier Format}} on määritetty. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\_authnContextTag\\_\\_**: __AuthnContext-mallin__ sisältö, jos voimassa oleva {{Custom Authn Context}} on määritetty. \n- **\\_\\_authnContextComparison\\_\\_**: {{Authn Context Comparison}} -asetuksen arvo. \n- **\\_\\_authnContext\\_\\_**: {{Custom Authn Context}} -asetuksen arvo.", + "SAML_AuthnRequest_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_newId\\_\\_**: Satunnaisesti luotu id-merkkijono \n- **\\_\\_instant\\_\\_**: Nykyinen aikaleima \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chatin takaisinkutsun URL-osoite. \n- **\\_\\_entryPoint\\_\\_**: {{Custom Entry Point}} -asetuksen arvo. \n- **\\_\\_issuer\\_\\_**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormatTag\\_\\_**: {{NameID Policy Template}} sisältö, jos voimassa oleva {{Identifier Format}} on määritetty. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\_authnContextTag\\_\\_**: {{AuthnContext Template}} sisältö, jos voimassa oleva {{Custom Authn Context}} on määritetty. \n- **\\_\\_authnContextComparison\\_\\_**: {{Authn Context Comparison}} -asetuksen arvo. \n- **\\_\\_authnContext\\_\\_**: {{Custom Authn Context}} -asetuksen arvo.", "SAML_Connection": "Yhteys", "SAML_Enterprise": "Yritys", "SAML_General": "Yleinen", @@ -4240,7 +4236,7 @@ "SAML_LogoutResponse_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_newId\\__\\_**: Satunnaisesti luotu id-merkkijono \n- **\\_\\_inResponseToId\\_\\_**: IdP:ltä vastaanotetun uloskirjautumispyynnön tunnus \n- **\\_\\_instant\\_\\__**: Nykyinen aikaleima \n- **\\_\\_idpSLORedirectURL\\_\\_**: IDP:n yksittäisen uloskirjautumisen URL-osoite, johon ohjataan. \n- **\\_\\_issuer\\_\\__**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\__nameID\\_\\__**: IdP:n uloskirjautumispyynnöstä saatu NameID. \n- **\\_\\_sessionIndex\\_\\_**: IdP:n uloskirjautumispyynnöstä saatu sessionIndex.", "SAML_Metadata_Certificate_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_certificate\\_\\_**: Yksityinen varmenne väitteen salausta varten.", "SAML_Metadata_Template": "Metadatan tietomalli", - "SAML_Metadata_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_sloLocation\\_\\_**: Rocket.Chat Single LogOut URL-osoite. \n- **\\____issuer\\_____**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\_certificateTag\\_\\_**: Jos yksityinen varmenne on määritetty, tämä sisältää {{Metadata Certificate Template}} -varmenteen mallin__, muutoin sitä ei oteta huomioon. \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chatin takaisinkutsun URL-osoite.", + "SAML_Metadata_Template_Description": "Seuraavat muuttujat ovat käytettävissä: \n- **\\_\\_sloLocation\\_\\_**: Rocket.Chat Single LogOut URL-osoite. \n- **\\_\\_issuer\\_\\_**: {{Custom Issuer}} -asetuksen arvo. \n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} -asetuksen arvo. \n- **\\_\\_certificateTag\\_\\_**: Jos yksityinen varmenne on määritetty, tämä sisältää {{Metadata Certificate Template}} -varmenteen mallin__, muutoin sitä ei oteta huomioon. \n- **\\_\\_callbackUrl\\_\\_**: Rocket.Chatin takaisinkutsun URL-osoite.", "SAML_MetadataCertificate_Template": "Metadatan varmenteen malli", "SAML_NameIdPolicy_Template": "NameID Policy malli", "SAML_NameIdPolicy_Template_Description": "Voit käyttää mitä tahansa muuttujaa Authorize Request Template -mallista.", @@ -4285,7 +4281,6 @@ "Search": "Haku", "Searchable": "Hakukelpoinen", "Search_Apps": "Hae sovelluksia", - "Search_Enterprise_Apps": "Hae yrityssovelluksia", "Search_Installed_Apps": "Hae asennettuja sovelluksia", "Search_Private_apps": "Hae yksityisiä sovelluksia", "Search_Requested_Apps": "Hae pyydettyjä sovelluksia", @@ -4461,6 +4456,9 @@ "Showing_online_users": "Näytetään: {{total_showing}}, Online: {{online}}, Yhteensä: {{total}} käyttäjää", "Showing_results": "

Näytetään %s tulosta

", "Showing_results_of": "Näytetään tulokset %s - %s %s:stä", + "Show_usernames": "Näytä käyttäjänimet", + "Show_or_hide_the_user_roles_of_message_authors": "Näytä tai piilota viestin kirjoittajien käyttäjäroolit.", + "Show_or_hide_the_username_of_message_authors": "Näytä tai piilota viestin kirjoittajien käyttäjänimet.", "Sidebar": "Sivupalkki", "Sidebar_list_mode": "Sivupalkin kanavaluettelon tila", "Sign_in_to_start_talking": "Kirjaudu ja ala puhua", @@ -4719,9 +4717,13 @@ "Teams_Search_teams": "Etsi tiimejä", "Teams_New_Read_only_Label": "Vain luku", "Technology_Services": "Tekniikkapalvelut", + "Upgrade_tab_connection_error_description": "Näyttää siltä, että sinulla ei ole internet-yhteyttä. Tämä voi johtua siitä, että työtilasi on asennettu täysin suojattuun air-gapped palvelimeen", "Terms": "Ehdot", "Terms_of_use": "Käyttöehdot", + "Upgrade_tab_connection_error_restore": "Palauta yhteys, niin saat tietää puuttuvista ominaisuuksista.", "Test_Connection": "Testaa yhteys", + "Upgrade_tab_go_fully_featured": "Ota kaikki ominaisuudet käyttöön", + "Upgrade_tab_trial_guide": "Kokeiluopas", "Test_Desktop_Notifications": "Testaa työpöytäilmoitukset", "Test_LDAP_Search": "Testaa LDAP-haku", "test-admin-options": "Hallintapaneelin testausvaihtoehdot", @@ -5008,10 +5010,6 @@ "Update_to_version": "Päivitys versioon {{version}}", "Update_your_RocketChat": "Päivitä Chatsovellus", "Updated_at": "Päivitetty klo.", - "Upgrade_tab_connection_error_description": "Näyttää siltä, että sinulla ei ole internet-yhteyttä. Tämä voi johtua siitä, että työtilasi on asennettu täysin suojattuun air-gapped palvelimeen", - "Upgrade_tab_connection_error_restore": "Palauta yhteys, niin saat tietää puuttuvista ominaisuuksista.", - "Upgrade_tab_go_fully_featured": "Ota kaikki ominaisuudet käyttöön", - "Upgrade_tab_trial_guide": "Kokeiluopas", "Upgrade_tab_upgrade_your_plan": "Päivitä tilauksesi", "Upload": "Lataa", "Uploads": "Lataukset", @@ -5259,6 +5257,7 @@ "view-full-other-user-info_description": "Oikeus tarkastella muiden käyttäjien täydellistä profiilia, mukaan lukien tilin luontipäivä, viimeinen sisäänkirjautuminen jne.", "view-history": "Näytä historia", "view-history_description": "Oikeus tarkastella kanavan historiaa", + "onboarding.component.form.action.registerNow": "Rekisteröidy nyt", "view-join-code": "Näytä liittymiskoodi", "view-join-code_description": "Oikeus tarkastella kanavan liittymiskoodia", "view-joined-room": "Katso yhdistetty huone", @@ -5266,6 +5265,7 @@ "view-l-room": "Näytä Omnichannel-huoneet Room", "view-l-room_description": "Lupa tarkastella Omnichannel-huoneita", "view-livechat-analytics": "Näytä Omnichannel-analytiikka", + "onboarding.page.awaitingConfirmation.subtitle": "Olemme lähettäneet sinulle sähköpostia osoitteeseen {{emailAddress}}, jossa on vahvistuslinkki. Tarkista, että alla oleva turvakoodi vastaa sähköpostissa olevaa koodia.", "view-livechat-analytics_description": "Lupa tarkastella live-chatin analytiikkaa", "view-livechat-appearance": "Näytä Omnichannel-ulkoasu", "view-livechat-appearance_description": "Lupa tarkastella live-chatin ulkoasua", @@ -5365,8 +5365,10 @@ "Wait_activation_warning": "Ennen kuin voit kirjautua, järjestelmänvalvojan on aktivoitava tilisi manuaalisesti.", "Waiting_for_answer": "Odotetaan vastausta", "Waiting_queue": "Odotusjonossa", + "Enterprise_cap_description": "Yritysversion työtiloissa ei ole läsnäolopalvelun ylärajaa.", "Waiting_queue_message": "Odotusjonon viesti", "Waiting_queue_message_description": "Viesti, joka näytetään kävijöille, kun he joutuvat jonoon", + "More_about_Enterprise_Edition": "Lisätietoja yritysversiosta", "Waiting_Time": "Odotusaika", "Waiting_for_server_connection": "Odottaa palvelinyhteyttä", "Warning": "Varoitus", @@ -5432,6 +5434,7 @@ "Would_you_like_to_return_the_inquiry": "Haluatko palauttaa kyselyn?", "Would_you_like_to_return_the_queue": "Haluatteko siirtää tämän huoneen takaisin jonoon? Kaikki keskusteluhistoria säilyy huoneessa.", "Would_you_like_to_place_chat_on_hold": "Haluaisitko asettaa tämän keskustelun pitoon?", + "multiple_instance_solutions": "usean esiintymän ratkaisut", "Wrap_up_the_call": "Puhelun päättäminen", "Wrap_Up_Notes": "Lopetusmuistiinpanot", "Workspace": "Työtila", @@ -5568,13 +5571,10 @@ "onboarding.component.form.action.next": "Seuraava", "onboarding.component.form.action.skip": "Ohita tämä vaihe", "onboarding.component.form.action.register": "Rekisteröi", - "onboarding.component.form.action.registerNow": "Rekisteröidy nyt", "onboarding.component.form.action.confirm": "Vahvista", "onboarding.component.form.termsAndConditions": "Hyväksyn käyttöehdot <1>ja <3>tietosuojaselosteen", "onboarding.component.emailCodeFallback": "Etkö saanut sähköpostia? <1>Lähetä uudelleen tai <3>muuta sähköpostia", - "onboarding.page.form.title": " <1>Käynnistetään työtilasi", - "onboarding.page.awaitingConfirmation.title": "Odotamme vahvistusta", - "onboarding.page.awaitingConfirmation.subtitle": "Olemme lähettäneet sinulle sähköpostia osoitteeseen {{emailAddress}}, jossa on vahvistuslinkki. Tarkista, että alla oleva turvakoodi vastaa sähköpostissa olevaa koodia.", + "onboarding.page.form.title": " Käynnistetään työtilasi", "onboarding.page.emailConfirmed.title": "Sähköposti vahvistettu!", "onboarding.page.emailConfirmed.subtitle": "Voit palata chatsovellukseen, olemme jo käynnistäneet työtilasi.", "onboarding.page.checkYourEmail.title": "Tarkista sähköpostisi", @@ -5610,6 +5610,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Salasana", "onboarding.form.adminInfoForm.fields.password.placeholder": "Luo salasana", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Pidä minut ajan tasalla chatsovelluksen päivityksistä", + "onboarding.form.awaitConfirmationForm.title": "Odotamme vahvistusta", "onboarding.form.organizationInfoForm.title": "Organisaation tiedot", "onboarding.form.organizationInfoForm.subtitle": "Pyydämme kärsivällisyyttä, nämä tiedot auttavat meitä muokkaamaan työtilasi yksilölliseksi", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organisaation nimi", @@ -5638,7 +5639,9 @@ "Something_Went_Wrong": "Jokin meni pieleen", "Toolbox_room_actions": "Ensisijaiset huoneen Room toimet", "Theme_light": "Vaalea", + "Theme_light_description": "Helppokäyttöisempi vaihtoehto yksilöille, joilla on näönvaraisen hahmottamisen ongelmia. Hyvä valinta hyvin valaistuihin olosuhteisiin.", "Theme_dark": "Tumma", + "Theme_dark_description": "Vähennä silmien rasitusta ja väsymystä huonosti valaistuissa olosuhteissa minimoimalla näytön tuottamaa valoa.", "Enable_of_limit_apps_currently_enabled": "**{{enabled}}/{{limit}} {{context}} sovellusta on nyt käytössä.** \n \nYhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}}sovellusta. \n \n**{{appName}} on oletusarvoisesti poissa käytöstä.** Jos haluat ottaa tämän sovelluksen käyttöön, poista käytöstä jokin muu {{context}}sovellus tai päivitä yritysversioon.", "Enable_of_limit_apps_currently_enabled_exceeded": "**{{enabled}}/{{limit}} {{context}}sovellusta on nyt käytössä.** \n \nYhteisöversion sovellusraja on saavutettu. \n \nYhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}}sovellusta. \n \n**{{appName}} poistetaan oletusarvoisesti käytöstä.** Poista käytöstä vähintään {{exceed}} muuta {{context}}sovellusta tai päivitä yritysversioon, jotta voit ottaa tämän sovelluksen käyttöön.", "Workspaces_on_Community_edition_install_app": "Yhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}}sovellusta. Päivitä yritysversioon, jotta voit ottaa sovelluksia käyttöön rajattomasti.", @@ -5652,6 +5655,9 @@ "Disable_at_least_more_apps": "Poista käytöstä vähintään {{numberOfExceededApps}} muuta sovellusta tai päivitä yritysversioon, jotta voit ottaa tämän sovelluksen käyttöön.", "Community_Private_apps_limit_exceeded": "Yhteisöversion sovellusraja on ylitetty.", "Theme_match_system": "Järjestelmän mukaan", + "Theme_match_system_description": "Seuraa käyttöjärjestelmän teemaa.", + "Theme_high_contrast": "Korkea kontrasti", + "Theme_high_contrast_description": "Maksimaalinen sävyerottelu korostetuilla väreillä ja terävillä kontrasteilla parantaa käytettävyyttä.", "Join_your_team": "Liity tiimiisi", "Create_an_account": "Luo tili", "Get_all_apps": "Hanki kaikki sovellukset, jotka tiimisi tarvitsee", @@ -5677,9 +5683,7 @@ "Undo_request": "Kumoa pyyntö", "No_permission": "Ei oikeutta", "Community_cap_description": "Yhteisön työtiloissa on 200 samanaikaisen yhteyden yläraja. Vaikka aktiivisia yhteyksiä voi olla sitä enemmänkin, kyseisen rajan jälkeen et enää näe käyttäjien tilaa. Tämä ei vaikuta siihen, miten he voivat lähettää ja vastaanottaa viestejä.", - "Enterprise_cap_description": "Yritysversion työtiloissa ei ole läsnäolopalvelun ylärajaa.", "Service_status": "Palvelun tila", - "More_about_Enterprise_Edition": "Lisätietoja yritysversiosta", "Presence_service_cap": "Läsnäolopalvelun yläraja", "User_Status": "Käyttäjän tila", "Active_connections": "Aktiiviset yhteydet", @@ -5745,8 +5749,9 @@ "cloud.RegisterWorkspace_Token_Step_One": "1. Valitse: <1>cloud.rocket.chat > Työtilat ja <3>Itse hallinnoitu rekisteröinti.", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Hyväksyn <1>käyttöehdot ja <3>tietosuojakäytännön", "Larger_amounts_of_active_connections": "Jos tarvitset enemmän aktiivisia yhteyksiä, ota harkintaan", - "multiple_instance_solutions": "usean esiintymän ratkaisut", "Uninstall_grandfathered_app": "Poistetaanko {{appName}}?", "App_will_lose_grandfathered_status": "**Tämä {{context}}sovellus menettää aikaisemmin käytetössä olleen sovelluksen tilansa.** \n \nYhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}} sovellusta. aikaisemmin Aikaisemmin käytössä olleet sovellukset lasketaan mukaan rajoitukseen, mutta rajoitusta ei sovelleta niihin.", - "Theme_Appearence": "Teeman ulkoasu" + "Theme_Appearence": "Teeman ulkoasu", + "Enterprise": "Yritys", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json index f460fc0b61de..f239fcc0fc74 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -426,6 +426,7 @@ "App_author_homepage": "Page d'accueil de l'auteur", "App_Details": "Détails de l'application", "App_Information": "Informations sur l'application", + "Apps_context_enterprise": "Entreprise", "App_Installation": "Installation de l'application", "App_status_auto_enabled": "Activé", "App_status_constructed": "Construit", @@ -450,7 +451,6 @@ "Apply": "Appliquer", "Apply_and_refresh_all_clients": "Appliquer et actualiser tous les clients", "Apps": "Applications", - "Apps_context_enterprise": "Entreprise", "Apps_context_installed": "Installé", "Apps_Engine_Version": "Version d'Apps Engine", "Apps_Essential_Alert": "Cette application est indispensable pour les événements suivants :", @@ -843,8 +843,6 @@ "Close": "Fermer", "Close_chat": "Fermer le chat", "Close_room_description": "Vous êtes sur le point de fermer ce chat. Voulez-vous continuer ?", - "Close_to_seat_limit_banner_warning": "*Il vous reste [{{seats}}] sièges* \nLe nombre maximal de sièges de cet espace de travail est presque atteint. Une fois la limite atteinte, aucun nouveau membre ne pourra être ajouté. *[Demander plus de sièges]({{url}})*", - "Close_to_seat_limit_warning": "Aucun nouveau membre ne peut être créé une fois que la limite de sièges est atteinte.", "close-livechat-room": "Fermer le salon omnicanal", "close-livechat-room_description": "Autorisation de fermer le salon omnicanal actuel", "Close_menu": "Fermer le menu", @@ -878,8 +876,6 @@ "Cloud_register_offline_finish_helper": "Une fois le processus d'enregistrement terminé dans la console cloud, un texte doit s'afficher. Collez-le ici pour terminer l'enregistrement.", "Cloud_register_offline_helper": "Les espaces de travail peuvent être enregistrés manuellement s'ils sont isolés (airgap) ou si l'accès au réseau est restreint. Copiez le texte ci-dessous et accédez à notre console cloud pour terminer le processus.", "Cloud_register_success": "Votre espace de travail a été enregistré avec succès !", - "Cloud_registration_pending_html": "Les notifications push ne fonctionnent pas tant que l'enregistrement n'est pas terminé. En savoir plus", - "Cloud_registration_pending_title": "L'enregistrement dans le cloud est toujours en cours", "Cloud_registration_required": "Inscription requise", "Cloud_registration_required_description": "Il semble que, lors de l'installation, vous n'ayez pas choisi d'enregistrer votre espace de travail.", "Cloud_registration_required_link_text": "Cliquez ici pour enregistrer votre espace de travail.", @@ -1498,7 +1494,7 @@ "E2E_Encryption_Password_Explanation": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E.", "E2E_key_reset_email": "Notification de réinitialisation de clé E2E", "E2E_password_request_text": "Pour accéder à vos groupes privés et à vos messages directs chiffrés, entrez votre mot de passe de chiffrement.
Vous devez entrer ce mot de passe pour encoder/décoder vos messages sur chaque client que vous utilisez, car la clé n'est pas stockée sur le serveur.", - "E2E_password_reveal_text": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E. En savoir plus ici !

Votre mot de passe est : %s

Ceci est un mot de passe généré automatiquement, vous pouvez configurer un nouveau de mot de passe pour votre clé de chiffrement à tout moment depuis n'importe quel navigateur où vous avez entré le mot de passe existant.
Ce mot de passe n'est stocké que dans ce navigateur jusqu'à ce que vous l'enregistriez et que vous fermiez ce message.", + "E2E_password_reveal_text": "Vous pouvez désormais créer des groupes privés et des messages directs chiffrés. Vous pouvez également modifier les groupes privés ou les messages directs existants pour les chiffrer.

Il s'agit d'un chiffrement de bout en bout de sorte que la clé pour encoder/décoder vos messages ne sera pas enregistrée sur le serveur. Pour cette raison, vous devez stocker votre mot de passe dans un endroit sûr. Vous devrez le saisir sur les autres appareils sur lesquels vous souhaitez utiliser le chiffrement E2E. En savoir plus ici !

Votre mot de passe est : {{randomPassword}}

Ceci est un mot de passe généré automatiquement, vous pouvez configurer un nouveau de mot de passe pour votre clé de chiffrement à tout moment depuis n'importe quel navigateur où vous avez entré le mot de passe existant.
Ce mot de passe n'est stocké que dans ce navigateur jusqu'à ce que vous l'enregistriez et que vous fermiez ce message.", "E2E_Reset_Email_Content": "Vous avez été automatiquement déconnecté. Lorsque vous vous reconnecterez, Rocket.Chat générera une nouvelle clé et restaurera votre accès à tout salon chiffré ayant un ou plusieurs membres en ligne. En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", "E2E_Reset_Key_Explanation": "Cette option supprimera votre clé E2E actuelle et vous déconnectera.
Lorsque vous vous reconnecterez, Rocket.Chat générera une nouvelle clé et restaurera votre accès à tout salon chiffré ayant un ou plusieurs membres en ligne.
En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", "E2E_Reset_Other_Key_Warning": "La réinitialisation de la clé E2E actuelle déconnectera l'utilisateur. Lorsque l'utilisateur se reconnectera, Rocket.Chat générera une nouvelle clé et restaurera l'accès de l'utilisateur à tout salon chiffré ayant un ou plusieurs membres en ligne. En raison de la nature du chiffrement E2E, Rocket.Chat ne pourra pas restaurer l'accès à un salon chiffré qui n'a aucun membre en ligne.", @@ -1580,6 +1576,8 @@ "email_style_description": "Éviter les sélecteurs imbriqués", "email_style_label": "Style d'e-mail", "Email_subject": "Objet de l'e-mail", + "Enterprise_License": "Licence d'entreprise", + "Enterprise_License_Description": "Si votre espace de travail est enregistré et que la licence est fournie par le cloud Rocket.Chat, vous n'avez pas besoin de mettre à jour manuellement la licence ici.", "Email_verified": "Adresse e-mail vérifiée", "Email_sent": "E-mail envoyé", "Emoji": "Emoji", @@ -1631,9 +1629,6 @@ "Enter_Normal": "Mode normal (envoyé avec Entrée)", "Enter_to": "Entrée pour", "Enter_your_E2E_password": "Entrez votre mot de passe E2E", - "Enterprise": "Entreprise", - "Enterprise_License": "Licence d'entreprise", - "Enterprise_License_Description": "Si votre espace de travail est enregistré et que la licence est fournie par le cloud Rocket.Chat, vous n'avez pas besoin de mettre à jour manuellement la licence ici.", "Entertainment": "Divertissement", "Error": "Erreur", "Error_404": "Erreur 404", @@ -1655,7 +1650,7 @@ "error-avatar-invalid-url": "URL d'avatar non valide : {{url}}", "error-avatar-url-handling": "Erreur lors du traitement du paramètre d'avatar à partir d'une URL ({{url}}) pour {{username}}", "error-business-hours-are-closed": "Les heures d'ouverture sont fermées", - "error-blocked-username": "{{field}} est bloqué et ne peut pas être utilisé !", + "error-blocked-username": "**{{field}}** est bloqué et ne peut pas être utilisé !", "error-canned-response-not-found": "Réponse standardisée introuvable", "error-cannot-delete-app-user": "La suppression de l'utilisateur de l'application n'est pas autorisée, désinstallez l'application correspondante pour le supprimer.", "error-cant-invite-for-direct-room": "Impossible d'inviter l'utilisateur dans les salons directs", @@ -2574,7 +2569,7 @@ "leave-c_description": "Autorisation de quitter les canaux", "leave-p": "Quitter les groupes privés", "leave-p_description": "Autorisation de quitter les groupes privés", - "Lets_get_you_new_one": "Nous allons vous en fournir un nouveau", + "Lets_get_you_new_one_": "Nous allons vous en fournir un nouveau", "List_of_Channels": "Liste des canaux", "List_of_departments_for_forward": "Liste des départements autorisés pour le transfert (optionnel)", "List_of_departments_for_forward_description": "Autoriser à définir une liste restreinte de départements qui peuvent recevoir des chats de ce département", @@ -3415,7 +3410,6 @@ "Random": "Aléatoire", "Rate_Limiter_Limit_RegisterUser": "Nombre d'appels par défaut au limiteur de débit pour l'enregistrement d'un utilisateur", "Rate_Limiter_Limit_RegisterUser_Description": "Nombre d'appels par défaut pour les points de terminaison d'enregistrement d'utilisateurs (API REST et en temps réel) autorisés pendant l'intervalle défini dans la section Limiteur de débit d'API.", - "Reached_seat_limit_banner_warning": "*Plus de sièges disponibles* \nLe nombre maximal de sièges de cet espace de travail est atteint. Aucun autre membre ne peut le rejoindre. *[Request More Seats]({{url}})*", "React_when_read_only": "Autoriser les réactions", "React_when_read_only_changed_successfully": "Autoriser les réactions après modification du mode de lecture seule", "Reacted_with": "A réagi avec", @@ -3507,11 +3501,6 @@ "Report_this_message_question_mark": "Signaler ce message ?", "Reporting": "Rapports", "Request": "Demande", - "Request_seats": "Demander des sièges", - "Request_more_seats": "Demander plus de sièges.", - "Request_more_seats_out_of_seats": "Vous ne pouvez pas ajouter de membres car cet espace de travail n'a plus de sièges, demandez plus de sièges.", - "Request_more_seats_sales_team": "Une fois votre demande soumise, notre équipe commerciale l'examinera et vous contactera dans les prochains jours.", - "Request_more_seats_title": "Demander plus de sièges", "Request_comment_when_closing_conversation": "Demander un commentaire lors de la fermeture de la conversation", "Request_comment_when_closing_conversation_description": "Si cette option est activée, l'agent devra définir un commentaire avant la fermeture de la conversation.", "Request_tag_before_closing_chat": "Demander des balises avant de fermer la conversation", @@ -3765,6 +3754,7 @@ "See_documentation": "Voir la documentation", "See_full_profile": "Voir le profil complet", "See_on_Engagement_Dashboard": "Voir sur le tableau de bord d'engagement", + "Select": "Sélectionnez", "Select_a_department": "Sélectionner un département", "Select_a_room": "Sélectionner un salon", "Select_a_user": "Sélectionner un utilisateur", @@ -4117,8 +4107,12 @@ "Teams_Search_teams": "Rechercher des équipes", "Teams_New_Read_only_Label": "Lecture seule", "Technology_Services": "Services technologiques", + "Upgrade_tab_connection_error_description": "Il semble que vous n'ayez pas de connexion Internet. Cela peut être dû au fait que votre espace de travail est installé sur un serveur air-gap entièrement sécurisé", "Terms": "Conditions", + "Upgrade_tab_connection_error_restore": "Rétablissez votre connexion pour découvrir les fonctionnalités qui vous manquent.", "Test_Connection": "Tester la connexion", + "Upgrade_tab_go_fully_featured": "Passez à la version complète", + "Upgrade_tab_trial_guide": "Guide d'essai", "Test_Desktop_Notifications": "Tester les notifications de bureau", "Test_LDAP_Search": "Tester la recherche LDAP", "test-admin-options": "Tester les options du panneau d'administration telles que la connexion LDAP et les notifications push", @@ -4379,10 +4373,6 @@ "Update_to_version": "Mettre à jour vers {{version}}", "Update_your_RocketChat": "Mettre à jour votre Rocket.Chat", "Updated_at": "Mis à jour à", - "Upgrade_tab_connection_error_description": "Il semble que vous n'ayez pas de connexion Internet. Cela peut être dû au fait que votre espace de travail est installé sur un serveur air-gap entièrement sécurisé", - "Upgrade_tab_connection_error_restore": "Rétablissez votre connexion pour découvrir les fonctionnalités qui vous manquent.", - "Upgrade_tab_go_fully_featured": "Passez à la version complète", - "Upgrade_tab_trial_guide": "Guide d'essai", "Upgrade_tab_upgrade_your_plan": "Améliorez votre plan", "Upload": "Charger", "Uploads": "Chargements", @@ -4577,6 +4567,7 @@ "view-l-room": "Voir les salons omnicanaux", "view-l-room_description": "Autorisation de voir les salons omnicanaux", "view-livechat-analytics": "Afficher les analyses omnicanales", + "onboarding.page.awaitingConfirmation.subtitle": "Nous vous avons envoyé un e-mail à {{emailAddress}} avec un lien de confirmation. Veuillez vérifier que le code de sécurité ci-dessous correspond à celui de l'e-mail.", "view-livechat-analytics_description": "Autorisation d'afficher les analyses Livechat", "view-livechat-appearance": "Afficher l'apparence omnicanale", "view-livechat-appearance_description": "Autorisation d'afficher l'apparence de Livechat", @@ -4822,11 +4813,10 @@ "onboarding.component.form.action.skip": "Passer cette étape", "onboarding.component.form.action.register": "S'inscrire", "onboarding.component.form.action.confirm": "Confirmer", + "onboarding.component.form.action.pasteHere": "Coller ici...", "onboarding.component.form.termsAndConditions": "J'accepte les <1>Conditions d'utilisation et la <3>Politique de confidentialité", "onboarding.component.emailCodeFallback": "Vous n'avez pas reçu d'e-mail ? <1>Renvoyer ou <3>Modifier l'adresse mail", - "onboarding.page.form.title": "<1>Lancez votre espace de travail", - "onboarding.page.awaitingConfirmation.title": "En attente de confirmation", - "onboarding.page.awaitingConfirmation.subtitle": "Nous vous avons envoyé un e-mail à {{emailAddress}} avec un lien de confirmation. Veuillez vérifier que le code de sécurité ci-dessous correspond à celui de l'e-mail.", + "onboarding.page.form.title": "Lancez votre espace de travail", "onboarding.page.emailConfirmed.title": "E-mail confirmé !", "onboarding.page.emailConfirmed.subtitle": "Vous pouvez retourner à votre application Rocket.Chat : nous avons déjà lancé votre espace de travail.", "onboarding.page.checkYourEmail.title": "Vérifiez votre messagerie", @@ -4862,6 +4852,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Mot de passe", "onboarding.form.adminInfoForm.fields.password.placeholder": "Créer un mot de passe", "onboarding.form.adminInfoForm.fields.keepPosted.label": "M'informer des mises à jour de Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "En attente de confirmation", "onboarding.form.organizationInfoForm.title": "Informations sur l'organisation", "onboarding.form.organizationInfoForm.subtitle": "Aidez-nous ! Grâce à ces informations, nous pourrons personnaliser votre espace de travail", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nom de l'organisation", @@ -4874,6 +4865,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Sélectionnez", "onboarding.form.organizationInfoForm.fields.country.label": "Pays", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Sélectionnez", + "onboarding.form.registerOfflineForm.title": "S'inscrire hors ligne", "onboarding.form.registeredServerForm.title": "Enregistrer votre serveur", "onboarding.form.registeredServerForm.included.push": "Notifications push mobiles", "onboarding.form.registeredServerForm.included.externalProviders": "Intégration avec des fournisseurs externes (WhatsApp, Facebook, Telegram, Twitter)", @@ -4890,5 +4882,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "Marketplace", "RegisterWorkspace_Features_Omnichannel_Title": "Omnicanal", "RegisterWorkspace_Setup_Label": "E-mail du compte cloud", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "J'accepte les <1>Conditions d'utilisation et la <3>Politique de confidentialité" + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "J'accepte les <1>Conditions d'utilisation et la <3>Politique de confidentialité", + "Enterprise": "Entreprise", + "UpgradeToGetMore_engagement-dashboard_Title": "Analyses", + "UpgradeToGetMore_auditing_Title": "Audit des messages" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json index 9ee622195a6a..a17dba96f252 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json @@ -278,6 +278,7 @@ "Videocall_enabled": "Videochamada habilitada", "Videocall_declined": "Videochamada rexeitada.", "view-full-other-user-info": "Ver toda a información do usuario", + "onboarding.page.awaitingConfirmation.subtitle": "Enviámosche un correo electrónico a {{emailAddress}} cunha ligazón de confirmación. Verifique que o código de seguranza que aparece a continuación coincide co do correo electrónico.", "You_can_close_this_window_now": "Xa podes pechar esta ventá.", "You_can_use_an_emoji_as_avatar": "Tamén podes usar un emoji como avatar.", "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Podes usar webhooks para integrar facilmente o chat de vídeo co teu CRM.", @@ -325,9 +326,7 @@ "onboarding.component.form.action.confirm": "Confirmar", "onboarding.component.form.termsAndConditions": "Acepto os <1>Termos e condicións e a <3>Política de privacidade", "onboarding.component.emailCodeFallback": "Non recibiches o correo electrónico? <1>Reenviar ou <3>Cambiar correo electrónico", - "onboarding.page.form.title": "Imos <1>Iniciar o teu espazo de traballo", - "onboarding.page.awaitingConfirmation.title": "Agardando confirmación", - "onboarding.page.awaitingConfirmation.subtitle": "Enviámosche un correo electrónico a {{emailAddress}} cunha ligazón de confirmación. Verifique que o código de seguranza que aparece a continuación coincide co do correo electrónico.", + "onboarding.page.form.title": "Imos Iniciar o teu espazo de traballo", "onboarding.page.emailConfirmed.title": "Correo electrónico confirmado!", "onboarding.page.emailConfirmed.subtitle": "Podes volver á túa aplicación Rocket.Chat: xa lanzamos o teu espazo de traballo.", "onboarding.page.checkYourEmail.title": "Comprobe o seu correo electrónico", @@ -363,6 +362,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Contrasinal", "onboarding.form.adminInfoForm.fields.password.placeholder": "Crear contrasinal", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Mantéñame informado sobre as actualizacións de Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "Agardando confirmación", "onboarding.form.organizationInfoForm.title": "Información da organización", "onboarding.form.organizationInfoForm.subtitle": "Por favor, ten paciencia connosco. Esta información axudaranos a personalizar o teu espazo de traballo", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nome da Organización", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json index 7f391aa806b4..0f17d3f548c2 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json @@ -1534,5 +1534,6 @@ "registration.component.form.submit": "שליחה", "registration.component.form.invalidConfirmPass": "אימות הססמה אינו זהה לססמה", "registration.component.form.confirmPassword": "אמת את הסיסמה שלך", - "registration.component.form.sendConfirmationEmail": "שליחת דוא״ל אימות" + "registration.component.form.sendConfirmationEmail": "שליחת דוא״ל אימות", + "UpgradeToGetMore_engagement-dashboard_Title": "סטטיסטיקה" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json index bbad485652d1..e33f8dd815da 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -1104,7 +1104,6 @@ "Enter_name_here": "Unesite ime", "Enter_Normal": "Normalni način rada (pošalji s Enterom)", "Enter_to": "Uđi u ", - "Enterprise": "Poduzeće", "Entertainment": "Zabava", "Error": "Pogreška", "Error_404": "Pogreška: 404", @@ -2894,5 +2893,7 @@ "registration.component.form.reasonToJoin": "Razlog pridruživanja", "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", - "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email" + "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email", + "Enterprise": "Poduzeće", + "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json index 8fed8002a5db..311cfd71ed69 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -29,6 +29,8 @@ "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "Biztonságos és rendkívül személyes, önmenedzselt megoldás a konferenciahívásokhoz.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "A munkaterület adminisztrátorának telepítenie kell és be kell állítania egy konferenciahívás-alkalmazást.", "An_app_needs_to_be_installed_and_configured": "Egy alkalmazást kell telepíteni és beállítani.", + "Accessibility": "Hozzáférhetőség", + "Accessibility_and_Appearance": "Hozzáférhetőség és megjelenés", "Accept_Call": "Hívás fogadása", "Accept": "Elfogadás", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Bejövő összcsatornás kérések elfogadása, akkor is ha nincsenek elérhető ügyintézők", @@ -754,6 +756,7 @@ "Broadcasting_media_server_url": "Műsorszórási médiakiszolgáló URL", "Browse_Files": "Fájlok tallózása", "Browser_does_not_support_audio_element": "A böngészője nem támogatja az „audio” elemet.", + "Call_number_enterprise_only": "Szám hívása (csak vállalati kiadás)", "Browser_does_not_support_video_element": "A böngészője nem támogatja a „video” elemet.", "Browser_does_not_support_recording_video": "A böngészője nem támogatja a videó rögzítését", "Bugsnag_api_key": "Bugsnag API-kulcs", @@ -790,7 +793,6 @@ "Call_provider": "Hívásszolgáltató", "Call_Already_Ended": "A hívás már befejeződött", "Call_number": "Szám hívása", - "Call_number_enterprise_only": "Szám hívása (csak vállalati kiadás)", "call-management": "Híváskezelés", "call-management_description": "Jogosultság egy értekezlet kezdéséhez", "Call_ongoing": "Hívás folyamatban", @@ -933,8 +935,6 @@ "Close": "Bezárás", "Close_chat": "Csevegés lezárása", "Close_room_description": "A csevegés lezárására készül. Biztosan folytatni szeretné?", - "Close_to_seat_limit_banner_warning": "*Önnek [{{seats}}] helye van hátra* \nEz a munkaterület közelít a helyek korlátjához. A korlát elérése után nem lehet új tagokat hozzáadni. *[További helyek kérése]({{url}})*", - "Close_to_seat_limit_warning": "Nem lehet új tagokat létrehozni, ha a helyek elérték a korlátot.", "close-livechat-room": "Összcsatornás szoba lezárása", "close-livechat-room_description": "Jogosultság a jelenlegi összcsatornás szoba lezárásához", "Close_menu": "Menü bezárása", @@ -969,8 +969,6 @@ "Cloud_register_offline_finish_helper": "Miután befejezte a regisztrációs folyamatot a felhőkonzolban, megjelenik néhány szöveg. Illessze be ide a regisztráció befejezéséhez.", "Cloud_register_offline_helper": "A munkaterületek kézzel is regisztrálhatók, ha fizikailag elválasztott vagy a hálózati hozzáférés korlátozott. Másolja le az alábbi szöveget, és menjen a felhőkonzolunkhoz a folyamat befejezéséhez.", "Cloud_register_success": "A munkaterülete sikeresen regisztrálva lett!", - "Cloud_registration_pending_html": "A leküldéses értesítések nem működnek, amíg a regisztráció be nem fejeződik. Tudjon meg többet", - "Cloud_registration_pending_title": "A felhőregisztráció továbbra is függőben van", "Cloud_registration_required": "Regisztráció szükséges", "Cloud_registration_required_description": "Úgy tűnik, hogy a beállítás során nem választotta a munkaterületének regisztrációját.", "Cloud_registration_required_link_text": "Kattintson ide a munkaterülete regisztrálásához.", @@ -1644,7 +1642,7 @@ "E2E_key_reset_email": "Végpontok közötti titkosítási kulcs visszaállításának értesítése", "E2E_message_encrypted_placeholder": "Ez az üzenet végpontok között titkosított. A megtekintéséhez meg kell adnia a titkosítási kulcsot a fiók beállításaiban.", "E2E_password_request_text": "A titkosított személyes csoportok és közvetlen üzenetek eléréséhez adja meg a titkosítási jelszót.
Ezt a jelszót kell megadnia az üzenetek kódolásához vagy dekódolásához minden egyes használt ügyfélprogramban, mivel a kulcs nincs eltárolva a kiszolgálón.", - "E2E_password_reveal_text": "Mostantól létrehozhat titkosított személyes csoportokat és közvetlen üzeneteket. A meglévő személyes csoportokat vagy közvetlen üzeneteket is megváltoztathatja titkosítottra.

Ez végpontok közötti titkosítás, így az üzenetek kódolásához vagy dekódolásához szükséges kulcs nem kerül mentésre a kiszolgálón. Emiatt a jelszavát valamilyen biztonságos helyen kell tárolnia. Meg kell tudni adni a többi eszközön is, amelyen a végpontok közötti titkosítást használni szeretné. Tudjon meg többet itt!

A jelszava: %s

Ez egy automatikusan előállított jelszó, bármikor beállíthat egy új jelszót a titkosítási kulcsához bármelyik böngészőből, ahová a meglévő jelszót beírta.
Ez a jelszó csak addig tárolódik ebben a böngészőben, amíg el nem tárolja a jelszót, és el nem utasítja ezt az üzenetet.", + "E2E_password_reveal_text": "Mostantól létrehozhat titkosított személyes csoportokat és közvetlen üzeneteket. A meglévő személyes csoportokat vagy közvetlen üzeneteket is megváltoztathatja titkosítottra.

Ez végpontok közötti titkosítás, így az üzenetek kódolásához vagy dekódolásához szükséges kulcs nem kerül mentésre a kiszolgálón. Emiatt a jelszavát valamilyen biztonságos helyen kell tárolnia. Meg kell tudni adni a többi eszközön is, amelyen a végpontok közötti titkosítást használni szeretné. Tudjon meg többet itt!

A jelszava: {{randomPassword}}

Ez egy automatikusan előállított jelszó, bármikor beállíthat egy új jelszót a titkosítási kulcsához bármelyik böngészőből, ahová a meglévő jelszót beírta.
Ez a jelszó csak addig tárolódik ebben a böngészőben, amíg el nem tárolja a jelszót, és el nem utasítja ezt az üzenetet.", "E2E_Reset_Email_Content": "Ön automatikusan ki lett jelentkeztetve. Ha újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani, és visszaállítja a hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik. A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", "E2E_Reset_Key_Explanation": "Ez a beállítás eltávolítja a jelenlegi végpontok közötti titkosítási kulcsot, és kijelentkezteti Önt.
Ha újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani Önnek, és visszaállítja a hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik.
A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", "E2E_Reset_Other_Key_Warning": "A jelenlegi végpontok közötti titkosítási kulcs visszaállítása és a felhasználó kijelentkeztetése. Ha a felhasználó újra bejelentkezik, akkor a Rocket.Chat új kulcsot fog előállítani, és visszaállítja a felhasználó hozzáférését az összes olyan titkosított szobához, amely egy vagy több elérhető taggal rendelkezik. A végpontok közötti titkosítás természetéből adódóan a Rocket.Chat nem tudja visszaállítani a hozzáférést olyan titkosított szobákhoz, amelyek nem rendelkeznek elérhető taggal.", @@ -1732,11 +1730,15 @@ "Email_Notifications_Change_Disabled": "A Rocket.Chat adminisztrátora letiltotta az e-mail-értesítéseket", "Email_or_username": "E-mail-cím vagy felhasználónév", "Email_Placeholder": "Adja meg az e-mail-címét…", + "Enterprise_capabilities": "Vállalati képességek", "Email_Placeholder_any": "Adjon meg e-mail-címeket…", "email_plain_text_only": "Csak egyszerű szöveges e-mailek küldése", "email_style_description": "Egymásba ágyazott kiválasztók elkerülése", "email_style_label": "E-mail stílusa", + "Enterprise_Description": "A vállalati licenc kézi frissítése.", "Email_subject": "E-mail tárgya", + "Enterprise_License": "Vállalati licenc", + "Enterprise_License_Description": "Ha a munkaterülete regisztrálva van és a Rocket.Chat felhője biztosítja a licencet, akkor itt nem kell kézzel frissítenie a licencet.", "Email_verified": "E-mail ellenőrizve", "Email_sent": "E-mail elküldve", "Emoji": "Emodzsi", @@ -1794,11 +1796,6 @@ "Enter_Normal": "Normál mód (küldés az Enter billentyűvel)", "Enter_to": "Belépés ide:", "Enter_your_E2E_password": "A végpontok közötti titkosítási jelszó megadása", - "Enterprise": "Vállalati", - "Enterprise_capabilities": "Vállalati képességek", - "Enterprise_Description": "A vállalati licenc kézi frissítése.", - "Enterprise_License": "Vállalati licenc", - "Enterprise_License_Description": "Ha a munkaterülete regisztrálva van és a Rocket.Chat felhője biztosítja a licencet, akkor itt nem kell kézzel frissítenie a licencet.", "Entertainment": "Szórakozás", "Error": "Hiba", "Error_something_went_wrong": "Hoppá! Valami elromlott. Töltse újra az oldalt, vagy vegye fel a kapcsolatot egy adminisztrátorral.", @@ -1821,7 +1818,7 @@ "error-avatar-invalid-url": "Érvénytelen profilkép URL: {{url}}", "error-avatar-url-handling": "Hiba történt {{username}} {{url}} URL-éről érkező profilkép-beállításának kezelésekor", "error-business-hours-are-closed": "A munkaidő véget ért", - "error-blocked-username": "A(z) {{field}} tiltva van és nem használható!", + "error-blocked-username": "A(z) **{{field}}** tiltva van és nem használható!", "error-canned-response-not-found": "A sablonválasz nem található", "error-cannot-delete-app-user": "Az alkalmazás felhasználójának törlése nem engedélyezett, távolítsa el a megfelelő alkalmazást a felhasználó eltávolításához.", "error-cant-add-federated-users": "Nem lehet föderált felhasználókat hozzáadni egy nem föderált szobához", @@ -1870,6 +1867,7 @@ "error-invalid-email-address": "Érvénytelen e-mail-cím", "error-invalid-email-inbox": "Érvénytelen beérkező levelek mappa", "error-email-inbox-not-found": "A beérkező levelek mappa nem található", + "error-this-is-an-ee-feature": "Ez egy vállalati kiadási funkció", "error-invalid-file-height": "Érvénytelen fájlmagasság", "error-invalid-file-type": "Érvénytelen fájltípus", "error-invalid-file-width": "Érvénytelen fájlszélesség", @@ -1942,7 +1940,6 @@ "error-tags-must-be-assigned-before-closing-chat": "Címkéket kell hozzárendelni a csevegés lezárása előtt", "error-the-field-is-required": "A(z) {{field}} mező kötelező.", "error-this-is-not-a-livechat-room": "Ez nem összcsatornás szoba", - "error-this-is-an-ee-feature": "Ez egy vállalati kiadási funkció", "error-token-already-exists": "Már létezik ilyen nevű token", "error-token-does-not-exists": "A token nem létezik", "error-too-many-requests": "Hiba, túl sok kérés. Lassítson. Várnia kell {{seconds}} másodpercet, mielőtt újra próbálkozna.", @@ -2132,10 +2129,12 @@ "FileUpload_S3_BucketURL": "Gyűjtő URL", "FileUpload_S3_CDN": "CDN-tartomány a letöltésekhez", "FileUpload_S3_ForcePathStyle": "Útvonal stílusának kényszerítése", + "Google_Meet_Enterprise_only": "Google Meet (csak vállalati)", "FileUpload_S3_Proxy_Avatars": "Proxyavatarok", "FileUpload_S3_Proxy_Avatars_Description": "Proxyavatar fájlátvitelek a kiszolgálón keresztül az eszköz URL-jének közvetlen elérése helyett", "FileUpload_S3_Proxy_Uploads": "Proxyfeltöltések", "FileUpload_S3_Proxy_Uploads_Description": "Proxyfeltöltés fájlátvitelek a kiszolgálón keresztül az eszköz URL-jének közvetlen elérése helyett", + "Hold_Call_EE_only": "Tartott hívás (csak vállalati kiadás)", "FileUpload_S3_Region": "Régió", "FileUpload_S3_SignatureVersion": "Aláírás verziója", "FileUpload_S3_URLExpiryTimeSpan": "URL-ek lejárati időtartama", @@ -2190,6 +2189,7 @@ "Forgot_Password_Email": "Kattintson ide a jelszava visszaállításához.", "Forgot_Password_Email_Subject": "[Site_Name] – jelszó-helyreállítás", "Forgot_password_section": "Elfelejtett jelszó", + "Hold_EE_only": "Tartás (csak vállalati kiadás)", "Format": "Formátum", "Forward": "Továbbítás", "Forward_chat": "Csevegés továbbítása", @@ -2233,10 +2233,8 @@ "Global_purge_override_warning": "Globális megőrzési házirend van érvényben. Ha kikapcsolja a „Globális megőrzési házirend felülbírálása” beállítást, akkor csak a globális házirendnél szigorúbb házirendet alkalmazhat.", "Global_Search": "Globális keresés", "Go_to_your_workspace": "Ugrás a munkaterületére", - "Google_Meet_Enterprise_only": "Google Meet (csak vállalati)", "Google_Play": "Google Play", "Hold_Call": "Tartott hívás", - "Hold_Call_EE_only": "Tartott hívás (csak vállalati kiadás)", "GoogleCloudStorage": "Google-felhőtárhely", "GoogleNaturalLanguage_ServiceAccount_Description": "A szolgáltatás fiókkulcsának JSON-fájlja. További információk találhatók [itt](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google-címkekezelő azonosítója", @@ -2288,7 +2286,6 @@ "History": "Előzmények", "Hold_Time": "Tartási idő", "Hold": "Tartás", - "Hold_EE_only": "Tartás (csak vállalati kiadás)", "Home": "Kezdőlap", "Homepage": "Honlap", "Host": "Kiszolgáló", @@ -2804,7 +2801,7 @@ "leave-c_description": "Jogosultság a csatornák elhagyásához", "leave-p": "Személyes csoportok elhagyása", "leave-p_description": "Jogosultság a személyes csoportok elhagyásához", - "Lets_get_you_new_one": "Had adjunk Önnek egy újat!", + "Lets_get_you_new_one_": "Had adjunk Önnek egy újat!", "License": "Licenc", "Link_Preview": "Hivatkozás előnézete", "List_of_Channels": "Csatornák listája", @@ -2911,15 +2908,27 @@ "Load_Rotation": "Forgatás betöltése", "Loading": "Betöltés", "Loading_more_from_history": "Továbbiak betöltése az előzményekből", + "marketplace_featured_section_community_featured": "Kiemelt közösségi alkalmazások", "Loading_suggestion": "Javaslatok betöltése", + "marketplace_featured_section_community_supported": "Közösségi támogatású alkalmazások", "Loading...": "Betöltés…", + "marketplace_featured_section_enterprise": "Kiemelt vállalati alkalmazások", + "marketplace_featured_section_featured": "Kiemelt alkalmazások", + "marketplace_featured_section_most_popular": "Legnépszerűbb alkalmazások", "Local_Domains": "Helyi tartományok", + "marketplace_featured_section_new_arrivals": "Újonnan érkezettek", "Local_Password": "Helyi jelszó", + "marketplace_featured_section_popular_this_month": "Ebben a hónapban népszerű alkalmazások", "Local_Time": "Helyi idő", + "marketplace_featured_section_recommended": "Ajánlott alkalmazások", "Local_Timezone": "Helyi időzóna", + "marketplace_featured_section_social": "Közösségi alkalmazások", "Local_Time_time": "Helyi idő: {{time}}", + "marketplace_featured_section_trending": "Felkapott alkalmazások", "Localization": "Honosítás", "Location": "Hely", + "marketplace_featured_section_omnichannel": "Összcsatornás alkalmazások", + "marketplace_featured_section_video_conferencing": "Videokonferencia alkalmazások", "Log_Exceptions_to_Channel": "Kivételek naplózása egy csatornába", "Log_Exceptions_to_Channel_Description": "Egy csatorna, amely az összes elfogott kivételt megkapja. Hagyja üresen a kivételek figyelmen kívül hagyásához.", "Log_File": "Fájl és sor megjelenítése", @@ -3053,18 +3062,6 @@ "Marketplace_app_last_updated": "Utoljára frissítve: {{lastUpdated}}", "Marketplace_view_marketplace": "Piactér megtekintése", "Marketplace_error": "Nem lehet kapcsolódni az internetre, vagy a munkaterülete kapcsolat nélküli telepítésű lehet.", - "marketplace_featured_section_community_featured": "Kiemelt közösségi alkalmazások", - "marketplace_featured_section_community_supported": "Közösségi támogatású alkalmazások", - "marketplace_featured_section_enterprise": "Kiemelt vállalati alkalmazások", - "marketplace_featured_section_featured": "Kiemelt alkalmazások", - "marketplace_featured_section_most_popular": "Legnépszerűbb alkalmazások", - "marketplace_featured_section_new_arrivals": "Újonnan érkezettek", - "marketplace_featured_section_popular_this_month": "Ebben a hónapban népszerű alkalmazások", - "marketplace_featured_section_recommended": "Ajánlott alkalmazások", - "marketplace_featured_section_social": "Közösségi alkalmazások", - "marketplace_featured_section_trending": "Felkapott alkalmazások", - "marketplace_featured_section_omnichannel": "Összcsatornás alkalmazások", - "marketplace_featured_section_video_conferencing": "Videokonferencia alkalmazások", "MAU_value": "MAU {{value}}", "Max_length_is": "A legnagyobb hossz %s", "Max_number_incoming_livechats_displayed": "A várólistában megjelenített elemek legnagyobb száma", @@ -3172,6 +3169,7 @@ "Message_HideType_subscription_role_removed": "A „szerep többé nincs meghatározva” üzenetek elrejtése", "Message_HideType_uj": "A „felhasználó csatlakozott” üzenetek elrejtése", "Message_HideType_ujt": "A „felhasználó csatlakozott a csapathoz” üzenetek elrejtése", + "New_Call_Enterprise_Edition_Only": "Új hívás (csak vállalati kiadás)", "Message_HideType_ul": "A „felhasználó kilépett” üzenetek elrejtése", "Message_HideType_ult": "A „felhasználó elhagyta a csapatot” üzenetek elrejtése", "Message_HideType_user_added_room_to_team": "A „felhasználó hozzáadta a szobát a csapathoz” üzenetek elrejtése", @@ -3316,7 +3314,6 @@ "New_Application": "Új alkalmazás", "New_Business_Hour": "Új munkaidő", "New_Call": "Új hívás", - "New_Call_Enterprise_Edition_Only": "Új hívás (csak vállalati kiadás)", "New_chat_in_queue": "Új csevegés a várólistában", "New_chat_priority": "Prioritás megváltoztatva: {{user}} megváltoztatta a prioritást {{priority}} szintre", "New_chat_transfer": "Új csevegésátadás: {{transfer}}", @@ -3397,6 +3394,7 @@ "None": "Nincs", "Nonprofit": "Nonprofit", "Not_authorized": "Nincs felhatalmazva", + "Pexip_Enterprise_only": "Pexip (csak vállalati)", "Normal": "Normál", "Not_Available": "Nem érhető el", "Not_enough_data": "Nincs elég adat", @@ -3602,7 +3600,6 @@ "Permalink": "Állandó hivatkozás", "Permissions": "Jogosultságok", "Personal_Access_Tokens": "Személyes hozzáférési tokenek", - "Pexip_Enterprise_only": "Pexip (csak vállalati)", "Phone": "Telefon", "Phone_call": "Telefonhívás", "Phone_Number": "Telefonszám", @@ -3765,7 +3762,6 @@ "Rate Limiter_Description": "A kiszolgáló által elküldött vagy fogadott kérések sebességének vezérlése, hogy megakadályozza a kibertámadásokat és az adatkinyeréseket.", "Rate_Limiter_Limit_RegisterUser": "Alapértelmezett hívásszám a sebességkorlátozóhoz egy felhasználó regisztrálásánál", "Rate_Limiter_Limit_RegisterUser_Description": "Az API sebességkorlátozó szakaszban meghatározott időtartományon belül engedélyezett alapértelmezett hívások száma a felhasználó regisztrálási végpontoknál (REST és valós idejű API-k).", - "Reached_seat_limit_banner_warning": "*Nincs több elérhető hely* \nEz a munkaterület elérte a helyek korlátját, így több tag nem csatlakozhat. *[További helyek kérése]({{url}})*", "React_when_read_only": "Reagálás engedélyezése", "React_when_read_only_changed_successfully": "Reagálás engedélyezése csak olvashatókor sikeresen megváltoztatva", "Reacted_with": "Reagált ezzel:", @@ -3875,11 +3871,6 @@ "Report_this_message_question_mark": "Jelenti ezt az üzenetet?", "Reporting": "Jelentés", "Request": "Kérés", - "Request_seats": "Helyek kérése", - "Request_more_seats": "További helyek kérése.", - "Request_more_seats_out_of_seats": "Nem tud tagokat hozzáadni, mert ezen a munkaterületen elfogytak a helyek. Kérjen további helyeket.", - "Request_more_seats_sales_team": "Miután a kérése elküldésre került, az értékesítési csapatunk megvizsgálja azt, és felveszi Önnel a kapcsolatot a következő néhány napon belül.", - "Request_more_seats_title": "További helyek kérése", "Request_comment_when_closing_conversation": "Megjegyzés kérése a beszélgetés lezárásakor", "Request_comment_when_closing_conversation_description": "Ha engedélyezve van, akkor az ügyintézőnek be kell állítania egy megjegyzést a beszélgetés lezárása előtt.", "Request_tag_before_closing_chat": "Címkék kérése a beszélgetés lezárása előtt", @@ -4541,9 +4532,13 @@ "Teams_Search_teams": "Csapatok keresése", "Teams_New_Read_only_Label": "Csak olvasható", "Technology_Services": "Technológiai szolgáltatások", + "Upgrade_tab_connection_error_description": "Úgy tűnik, hogy nincs internetkapcsolata. Ez azért lehet, mert a munkaterülete egy teljesen biztonságos, légréses kiszolgálón van telepítve.", "Terms": "Feltételek", "Terms_of_use": "Használati feltételek", + "Upgrade_tab_connection_error_restore": "Állítsa vissza a kapcsolatot, hogy megtudja, milyen funkciókról maradt le.", "Test_Connection": "Kapcsolat tesztelése", + "Upgrade_tab_go_fully_featured": "Irány teljes értékűvé", + "Upgrade_tab_trial_guide": "Próba útmutató", "Test_Desktop_Notifications": "Asztali értesítések tesztelése", "Test_LDAP_Search": "LDAP-keresés tesztelése", "test-admin-options": "Beállítások tesztelése az adminisztrátori panelen", @@ -4822,10 +4817,6 @@ "Update_to_version": "Frissítés a(z) {{version}} verzióra", "Update_your_RocketChat": "A Rocket.Chat frissítése", "Updated_at": "Frissítve", - "Upgrade_tab_connection_error_description": "Úgy tűnik, hogy nincs internetkapcsolata. Ez azért lehet, mert a munkaterülete egy teljesen biztonságos, légréses kiszolgálón van telepítve.", - "Upgrade_tab_connection_error_restore": "Állítsa vissza a kapcsolatot, hogy megtudja, milyen funkciókról maradt le.", - "Upgrade_tab_go_fully_featured": "Irány teljes értékűvé", - "Upgrade_tab_trial_guide": "Próba útmutató", "Upgrade_tab_upgrade_your_plan": "Előfizetéses csomag frissítése", "Upload": "Feltöltés", "Uploads": "Feltöltések", @@ -5073,6 +5064,7 @@ "view-l-room": "Összcsatornás szobák megtekintése", "view-l-room_description": "Jogosultság az összcsatornás szobák megtekintéséhez", "view-livechat-analytics": "Összcsatornás elemzések megtekintése", + "onboarding.page.awaitingConfirmation.subtitle": "Egy megerősítő hivatkozást tartalmazó levelet küldtünk Önnek a(z) {{emailAddress}} e-mail-címre. Ellenőrizze, hogy az alábbi biztonsági kód megegyezik-e azzal, amit e-mailben kapott.", "view-livechat-analytics_description": "Jogosultság az élő csevegés elemzéseinek megtekintéséhez", "view-livechat-appearance": "Összcsatorna megjelenésének megtekintése", "view-livechat-appearance_description": "Jogosultság az élő csevegés megjelenésének megtekintéséhez", @@ -5360,11 +5352,10 @@ "onboarding.component.form.action.skip": "Lépés kihagyása", "onboarding.component.form.action.register": "Regisztráció", "onboarding.component.form.action.confirm": "Megerősítés", + "onboarding.component.form.action.pasteHere": "Beillesztés ide...", "onboarding.component.form.termsAndConditions": "Elfogadom a <1>használati feltételeket és az <3>adatvédelmi irányelveket", "onboarding.component.emailCodeFallback": "Nem kapott levelet? <1>Újraküldés vagy <3>e-mail-cím megváltoztatása", - "onboarding.page.form.title": "<1>Indítsuk el a munkaterületét", - "onboarding.page.awaitingConfirmation.title": "Megerősítésre vár", - "onboarding.page.awaitingConfirmation.subtitle": "Egy megerősítő hivatkozást tartalmazó levelet küldtünk Önnek a(z) {{emailAddress}} e-mail-címre. Ellenőrizze, hogy az alábbi biztonsági kód megegyezik-e azzal, amit e-mailben kapott.", + "onboarding.page.form.title": "Indítsuk el a munkaterületét", "onboarding.page.emailConfirmed.title": "E-mail-cím megerősítve!", "onboarding.page.emailConfirmed.subtitle": "Visszatérhet a Rocket.Chat alkalmazásához – már elindítottuk a munkaterületét.", "onboarding.page.checkYourEmail.title": "Nézze meg a leveleit", @@ -5400,6 +5391,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Jelszó", "onboarding.form.adminInfoForm.fields.password.placeholder": "Jelszó létrehozása", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Tájékoztassanak a Rocket.Chat frissítéseiről", + "onboarding.form.awaitConfirmationForm.title": "Megerősítésre vár", "onboarding.form.organizationInfoForm.title": "Szervezetinformációk", "onboarding.form.organizationInfoForm.subtitle": "Legyen türelemmel. Ezek az információk segítenek nekünk személyre szabni a munkaterületét.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Szervezet neve", @@ -5429,5 +5421,8 @@ "Theme_dark": "Sötét", "Join_your_team": "Csatlakozás csapathoz", "Create_an_account": "Fiók létrehozása", - "RegisterWorkspace_Features_Marketplace_Title": "Piactér" + "RegisterWorkspace_Features_Marketplace_Title": "Piactér", + "Enterprise": "Vállalati", + "UpgradeToGetMore_engagement-dashboard_Title": "Analitika", + "UpgradeToGetMore_auditing_Title": "Üzenet ellenőrzés" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json index 4f78b268bcc8..563d67a3fb7f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json @@ -973,7 +973,6 @@ "Enter_name_here": "Masukkan nama di sini", "Enter_Normal": "Mode normal (kirim dengan Enter)", "Enter_to": "Masuk ke", - "Enterprise": "Perusahaan", "Entertainment": "Hiburan", "Error": "Kesalahan", "Error_404": "Kesalahan 404", @@ -2767,5 +2766,7 @@ "registration.component.form.reasonToJoin": "Alasan untuk bergabung", "registration.component.form.invalidConfirmPass": "Kata sandi konfirmasi tidak cocok dengan kata sandi utama", "registration.component.form.confirmPassword": "Konfirmasikan kata sandi anda", - "registration.component.form.sendConfirmationEmail": "Kirim email konfirmasi" + "registration.component.form.sendConfirmationEmail": "Kirim email konfirmasi", + "Enterprise": "Perusahaan", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json index efa53dff16be..c92d081c6779 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json @@ -21,7 +21,7 @@ "24_Hour": "Orologio 24 ore", "A_new_owner_will_be_assigned_automatically_to__count__rooms": "Un nuovo proprietario verrà assegnato automaticamente a{{count}}stanze.", "A_new_owner_will_be_assigned_automatically_to_the__roomName__room": "Un nuovo proprietario verrà assegnato automaticamente alla stanza {{roomName}}.", - "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "Un nuovo proprietario verrà assegnato automaticamente a queste_count__stanze:
__rooms__.", + "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "Un nuovo proprietario verrà assegnato automaticamente a queste_count__stanze:
{{rooms}}.", "Accept_Call": "Accetta la chiamata", "Accept": "Accetta", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accetta richieste livechat in arrivo anche se non c'è alcun operatore online", @@ -1020,7 +1020,6 @@ "Enter_name_here": "Inserisci il nome qui", "Enter_Normal": "Modalità normale (inviato con Invio)", "Enter_to": "Invio per", - "Enterprise": "impresa", "Entertainment": "Divertimento", "Error": "Errore", "Error_404": "Errore 404", @@ -2860,5 +2859,7 @@ "registration.component.form.reasonToJoin": "Motivo per partecipare", "registration.component.form.invalidConfirmPass": "La password di conferma non corrisponde con la password", "registration.component.form.confirmPassword": "Conferma la tua password", - "registration.component.form.sendConfirmationEmail": "Invia email di conferma" + "registration.component.form.sendConfirmationEmail": "Invia email di conferma", + "Enterprise": "impresa", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json index 31973b5da92a..9487983bf9f7 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -424,6 +424,7 @@ "App_author_homepage": "著者のホームページ", "App_Details": "アプリの詳細", "App_Information": "アプリ情報", + "Apps_context_enterprise": "エンタープライズ", "App_Installation": "アプリのインストール", "App_status_auto_enabled": "有効", "App_status_constructed": "構築済み", @@ -447,7 +448,6 @@ "Apply": "適用", "Apply_and_refresh_all_clients": "すべてのクライアントを適用して更新", "Apps": "アプリ", - "Apps_context_enterprise": "エンタープライズ", "Apps_context_installed": "インストール済み", "Apps_Engine_Version": "アプリエンジンのバージョン", "Apps_Essential_Alert": "このアプリは次のイベントに不可欠です:", @@ -830,8 +830,6 @@ "Close": "閉じる", "Close_chat": "チャットを閉じる", "Close_room_description": "このチャットを閉じようとしています。続行してよろしいですか?", - "Close_to_seat_limit_banner_warning": "*[{{seats}}]のシートが残っています* \nこのワークスペースのシート数の上限に近づいています。上限に達すると、新しいメンバーを追加できません。*[追加のシートを要求する]({{url}})*", - "Close_to_seat_limit_warning": "シートの上限に達すると、新しいメンバーを作成できません。", "close-livechat-room": "オムニチャネルRoomを閉じる", "close-livechat-room_description": "現在のオムニチャネルルームを閉じる権限", "Close_menu": "閉じる", @@ -865,8 +863,6 @@ "Cloud_register_offline_finish_helper": "Cloud Consoleで登録プロセスを完了すると、テキストが表示されます。ここに貼り付けて登録を完了してください。", "Cloud_register_offline_helper": "エアギャップまたはネットワークアクセスが制限されている場合、ワークスペースを手動で登録できます。以下のテキストをコピーし、Cloud Consoleに移動してプロセスを完了します。", "Cloud_register_success": "ワークスペースが正常に登録されました!", - "Cloud_registration_pending_html": "プッシュ通知は登録が完了するまで機能しません。詳細はこちら", - "Cloud_registration_pending_title": "クラウド登録はまだ保留中です", "Cloud_registration_required": "登録が必要です", "Cloud_registration_required_description": "設定中にワークスペースを登録しない選択をしたようです。", "Cloud_registration_required_link_text": "ワークスペースを登録するにはここをクリックしてください。", @@ -1480,7 +1476,7 @@ "E2E_Encryption_Password_Explanation": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはダイレクトメッセージを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であり、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスに入力する必要があります。", "E2E_key_reset_email": "E2Eキーリセット通知", "E2E_password_request_text": "暗号化されたプライベートグループとダイレクトメッセージにアクセスするには、暗号化パスワードを入力します。
キーがサーバーに保存されていないため、使用するすべてのクライアントでメッセージをエンコード/デコードするには、このパスワードを入力する必要があります。", - "E2E_password_reveal_text": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはDMを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であるため、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にこのパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスで入力する必要があります。詳細はこちら

パスワードは %sです。

これは自動生成されたパスワードです。既存のパスワードを入力したブラウザーからであれば、いつでも暗号化キーの新しいパスワードを設定できます。
パスワードを保存し、このメッセージを閉じるまで、このパスワードはこのブラウザーにのみ保存されます。", + "E2E_password_reveal_text": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはDMを暗号化するように変更することもできます。

これはエンドツーエンドの暗号化であるため、メッセージのエンコード/デコードのキーがサーバーに保存されなくなります。そのため、安全な別の場所にこのパスワードを保管する必要があります。このパスワードは、E2E暗号化を使用したい他のデバイスで入力する必要があります。詳細はこちら

パスワードは {{randomPassword}}です。

これは自動生成されたパスワードです。既存のパスワードを入力したブラウザーからであれば、いつでも暗号化キーの新しいパスワードを設定できます。
パスワードを保存し、このメッセージを閉じるまで、このパスワードはこのブラウザーにのみ保存されます。", "E2E_Reset_Email_Content": "自動的にログアウトしました。再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのアクセスを復元します。E2E暗号化の性質上、Rocket.Chatは、メンバーがオンラインでない暗号化されたルームへのアクセスを復元できません。", "E2E_Reset_Key_Explanation": "このオプションは、現在のE2Eキーを削除してログアウトします。
再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのアクセスを復元します。
E2E暗号化の性質により、Rocket.Chatは、メンバーがオンラインになっていない暗号化されたルームへのアクセスを復元することはできません。", "E2E_Reset_Other_Key_Warning": "現在のE2Eキーをリセットすると、ユーザーがログアウトします。ユーザーが再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのユーザーアクセスを復元します。E2E暗号化の性質上、Rocket.Chatは、メンバーがオンラインでない暗号化されたルームへのアクセスを復元できません。", @@ -1562,6 +1558,8 @@ "email_style_description": "ネストされたセレクターを回避", "email_style_label": "メールスタイル", "Email_subject": "メールの件名", + "Enterprise_License": "エンタープライズライセンス", + "Enterprise_License_Description": "ワークスペースが登録されており、ライセンスがRocket.Chat Cloudによって提供されている場合は、ここでライセンスを手動で更新する必要はありません。", "Email_verified": "メール確認済み", "Email_sent": "メール送信済み", "Emoji": "絵文字", @@ -1613,9 +1611,6 @@ "Enter_Normal": "通常モード(Enterで送信)", "Enter_to": "Enterキーで", "Enter_your_E2E_password": "E2Eパスワードを入力してください", - "Enterprise": "エンタープライズ", - "Enterprise_License": "エンタープライズライセンス", - "Enterprise_License_Description": "ワークスペースが登録されており、ライセンスがRocket.Chat Cloudによって提供されている場合は、ここでライセンスを手動で更新する必要はありません。", "Entertainment": "エンターテインメント", "Error": "エラー", "Error_404": "エラー404", @@ -1637,7 +1632,7 @@ "error-avatar-invalid-url": "無効なアバターURL:{{url}}", "error-avatar-url-handling": "{{username}}のURL({{url}})からアバター設定を処理中にエラーが発生しました", "error-business-hours-are-closed": "営業時間は閉じられています", - "error-blocked-username": "{{field}}がブロックされており、使用できません!", + "error-blocked-username": "**{{field}}**がブロックされており、使用できません!", "error-canned-response-not-found": "返信定型文が見つかりません", "error-cannot-delete-app-user": "アプリユーザーの削除は許可されていません。対応するアプリをアンインストールして削除してください。", "error-cant-invite-for-direct-room": "ユーザーをダイレクトルームに招待できません", @@ -2551,7 +2546,7 @@ "leave-c_description": "チャネルから退出する権限", "leave-p": "プライベートグループから退出", "leave-p_description": "プライベートグループから退出する権限", - "Lets_get_you_new_one": "新たな挑戦をしてみましょう!", + "Lets_get_you_new_one_": "新たな挑戦をしてみましょう!", "List_of_Channels": "Channel一覧", "List_of_departments_for_forward": "転送が許可されている部署の一覧(オプション)", "List_of_departments_for_forward_description": "この部署からチャットを受信できる部署の制限リストを設定することを許可します", @@ -3386,7 +3381,6 @@ "Random": "ランダム", "Rate_Limiter_Limit_RegisterUser": "ユーザーを登録するためのレート制限へのデフォルト数の呼び出し", "Rate_Limiter_Limit_RegisterUser_Description": "エンドポイント(RESTとリアルタイムAPI)を登録するユーザーのデフォルトの呼び出し数。[APIレート制限]セクションで定義した時間範囲内で許可されます。", - "Reached_seat_limit_banner_warning": "*利用できるシートがありません* \nこのワークスペースはシート数の上限に達したため、メンバーはこれ以上参加できません。*[追加のシートの要求]({{url}})*", "React_when_read_only": "応答を許可", "React_when_read_only_changed_successfully": "読み取り専用が正常に変更された場合の応答を許可", "Reacted_with": "で応答", @@ -3477,11 +3471,6 @@ "Report_this_message_question_mark": "このメッセージを報告しますか?", "Reporting": "報告", "Request": "要求", - "Request_seats": "シートの要求", - "Request_more_seats": "追加のシートを要求します。", - "Request_more_seats_out_of_seats": "このワークスペースはシートが不足しているため、メンバーを追加できません。追加のシートを要求してください。", - "Request_more_seats_sales_team": "要求が送信されました。確認後、営業チームから数日以内にご連絡いたします。", - "Request_more_seats_title": "追加のシートの要求", "Request_comment_when_closing_conversation": "会話を閉じるときにコメントを要求", "Request_comment_when_closing_conversation_description": "有効にした場合、エージェントは会話が閉じられる前にコメントを設定する必要があります。", "Request_tag_before_closing_chat": "会話を閉じる前にタグを要求", @@ -3626,7 +3615,7 @@ "SAML_General": "一般", "SAML_Custom_Authn_Context": "カスタム認証コンテキスト", "SAML_Custom_Authn_Context_Comparison": "認証コンテキストの比較", - "SAML_Custom_Authn_Context_description": "要求からauthnコンテキストを除外するには、これを空のままにします。 \n \n複数の認証コンテキストを追加するには、__AuthnContextTemplate__設定に直接追加します。", + "SAML_Custom_Authn_Context_description": "要求からauthnコンテキストを除外するには、これを空のままにします。 \n \n複数の認証コンテキストを追加するには、{{AuthnContext Template}}設定に直接追加します。", "SAML_Custom_Cert": "カスタム証明書", "SAML_Custom_Debug": "デバッグを有効にする", "SAML_Custom_EMail_Field": "メールのフィールド名", @@ -3732,6 +3721,7 @@ "Security": "セキュリティ", "See_full_profile": "全プロフィールを見る", "See_on_Engagement_Dashboard": "エンゲージメントダッシュボードで見る", + "Select": "選択", "Select_a_department": "部署を選択", "Select_a_room": "ルームを選択", "Select_a_user": "ユーザーを選択", @@ -4527,6 +4517,7 @@ "view-l-room": "オムニチャネルRoomの表示", "view-l-room_description": "オムニチャネルルームを表示する権限", "view-livechat-analytics": "オムニチャネル分析の表示", + "onboarding.page.awaitingConfirmation.subtitle": "確認用のリンクが含まれるメールを{{emailAddress}}に送信しました。以下のセキュリティコードとメールのセキュリティコードが一致していることを確認してください。", "view-livechat-analytics_description": "ライブチャットの分析を表示する権限", "view-livechat-appearance": "オムニチャネルデザインの表示", "view-livechat-appearance_description": "ライブチャットのデザインを表示する権限", @@ -4772,11 +4763,10 @@ "onboarding.component.form.action.skip": "このステップをスキップ", "onboarding.component.form.action.register": "登録", "onboarding.component.form.action.confirm": "確認", + "onboarding.component.form.action.pasteHere": "ここに貼り付け...", "onboarding.component.form.termsAndConditions": "<1>使用と<3>プライバシーポリシーに同意します", "onboarding.component.emailCodeFallback": "メールを受け取っていませんか?返信または <3>メールを変更してください", - "onboarding.page.form.title": "ワークスペースを<1>起動しましょう", - "onboarding.page.awaitingConfirmation.title": "確認を待っています", - "onboarding.page.awaitingConfirmation.subtitle": "確認用のリンクが含まれるメールを{{emailAddress}}に送信しました。以下のセキュリティコードとメールのセキュリティコードが一致していることを確認してください。", + "onboarding.page.form.title": "ワークスペースを起動しましょう", "onboarding.page.emailConfirmed.title": "メールを確認しました!", "onboarding.page.emailConfirmed.subtitle": "Rocket.Chatアプリケーションに戻ることができます。すでにワークスペースを起動しています。", "onboarding.page.checkYourEmail.title": "メールのチェック", @@ -4812,6 +4802,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "パスワード", "onboarding.form.adminInfoForm.fields.password.placeholder": "パスワードを作成", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Rocket.Chatの更新に関する投稿を受け取る", + "onboarding.form.awaitConfirmationForm.title": "確認を待っています", "onboarding.form.organizationInfoForm.title": "組織情報", "onboarding.form.organizationInfoForm.subtitle": "しばらくお待ちください。この情報はワークスペースのパーソナライズに役立ちます", "onboarding.form.organizationInfoForm.fields.organizationName.label": "組織名", @@ -4824,6 +4815,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "選択", "onboarding.form.organizationInfoForm.fields.country.label": "国", "onboarding.form.organizationInfoForm.fields.country.placeholder": "選択", + "onboarding.form.registerOfflineForm.title": "オフラインで登録", "onboarding.form.registeredServerForm.title": "サーバーの登録", "onboarding.form.registeredServerForm.included.push": "モバイルプッシュ通知", "onboarding.form.registeredServerForm.included.externalProviders": "外部プロバイダー(WhatsApp、Facebook、Telegram、Twitter)との統合", @@ -4840,5 +4832,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "マーケットプレイス", "RegisterWorkspace_Features_Omnichannel_Title": "オムニチャネル", "RegisterWorkspace_Setup_Label": "クラウドアカウントメール", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "<1>使用と<3>プライバシーポリシーに同意します" + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "<1>使用と<3>プライバシーポリシーに同意します", + "Enterprise": "エンタープライズ", + "UpgradeToGetMore_engagement-dashboard_Title": "分析", + "UpgradeToGetMore_auditing_Title": "メッセージ監査" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json index 6dd72917fe9d..8e673e5346cc 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json @@ -1205,7 +1205,7 @@ "E2E_Encryption_Password_Change": "დაშიფვრის პაროლის შეცვლა", "E2E_Encryption_Password_Explanation": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები .

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას", "E2E_password_request_text": "თქვენ დაშიფრულ პირად ჯგუფებზე და პირად მესიჯებზე წვდომისთვის შეიყვანეთ პაროლი.
ეს პაროლი უნდა შეიყვანოთ თქვენი შეტყობინებების დაშიფვრა/გაშიფვრისთვის ყოველი კლიენტისთვის, რადგან პაროლი სერვერზე არ ინახება", - "E2E_password_reveal_text": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები.

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას გაიგეთ მეტი აქ!

თქვენი პაროლი არის:%s

ეს არის ავტომატურად გენერირებული პაროლი, პაროლის შეცვლა შეგიძლიათ ნებისმიერ დროს ნებისმიერი ბრაუზერიდან(არსებული პაროლის შეყვანის შემდეგ).
ეს პაროლი ინახება მხოლოდ ამ ბრაუზერში სანამ თქვენ არ შეინახავთ მას. შეინახეთ პაროლი ამ შეტყობინების გათიშვამდე", + "E2E_password_reveal_text": "ახლა შეგიძლიათ შექმნათ დაშიფრული პირადი ჯგუფები და პირდაპირი შეტყობინებები. თქვენ ასევე შეგიძლიათ დაშიფროთ არსებული პირადი ჯგუფები ან DM-ები.

ეს არის წერტილიდან ბოლო წერტილამდე დაშიფვრა ამიტომ თქვენი გასაღები არ იქნება შენახული სერვერზე. ამითომ გასაღები უნდა შეინახოთ თქვენ. თქვენ მოგიწევთ ამ გასაღების გამოყენება სხვა მოწყობილობებზე რომლებზეც მოისურვებთ e2e დაშიფვრის გამოყენებას გაიგეთ მეტი აქ!

თქვენი პაროლი არის:{{randomPassword}}

ეს არის ავტომატურად გენერირებული პაროლი, პაროლის შეცვლა შეგიძლიათ ნებისმიერ დროს ნებისმიერი ბრაუზერიდან(არსებული პაროლის შეყვანის შემდეგ).
ეს პაროლი ინახება მხოლოდ ამ ბრაუზერში სანამ თქვენ არ შეინახავთ მას. შეინახეთ პაროლი ამ შეტყობინების გათიშვამდე", "E2E_Reset_Key_Explanation": "ეს პარამეტრი წაშლის თქვენს მიმდინარე E2E გასაღებს და გამოხვალთ სისტემიდან.
ისევ შესვლისას, Rocket.Chat დააგენერირებს თქვენ ახალ გასაღებს და აღადგენს თქვენს დაშვებას ნებისმიერ დაშიფრული ოთახში, რომელშიც არის ერთი ან მეტი წევრი ონლაინ.
E2E დაშიფვრის ხასიათის გამო, Rocket.Chat არ შეუძლია აღადგინოს დაშიფრული ოთახი, რომელშიც არ არის არც-ერთი წევრი ონლაინ.", "Edit": "რედაქტირება", "Edit_Business_Hour": "სამუშაო საათების რედაქტირება", @@ -1268,6 +1268,8 @@ "email_style_description": "ქვე სელექტორების უგულებელყოფა", "email_style_label": "ელ.ფოსტის სტილი", "Email_subject": "საგანი", + "Enterprise_License": "საწარმოოს ლიცენზია", + "Enterprise_License_Description": "თუ თქვენი სამუშაო ადგილი რეგისტრირებულია და ლიცენზირებულია Rocket.Chat Cloud–-ის მიერ , აქ ლიცენზიის ხელით განახლება არ დაგჭირდებათ.", "Email_verified": "ელ.ფოსტა დამოწმდა", "Emoji": "ემოჯი", "EmojiCustomFilesystem": "პერსონალური ემოჯი ფაილ-სისტემა", @@ -1304,8 +1306,6 @@ "Enter_Normal": "ნორმალური რეჟიმი", "Enter_to": "შესვლა", "Enter_your_E2E_password": "შეიყვანეთ თქვენი E2E პაროლი", - "Enterprise_License": "საწარმოოს ლიცენზია", - "Enterprise_License_Description": "თუ თქვენი სამუშაო ადგილი რეგისტრირებულია და ლიცენზირებულია Rocket.Chat Cloud–-ის მიერ , აქ ლიცენზიის ხელით განახლება არ დაგჭირდებათ.", "Entertainment": "გართობა", "Error": "შეცდომა", "Error_404": "შეცდომა: 404", @@ -2059,7 +2059,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "დატოვეთ აღწერილობის ველი ცარიელი, თუ არ გსურთ როლის ჩვენება", "leave-c": "დატოვეთ არხები", "leave-p": "დატოვე პირადი ჯგუფები", - "Lets_get_you_new_one": "მიიღეთ ახალი!", + "Lets_get_you_new_one_": "მიიღეთ ახალი!", "List_of_Channels": "არხების სია", "List_of_departments_for_forward": "გასაგზავნად ნებადართული განყოფილებების სია (არჩევითი)", "List_of_departments_for_forward_description": "ნება დართეთ შეიქმნას შეზღუდული სია (განყოფილებების) , რომელთაც შეუძლიათ მიიღონ ჩათები ამ განყოფილებიდან", @@ -2803,8 +2803,8 @@ "Room_archivation_state_false": "აქტიური", "Room_archivation_state_true": "დაარქივებულია", "Room_archived": "ოთახი დაარქივებულია", - "room_changed_announcement": "ოთახის განცხადება შეიცვალა __room_announcement__,__username__-ის მიერ", - "room_changed_description": "ოთახის აღწერა შეიცვალა: __room_description__ __ მომხმარებელი__-ის მიერ ", + "room_changed_announcement": "ოთახის განცხადება შეიცვალა {{room_announcement}},{{username}}-ის მიერ", + "room_changed_description": "ოთახის აღწერა შეიცვალა: {{room_description}} __ მომხმარებელი__-ის მიერ ", "room_changed_topic": "ოთახის თემა შეიცვალა: {{room_topic}} {{user_by}}", "Room_default_change_to_private_will_be_default_no_more": "ეს არის დეფაულტ არხი და პირად ჯგუფად გადაკეთების შემთხვევაში აღარ იქნება დეფაულტ არხი.გსურთ გაგრძელება?", "Room_description_changed_successfully": "ოთახის აღწერა წარმატებით შეიცვალა", @@ -3247,7 +3247,7 @@ "This_room_has_been_archived_by__username_": "ეს ოთახი დაარქივდა {{username}}-ის მიერ", "This_room_has_been_unarchived_by__username_": "ეს ოთახი ამოარქივდა {{username}}-ის მიერ", "This_week": "ეს კვირა", - "Thread_message": "კომენტარი გააკეთა * __ მომხმარებლის __ ის გზავნილზე: _ __msg__ _", + "Thread_message": "კომენტარი გააკეთა * __ მომხმარებლის __ ის გზავნილზე: _ {{msg}} _", "Thursday": "ხუთშაბათი", "Time_in_seconds": "დრო წამებში", "Timeouts": "თაიმაუტები", @@ -3432,7 +3432,7 @@ "User_removed_by": "მომხმარებელი {{user_removed}} {{user_by}}.", "User_sent_a_message_on_channel": "{{username}} შეტყობინების გაგზავნა {{channel}}", "User_sent_a_message_to_you": "{{username}} გამოგიგზავნათ შეტყობინება", - "user_sent_an_attachment": "__username__– მა გაგზავნა დანართი", + "user_sent_an_attachment": "{{username}}– მა გაგზავნა დანართი", "User_Settings": "მომხმარებლის პარამეტრები", "User_started_a_new_conversation": "{{username}}– მა დაიწყო ახალი საუბარი", "User_unmuted_by": "მომხმარებელი {{user_unmuted}} {{user_by}}.", @@ -3666,5 +3666,9 @@ "registration.component.form.reasonToJoin": "გაწევრიანების მიზეზი", "registration.component.form.invalidConfirmPass": "პაროლის დასტური არ შეესაბამება პაროლს", "registration.component.form.confirmPassword": "დაადასტურეთ თქვენი პაროლი", - "registration.component.form.sendConfirmationEmail": "დადასტურების ელ.ფოსტის გაგზავნა" + "registration.component.form.sendConfirmationEmail": "დადასტურების ელ.ფოსტის გაგზავნა", + "onboarding.component.form.action.pasteHere": "ჩასვით აქ ...", + "onboarding.form.registerOfflineForm.title": "ხელით დარეგისტრირება", + "UpgradeToGetMore_engagement-dashboard_Title": "ანალიტიკა", + "UpgradeToGetMore_auditing_Title": "შეტყობინებების შემოწმება" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json index 376c4f51610a..b58c8c5c5dc1 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json @@ -1163,6 +1163,8 @@ "Email_Placeholder_any": "សូមបញ្ចូលអាសយដ្ឋានអ៊ីមែល ...", "email_style_label": "រចនាប័ទ្មអ៊ីម៉ែល", "Email_subject": "ប្រធានបទ", + "Enterprise_License": "អាជ្ញាប័ណ្ណសហគ្រាស", + "Enterprise_License_Description": "ប្រសិនបើកន្លែងធ្វើការរបស់អ្នកត្រូវបានចុះឈ្មោះហើយអាជ្ញាប័ណ្ណត្រូវបានផ្តល់ដោយ Rocket.Chat Cloud អ្នកមិនចាំបាច់ធ្វើបច្ចុប្បន្នភាពអាជ្ញាប័ណ្ណដោយដៃនៅទីនេះទេ។", "Email_verified": "អ៊ីម៉ែល​បញ្ជាក់", "Emoji": "សញ្ញា​អារម្មណ៍", "EmojiCustomFilesystem": "ប្រព័ន្ធឯកសារសញ្ញាអារម្មណ៍ផ្ទាល់ខ្លួន", @@ -1192,9 +1194,6 @@ "Enter_Normal": "របៀបធម្មតា (ផ្ញើជាមួយបញ្ចូល)", "Enter_to": "បញ្ចូល", "Enter_your_E2E_password": "បញ្ចូលពាក្យសម្ងាត់ E2E របស់អ្នក", - "Enterprise": "សហគ្រាស", - "Enterprise_License": "អាជ្ញាប័ណ្ណសហគ្រាស", - "Enterprise_License_Description": "ប្រសិនបើកន្លែងធ្វើការរបស់អ្នកត្រូវបានចុះឈ្មោះហើយអាជ្ញាប័ណ្ណត្រូវបានផ្តល់ដោយ Rocket.Chat Cloud អ្នកមិនចាំបាច់ធ្វើបច្ចុប្បន្នភាពអាជ្ញាប័ណ្ណដោយដៃនៅទីនេះទេ។", "Entertainment": "ការកំសាន្ត", "Error": "កំហុសក្នុងការ", "Error_404": "កំហុស: 404", @@ -1816,7 +1815,7 @@ "Leave_the_current_channel": "ចាកចេញពីឆានែលបច្ចុប្បន្ន", "leave-c": "ចាកចេញពីឆានែល", "leave-p": "ចាកចេញពីក្រុមឯកជន", - "Lets_get_you_new_one": "ចូរយើងទទួលបានអ្នកថ្មី!", + "Lets_get_you_new_one_": "ចូរយើងទទួលបានអ្នកថ្មី!", "List_of_Channels": "បញ្ជីឆានែល", "List_of_Direct_Messages": "បញ្ជីនៃការផ្ញើសារដោយផ្ទាល់", "Livechat": "Livechat", @@ -3112,5 +3111,9 @@ "registration.component.form.reasonToJoin": "ហេតុផលដើម្បីចូលរួម", "registration.component.form.invalidConfirmPass": "ពាក្យ​សម្ងាត់​បញ្ជាក់​មិន​ដូច​ពាក្យ​សម្ងាត់​បាន​បញ្ចូល​", "registration.component.form.confirmPassword": "បញ្ជាក់​ពាក្យ​សម្ងាត់", - "registration.component.form.sendConfirmationEmail": "ផ្ញើរអ៊ីម៉ែល​បញ្ជាក់" + "registration.component.form.sendConfirmationEmail": "ផ្ញើរអ៊ីម៉ែល​បញ្ជាក់", + "onboarding.form.registerOfflineForm.title": "ចុះឈ្មោះដោយដៃ", + "Enterprise": "សហគ្រាស", + "UpgradeToGetMore_engagement-dashboard_Title": "វិភាគ", + "UpgradeToGetMore_auditing_Title": "សវនកម្មសារ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json index 2574c0b288b8..0341f6388348 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -755,8 +755,6 @@ "Cloud_register_offline_finish_helper": "Cloud Console에서 등록 프로세스를 완료하면 몇 가지 텍스트가 표시됩니다. 등록을 마치려면 여기에 붙여 넣으십시오.", "Cloud_register_offline_helper": "에어 갭 또는 네트워크 액세스가 제한되는 경우 Workspace를 수동으로 등록 할 수 있습니다. 아래 텍스트를 복사하고 Cloud Console로 이동하여 프로세스를 완료하십시오.", "Cloud_register_success": "Workspace가 성공적으로 등록되었습니다!", - "Cloud_registration_pending_html": " 등록이 완료 될 때까지 모바일 알림이 작동하지 않습니다. 자세히 알아보기 ", - "Cloud_registration_pending_title": "현재 클라우드 등록 처리가 지연 중입니다.", "Cloud_registration_required": "등록이 필요합니다.", "Cloud_registration_required_description": "설치 중에는 Workspace가 등록되지 않은 것처럼 보입니다.", "Cloud_registration_required_link_text": " Workspace를 등록하려면 여기를 클릭하십시오.", @@ -1324,7 +1322,7 @@ "E2E_Encryption_Password_Explanation": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다.", "E2E_key_reset_email": "E2E 키 재설정 알림", "E2E_password_request_text": "암호화된 비공개그룹 및 1:1 대화방에 액세스하려면 암호화 비밀번호를 입력하십시오.
키가 서버에 저장되어 있지 않으므로 사용하는 모든 클라이언트에서 메시지를 암호화/복호화하려면 이 비밀번호를 입력해야합니다.", - "E2E_password_reveal_text": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다. 더 배워보세요!

비밀번호는 %s입니다.

자동으로 만들어진 비밀번호입니다. 기존 비밀번호를 입력한 모든 브라우저에서 언제든 새 비밀번호를 설정할 수 있습니다.
이 비밀번호는 이 메시지를 닫을 때까지 오직 현재 브라우저에만 저장됩니다.", + "E2E_password_reveal_text": "이제 암호화된 비공개 그룹 및 1:1 대화방을 만들 수 있습니다. 기존 비공개 그룹이나 1:1 대화방을 암호화하도록 변경할 수도 있습니다.

메시지 암호화/복호화 키가 서버에 저장되지 않는 종단간 암호화입니다. 그러므로 안전한 곳에 비밀번호를 저장해야 합니다. E2E 암호화를 사용하려는 다른 장치에 이 비밀번호를 입력해야 합니다. 더 배워보세요!

비밀번호는 {{randomPassword}}입니다.

자동으로 만들어진 비밀번호입니다. 기존 비밀번호를 입력한 모든 브라우저에서 언제든 새 비밀번호를 설정할 수 있습니다.
이 비밀번호는 이 메시지를 닫을 때까지 오직 현재 브라우저에만 저장됩니다.", "E2E_Reset_Email_Content": "자동으로 로그 아웃되었습니다. 다시 로그인하면 Rocket.Chat은 새 키를 생성하고 온라인 회원이 한 명 이상인 암호화 된 방에 대한 액세스를 복원합니다. E2E 암호화의 특성으로 인해 Rocket.Chat은 온라인에 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 없습니다.", "E2E_Reset_Key_Explanation": "이 옵션은 현재 E2E 키를 제거하고 로그 아웃합니다.
다시 로그인하면 Rocket.Chat에서 새 키를 생성하고 온라인으로 하나 이상의 구성원이있는 암호화 된 방에 대한 액세스 권한을 복원합니다.
E2E 암호화의 특성상 Rocket.Chat은 온라인으로 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 있습니다.", "E2E_Reset_Other_Key_Warning": "현재 E2E 키를 재설정하면 사용자가 로그 아웃됩니다. 사용자가 다시 로그인하면 Rocket.Chat은 새 키를 생성하고 한 명 이상의 온라인 회원이있는 암호화 된 방에 대한 사용자 액세스를 복원합니다. E2E 암호화의 특성으로 인해 Rocket.Chat은 온라인에 회원이없는 암호화 된 방에 대한 액세스를 복원 할 수 없습니다.", @@ -1393,6 +1391,8 @@ "email_style_description": "중첩된 선택 사용 안 함", "email_style_label": "이메일 스타일", "Email_subject": "제목", + "Enterprise_License": "기업 라이센스", + "Enterprise_License_Description": "WorkSpace가 등록되어 있고, Rocket.Chat Cloud에서 제공한 라이선스일 경우, 여기에 라이센스를 수동으로 업데이트 할 필요가 없습니다.", "Email_verified": "이메일 확인", "Emoji": "Emoji", "EmojiCustomFilesystem": "사용자 정의 이모티콘 파일 시스템", @@ -1429,9 +1429,6 @@ "Enter_Normal": "일반 모드 (Enter 키와 함께 전송)", "Enter_to": "입력:", "Enter_your_E2E_password": "E2E 비밀번호를 입력하세요.", - "Enterprise": "기업", - "Enterprise_License": "기업 라이센스", - "Enterprise_License_Description": "WorkSpace가 등록되어 있고, Rocket.Chat Cloud에서 제공한 라이선스일 경우, 여기에 라이센스를 수동으로 업데이트 할 필요가 없습니다.", "Entertainment": "엔터테인먼트", "Error": "오류", "Error_404": "오류: 404", @@ -2230,7 +2227,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "역할을 표시하지 않으려면 설명 필드를 비워두세요.", "leave-c": "Channel 나가기", "leave-p": "비공개 그룹에서 나가기", - "Lets_get_you_new_one": "새로 생성", + "Lets_get_you_new_one_": "새로 생성", "List_of_Channels": "Channel 목록", "List_of_departments_for_forward": "전달이 허용 된 부서 목록 (선택 사항)", "List_of_departments_for_forward_description": "이 부서에서 채팅을 받을 수 있는 제한된 부서 목록을 설정하도록 허용", @@ -4026,5 +4023,10 @@ "registration.component.form.reasonToJoin": "가입 이유", "registration.component.form.invalidConfirmPass": "비밀번호가 일치하지 않습니다.", "registration.component.form.confirmPassword": "비밀번호를 확인하세요", - "registration.component.form.sendConfirmationEmail": "확인 메일 보내기" + "registration.component.form.sendConfirmationEmail": "확인 메일 보내기", + "onboarding.component.form.action.pasteHere": "여기에 붙여 넣기 ...", + "onboarding.form.registerOfflineForm.title": "오프라인 등록", + "Enterprise": "기업", + "UpgradeToGetMore_engagement-dashboard_Title": "분석(에널리틱스)", + "UpgradeToGetMore_auditing_Title": "메시지 감사" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json index 8441a8a2fda8..856732eca0be 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json @@ -972,7 +972,6 @@ "Enter_name_here": "name li vir binivîse", "Enter_Normal": "Modeya Normal (Ji Bi Enter bişîne)", "Enter_to": "binivîse", - "Enterprise": "Enterprise", "Entertainment": "Axaftin", "Error": "Şaşî", "Error_404": "Çewt: 404", @@ -2747,5 +2746,7 @@ "registration.component.form.reasonToJoin": "Reason to join", "registration.component.form.invalidConfirmPass": "دووبارەکراوەی تێپەڕەوشە یەکناگرێتەوە لەگەڵ تێپەڕەوشە", "registration.component.form.confirmPassword": "تێپەڕەوشەکەت پشتڕاستکەوە", - "registration.component.form.sendConfirmationEmail": "ئیمەیڵی پشتڕاستکردنەوە بنێرە" + "registration.component.form.sendConfirmationEmail": "ئیمەیڵی پشتڕاستکردنەوە بنێرە", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json index 81c5ababade7..34f308d2ab50 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json @@ -974,6 +974,8 @@ "Email_Placeholder": "ກະລຸນາໃສ່ທີ່ຢູ່ອີເມວຂອງທ່ານ ...", "Email_Placeholder_any": "ກະລຸນາໃສ່ທີ່ຢູ່ອີເມວ ...", "Email_subject": "Subject", + "Enterprise_License": "ສິດໃຊ້ງານລະດັບອົງກອນ", + "Enterprise_License_Description": "ຫາກພື້ນທີ່ເຮັດວຽກຂອງທ່ານລົງທະບຽນ ແລະ ໄດ້ຮັບອະນຸຍາດຈາກ Rocket.Chat Cloud ທ່ານບໍ່ຈໍາເປັນຕ້ອງອັບເດດສິຂະສິດການນໍາໃຊ້ເອງຢູ່ບ່ອນນີ້.", "Email_verified": "Email ກວດສອບ", "Emoji": "Emoji", "EmojiCustomFilesystem": "Custom Emoji Filesystem", @@ -998,9 +1000,6 @@ "Enter_name_here": "ກະລຸນາໃສ່ຊື່ນີ້", "Enter_Normal": "ໂຫມດປະກະຕິ (ສົ່ງກັບ Enter)", "Enter_to": "ກະລຸນາໃສ່ທີ່", - "Enterprise": "Enterprise", - "Enterprise_License": "ສິດໃຊ້ງານລະດັບອົງກອນ", - "Enterprise_License_Description": "ຫາກພື້ນທີ່ເຮັດວຽກຂອງທ່ານລົງທະບຽນ ແລະ ໄດ້ຮັບອະນຸຍາດຈາກ Rocket.Chat Cloud ທ່ານບໍ່ຈໍາເປັນຕ້ອງອັບເດດສິຂະສິດການນໍາໃຊ້ເອງຢູ່ບ່ອນນີ້.", "Entertainment": "ຄວາມບັນເທີງ", "Error": "Error", "Error_404": "ຂໍ້ຜິດພາດ: 404", @@ -2795,5 +2794,7 @@ "registration.component.form.reasonToJoin": "ເຫດຜົນທີ່ຈະເຂົ້າຮ່ວມ", "registration.component.form.invalidConfirmPass": "ການຢືນຢັນລະຫັດຜ່ານບໍ່ກົງກັບລະຫັດຜ່ານ", "registration.component.form.confirmPassword": "ຢືນຢັນລະຫັດຜ່ານຂອງທ່ານ", - "registration.component.form.sendConfirmationEmail": "ສົ່ງອີເມວການຢືນຢັນ" + "registration.component.form.sendConfirmationEmail": "ສົ່ງອີເມວການຢືນຢັນ", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "ການວິເຄາະ" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json index 8d3e1c746860..89226d5019d8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json @@ -1028,7 +1028,6 @@ "Enter_name_here": "Įveskite pavadinimą čia", "Enter_Normal": "Normalus režimas (siųsti su \"Enter\")", "Enter_to": "Įeiti į", - "Enterprise": "Įmonė", "Entertainment": "Pramogos", "Error": "Klaida", "Error_404": "Klaida: 404", @@ -2812,5 +2811,7 @@ "registration.component.form.reasonToJoin": "Priežastys prisijungti", "registration.component.form.invalidConfirmPass": "Slaptažodžio patvirtinimas nesutampa su slaptažodžiu", "registration.component.form.confirmPassword": "Patvirtinkite savo slaptažodį", - "registration.component.form.sendConfirmationEmail": "Siųsti patvirtinimo el. Laišką" + "registration.component.form.sendConfirmationEmail": "Siųsti patvirtinimo el. Laišką", + "Enterprise": "Įmonė", + "UpgradeToGetMore_engagement-dashboard_Title": "\"Analytics\"" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json index e658e85d3b05..ab594b7d2f69 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json @@ -962,6 +962,8 @@ "Email_Placeholder": "Lūdzu ievadiet savu e-pasta adresi...", "Email_Placeholder_any": "Lūdzu, ievadiet e-pasta adreses ...", "Email_subject": "Temats", + "Enterprise_License": "Uzņēmuma licence", + "Enterprise_License_Description": "Ja jūsu darbvieta ir reģistrēta un licenci nodrošina Rocket.Chat Mākulis, jums šeit licence nav manuāli jāaktualalizē.", "Email_verified": "E-pasts ir apstiprināts", "Emoji": "Emoji", "EmojiCustomFilesystem": "Pielāgota Emoji failu sistēma", @@ -986,9 +988,6 @@ "Enter_name_here": "Ievadiet nosaukumu šeit", "Enter_Normal": "Normāls režīms (nosūtīt ar 'Enter')", "Enter_to": "Enter uz", - "Enterprise": "Uzņēmums", - "Enterprise_License": "Uzņēmuma licence", - "Enterprise_License_Description": "Ja jūsu darbvieta ir reģistrēta un licenci nodrošina Rocket.Chat Mākulis, jums šeit licence nav manuāli jāaktualalizē.", "Entertainment": "Izklaide", "Error": "Kļūda", "Error_404": "Kļūda: 404", @@ -2753,5 +2752,7 @@ "registration.component.form.reasonToJoin": "Iemesls pievienoties", "registration.component.form.invalidConfirmPass": "Paroles apstiprinājums neatbilst parolei", "registration.component.form.confirmPassword": "Apstipriniet savu paroli", - "registration.component.form.sendConfirmationEmail": "Nosūtīt apstiprinājuma e-pastu" + "registration.component.form.sendConfirmationEmail": "Nosūtīt apstiprinājuma e-pastu", + "Enterprise": "Uzņēmums", + "UpgradeToGetMore_engagement-dashboard_Title": "Analītika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json index c7959fc2a85c..19da31a1b2e5 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json @@ -972,7 +972,6 @@ "Enter_name_here": "Нэрийг оруулна уу", "Enter_Normal": "Хэвийн горим (Enter ашиглан илгээ)", "Enter_to": "Руу оруулна уу", - "Enterprise": "Аж ахуйн нэгж", "Entertainment": "Үзвэр үйлчилгээ", "Error": "Алдаа", "Error_404": "Алдаа: 404", @@ -2556,15 +2555,15 @@ "User_Presence": "Хэрэглэгчийн байдал", "User_removed": "Хэрэглэгч устгагдсан", "User_removed_by": "Хэрэглэгч {{user_removed}}хасагдсан {{user_by}}.", - "User_sent_a_message_on_channel": "__усername__мессеж илгээгдсэн __channel__", + "User_sent_a_message_on_channel": "{{username}} мессеж илгээгдсэн {{channel}}", "User_sent_a_message_to_you": "__зориулагчтанд зурвас илгээж байна", "user_sent_an_attachment": "{{user}} хавсралтыг илгээсэн", "User_Settings": "Хэрэглэгчийн тохиргоо", "User_unmuted_by": "Хэрэглэгч {{user_unmuted}}нээгдсэн {{user_by}}.", "User_unmuted_in_room": "Хэрэглэгчид унтаагүй байна", "User_updated_successfully": "Хэрэглэгч шинэчлэгдсэн", - "User_uploaded_a_file_on_channel": "__усername____channel__ дээр файл байршуулсан", - "User_uploaded_a_file_to_you": "__усername__танд файл илгээв", + "User_uploaded_a_file_on_channel": "{{username}} {{channel}} дээр файл байршуулсан", + "User_uploaded_a_file_to_you": "{{username}} танд файл илгээв", "User_uploaded_file": "Файлыг байршуулсан", "User_uploaded_image": "Зургийг байршуулсан", "user-generate-access-token": "Хэрэглэгч нэвтрэх тэмдгийг үүсгэнэ", @@ -2746,5 +2745,7 @@ "registration.component.form.reasonToJoin": "Яагаад болохгүй гэж?", "registration.component.form.invalidConfirmPass": "Нууц үг баталгаажуулалт нь нууц үгтэй таарахгүй байна", "registration.component.form.confirmPassword": "Нууц үгээ батлах", - "registration.component.form.sendConfirmationEmail": "Баталгаажуулах имэйл илгээх" + "registration.component.form.sendConfirmationEmail": "Баталгаажуулах имэйл илгээх", + "Enterprise": "Аж ахуйн нэгж", + "UpgradeToGetMore_engagement-dashboard_Title": "Аналитик" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json index dea066ead6fd..8d2cb17ea0d2 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json @@ -1,6 +1,6 @@ { "500": "Ralat Pelayan Dalaman", - "__username__was_set__role__by__user_by_": "__nama pengguna__ ditubuhkan __role__ oleh __user_by__", + "__username__was_set__role__by__user_by_": "__nama pengguna__ ditubuhkan {{role}} oleh {{user_by}}", "@username": "@pengguna", "@username_message": "@username ", "#channel": "#channel", @@ -973,7 +973,6 @@ "Enter_name_here": "Masukkan nama di sini", "Enter_Normal": "Mod biasa (hantar dengan Enter)", "Enter_to": "Masuk ke", - "Enterprise": "Enterprise", "Entertainment": "Hiburan", "Error": "ralat", "Error_404": "Ralat: 404", @@ -2763,5 +2762,7 @@ "registration.component.form.reasonToJoin": "Sebab untuk Bergabung", "registration.component.form.invalidConfirmPass": "Pengesahan kata laluan tidak sepadan dengan kata laluan", "registration.component.form.confirmPassword": "Sahkan kata laluan anda", - "registration.component.form.sendConfirmationEmail": "Hantar e-mel pengesahan" + "registration.component.form.sendConfirmationEmail": "Hantar e-mel pengesahan", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "Analisis" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json index eff6811050c1..23e356f28eee 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -426,6 +426,7 @@ "App_author_homepage": "auteur homepage", "App_Details": "Applicatie details", "App_Information": "App-informatie", + "Apps_context_enterprise": "Onderneming", "App_Installation": "App-installatie", "App_status_auto_enabled": "Ingeschakeld", "App_status_constructed": "Gebouwd", @@ -450,7 +451,6 @@ "Apply": "Toepassen", "Apply_and_refresh_all_clients": "Toepassen en alle klanten opnieuw laden", "Apps": "Apps", - "Apps_context_enterprise": "Onderneming", "Apps_context_installed": "Geïnstalleerd", "Apps_Engine_Version": "Apps Engine-versie", "Apps_Essential_Alert": "Deze app is essentieel voor de volgende evenementen:", @@ -838,8 +838,6 @@ "Close": "Sluiten", "Close_chat": "Chat sluiten", "Close_room_description": "Je staat op het punt deze chat te sluiten. Weet je zeker dat je wilt doorgaan?", - "Close_to_seat_limit_banner_warning": "*Je hebt nog [{{seats}}] plaatsen over* \nDeze werkruimte nadert zijn limiet qua plaatsen. Zodra de limiet bereikt is, kunnen er geen nieuwe leden worden toegevoegd. *[Meer plaatsen aanvragen]({{url}})*", - "Close_to_seat_limit_warning": "Er kunnen geen nieuwe leden worden aangemaakt zodra de plaatslimiet bereikt is.", "close-livechat-room": "Omnichannel-ruimte sluiten", "close-livechat-room_description": "Toestemming om de huidige omnichannel-ruimte te sluiten", "Close_menu": "Menu sluiten", @@ -873,8 +871,6 @@ "Cloud_register_offline_finish_helper": "Nadat u het registratieproces in de Cloud Console hebt voltooit, krijgt u wat tekst te zien. Plak het hier om de registratie te voltooien.", "Cloud_register_offline_helper": "Werkruimten kunnen handmatig worden geregistreerd als het airgapped is of wanneer de netwerktoegang beperkt is. Kopieer de onderstaande tekst en ga naar onze Cloud Console om het proces te voltooien.", "Cloud_register_success": "Uw werkruimte is succesvol geregistreerd!", - "Cloud_registration_pending_html": "Pushmeldingen werken pas als de registratie voltooid is. Meer informatie", - "Cloud_registration_pending_title": "Cloudregistratie is nog in behandeling", "Cloud_registration_required": "Registratie vereist", "Cloud_registration_required_description": "Het lijkt erop dat u tijdens de installatie er niet hebt voor gekozen om uw werkruimte te registreren.", "Cloud_registration_required_link_text": "Klik hier om je werkruimte te registreren.", @@ -1493,7 +1489,7 @@ "E2E_Encryption_Password_Explanation": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt ook bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken.", "E2E_key_reset_email": "E2E Key Reset-melding", "E2E_password_request_text": "Om toegang te krijgen tot uw gecodeerde privégroepen en privéberichten, voert u uw coderingswachtwoord in.
U moet dit wachtwoord invoeren om uw berichten te coderen / decoderen op elke client die u gebruikt, aangezien de sleutel niet op de server is opgeslagen.", - "E2E_password_reveal_text": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken. Meer informatie hier !

Je wachtwoord is: %s

Dit is een automatisch gegenereerd wachtwoord, je kan een nieuw wachtwoord voor jouw coderingssleutel op elk gewenst moment vanuit elke browser waarin je het bestaande wachtwoord hebt ingevoerd, aanvragen.
Dit wachtwoord wordt alleen in deze browser opgeslagen totdat je het wachtwoord opslaat en dit bericht negeert.", + "E2E_password_reveal_text": "Je kunt nu gecodeerde privégroepen en directe berichten maken. Je kunt bestaande privégroepen of DM's ook coderen.

Dit is end-to-end codering, zodat de sleutel voor het coderen/decoderen van jouw berichten niet op de server wordt opgeslagen. Om die reden moet je jouw wachtwoord op een veilige plaats bewaren. Je moet het invoeren op andere apparaten waarop je e2e-codering wilt gebruiken. Meer informatie hier !

Je wachtwoord is: {{randomPassword}}

Dit is een automatisch gegenereerd wachtwoord, je kan een nieuw wachtwoord voor jouw coderingssleutel op elk gewenst moment vanuit elke browser waarin je het bestaande wachtwoord hebt ingevoerd, aanvragen.
Dit wachtwoord wordt alleen in deze browser opgeslagen totdat je het wachtwoord opslaat en dit bericht negeert.", "E2E_Reset_Email_Content": "Je bent automatisch uitgelogd. Wanneer je opnieuw inlogt, zal Rocket.Chat een nieuwe sleutel genereren en je toegang herstellen tot elke versleutelde kamer met een of meer online leden. Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen lid online is, niet herstellen.", "E2E_Reset_Key_Explanation": "Met deze optie wordt uw huidige E2E-sleutel verwijderd en wordt u uitgelogd.
Wanneer je opnieuw inlogt, zal Rocket.Chat je een nieuwe sleutel genereren en je toegang herstellen tot elke versleutelde kamer met een of meer online leden.
Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen lid online is, niet herstellen.", "E2E_Reset_Other_Key_Warning": "Als u de huidige E2E-sleutel reset, wordt de gebruiker uitgelogd. Wanneer de gebruiker opnieuw inlogt, genereert Rocket.Chat een nieuwe sleutel en herstelt de gebruiker de toegang tot elke gecodeerde kamer met een of meer online leden. Vanwege de aard van de E2E-codering kan Rocket.Chat de toegang tot een gecodeerde kamer waar geen online lid is, niet herstellen.", @@ -1575,6 +1571,8 @@ "email_style_description": "Vermijd geneste selectors", "email_style_label": "E-mailstijl", "Email_subject": "E-mail onderwerp", + "Enterprise_License": "Enterprise-licentie", + "Enterprise_License_Description": "Als uw werkruimte geregistreerd is en de licentie verstrekt wordt door Rocket.Chat Cloud, hoeft u de licentie hier niet handmatig bij te werken.", "Email_verified": "E-mailadres geverifieerd", "Email_sent": "E-mail verzonden", "Emoji": "Emoji", @@ -1626,9 +1624,6 @@ "Enter_Normal": "Normale modus (verzenden met Enter)", "Enter_to": "Enter om", "Enter_your_E2E_password": "Voer uw E2E-wachtwoord in", - "Enterprise": "Onderneming", - "Enterprise_License": "Enterprise-licentie", - "Enterprise_License_Description": "Als uw werkruimte geregistreerd is en de licentie verstrekt wordt door Rocket.Chat Cloud, hoeft u de licentie hier niet handmatig bij te werken.", "Entertainment": "Vermaak", "Error": "Fout", "Error_404": "Foutmelding 404", @@ -1650,7 +1645,7 @@ "error-avatar-invalid-url": "Ongeldige avatar-URL: {{url}}", "error-avatar-url-handling": "Fout bij het afhandelen van avatar-instellingen vanaf een URL ({{url}}) voor {{username}}", "error-business-hours-are-closed": "De openingstijden zijn gesloten", - "error-blocked-username": "{{field}} is geblokkeerd en kan niet worden gebruikt!", + "error-blocked-username": "**{{field}}** is geblokkeerd en kan niet worden gebruikt!", "error-canned-response-not-found": "Standaardantwoord niet gevonden", "error-cannot-delete-app-user": "Het verwijderen van de app-gebruiker is niet toegestaan, verwijder de bijhorende app om deze te verwijderen.", "error-cant-invite-for-direct-room": "Kan gebruiker niet uitnodigen in directe kamers", @@ -2568,7 +2563,7 @@ "leave-c_description": "Toestemming om kanalen te verlaten", "leave-p": "Verlaat privégroepen", "leave-p_description": "Toestemming om privégroepen te verlaten", - "Lets_get_you_new_one": "Laten we een nieuwe voor je regelen!", + "Lets_get_you_new_one_": "Laten we een nieuwe voor je regelen!", "List_of_Channels": "Lijst met kanalen", "List_of_departments_for_forward": "Lijst met afdelingen die mogen worden doorgestuurd (optioneel)", "List_of_departments_for_forward_description": "Sta toe om een beperkte lijst van afdelingen in te stellen die chats van deze afdeling kunnen ontvangen", @@ -3408,7 +3403,6 @@ "Random": "Willekeurig", "Rate_Limiter_Limit_RegisterUser": "Standaard aantal oproepen naar de snelheidsbegrenzer (rate limiter) voor het registreren van een gebruiker", "Rate_Limiter_Limit_RegisterUser_Description": "Aantaal standaardoproepen voor gebruikersregistratie-eindpunten (REST en realtime API's), toegestaan binnen het tijdbereik dat is gedefinieerd in de sectie API Rate Limiter.", - "Reached_seat_limit_banner_warning": "*Geen plaatsen meer beschikbaar* \nDeze werkruimte heeft de plaatslimiet bereikt, er kunnen dus geen leden meer toegevoegd worden. *[Meer plaatsen aanvragen]({{url}})*", "React_when_read_only": "Reageren toestaan", "React_when_read_only_changed_successfully": "Laat reageren wanneer alleen lezen succesvol is gewijzigd", "Reacted_with": "Reageerde met", @@ -3500,11 +3494,6 @@ "Report_this_message_question_mark": "Dit bericht melden?", "Reporting": "Rapporteren", "Request": "Verzoek", - "Request_seats": "Plaatsen aanvragen", - "Request_more_seats": "Meer plaatsen aanvragen.", - "Request_more_seats_out_of_seats": "Je kan geen leden toevoegen omdat deze werkruimte geen plaatsen meer heeft. Vraag meer plaatsen aan.", - "Request_more_seats_sales_team": "Zodra uw verzoek is ingediend, zal ons verkoopteam het bekijken en binnen enkele dagen contact met u opnemen.", - "Request_more_seats_title": "Meer plaatsen aanvragen", "Request_comment_when_closing_conversation": "Commentaar vragen bij het sluiten van het gesprek", "Request_comment_when_closing_conversation_description": "Indien ingeschakeld, moet de agent een opmerking plaatsen voor het gesprek wordt gesloten.", "Request_tag_before_closing_chat": "Vraag tag(s) aan voordat u het gesprek sluit", @@ -3758,6 +3747,7 @@ "See_documentation": "Documentatie bekijken", "See_full_profile": "Bekijk het volledige profiel", "See_on_Engagement_Dashboard": "Zie op het Engagement Dashboard", + "Select": "Selecteer", "Select_a_department": "Selecteer een afdeling", "Select_a_room": "Kies een kamer", "Select_a_user": "Selecteer een gebruiker", @@ -4108,8 +4098,12 @@ "Teams_Search_teams": "Zoek teams", "Teams_New_Read_only_Label": "Alleen lezen", "Technology_Services": "Technologiediensten", + "Upgrade_tab_connection_error_description": "Het lijkt erop dat je geen internetverbinding hebt. Dit kan komen omdat jouw werkruimte geïnstalleerd is op een volledig beveiligde air-gapped server", "Terms": "Voorwaarden", + "Upgrade_tab_connection_error_restore": "Herstel uw verbinding om meer te weten komen over functies die u mist.", "Test_Connection": "Test verbinding", + "Upgrade_tab_go_fully_featured": "Upgrade naar de volledige versie", + "Upgrade_tab_trial_guide": "Proefgids", "Test_Desktop_Notifications": "Desktopmeldingen testen", "Test_LDAP_Search": "LDAP-zoekopdracht testen", "test-admin-options": "Test opties op admin paneel zoals LDAP login en pushmeldingen", @@ -4369,10 +4363,6 @@ "Update_to_version": "Update naar {{version}}", "Update_your_RocketChat": "Update je Rocket.Chat", "Updated_at": "Bijgewerkt op", - "Upgrade_tab_connection_error_description": "Het lijkt erop dat je geen internetverbinding hebt. Dit kan komen omdat jouw werkruimte geïnstalleerd is op een volledig beveiligde air-gapped server", - "Upgrade_tab_connection_error_restore": "Herstel uw verbinding om meer te weten komen over functies die u mist.", - "Upgrade_tab_go_fully_featured": "Upgrade naar de volledige versie", - "Upgrade_tab_trial_guide": "Proefgids", "Upgrade_tab_upgrade_your_plan": "Upgrade je abonnement", "Upload": "Uploaden", "Uploads": "Uploads", @@ -4565,6 +4555,7 @@ "view-l-room": "Bekijk omnichannel-kamers", "view-l-room_description": "Toestemming om omnichannel-kamers te bekijken", "view-livechat-analytics": "Omnichannel analytics bekijken", + "onboarding.page.awaitingConfirmation.subtitle": "We hebben je een e-mail gestuurd naar {{emailAddress}} met een bevestigingslink. Controleer of de onderstaande beveiligingscode overeenkomt met die in de e-mail.", "view-livechat-analytics_description": "Toestemming om livechat analyses te bekijken", "view-livechat-appearance": "Bekijk omnichannel-uiterlijk", "view-livechat-appearance_description": "Toestemming om het uiterlijk van de livechat te bekijken", @@ -4810,11 +4801,10 @@ "onboarding.component.form.action.skip": "Sla deze stap over", "onboarding.component.form.action.register": "Registreren", "onboarding.component.form.action.confirm": "Bevestigen", + "onboarding.component.form.action.pasteHere": "Plak hier...", "onboarding.component.form.termsAndConditions": "Ik ga akkoord met de <1>Algemene voorwaarden en <3>Privacybeleid", "onboarding.component.emailCodeFallback": "Geen e-mail ontvangen? <1>Opnieuw verzenden of <3>E-mailadres wijzigen", - "onboarding.page.form.title": "<1>Lanceer uw werkruimte", - "onboarding.page.awaitingConfirmation.title": "Wachtend op bevestiging", - "onboarding.page.awaitingConfirmation.subtitle": "We hebben je een e-mail gestuurd naar {{emailAddress}} met een bevestigingslink. Controleer of de onderstaande beveiligingscode overeenkomt met die in de e-mail.", + "onboarding.page.form.title": "Lanceer uw werkruimte", "onboarding.page.emailConfirmed.title": "E-mail bevestigd!", "onboarding.page.emailConfirmed.subtitle": "U kunt terugkeren naar uw Rocket.Chat-toepassing - we hebben uw werkruimte al gelanceerd.", "onboarding.page.checkYourEmail.title": "Controleer je e-mail", @@ -4850,6 +4840,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Wachtwoord", "onboarding.form.adminInfoForm.fields.password.placeholder": "Wachtwoord aanmaken", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Hou me op de hoogte van Rocket.Chat-updates", + "onboarding.form.awaitConfirmationForm.title": "Wachtend op bevestiging", "onboarding.form.organizationInfoForm.title": "Organisatie info", "onboarding.form.organizationInfoForm.subtitle": "Wees geduldig met ons. Met deze informatie kunnen we uw werkruimte personaliseren", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organisatie naam", @@ -4862,6 +4853,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Selecteer", "onboarding.form.organizationInfoForm.fields.country.label": "Land", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Selecteer", + "onboarding.form.registerOfflineForm.title": "Offline registreren", "onboarding.form.registeredServerForm.title": "Registreer uw server", "onboarding.form.registeredServerForm.included.push": "Mobiele pushmeldingen", "onboarding.form.registeredServerForm.included.externalProviders": "Integratie met externe providers (WhatsApp, Facebook, Telegram, Twitter)", @@ -4878,5 +4870,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "Marktplaats", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mailadres van cloudaccount", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ik ga akkoord met de <1>Algemene voorwaarden en <3>Privacybeleid" + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ik ga akkoord met de <1>Algemene voorwaarden en <3>Privacybeleid", + "Enterprise": "Onderneming", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", + "UpgradeToGetMore_auditing_Title": "Bericht auditing" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json index 1eb6c8ceb8bd..f1d3862c76d6 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json @@ -1,28 +1,68 @@ { "500": "Intern server feil", + "__agents__agents_and__count__conversations__period__": "{{agents}} agenter og {{count}} samtaler, {{period}}", + "__count__empty_rooms_will_be_removed_automatically": "{{count}} tomme rom vil bli fjernet automatisk.", + "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomme rom vil bli fjernet automatisk:
{{rooms}}.", + "__count__conversations__period__": "{{count}} samtaler, {{period}}", + "__count__tags__and__count__conversations__period__": "{{count}}-tagger og {{conversations}}-samtaler, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} avdelinger og {{count}} samtaler, {{period}}", + "__usersCount__member_joined": "+ {{usersCount}} medlem ble med", + "__usersCount__member_joined_plural": "+ {{usersCount}} medlemmer ble med", + "__usersCount__people_will_be_invited": "{{usersCount}} personer blir invitert", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} er ikke lenger {{role}} av {{user_by}}", "__username__was_set__role__by__user_by_": "{{username}} ble satt {{role}} av {{user_by}}", + "__count__without__department__": "{{count}} uten avdeling", + "__count__without__tags__": "{{count}} uten tagger", + "__count__without__assignee__": "{{count}} uten mottaker", + "removed__username__as__role_": "fjernet {{username}} som {{role}}", + "set__username__as__role_": "sett {{username}} som {{role}}", + "This_room_encryption_has_been_enabled_by__username_": "Dette rommets kryptering er aktivert av {{username}}", + "This_room_encryption_has_been_disabled_by__username_": "Dette rommets kryptering har blitt deaktivert av {{username}}", + "Third_party_login": "Tredjeparts innlogging", + "Enabled_E2E_Encryption_for_this_room": "aktivert E2E-kryptering for dette rommet", + "disabled": "deaktivert", + "Disabled_E2E_Encryption_for_this_room": "deaktivert E2E-kryptering for dette rommet", "@username": "@brukernavn", "@username_message": "@brukernavn ", "#channel": "#kanal", - "%_of_conversations": "% av samtaler", + "%_of_conversations": "%% av samtaler", "0_Errors_Only": "0 - Kun Feil", "1_Errors_and_Information": "1 - Feil og informasjon", "2_Erros_Information_and_Debug": "2 - Feil, Informasjon og Feilsøking", "12_Hour": "12-timers klokke", "24_Hour": "24-timers klokke", + "A_cloud-based_platform_for_those_needing_a_plug-and-play_app": "En skybasert plattform for de som trenger en plug-and-play-app.", + "A_new_owner_will_be_assigned_automatically_to__count__rooms": "En ny eier vil automatisk bli tildelt {{count}} rom.", + "A_new_owner_will_be_assigned_automatically_to_the__roomName__room": "En ny eier vil automatisk bli tildelt {{roomName}}-rommet.", + "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "En ny eier vil automatisk bli tildelt disse {{count}}-rommene:
{{rooms}}.", + "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "En sikker og privat selvstyrt løsning for konferansesamtaler.", + "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "En arbeidsområdeadministrator må installere og konfigurere en konferansesamtale-app.", + "An_app_needs_to_be_installed_and_configured": "En app må installeres og konfigureres.", + "Accessibility": "Tilgjengelighet", + "Accessibility_and_Appearance": "Tilgjengelighet og utseende", + "Accessibility_activation": "Her kan du aktivere en rekke funksjoner for å forbedre nettleseropplevelsen din.", + "Accept_Call": "Godta anrop", "Accept": "Aksepter", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Aksepter innkommende livechat selv om det ikke er noen online", - "Accept_with_no_online_agents": "Aksepter uten online agenter", - "Access_not_authorized": "Aksepter uautoriserte", + "Accept_new_livechats_when_agent_is_idle": "Godta nye omnikanalforespørsler når agenten er inaktiv", + "Accept_with_no_online_agents": "Aksepter uten påloggede agenter", + "Access_not_authorized": "Tilgang ikke autorisert", "Access_Token_URL": "Tilgangstoken URL", + "Access_Your_Account": "Få tilgang til kontoen din", + "access_your_basic_information": "tilgang til din basis informasjon", "access-mailer": "Tilgang til Mailer-skjermen", "access-mailer_description": "Tillatelse til å sende masse e-post til alle brukere.", + "access-marketplace": "Få tilgang til markedsplassen", + "access-marketplace_description": "Tillatelse til å bla gjennom og hente apper fra markedsplassen", "access-permissions": "Tilgang Tillatelser Skjerm", "access-permissions_description": "Endre tillatelser for ulike roller.", + "access-setting-permissions": "Endre innstillingsbaserte tillatelser", + "access-setting-permissions_description": "Tillatelse til å endre innstillingsbaserte tillatelser", "Accessing_permissions": "Få tilgang til tillatelser", "Account_SID": "Konto SID", + "Account": "konto", "Accounts": "kontoer", + "Accounts_Description": "Endre medlemskontoinnstillingene for arbeidsområdet.", "Accounts_Admin_Email_Approval_Needed_Default": "

Brukeren [name] ([email]) er registrert.

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "En ny bruker registrert og trenger godkjenning", "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Brukeren [name] ([email]) er registrert.

Årsak: [reason]

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", @@ -31,9 +71,12 @@ "Accounts_AllowDeleteOwnAccount": "Tillat brukere å slette egen konto", "Accounts_AllowedDomainsList": "Liste over aksepterte domener", "Accounts_AllowedDomainsList_Description": "Kommaseparert liste over tillatte domener", + "Accounts_AllowInvisibleStatusOption": "Tillat usynlig status", "Accounts_AllowEmailChange": "Tillat endring av e-post", "Accounts_AllowEmailNotifications": "Tillat epostvarsling", + "Accounts_AllowFeaturePreview": "Tillat funksjonsforhåndsvisning", "Accounts_AllowPasswordChange": "Tillat passordendring", + "Accounts_AllowPasswordChangeForOAuthUsers": "Tillat passordendring for OAuth-brukere", "Accounts_AllowRealNameChange": "Tillat navneskift", "Accounts_AllowUserAvatarChange": "Tillat brukervennlige endringer", "Accounts_AllowUsernameChange": "Tillat endring av brukernavn", @@ -59,6 +102,7 @@ "Accounts_Default_User_Preferences_not_available": "Kunne ikke hente brukerinnstillinger fordi de ennå ikke er konfigurert av brukeren", "Accounts_DefaultUsernamePrefixSuggestion": "Standard brukernavn Prefix Suggestion", "Accounts_denyUnverifiedEmail": "Avvis unverifisert e-post", + "Accounts_Directory_DefaultView": "Standard katalogoppføring", "Accounts_Email_Activated": "[navn]

Kontoen din ble aktivert.

", "Accounts_Email_Activated_Subject": "Konto aktivert", "Accounts_Email_Approved": "[navn]

Kontoen din ble godkjent.

", @@ -78,21 +122,32 @@ "Accounts_iframe_url": "Iframe URL", "Accounts_LoginExpiration": "Innlogging Utløp i dager", "Accounts_ManuallyApproveNewUsers": "Godkjenn nye brukere manuelt", + "Accounts_OAuth_Apple": "Logg på med Apple", + "Accounts_OAuth_Apple_Description": "Hvis du vil at Apple-pålogging kun skal være aktivert på mobil, kan du la alle feltene stå tomme.", "Accounts_OAuth_Custom_Access_Token_Param": "Parameternavn for \"access token\"", "Accounts_OAuth_Custom_Authorize_Path": "Godkjenn sti", "Accounts_OAuth_Custom_Avatar_Field": "Avatarfelt", "Accounts_OAuth_Custom_Button_Color": "Knappfarge", "Accounts_OAuth_Custom_Button_Label_Color": "Knapptekstfarge", "Accounts_OAuth_Custom_Button_Label_Text": "Knapptekst", + "Accounts_OAuth_Custom_Channel_Admin": "Brukerdatagruppekart", + "Accounts_OAuth_Custom_Channel_Map": "OAuth gruppe Channel tildeling", + "Accounts_OAuth_Custom_Email_Field": "E-postfelt", "Accounts_OAuth_Custom_Enable": "Aktiver", + "Accounts_OAuth_Custom_Groups_Claim": "Roller/Grupper felt for kanalkartlegging", "Accounts_OAuth_Custom_id": "id", "Accounts_OAuth_Custom_Identity_Path": "Identitetsvei", "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Identitets Token Sendt Via", + "Accounts_OAuth_Custom_Key_Field": "Nøkkelfelt", "Accounts_OAuth_Custom_Login_Style": "Logg inn stil", + "Accounts_OAuth_Custom_Map_Channels": "Tilordne roller/grupper til kanaler", "Accounts_OAuth_Custom_Merge_Roles": "Slå sammen roller fra SSO", "Accounts_OAuth_Custom_Merge_Users": "Slå sammen brukere", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services": "Slå sammen brukere fra forskjellige tjenester", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services_Description": "Når det angitte nøkkelfeltet samsvarer med feltet til en eksisterende bruker, la brukere fra denne OAuth-tjenesten slås sammen med eksisterende brukere uavhengig av opprinnelsestjenesten.", "Accounts_OAuth_Custom_Name_Field": "Felt for navn", "Accounts_OAuth_Custom_Roles_Claim": "Roller / Grupper feltnavn", + "Accounts_OAuth_Custom_Roles_To_Sync": "Roller som skal synkroniseres", "Accounts_OAuth_Custom_Scope": "omfang", "Accounts_OAuth_Custom_Secret": "Hemmelig", "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Vis knapp på innloggingsside", @@ -182,6 +237,9 @@ "Accounts_Registration_AuthenticationServices_Default_Roles": "Standardroller for godkjenningstjenester", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Standardroller (kommaseparerte) brukere vil bli gitt når de registreres via autentiseringstjenester", "Accounts_Registration_AuthenticationServices_Enabled": "Registrering med godkjenningstjenester", + "Accounts_Registration_Users_Default_Roles": "Standard roller for brukere", + "Accounts_Registration_Users_Default_Roles_Description": "Standardroller (kommaseparert) brukere vil bli gitt ved registrering gjennom manuell registrering (inkludert via API)", + "Accounts_Registration_Users_Default_Roles_Enabled": "Aktiver standardroller for manuell registrering", "Accounts_Registration_InviteUrlType": "Type invitasjonslenke", "Accounts_Registration_InviteUrlType_Direct": "Direkte", "Accounts_Registration_InviteUrlType_Proxy": "Proxy", @@ -194,6 +252,8 @@ "Accounts_RegistrationForm_SecretURL_Description": "Du må oppgi en tilfeldig streng som vil bli lagt til din registreringsadresse. Eksempel: `https://open.rocket.chat/register/[secret_hash]`", "Accounts_RequireNameForSignUp": "Krever navn for registrering", "Accounts_RequirePasswordConfirmation": "Kreve passordbekreftelse", + "Accounts_RoomAvatarExternalProviderUrl": "Room Avatar ekstern tilbyder URL", + "Accounts_RoomAvatarExternalProviderUrl_Description": "Eksempel: `https://acme.com/api/v1/{roomId}`", "Accounts_SearchFields": "Felt som skal vurderes i søk", "Accounts_Send_Email_When_Activating": "Send e-post til brukeren når brukeren blir aktivert", "Accounts_Send_Email_When_Deactivating": "Send e-post til brukeren når brukeren blir deaktivert", @@ -202,6 +262,7 @@ "Accounts_SetDefaultAvatar": "Angi Standard Avatar", "Accounts_SetDefaultAvatar_Description": "Trenger å bestemme standard avatar basert på OAuth-konto eller Gravatar", "Accounts_ShowFormLogin": "Vis skjemabasert pålogging", + "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "Aktiver tofaktorautentisering via TOTP", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Automatisk aktiver tofaktor via e-post for nye brukere", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nye brukere vil ha tofaktorautentisering via e-post aktivert som standard. De vil kunne deaktivere det på profilsiden.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Tid i sekunder før koden sendt i e-post utløper", @@ -209,6 +270,7 @@ "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Brukere med bekreftet epostadresse og alternativet aktivert på profilsiden deres vil motta en e-post med en midlertidig kode for å autorisere visse handlinger som innlogging, lagring av profilen, etc.", "Accounts_TwoFactorAuthentication_Enabled": "Aktiver to faktorautentiseringer", "Accounts_TwoFactorAuthentication_Enabled_Description": "Brukere kan konfigurere tofaktorautentisering ved å bruke hvilken som helst TOTP-app, for eksempel Google Authenticator eller Authy", + "Accounts_TwoFactorAuthentication_Enforce_Password_Fallback": "Håndhev passordreservering", "Accounts_TwoFactorAuthentication_MaxDelta": "Maksimal Delta", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Maksimum Delta bestemmer hvor mange tokens er gyldige til enhver tid. Tokene genereres hvert 30. sekund, og gjelder for (30 * Maks. Delta) sekunder. \nEksempel: Med et maksimalt Delta-sett på 10, kan hver token brukes opptil 300 sekunder før eller etter tidsstempel. Dette er nyttig når klientens klokke ikke er riktig synkronisert med serveren.", "Accounts_TwoFactorAuthentication_RememberFor": "Husk tofaktor i (sekunder)", @@ -220,23 +282,45 @@ "Accounts_UserAddedEmail_Description": "Du kan bruke følgende plassholdere: \n - [navn], [fname], [lname] for brukerens fulle navn, fornavn eller etternavn. \n - `[email]` for brukerens e-postadresse. \n - [passord] for brukerens passord. \n - `[Site_Name]` og `[Site_URL]` for henholdsvis programnavnet og nettadressen. ", "API_EmbedDisabledFor_Description": "Kommaseparert liste over brukernavn for å deaktivere forhåndsvisning av embedded link.", "Accounts_UserAddedEmailSubject_Default": "Du har blitt lagt til i [Site_Name]", + "Accounts_Verify_Email_For_External_Accounts": "Merk e-post for eksterne kontoer som bekreftet", + "Action": "Handling", + "Action_required": "Handling kreves", + "Action_Available_After_Custom_Content_Added": "Denne handlingen blir tilgjengelig etter at det tilpassede innholdet er lagt til", + "Action_Available_After_Custom_Content_Added_And_Visible": "Denne handlingen blir tilgjengelig etter at det tilpassede innholdet er lagt til og gjort synlig for alle", "Activate": "Aktiver", "Active": "Aktiv", "Active_users": "Aktive brukere", "Activity": "Aktivitet", "Add": "Legg til", + "Add_a_Message": "Legg til en melding", "Add_agent": "Legg til agent", "Add_custom_oauth": "Legg til egendefinert oauth", "Add_Domain": "Legg til domene", + "Add_emoji": "Legg til emoji", "Add_files_from": "Legg til filer fra", "Add_manager": "Legg til leder", + "Add_monitor": "Legg til monitor", "Add_Reaction": "Legg til reaksjon", "Add_Role": "Legg til rolle", + "Add_Sender_To_ReplyTo": "Legg til avsender til svar-til", + "Add_Server": "Legg til server", + "Add_URL": "Legg til URL", "Add_user": "Legg til bruker", "Add_User": "Legg til bruker", "Add_users": "Legg til brukere", + "Add_members": "Legg til medlemmer", + "add-all-to-room": "Legg til alle brukere i et rom", + "add-all-to-room_description": "Tillatelse til å legge til alle brukere i et rom", + "add-livechat-department-agents": "Legg til omnikanalagenter til avdelinger", + "add-livechat-department-agents_description": "Tillatelse til å legge til omnikanalagenter til avdelinger", "add-oauth-service": "Legg til Oauth Service", "add-oauth-service_description": "Tillatelse til å legge til en ny Oauth-tjeneste", + "bypass-time-limit-edit-and-delete": "Omgå tidsbegrensning", + "bypass-time-limit-edit-and-delete_description": "Tillatelse til å omgå tidsgrense for redigering og sletting av meldinger", + "add-team-channel": "Legg til Team Channel", + "add-team-channel_description": "Tillatelse til å legge til en kanal i et team", + "add-team-member": "Legg til et teammedlem", + "add-team-member_description": "Tillatelse til å legge til medlemmer i et team", "add-user": "Legg til bruker", "add-user_description": "Tillatelse til å legge til nye brukere på serveren via brukerskjermbildet", "add-user-to-any-c-room": "Legg til bruker til hvilken som helst offentlig kanal", @@ -283,6 +367,8 @@ "All_logs": "Aller logger", "AutoLinker_UrlsRegExp": "AutoLinker URL Regular Expression", "All_messages": "Alle meldinger", + "All_Prices": "Alle priser", + "All_status": "Alle statuser", "All_users": "Alle brukere", "All_users_in_the_channel_can_write_new_messages": "Alle brukere i kanalen kan skrive nye meldinger", "Allow_collect_and_store_HTTP_header_informations": "Tillat å samle inn og lagre informasjon om HTTP headere.", @@ -290,12 +376,20 @@ "Allow_Invalid_SelfSigned_Certs": "Tillat ugyldige selvsignerte sertifikater", "Allow_Invalid_SelfSigned_Certs_Description": "Tillat ugyldig og selvsignert SSL-sertifikat for koblingsvalidering og forhåndsvisninger.", "Allow_Marketing_Emails": "Tillat markedsføring e-post", + "Allow_Online_Agents_Outside_Business_Hours": "Tillat nettagenter utenom åpningstidene", + "Allow_Online_Agents_Outside_Office_Hours": "Tillat nettagenter utenom kontortiden", + "Allow_Save_Media_to_Gallery": "Tillat Lagre media til Galleri", "Allow_switching_departments": "Tillat besøkende å bytte avdelinger", "Almost_done": "Nesten ferdig", "Alphabetical": "Alfabetisk", "bold": "fet", + "Also_send_thread_message_to_channel_behavior": "Send også trådmelding til kanaladferd", + "Also_send_to_channel": "Send også til kanal", "Always_open_in_new_window": "Alltid åpne i nytt vindu", + "Always_show_thread_replies_in_main_channel": "Vis alltid trådsvar i hovedkanalen", + "Analytic_reports": "Analyse rapporter", "Analytics": "Analytics", + "Analytics_Description": "Se hvordan brukere samhandler med arbeidsområdet ditt.", "Analytics_features_enabled": "Funksjoner aktivert", "Analytics_features_messages_Description": "Sporer tilpassede hendelser relatert til handlinger en bruker gjør på meldinger.", "Analytics_features_rooms_Description": "Sporer tilpassede hendelser relatert til handlinger på en kanal eller gruppe (opprett, forlatt, slett).", @@ -358,30 +452,52 @@ "api-bypass-rate-limit": "Forbigå rate-limit for REST API", "Apiai_Key": "Api.ai Key", "Apiai_Language": "Api.ai Språk", + "APIs": "APIer", "App_author_homepage": "forfatter hjemmeside", + "App_Details": "Appdetaljer", + "App_Info": "App info", "App_Information": "App Informasjon", + "Apps_context_enterprise": "Enterprise", "App_Installation": "App installasjon", + "App_not_enabled": "App ikke aktivert", + "App_not_found": "App ikke funnet", "App_status_auto_enabled": "aktivert", "App_status_constructed": "konstruert", "App_status_disabled": "Funksjonshemmet", "App_status_error_disabled": "Deaktivert: Uncaught Error", "App_status_initialized": "initialisert", "App_status_invalid_license_disabled": "Deaktivert: Ugyldig lisens", + "Apps_disabled_when_Enterprise_trial_ended": "Apper deaktivert da Enterprise-prøveperioden ble avsluttet", "App_status_invalid_settings_disabled": "Deaktivert: Konfigurasjon er nødvendig", "App_status_manually_disabled": "Deaktivert: manuelt", "App_status_manually_enabled": "aktivert", "App_status_unknown": "Unknown", + "App_Store": "App Store", "App_support_url": "støtte url", "App_Url_to_Install_From": "Installer fra URL", "App_Url_to_Install_From_File": "Installer fra fil", + "App_user_not_allowed_to_login": "Appbrukere har ikke lov til å logge inn direkte.", "Appearance": "Utseende", "Application_added": "Søknad lagt til", + "Application_delete_warning": "Du vil ikke kunne gjenopprette denne applikasjonen!", "Application_Name": "Programnavn", "Application_updated": "Søknad oppdatert", "Apply": "Søke om", "Apply_and_refresh_all_clients": "Påfør og oppdater alle klienter", "Apps": "Apps", + "Apps_context_explore": "Utforske", + "Apps_context_installed": "Installert", + "Apps_context_requested": "Forespurt", + "Apps_context_private": "Private apper", + "Apps_context_premium": "Premium", + "Apps_Count_Enabled": "{{count}} app aktivert", + "Apps_Count_Enabled_plural": "{{count}} apper aktivert", + "Private_Apps_Count_Enabled": "{{count}} privat app aktivert", + "Private_Apps_Count_Enabled_plural": "{{count}} private apper aktivert", "Apps_Engine_Version": "Versjon av Apps Engine", + "Apps_Game_Center": "Spillsenter", + "Apps_Game_Center_Back": "Tilbake til spillsenteret", + "Apps_Game_Center_Invite_Friends": "Inviter vennene dine til å bli med", "Apps_Settings": "Appens innstillinger", "Apps_WhatIsIt": "Apper: Hva er de?", "Apps_WhatIsIt_paragraph1": "Et nytt ikon i administrasjonsområdet! Hva betyr dette og hva er apper?", @@ -1018,6 +1134,8 @@ "Email_Placeholder": "Vennligst skriv inn E-postadressen din...", "Email_Placeholder_any": "Vennligst skriv inn e-postadresser ...", "Email_subject": "Emne", + "Enterprise_License": "Enterpriselisens", + "Enterprise_License_Description": "Hvis arbeidsområdet ditt er registrert og lisensen er levert av Rocket.Chat Cloud trenger du ikke å oppdatere lisensen manuelt her.", "Email_verified": "E-post bekreftet", "Emoji": "Emoji", "EmojiCustomFilesystem": "Egendefinert Emoji-filsystem", @@ -1040,9 +1158,6 @@ "Enter_name_here": "Skriv inn navn her", "Enter_Normal": "Normal modus (send med Enter)", "Enter_to": "Skriv inn til", - "Enterprise": "Bedriften", - "Enterprise_License": "Enterpriselisens", - "Enterprise_License_Description": "Hvis arbeidsområdet ditt er registrert og lisensen er levert av Rocket.Chat Cloud trenger du ikke å oppdatere lisensen manuelt her.", "Entertainment": "Underholdning", "Error": "Feil", "Error_404": "Feil: 404", @@ -2859,5 +2974,7 @@ "registration.component.form.reasonToJoin": "Årsak til å bli med", "registration.component.form.invalidConfirmPass": "Passordbekreftelsen stemmer ikke overens med passordet", "registration.component.form.confirmPassword": "Bekreft passordet ditt", - "registration.component.form.sendConfirmationEmail": "Send bekreftelses-e-post" + "registration.component.form.sendConfirmationEmail": "Send bekreftelses-e-post", + "Enterprise": "Bedriften", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json index e2651bfa08fc..6a4265cc7397 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -455,6 +455,7 @@ "App_Details": "Szczegóły aplikacji", "App_Info": "Info o aplikacji", "App_Information": "Informacje o aplikacji", + "Apps_context_enterprise": "Enterprise", "App_Installation": "Instalacja aplikacji", "App_status_auto_enabled": "Włączone", "App_status_constructed": "Skonstruowane", @@ -480,7 +481,6 @@ "Apply_and_refresh_all_clients": "Zastosuj i odśwież wszystkich klientów", "Apps": "Aplikacje", "Apps_context_explore": "Poznaj", - "Apps_context_enterprise": "Enterprise", "Apps_context_installed": "Zainstalowana", "Apps_Engine_Version": "Wersja silnika aplikacji", "Apps_Essential_Alert": "Ta aplikacja jest niezbędna dla następujących zdarzeń:", @@ -743,6 +743,7 @@ "Broadcasting_media_server_url": "Rozgłaszanie adresu URL serwera multimedialnego", "Browse_Files": "Przeglądaj pliki", "Browser_does_not_support_audio_element": "Przeglądarka nie obsługuje tego elementu dźwiękowego.", + "Call_number_enterprise_only": "Numer połączenia (tylko wersja Enterprise Edition)", "Browser_does_not_support_video_element": "Przeglądarka nie obsługuje tego elementu wideo.", "Bugsnag_api_key": "Klucz API Bugsnag", "Build_Environment": "Środowisko kompilacji", @@ -776,7 +777,6 @@ "Call_provider": "Dostawca połączenia", "Call_Already_Ended": "Połączenie już zakończone", "Call_number": "Numer połączenia", - "Call_number_enterprise_only": "Numer połączenia (tylko wersja Enterprise Edition)", "call-management": "Zarządzanie połączeniami", "call-management_description": "Zezwolenie na rozpoczęcie spotkania", "Call_unavailable_for_federation": "Połączenie jest niedostępne dla pokoi Federacji", @@ -917,8 +917,6 @@ "Close": "Zamknij", "Close_chat": "Zamknij czat", "Close_room_description": "Za chwilę zamkniesz ten czat. Czy na pewno chcesz kontynuować?", - "Close_to_seat_limit_banner_warning": "* Zostało miejsc: [{{seats}}]* \nTen obszar roboczy zbliża się do limitu miejsc. Po osiągnięciu limitu nie będzie można dodawać nowych członków. *[Poproś o więcej miejsc]({{url}})*.", - "Close_to_seat_limit_warning": "Po wyczerpaniu limitu miejsc nie można tworzyć nowych członków.", "close-livechat-room": "Zamknij pokój Omnichannel", "close-livechat-room_description": "Uprawnienie do zamykania bieżącego pokoju Omnichannel", "Close_menu": "Zamknij menu", @@ -952,8 +950,6 @@ "Cloud_register_offline_finish_helper": "Po zakończeniu procesu rejestracji w konsoli chmury powinien pojawić się tekst. Wklej go tutaj, aby zakończyć rejestrację.", "Cloud_register_offline_helper": "Obszary robocze można zarejestrować ręcznie, jeśli dostęp do sieci jest ograniczony. Skopiuj poniższy tekst i przejdź do konsoli chmury, aby zakończyć proces.", "Cloud_register_success": "Twój obszar roboczy został zarejestrowany!", - "Cloud_registration_pending_html": "Powiadomienia push nie będą działać do czasu zakończenia rejestracj.Dowiedz się więcej", - "Cloud_registration_pending_title": "Rejestracja w chmurze jest nadal w toku", "Cloud_registration_required": "Rejestracja wymagana", "Cloud_registration_required_description": "Wygląda na to, że podczas konfiguracji nie wybrano opcji rejestracji obszaru roboczego.", "Cloud_registration_required_link_text": "Kliknij tutaj, aby zarejestrować swój obszar roboczy.", @@ -1619,7 +1615,7 @@ "E2E_key_reset_email": "Powiadomienie o resetowaniu klucza E2E", "E2E_message_encrypted_placeholder": "Ta wiadomość jest zaszyfrowana end-to-end. Aby ją wyświetlić, musisz wprowadzić swój klucz szyfrowania w ustawieniach konta.", "E2E_password_request_text": "Aby uzyskać dostęp do zaszyfrowanych grup prywatnych i wiadomości bezpośrednich, wprowadź swoje hasło szyfrowania.
Musisz wprowadzić to hasło, aby kodować / dekodować wiadomości na każdym używanym kliencie, ponieważ klucz nie jest przechowywany na serwerze.", - "E2E_password_reveal_text": "Możesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. Możesz również zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać to hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić go na innych urządzeniach, na których chcesz używać szyfrowania e2e. Dowiedz się więcej tutaj

Twoje hasło: %s

to jest automatycznie wygenerowane hasło, możesz ustawić nowe hasło do szyfrowania klucza w dowolnym momencie z dowolnej przeglądarki, do której wprowadziłeś istniejące hasło.
To hasło jest przechowywane tylko w tej przeglądarce, dopóki nie zapiszesz hasła i nie usuniesz tej wiadomości.", + "E2E_password_reveal_text": "Możesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. Możesz również zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać to hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić go na innych urządzeniach, na których chcesz używać szyfrowania e2e. Dowiedz się więcej tutaj

Twoje hasło: {{randomPassword}}

to jest automatycznie wygenerowane hasło, możesz ustawić nowe hasło do szyfrowania klucza w dowolnym momencie z dowolnej przeglądarki, do której wprowadziłeś istniejące hasło.
To hasło jest przechowywane tylko w tej przeglądarce, dopóki nie zapiszesz hasła i nie usuniesz tej wiadomości.", "E2E_Reset_Email_Content": "Zostałeś automatycznie wylogowany. Kiedy zalogujesz się ponownie, Rocket.Chat wygeneruje nowy klucz i przywróci Twój dostęp do każdego zaszyfrowanego pokoju, który ma jednego lub więcej członków online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, w którym nie ma żadnego członka online.", "E2E_Reset_Key_Explanation": "Ta opcja usunie Twój obecny klucz E2E i wyloguje Cię.
Po ponownym zalogowaniu się, Rocket.Chat wygeneruje nowy klucz i przywróci dostęp do szyfrowanego pokoju, który ma jednego lub więcej członków online.
Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, który nie ma członków online.", "E2E_Reset_Other_Key_Warning": "Zresetowanie aktualnego klucza E2E spowoduje wylogowanie użytkownika. Gdy użytkownik zaloguje się ponownie, Rocket.Chat wygeneruje nowy klucz i przywróci użytkownikowi dostęp do każdego zaszyfrowanego pomieszczenia, które ma jednego lub więcej członków online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrócić dostępu do szyfrowanego pokoju, w którym nie ma żadnego członka online.", @@ -1709,7 +1705,10 @@ "email_plain_text_only": "Wysyłaj wiadomości e-mail zwykłym tekstem", "email_style_description": "Unikaj zagnieżdżonych selektorów", "email_style_label": "Styl e-mail", + "Enterprise_Description": "Zaktualizuj licencję Enterprise manualnie.", "Email_subject": "Temat", + "Enterprise_License": "Licencja Enterprise", + "Enterprise_License_Description": "Jeśli Twoja przestrzeń robocza jest zarejestrowana i licencja jest dostarczana przez Rocket.Chat Cloud, nie musisz ręcznie aktualizować licencji tutaj.", "Email_verified": "E-mail zweryfikowany", "Email_sent": "Email wysłany", "Emoji": "Emotikon", @@ -1766,10 +1765,6 @@ "Enter_Normal": "Tryb normalny (wysyłaj klawiszem Enter)", "Enter_to": "Naciśnij Enter: ", "Enter_your_E2E_password": "Wprowadź swoje hasło E2E", - "Enterprise": "Enterprise", - "Enterprise_Description": "Zaktualizuj licencję Enterprise manualnie.", - "Enterprise_License": "Licencja Enterprise", - "Enterprise_License_Description": "Jeśli Twoja przestrzeń robocza jest zarejestrowana i licencja jest dostarczana przez Rocket.Chat Cloud, nie musisz ręcznie aktualizować licencji tutaj.", "Entertainment": "Rozrywka", "Error": "Błąd", "Error_something_went_wrong": "Ups! Coś poszło nie tak. Odśwież stronę lub skontaktuj się z administratorem.", @@ -1792,7 +1787,7 @@ "error-avatar-invalid-url": "Nieprawidłowy awatar URL: {{url}}", "error-avatar-url-handling": "Błąd podczas przenoszenia ustawienia awatara z URL ({{url}}) do użytkownika {{username}}", "error-business-hours-are-closed": "Godziny pracy są zamknięte", - "error-blocked-username": "{{field}} jest zablokowane i nie może być użyte!", + "error-blocked-username": "**{{field}}** jest zablokowane i nie może być użyte!", "error-canned-response-not-found": "Predefiniowana odpowiedź nie odnaleziona", "error-cannot-delete-app-user": "Usuwanie użytkownika aplikacyjnego jest niedozwolone, odinstaluj odpowiednią aplikację aby móc go usunąć.", "error-cant-add-federated-users": "Nie można dodać użytkowników federacyjnych do pokoju niefederacyjnego", @@ -1840,6 +1835,7 @@ "error-invalid-email-address": "Niepoprawny adres email", "error-invalid-email-inbox": "Nieprawidłowa skrzynka przychodząca Email", "error-email-inbox-not-found": "Nie znaleziono skrzynki odbiorczej e-mail", + "error-this-is-an-ee-feature": "To jest funkcja edycji Enterprise", "error-invalid-file-height": "Nieprawidłowa wysokość pliku", "error-invalid-file-type": "Nieprawidłowy typ pliku", "error-invalid-file-width": "Nieprawidłowa szerokość pliku", @@ -1912,7 +1908,6 @@ "error-tags-must-be-assigned-before-closing-chat": "Tag(i) musi (muszą) być przypisane przed zamknięciem czatu", "error-the-field-is-required": "Wymagane jest {{field}} pola.", "error-this-is-not-a-livechat-room": "To nie jest pokój Livechata", - "error-this-is-an-ee-feature": "To jest funkcja edycji Enterprise", "error-token-already-exists": "Token o tej nazwie już istnieje", "error-token-does-not-exists": "Token nie istnieje", "error-too-many-requests": "Błąd, zbyt wiele żądań. Proszę zwolnij. Musisz czekać {{seconds}} sekund przed ponowną próbą.", @@ -2103,6 +2098,7 @@ "FileUpload_S3_Proxy_Avatars_Description": "Pliki avatara proxy przesyłają się przez twój serwer zamiast bezpośredniego dostępu do adresu URL zasobu", "FileUpload_S3_Proxy_Uploads": "Przesyłanie z serwera proxy", "FileUpload_S3_Proxy_Uploads_Description": "Przesyłanie pliku proxy za pośrednictwem serwera zamiast bezpośredniego dostępu do adresu URL zasobu", + "Hold_Call_EE_only": "Zawieszenie połączenia (tylko wersja Enterprise)", "FileUpload_S3_Region": "Region", "FileUpload_S3_SignatureVersion": "Wersja podpisu", "FileUpload_S3_URLExpiryTimeSpan": "Czas przedawnienia URL", @@ -2202,7 +2198,6 @@ "Go_to_your_workspace": "Idź do swojej przestrzeni roboczej", "Google_Play": "Google Play", "Hold_Call": "Zawieś połączenie", - "Hold_Call_EE_only": "Zawieszenie połączenia (tylko wersja Enterprise)", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "Plik JSON klucza usługi. Więcej informacji można znaleźć [tutaj] (https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Menedżer tagów Google Id", @@ -2766,7 +2761,7 @@ "leave-c_description": "Zezwolenie na opuszczenie kanałów", "leave-p": "Opuść grupy prywatne", "leave-p_description": "Zezwolenie na opuszczenie grup prywatnych", - "Lets_get_you_new_one": "Zróbmy ci nową!", + "Lets_get_you_new_one_": "Zróbmy ci nową!", "License": "Licencja", "Link_Preview": "Podgląd linków", "List_of_Channels": "Lista kanałów", @@ -3116,6 +3111,7 @@ "Message_HideType_subscription_role_removed": "Ukryj wiadomość \"Rola już nie ma definicji\"", "Message_HideType_uj": "Ukryj wiadomości \"Dołącz do użytkownika\"", "Message_HideType_ujt": "Ukryj komunikaty „Użytkownik dołączył do zespołu”", + "New_Call_Enterprise_Edition_Only": "Nowe połączenie (tylko wersja Enterprise)", "Message_HideType_ul": "Ukryj wiadomości \"zostawiaj użytkownika\"", "Message_HideType_ult": "Ukryj komunikaty „Użytkownik opuścił zespół”", "Message_HideType_user_added_room_to_team": "Ukryj komunikaty „Użytkownik dodał pokój do zespołu”", @@ -3257,7 +3253,6 @@ "New_Application": "Nowa aplikacja", "New_Business_Hour": "Nowe godziny pracy", "New_Call": "Nowe połączenie", - "New_Call_Enterprise_Edition_Only": "Nowe połączenie (tylko wersja Enterprise)", "New_chat_in_queue": "Nowa rozmowa w kolejce", "New_chat_priority": "Zmieniono priorytet: {{user}} zmienił priorytet na {{priority}}", "New_chat_transfer": "Nowy transfer czatu: {{transfer}}", @@ -3699,7 +3694,6 @@ "Rate Limiter_Description": "Kontroluj częstotliwość żądań wysyłanych lub odbieranych przez Twój serwer, aby zapobiec cyberatakom i scrapingowi.", "Rate_Limiter_Limit_RegisterUser": "Domyślna liczba wywołań dla limitu żądań przy rejestracji użytkownika", "Rate_Limiter_Limit_RegisterUser_Description": "Liczba domyślnych wywołań dla punktów końcowych rejestrujących użytkownika (interfejsów API REST i czasu rzeczywistego), dozwolonych w zakresie czasowym określonym w sekcji Limit żądań interfejsu API.", - "Reached_seat_limit_banner_warning": "*Brak dostępnych miejsc* \nTa przestrzeń robocza osiągnęła swój limit miejsc, więc nikt więcej nie może dołączyć. *[Poproś o więcej miejsc]({{url}})", "React_when_read_only": "Zezwalaj na reagowanie", "React_when_read_only_changed_successfully": "Zezwalaj na reagowanie, gdy zmiana tylko do odczytu jest pomyślna", "Reacted_with": "reaguje z", @@ -3809,11 +3803,6 @@ "Report_this_message_question_mark": "Zgłoś tą wiadomość?", "Reporting": "Raportowanie", "Request": "Rządanie", - "Request_seats": "Zamówienie miejsc", - "Request_more_seats": "Zamów więcej miejsc", - "Request_more_seats_out_of_seats": "Nie możesz dodać członków, ponieważ ta przestrzeń robocza nie ma wolnych miejsc, poproś o więcej miejsc.", - "Request_more_seats_sales_team": "Po złożeniu wniosku, nasz Zespół Sprzedaży zajmie się nim i skontaktuje się z Tobą w ciągu kilku najbliższych dni.", - "Request_more_seats_title": "Zamów więcej miejsc", "Request_comment_when_closing_conversation": "Poproś o komentarz podczas zamykania rozmowy", "Request_comment_when_closing_conversation_description": "Jeśli jest włączona, agent będzie musiał ustawić komentarz przed zamknięciem rozmowy.", "Request_tag_before_closing_chat": "Poproś o znacznik (znaczniki) przed zamknięciem rozmowy", @@ -4097,6 +4086,7 @@ "See_full_profile": "Zobacz pełny profil", "See_history": "Zobacz historię", "See_on_Engagement_Dashboard": "Zobacz na Engagement Dashboard", + "Select": "Wybór", "Select_a_department": "Wybierz dział", "Select_a_room": "Wybierz pokój", "Select_a_user": "Wybierz użytkownika", @@ -4473,9 +4463,13 @@ "Teams_Search_teams": "Wyszukaj zespoły", "Teams_New_Read_only_Label": "Tylko do odczytu", "Technology_Services": "Usługi technologiczne", + "Upgrade_tab_connection_error_description": "Wygląda na to, że nie masz połączenia z internetem. Może to być spowodowane tym, że Twoja przestrzeń robocza jest zainstalowana na w pełni zabezpieczonym serwerze", "Terms": "Warunki", "Terms_of_use": "Warunki użytkowania", + "Upgrade_tab_connection_error_restore": "Przywróć połączenie, aby dowiedzieć się o funkcjach, których Ci brakuje.", "Test_Connection": "Test połączenia", + "Upgrade_tab_go_fully_featured": "Zostań w pełni funkcjonalny", + "Upgrade_tab_trial_guide": "Przewodnik próbny", "Test_Desktop_Notifications": "Testuj powiadomienia na pulpicie", "Test_LDAP_Search": "Testuj wyszukiwanie LDAP", "test-admin-options": "Testuj opcje w panelu administracyjnym, takie jak logowanie LDAP i powiadomienia push", @@ -4747,10 +4741,6 @@ "Update_to_version": "Zaktualizuj do {{version}}", "Update_your_RocketChat": "Zaktualizuj swój Rocket.Chat", "Updated_at": "Zaktualizowano na", - "Upgrade_tab_connection_error_description": "Wygląda na to, że nie masz połączenia z internetem. Może to być spowodowane tym, że Twoja przestrzeń robocza jest zainstalowana na w pełni zabezpieczonym serwerze", - "Upgrade_tab_connection_error_restore": "Przywróć połączenie, aby dowiedzieć się o funkcjach, których Ci brakuje.", - "Upgrade_tab_go_fully_featured": "Zostań w pełni funkcjonalny", - "Upgrade_tab_trial_guide": "Przewodnik próbny", "Upgrade_tab_upgrade_your_plan": "Zwiększ poziom swojego plan", "Upload": "Wczytaj", "Uploads": "Przesyłane pliki", @@ -4995,6 +4985,7 @@ "view-l-room": "Wyświetl pokoje Livechat", "view-l-room_description": "Zezwolenie na oglądanie kanałów na żywo", "view-livechat-analytics": "Zobacz analizę Livechat", + "onboarding.page.awaitingConfirmation.subtitle": "Wysłaliśmy do Ciebie wiadomość e-mail na adres {{emailAddress}} z linkiem potwierdzającym. Proszę sprawdzić, czy poniższy kod bezpieczeństwa jest zgodny z tym w wiadomości e-mail.", "view-livechat-analytics_description": "Uprawnienie do przeglądania live chat analytics", "view-livechat-appearance": "Zobacz wygląd omnichannel", "view-livechat-appearance_description": "Uprawnienie do podglądu wyglądu livechat", @@ -5172,9 +5163,9 @@ "You": "ty", "You_reacted_with": "Zareagowałeś z {{emoji}}", "Users_reacted_with": "{{users}} zareagowali z {{emoji}}", - "Users_and_more_reacted_with": "__users__ i __count__ więcej zareagowali z __emoji__", + "Users_and_more_reacted_with": "{{users}} i {{count}} więcej zareagowali z {{emoji}}", "You_and_users_Reacted_with": "Ty i {{users}} zareagowali z {{emoji}}", - "You_users_and_more_Reacted_with": "Ty, __users__ i __count__ więcej zareagowali z __emoji__", + "You_users_and_more_Reacted_with": "Ty, {{users}} i {{count}} więcej zareagowali z {{emoji}}", "You_are_converting_team_to_channel": "Przekształcasz ten zespół w kanał.", "you_are_in_preview_mode_of": "Jesteś w trybie podglądu kanału # {{room_name}}", "you_are_in_preview_mode_of_incoming_livechat": "Jesteś w trybie podglądu wiadomości przychodzącej livechat", @@ -5271,11 +5262,10 @@ "onboarding.component.form.action.skip": "Pomiń ten krok", "onboarding.component.form.action.register": "Rejestracja", "onboarding.component.form.action.confirm": "Potwierdź", + "onboarding.component.form.action.pasteHere": "Wklej tutaj...", "onboarding.component.form.termsAndConditions": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności.", "onboarding.component.emailCodeFallback": "Nie otrzymałeś emaila? <1>Wyślij ponownie lub <3>Zmień e-mail.", - "onboarding.page.form.title": "<1> Uruchom <1> swoją przestrzeń roboczą", - "onboarding.page.awaitingConfirmation.title": "Oczekuje na potwierdzenie", - "onboarding.page.awaitingConfirmation.subtitle": "Wysłaliśmy do Ciebie wiadomość e-mail na adres {{emailAddress}} z linkiem potwierdzającym. Proszę sprawdzić, czy poniższy kod bezpieczeństwa jest zgodny z tym w wiadomości e-mail.", + "onboarding.page.form.title": "Uruchom swoją przestrzeń roboczą", "onboarding.page.emailConfirmed.title": "Email potwierdzony!", "onboarding.page.emailConfirmed.subtitle": "Możesz wrócić do swojej aplikacji Rocket.Chat - uruchomiliśmy już Twój obszar roboczy.", "onboarding.page.checkYourEmail.title": "Sprawdź swój email", @@ -5311,6 +5301,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Hasło", "onboarding.form.adminInfoForm.fields.password.placeholder": "Utwórz hasło", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Informuj mnie o aktualizacjach Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "Oczekuje na potwierdzenie", "onboarding.form.organizationInfoForm.title": "Informacje o organizacji", "onboarding.form.organizationInfoForm.subtitle": "Prosimy, bądź z nami. Te informacje pomogą nam spersonalizować Twoje miejsce pracy.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nazwa organizacji", @@ -5323,6 +5314,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Wybór", "onboarding.form.organizationInfoForm.fields.country.label": "Kraj", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Wybór", + "onboarding.form.registerOfflineForm.title": "Zarejestruj się w trybie offline", "onboarding.form.registeredServerForm.title": "Zarejestruj swój serwer", "onboarding.form.registeredServerForm.included.push": "Powiadomienia mobilne push", "onboarding.form.registeredServerForm.included.externalProviders": "Integracja z zewnętrznymi dostawcami (WhatsApp, Facebook, Telegram, Twitter)", @@ -5349,5 +5341,8 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mail konta w chmurze", "RegisterWorkspace_Syncing_Complete": "Synchronizacja zakończona", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności." + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności.", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "Analityka", + "UpgradeToGetMore_auditing_Title": "Audyt wiadomości" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index 9b671868f506..64e6cb127e94 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -457,6 +457,7 @@ "App_Details": "Detalhes do aplicativo", "App_Info": "Informação do aplicativo", "App_Information": "Informações do aplicativo", + "Apps_context_enterprise": "Enterprise", "App_Installation": "Instalação do aplicativo", "App_status_auto_enabled": "Habilitado", "App_status_constructed": "Criado", @@ -480,7 +481,6 @@ "Apply": "Aplicar", "Apply_and_refresh_all_clients": "Aplicar e atualizar todos os clientes", "Apps": "Aplicativos", - "Apps_context_enterprise": "Enterprise", "Apps_context_installed": "Instalado", "Apps_Engine_Version": "Versão do mecanismo de aplicativos", "Apps_Essential_Alert": "Este aplicativo é essencial para os seguintes eventos:", @@ -880,8 +880,6 @@ "Close": "Fechar", "Close_chat": "Fechar conversa", "Close_room_description": "Você está prestes a fechar esta conversa. Você tem certeza de que deseja continuar?", - "Close_to_seat_limit_banner_warning": "*Você tem [{{seats}}] lugares vagos* \nEste espaço de trabalho está próximo do seu limite de lugares. Assim que o limite for atingido, não poderão ser adicionados novos membros. *[Solicitar mais lugares]({{url}})*", - "Close_to_seat_limit_warning": "Novos membros não podem ser criados, pois o limite de lugares foi atingido.", "close-livechat-room": "Fechar sala omnichannel", "close-livechat-room_description": "Permissão para fechar a sala Omnichannel atual", "Close_menu": "Fechar menu", @@ -915,8 +913,6 @@ "Cloud_register_offline_finish_helper": "Após concluir o processo de registro no console da nuvem, você será apresentado a um texto. Cole-o aqui para finalizar o registro.", "Cloud_register_offline_helper": "Os espaços de trabalho podem ser registrados manualmente caso estejam esgotados ou acesso à rede seja restrito. Copie o texto abaixo e vá até nossa Cloud Console para concluir o processo.", "Cloud_register_success": "Seu espaço de trabalho foi registrado com sucesso!", - "Cloud_registration_pending_html": "Notificações móveis não funcionarão até que o registro seja finalizado. Saiba mais", - "Cloud_registration_pending_title": "Registro na nuvem ainda está pendente", "Cloud_registration_required": "Registro solicitado", "Cloud_registration_required_description": "Parece que durante a configuração você optou por não registrar seu espaço de trabalho.", "Cloud_registration_required_link_text": "Clique aqui para registrar seu espaço de trabalho.", @@ -1535,7 +1531,7 @@ "E2E_Encryption_Password_Explanation": "Agora você pode criar grupos privados criptografados e mensagens diretas. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E.", "E2E_key_reset_email": "Notificação de redefinição de chave E2E", "E2E_password_request_text": "Para acessar seus grupos privados e mensagens diretas criptografados, insira sua senha de criptografia.
Você precisa digitar essa senha para codificar / decodificar suas mensagens em todos os clientes que você usa, já que a chave não está armazenada no servidor.", - "E2E_password_reveal_text": "Agora você pode criar grupos privados e mensagens diretas criptografados. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E. Saiba mais aqui!

Sua senha é: %s

Esta é uma senha gerada automaticamente, você pode configurar uma nova senha para sua chave de criptografia a qualquer momento, a partir de qualquer navegador onde utilizou a senha existente.
Esta senha só é armazenada neste navegador até que você armazene a senha e feche esta mensagem.", + "E2E_password_reveal_text": "Agora você pode criar grupos privados e mensagens diretas criptografados. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E. Saiba mais aqui!

Sua senha é: {{randomPassword}}

Esta é uma senha gerada automaticamente, você pode configurar uma nova senha para sua chave de criptografia a qualquer momento, a partir de qualquer navegador onde utilizou a senha existente.
Esta senha só é armazenada neste navegador até que você armazene a senha e feche esta mensagem.", "E2E_Reset_Email_Content": "Você foi desconectado automaticamente. Quando você fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online. Devido à natureza da criptografia E2E, o Rocket.Chat não será capaz de restaurar acesso a qualquer sala criptografada que não tenha nenhum membro online.", "E2E_Reset_Key_Explanation": "Esta opção removerá sua chave E2E atual e o desconectará.
Quando você fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online.
Devido à natureza da criptografia E2E, o Rocket.Chat não poderá restaurar acesso a qualquer sala criptografada que não tenha algum membro online.", "E2E_Reset_Other_Key_Warning": "Redefinir a chave E2E atual vai desconectar o usuário. Quando o usuário fizer login novamente, o Rocket.Chat vai gerar uma nova chave e restaurar seu acesso a qualquer sala criptografada que tenha um ou mais membros online. Devido à natureza da criptografia E2E, o Rocket.Chat não será capaz de restaurar acesso a qualquer sala criptografada que não tenha nenhum membro online.", @@ -1618,6 +1614,8 @@ "email_style_description": "Evite seletores aninhados", "email_style_label": "Estilo do e-mail", "Email_subject": "Assunto do e-mail", + "Enterprise_License": "Licença Enterprise", + "Enterprise_License_Description": "Se você registrou seu espaço de trabalho e a licença foi fornecida pela Rocket.Chat Cloud, você não precisará atualizar a licença manualmente aqui.", "Email_verified": "E-mail verificado", "Email_sent": "E-mail enviado", "Emoji": "Emoji", @@ -1669,9 +1667,6 @@ "Enter_Normal": "Modo normal (enviar com Enter)", "Enter_to": "Enter para", "Enter_your_E2E_password": "Digite sua senha E2E", - "Enterprise": "Enterprise", - "Enterprise_License": "Licença Enterprise", - "Enterprise_License_Description": "Se você registrou seu espaço de trabalho e a licença foi fornecida pela Rocket.Chat Cloud, você não precisará atualizar a licença manualmente aqui.", "Entertainment": "Entretenimento", "Error": "Erro", "Error_404": "Erro 404", @@ -1693,7 +1688,7 @@ "error-avatar-invalid-url": "URL inválido de avatar: {{url}}", "error-avatar-url-handling": "Erro durante o manuseio configuração avatar a partir de uma URL ({{url}}) para {{username}}", "error-business-hours-are-closed": "Horário de expediente fechado", - "error-blocked-username": "{{field}} está bloqueado e não pode ser usado!", + "error-blocked-username": "**{{field}}** está bloqueado e não pode ser usado!", "error-canned-response-not-found": "Resposta modelo não encontrada", "error-cannot-delete-app-user": "Excluir um usuário de aplicativo não é permitido, desinstale o app correspondente para removê-lo.", "error-cant-invite-for-direct-room": "Não é possível convidar usuários para salas diretas", @@ -1829,6 +1824,7 @@ "error-no-permission-team-channel": "Você não tem permissão para incluir este canal à equipe", "error-no-owner-channel": "Apenas proprietários podem adicionar este canal à equipe", "error-you-are-last-owner": "Você é o último proprietário da sala. Defina um novo proprietário antes de sair.", + "error-cannot-place-chat-on-hold": "Você não pode colocar a conversa em espera", "Errors_and_Warnings": "Erros e avisos", "Esc_to": "Esc para", "Estimated_wait_time": "Tempo estimado de espera (tempo em minutos)", @@ -2032,6 +2028,7 @@ "Forgot_Password_Email": "Clique aqui para redefinir sua senha.", "Forgot_Password_Email_Subject": "[Site_Name] - Recuperar Senha", "Forgot_password_section": "Esqueceu senha", + "Hold_EE_only": "Pausar (Enterprise Edition only)", "Forward": "Encaminhar", "Forward_chat": "Encaminhar conversa", "Forward_to_department": "Encaminhar ao departamento", @@ -2122,7 +2119,6 @@ "History": "Histórico", "Hold_Time": "Tempo de espera", "Hold": "Pausar", - "Hold_EE_only": "Pausar (Enterprise Edition only)", "Home": "Início", "Host": "Host", "Hospitality_Businness": "Hospitalidade", @@ -2622,7 +2618,7 @@ "leave-c_description": "Permissão para deixar canais", "leave-p": "Deixar grupos privados", "leave-p_description": "Permissão para deixar grupos privados", - "Lets_get_you_new_one": "Vamos pegar outro!", + "Lets_get_you_new_one_": "Vamos pegar outro!", "List_of_Channels": "Lista de Canais", "List_of_departments_for_forward": "Lista de departamentos permitidos para encaminhamento (opcional).", "List_of_departments_for_forward_description": "Permite definir uma lista restrita de departamentos que podem receber conversas deste departamento.", @@ -2634,7 +2630,9 @@ "Livechat_agents": "Agentes do omnichannel", "Livechat_Agents": "Agentes", "Livechat_allow_manual_on_hold": "Permitir que agentes coloquem a conversa em espera manualmente", - "Livechat_allow_manual_on_hold_Description": "Se habilitado, o agente terá uma nova opção para colocar a conversa em espera, desde que o agente tenha enviado a última mensagem", + "Livechat_allow_manual_on_hold_Description": "Se habilitado, o agente terá uma nova opção para colocar a conversa em espera", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only": "Conversas em espera somente após interação do agente", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only_Description": "Permitir que conversas sejam colocados em espera apenas quando o agente for quem enviou a última mensagem", "Livechat_AllowedDomainsList": "Domínios permitidos em Livechat", "Livechat_Appearance": "Aparência do livechat", "Livechat_auto_close_on_hold_chats_custom_message": "Mensagem personalizada para conversas encerradas na fila em espera", @@ -3474,7 +3472,6 @@ "Random": "Aleatória", "Rate_Limiter_Limit_RegisterUser": "Número padrão de chamadas para o limitador de taxa para os endpoints de registro de usuário", "Rate_Limiter_Limit_RegisterUser_Description": "Número de chamadas padrão para as endpoints de registro de usuário (API REST e real-time), permitido dentro do intervalo de tempo na seção Limitação de Taxa de API.", - "Reached_seat_limit_banner_warning": "*Não há mais lugares disponíveis* \nEste espaço de trabalho atingiu o seu limite de lugares, portanto nenhum membro poderá entrar. *[Solicitar mais lugares]({{url}})*", "React_when_read_only": "Permitir reação", "React_when_read_only_changed_successfully": "Permitir reação quando somente leitura foi alterada com sucesso", "Reacted_with": "Reagiu com", @@ -3569,11 +3566,6 @@ "Report_this_message_question_mark": "Denunciar esta mensagem?", "Reporting": "Relatórios", "Request": "Solicitar", - "Request_seats": "Solicitar lugares", - "Request_more_seats": "Solicitar mais lugares.", - "Request_more_seats_out_of_seats": "Você não pode adicionar membros porque este espaço de trabalho está sem lugares; solicite mais lugares.", - "Request_more_seats_sales_team": "Assim que sua solicitação for enviada, nossa equipe de vendas vai analisá-la e entrará em contato nos próximos dias.", - "Request_more_seats_title": "Solicitar mais lugares", "Request_comment_when_closing_conversation": "Solicitar comentário ao encerrar a conversa", "Request_comment_when_closing_conversation_description": "Se ativado, o agente precisará informar um comentário antes que a conversa seja encerrada.", "Request_tag_before_closing_chat": "Solicitar tag(s) antes de encerrar a conversa", @@ -3694,6 +3686,7 @@ "Room_password_changed_successfully": "A senha da sala foi alterada com sucesso", "room_removed_read_only": "Permissão de escrita adicionada à sala por {{user_by}}", "room_set_read_only": "Sala definida como somente leitura por {{user_by}}", + "Room_Status_Open": "Aberto", "Room_topic_changed_successfully": "Tópico da sala alterado com sucesso", "Room_type_changed_successfully": "Tipo de sala alterado com sucesso", "Room_type_of_default_rooms_cant_be_changed": "Esta é uma sala padrão e o tipo não pode ser alterado; consulte o seu administrador.", @@ -3833,6 +3826,7 @@ "Security": "Segurança", "See_full_profile": "Ver perfil completo", "See_on_Engagement_Dashboard": "Ver no painel de engajamento", + "Select": "Selecionar", "Select_a_department": "Selecione um departamento", "Select_a_room": "Selecione uma sala", "Select_a_user": "Selecione um usuário", @@ -4118,6 +4112,7 @@ "Take_it": "Pegue!", "Taken_at": "Atribuído em", "Talk_Time": "Tempo de conversa", + "Talk_to_your_workspace_admin_to_address_this_issue": "Converse com o admin do seu workspace para resolver esse problema", "Target user not allowed to receive messages": "Usuário de destino não autorizado a receber mensagens", "TargetRoom": "Sala de destino", "TargetRoom_Description": "A sala à qual as mensagens serão enviadas, que é o resultado de disparar este evento. Somente uma sala de destino é permitida e deve existir.", @@ -4185,8 +4180,12 @@ "Teams_Search_teams": "Pesquisar equipes", "Teams_New_Read_only_Label": "Somente leitura", "Technology_Services": "Serviços tecnológicos", + "Upgrade_tab_connection_error_description": "Parece que você não está com conexão com a internet. Isso pode ser porque sua workspace está instalada num servidor totalmente seguro sem acesso à internet", "Terms": "Termos", + "Upgrade_tab_connection_error_restore": "Restaure sua conexão para aprender sobre funcionalidades que você está perdendo", "Test_Connection": "Testar conexão", + "Upgrade_tab_go_fully_featured": "Obtenha todos os recursos", + "Upgrade_tab_trial_guide": "Guia de teste", "Test_Desktop_Notifications": "Testar notificações da área de trabalho", "Test_LDAP_Search": "Testar pesquisa do LDAP", "test-admin-options": "Testar opções no painel administrativo como login LDAP e push notifications", @@ -4210,6 +4209,7 @@ "The_user_s_will_be_removed_from_role_s": "O usuário %s será removido da função %s", "The_user_will_be_removed_from_s": "O usuário será removido de %s", "The_user_wont_be_able_to_type_in_s": "O usuário não poderá escrever em %s", + "The_workspace_has_exceeded_the_monthly_limit_of_active_contacts": "O workspace excedeu o limite mensal de contatos ativos", "Theme": "Tema", "theme-color-attention-color": "Cor de atenção", "theme-color-component-color": "Cor do componente", @@ -4455,10 +4455,6 @@ "Update_to_version": "Atualizado para {{version}}", "Update_your_RocketChat": "Atualize seu Rocket.Chat", "Updated_at": "Atualizado em", - "Upgrade_tab_connection_error_description": "Parece que você não está com conexão com a internet. Isso pode ser porque sua workspace está instalada num servidor totalmente seguro sem acesso à internet", - "Upgrade_tab_connection_error_restore": "Restaure sua conexão para aprender sobre funcionalidades que você está perdendo", - "Upgrade_tab_go_fully_featured": "Obtenha todos os recursos", - "Upgrade_tab_trial_guide": "Guia de teste", "Upgrade_tab_upgrade_your_plan": "Faça upgrade no seu plano", "Upload": "Upload", "Uploads": "Uploads", @@ -4652,6 +4648,7 @@ "view-l-room": "Ver salas de omnichannel", "view-l-room_description": "Permissão para ver salas de omnichannel", "view-livechat-analytics": "Ver a análise do omnichannel", + "onboarding.page.awaitingConfirmation.subtitle": "Enviamos um e-mail para {{emailAddress}} com um link de confirmação. Verifique se o código de segurança abaixo coincide com o do e-mail.", "view-livechat-analytics_description": "Permissão para ver análise do livechat", "view-livechat-appearance": "Ver aparência do omnichannel", "view-livechat-appearance_description": "Permissão para ver aparência do livechat", @@ -4905,11 +4902,10 @@ "onboarding.component.form.action.skip": "Pular essa etapa", "onboarding.component.form.action.register": "Registrar", "onboarding.component.form.action.confirm": "Confirmar", + "onboarding.component.form.action.pasteHere": "Cole aqui...", "onboarding.component.form.termsAndConditions": "Eu concordo com os <1>Termos e condições e a <3>Política de privacidade", "onboarding.component.emailCodeFallback": "Não recebeu e-mail? <1>Reenviar ou <3>Alterar e-mail", - "onboarding.page.form.title": "Vamos <1>Iniciar seu espaço de trabalho", - "onboarding.page.awaitingConfirmation.title": "Aguardando confirmação", - "onboarding.page.awaitingConfirmation.subtitle": "Enviamos um e-mail para {{emailAddress}} com um link de confirmação. Verifique se o código de segurança abaixo coincide com o do e-mail.", + "onboarding.page.form.title": "Vamos iniciar seu espaço de trabalho", "onboarding.page.emailConfirmed.title": "E-mail confirmado!", "onboarding.page.emailConfirmed.subtitle": "Você pode retornar para seu aplicativo Rocket.Chat - nós já iniciamos seu espaço de trabalho.", "onboarding.page.checkYourEmail.title": "Verifique seu e-mail", @@ -4945,6 +4941,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Senha", "onboarding.form.adminInfoForm.fields.password.placeholder": "Criar senha", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Mantenha-me informado sobre as atualizações do Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "Aguardando confirmação", "onboarding.form.organizationInfoForm.title": "Informações da organização", "onboarding.form.organizationInfoForm.subtitle": "Tenha paciência conosco. Estas informações nos ajudarão a personalizar seu espaço de trabalho.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Nome da organização", @@ -4957,6 +4954,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Selecionar", "onboarding.form.organizationInfoForm.fields.country.label": "País", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Selecionar", + "onboarding.form.registerOfflineForm.title": "Registrar offline", "onboarding.form.registeredServerForm.title": "Registre seu servidor", "onboarding.form.registeredServerForm.included.push": "Notificações push móveis", "onboarding.form.registeredServerForm.included.externalProviders": "Integração com provedores externos (WhatsApp, Facebook, Telegram, Twitter)", @@ -4978,5 +4976,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "Marketplace", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mail da conta da nuvem", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Eu concordo com os <1>Termos e condições e a <3>Política de privacidade" -} + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Eu concordo com os <1>Termos e condições e a <3>Política de privacidade", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", + "UpgradeToGetMore_auditing_Title": "Auditoria de mensagem" +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json index e31b0d86bb0f..9bc920849c8c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -1095,7 +1095,7 @@ "E2E_Enabled": "E2E activado", "E2E_Encryption_Password_Explanation": "Agora você pode criar grupos privados criptografados e mensagens diretas. Você também pode alterar os grupos privados ou DMs existentes para criptografados.

Esta é uma criptografia de ponta a ponta, logo a chave para codificar / decodificar suas mensagens não será salva no servidor. Por esse motivo, você precisa armazenar sua senha em algum lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a criptografia E2E.", "E2E_password_request_text": "Para acessar seus grupos privados e mensagens diretas criptografados , insira sua senha de criptografia.
Você precisa digitar essa senha para codificar / decodificar suas mensagens em todos os clientes que você usa, já que a chave não está armazenada no servidor.", - "E2E_password_reveal_text": "Agora pode criar grupos privados ou mensagens diretas encriptadas. Pode também alterar os grupos privados ou DMs existentes para encriptados.

Esta é uma encriptação de ponta a ponta, logo a chave para codificar / decodificar as suas mensagens não será salva no servidor. Por este motivo, precisa guardar a sua senha num lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a encriptação E2E. Saiba mais aqui!

A sua senha és: %s

Esta é uma senha gerada automaticamente, pode configurar uma nova senha para sua chave encriptada a qualquer momento e a partir de qualquer browser onde utilizou a senha existente.
Esta senha só é guardada neste browser até fechar esta mensagem.", + "E2E_password_reveal_text": "Agora pode criar grupos privados ou mensagens diretas encriptadas. Pode também alterar os grupos privados ou DMs existentes para encriptados.

Esta é uma encriptação de ponta a ponta, logo a chave para codificar / decodificar as suas mensagens não será salva no servidor. Por este motivo, precisa guardar a sua senha num lugar seguro. Será solicitada a inserção de senha em outros dispositivos nos quais deseja usar a encriptação E2E. Saiba mais aqui!

A sua senha és: {{randomPassword}}

Esta é uma senha gerada automaticamente, pode configurar uma nova senha para sua chave encriptada a qualquer momento e a partir de qualquer browser onde utilizou a senha existente.
Esta senha só é guardada neste browser até fechar esta mensagem.", "Edit": "Editar", "Edit_Custom_Field": "Editar campo personalizado", "Edit_Department": "Editar departamento", @@ -1172,7 +1172,6 @@ "Enter_Normal": "Modo normal (enviar com Enter)", "Enter_to": "Clique ( Enter )para", "Enter_your_E2E_password": "Digite sua senha E2E", - "Enterprise": "Empreendimento", "Entertainment": "Entretenimento", "Error": "Erro", "Error_404": "Erro:404", @@ -1281,6 +1280,7 @@ "error-user-registration-disabled": "O registo de utilizadores está desabilitado", "error-user-registration-secret": "O registo de utilizadores só é permitido via URL privada", "error-you-are-last-owner": "É o último proprietário da sala. Por favor defina um novo proprietário antes de sair.", + "error-cannot-place-chat-on-hold": "Você não pode colocar a conversa em espera", "Errors_and_Warnings": "Erros e Avisos", "Esc_to": "Prima Esc para", "Event_Trigger": "Gerador de Eventos", @@ -1803,7 +1803,7 @@ "Leave_the_current_channel": "Sai deste canal", "leave-c": "Sair dos canais", "leave-p": "Sair dos grupos privados", - "Lets_get_you_new_one": "Vamos pegar uma nova!", + "Lets_get_you_new_one_": "Vamos pegar uma nova!", "List_of_Channels": "Lista de Canais", "List_of_Direct_Messages": "Lista de Mensagens Diretas", "Livechat": "Livechat", @@ -3173,5 +3173,7 @@ "registration.component.form.reasonToJoin": "Razão para se juntar", "registration.component.form.invalidConfirmPass": "A confirmação da senha não é igual à senha", "registration.component.form.confirmPassword": "Confirmar a senha", - "registration.component.form.sendConfirmationEmail": "Enviar email de confirmação" + "registration.component.form.sendConfirmationEmail": "Enviar email de confirmação", + "Enterprise": "Empreendimento", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json index 9f1326ebca11..8a966903515c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json @@ -974,7 +974,6 @@ "Enter_name_here": "Introdu numele aici", "Enter_Normal": "Modul normal (trimiteți cu Enter)", "Enter_to": "Enter pentru a", - "Enterprise": "Afacere", "Entertainment": "Divertisment", "Error": "Eroare", "Error_404": "Eroare 404", @@ -2752,5 +2751,7 @@ "registration.component.form.reasonToJoin": "Motivul de a te alătura", "registration.component.form.invalidConfirmPass": "Confirmarea parolei nu se potrivește cu parola introdusă", "registration.component.form.confirmPassword": "Confirmați parola", - "registration.component.form.sendConfirmationEmail": "Trimite email de confirmare" + "registration.component.form.sendConfirmationEmail": "Trimite email de confirmare", + "Enterprise": "Afacere", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json index 4870bd05c337..6f96e4abd83c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -471,6 +471,7 @@ "App_Details": "Сведения о приложении", "App_Info": "Информация о приложении", "App_Information": "Информация о приложении", + "Apps_context_enterprise": "Организация", "App_Installation": "Установка приложения", "App_not_enabled": "Приложение не включено", "App_not_found": "Приложение не найдено", @@ -480,6 +481,7 @@ "App_status_error_disabled": "Отключено: неизвестная ошибка", "App_status_initialized": "Инициализировано", "App_status_invalid_license_disabled": "Отключено: недействительная лицензия", + "Apps_disabled_when_Enterprise_trial_ended": "Приложения отключены по окончании пробной версии Enterprise", "App_status_invalid_settings_disabled": "Отключено: требуется конфигурация", "App_status_manually_disabled": "Отключено: вручную", "App_status_manually_enabled": "Включено", @@ -497,7 +499,6 @@ "Apply": "Подать заявление", "Apply_and_refresh_all_clients": "Применить", "Apps": "Приложения", - "Apps_context_enterprise": "Организация", "Apps_context_installed": "Установлен", "Apps_context_requested": "Запрошено", "Apps_context_private": "Приватные приложения", @@ -506,7 +507,6 @@ "Private_Apps_Count_Enabled": "{{counter}} приватное приложение включено", "Private_Apps_Count_Enabled_plural": "{{counter}} приватных приложений включено", "Apps_Count_Enabled_tooltip": "В рабочих пространствах Community Edition можно использовать до {{number}} {{context}} приложений", - "Apps_disabled_when_Enterprise_trial_ended": "Приложения отключены по окончании пробной версии Enterprise", "Apps_Engine_Version": "Версия движка приложений", "Apps_Essential_Alert": "Это приложение необходимо для следующих событий:", "Apps_Essential_Disclaimer": "Перечисленные выше события будут прерваны, если это приложение будет отключено. Если вы хотите, чтобы Rocket.Chat работал без функциональности этого приложения, вам необходимо его удалить", @@ -768,6 +768,7 @@ "Broadcasting_media_server_url": "URL-адрес трансляционного медиа-сервера", "Browse_Files": "Просмотр файлов", "Browser_does_not_support_audio_element": "Ваш браузер не поддерживает звуковой элемент.", + "Call_number_enterprise_only": "Вызов номера (Только для ЕЕ)", "Browser_does_not_support_video_element": "Ваш браузер не поддерживает видео элемент.", "Browser_does_not_support_recording_video": "Ваш браузер не поддерживает запись видео", "Bugsnag_api_key": "Ключ Bugsnag API", @@ -803,7 +804,6 @@ "Call_provider": "Поставщик вызовов", "Call_Already_Ended": "Вызов уже завершен", "Call_number": "Вызов номера", - "Call_number_enterprise_only": "Вызов номера (Только для ЕЕ)", "call-management": "Управление вызовами", "call-management_description": "Разрешение на начало собрания", "Call_ongoing": "Звонок продолжается", @@ -939,8 +939,6 @@ "Close": "Закрыть", "Close_chat": "Закрыть чат", "Close_room_description": "Вы собираетесь закрыть этот чат. Вы уверены, что хотите продолжить?", - "Close_to_seat_limit_banner_warning": "*Мест осталось: [{{seats}}]* \nОграничение на количество мест в этом рабочем пространстве скоро будет достигнуто. После достижения ограничения добавление новых пользователей станет невозможным. *[Запросить дополнительные места]({{url}})*", - "Close_to_seat_limit_warning": "Создание новых участников невозможно после достижения ограничения на количество мест.", "close-livechat-room": "Закрыть комнату Livechat ", "close-livechat-room_description": "Разрешение на закрытие текущего чата LiveChat", "Close_menu": "Закрыть меню", @@ -974,8 +972,6 @@ "Cloud_register_offline_finish_helper": "После завершения процесса регистрации в Cloud Console вам должен быть представлен некоторый текст. Пожалуйста, вставьте его здесь, чтобы закончить регистрацию.", "Cloud_register_offline_helper": "Рабочие места могут быть зарегистрированы вручную, если доступ в сеть ограничен. Скопируйте текст ниже и перейдите в нашу Cloud Console, чтобы завершить процесс.", "Cloud_register_success": "Ваше рабочее место успешно зарегистрировано!", - "Cloud_registration_pending_html": "Мобильные уведомления не будут работать до тех пор, пока не будет завершена регистрация. Узнайте больше ", - "Cloud_registration_pending_title": "Регистрация в облаке еще не завершена", "Cloud_registration_required": "Требуется регистрация", "Cloud_registration_required_description": "Похоже, что во время установки вы не решили регистрировать свое рабочее пространство.", "Cloud_registration_required_link_text": "Нажмите здесь, чтобы зарегистрировать ваше рабочее пространство.", @@ -1622,7 +1618,7 @@ "E2E_Encryption_Password_Explanation": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно хранить ваш пароль где-то в безопасности. Вам потребуется ввести его на других устройствах, на которых вы хотите использовать шифрование e2e.", "E2E_key_reset_email": "Уведомление о сбросе ключа E2E", "E2E_password_request_text": "Чтобы получить доступ к вашим зашифрованным частным группам и прямым сообщениям, введите пароль шифрования.
Вам необходимо ввести этот пароль для кодирования / декодирования ваших сообщений на каждом используемом вами клиенте, поскольку ключ не хранится на сервере.", - "E2E_password_reveal_text": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно сохранить этот пароль где-то в безопасности. Вам потребуется ввести его на другие устройства, на которых вы хотите использовать шифрование e2e. Подробнее здесь

Ваш пароль: %s

Это автоматический сгенерированный пароль, Вы можете установить новый пароль для шифрования в любое время из любого браузера вы ввели существующий пароль.
Этот пароль хранится только в этом браузере, пока вы не сохраните пароль и не отпустите это сообщение.", + "E2E_password_reveal_text": "Теперь вы можете создавать зашифрованные частные группы и прямые сообщения. Вы также можете изменить существующие частные группы или DM на зашифрованные.

Это шифрование от конца до конца, поэтому ключ для кодирования / декодирования ваших сообщений не будет сохранен на сервере. По этой причине вам нужно сохранить этот пароль где-то в безопасности. Вам потребуется ввести его на другие устройства, на которых вы хотите использовать шифрование e2e. Подробнее здесь

Ваш пароль: {{randomPassword}}

Это автоматический сгенерированный пароль, Вы можете установить новый пароль для шифрования в любое время из любого браузера вы ввели существующий пароль.
Этот пароль хранится только в этом браузере, пока вы не сохраните пароль и не отпустите это сообщение.", "E2E_Reset_Email_Content": "Для вас был осуществлен автоматический выход из системы. При повторном входе в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ пользователя в любой зашифрованный чат, в котором есть один или несколько пользователей в сети. В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любому зашифрованному чату, в котором нет участников онлайн.", "E2E_Reset_Key_Explanation": "Эта опция удалит ваш текущий ключ E2E и выйдет из системы.
При повторном входе в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ к любой зашифрованной комнате, в которой есть один или несколько пользователей в сети.
В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любой зашифрованной комнате, в которой нет пользователей в сети.", "E2E_Reset_Other_Key_Warning": "Сброс текущего ключа E2E приведет к выходу пользователя из системы. При повторном входе пользователя в систему Rocket.Chat сгенерирует новый ключ и восстановит доступ пользователя в любой зашифрованный чат в котором есть один или несколько пользователей в сети. В связи с особенностями шифрования E2E, Rocket.Chat не сможет восстановить доступ к любому зашифрованному чату, в котором нет участников онлайн.", @@ -1705,7 +1701,10 @@ "email_plain_text_only": "Отправлять только обычные текстовые сообщения", "email_style_description": "Избегать вложенных селекторов", "email_style_label": "Стиль электронной почты", + "Enterprise_Description": "Вручную обновите лицензию Enterprise.", "Email_subject": "Тема", + "Enterprise_License": "Корпоративная лицензия", + "Enterprise_License_Description": "Если ваше рабочее пространство зарегистрировано и лицензия предоставлена Rocket.Chat Cloud, вам не нужно вручную обновлять лицензию здесь.", "Email_verified": "Адрес электронной почты подтверждён", "Email_sent": "Письмо отправлено", "Emoji": "Эмодзи ", @@ -1759,10 +1758,6 @@ "Enter_Normal": "Обычный режим (отправка по Enter)", "Enter_to": "Войти в", "Enter_your_E2E_password": "Введите пароль E2E", - "Enterprise": "Корпорация", - "Enterprise_Description": "Вручную обновите лицензию Enterprise.", - "Enterprise_License": "Корпоративная лицензия", - "Enterprise_License_Description": "Если ваше рабочее пространство зарегистрировано и лицензия предоставлена Rocket.Chat Cloud, вам не нужно вручную обновлять лицензию здесь.", "Entertainment": "Развлечения", "Error": "Ошибка", "Error_something_went_wrong": "Ой! Что-то пошло не так. Пожалуйста, перезагрузите страницу или обратитесь к администратору.", @@ -1785,7 +1780,7 @@ "error-avatar-invalid-url": "Неверный URL аватара: {{url}}", "error-avatar-url-handling": "Ошибка установки аватара из URL ({{url}}) для {{username}}", "error-business-hours-are-closed": "Рабочие часы окончены", - "error-blocked-username": "{{field}} запрещен к использованию!", + "error-blocked-username": "**{{field}}** запрещен к использованию!", "error-canned-response-not-found": "Заготовленный ответ не найден", "error-cannot-delete-app-user": "Удаление пользователя приложения не разрешено, удалите соответствующее приложение, чтобы удалить его.", "error-cant-add-federated-users": "Невозможно добавить федеративных пользователей в нефедеративный чат", @@ -2074,6 +2069,7 @@ "FileUpload_S3_Proxy_Avatars_Description": "Передача файлов прокси-сервера через ваш сервер вместо прямого доступа к URL-адресу ресурса", "FileUpload_S3_Proxy_Uploads": "Загрузка прокси", "FileUpload_S3_Proxy_Uploads_Description": "Передача файлов прокси-сервера через ваш сервер вместо прямого доступа к URL-адресу актива", + "Hold_Call_EE_only": "Удержание вызова (Только для ЕЕ)", "FileUpload_S3_Region": "Регион", "FileUpload_S3_SignatureVersion": "Версия подписи", "FileUpload_S3_URLExpiryTimeSpan": "Время истечения срока действия URL-адресов", @@ -2167,7 +2163,6 @@ "Global_Search": "Общий поиск", "Go_to_your_workspace": "Перейти в рабочее пространство", "Hold_Call": "Удерживать вызов", - "Hold_Call_EE_only": "Удержание вызова (Только для ЕЕ)", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "Учетная запись ключа JSON файла. Больше информации можно найти здесь [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Идентификатор Google Tag Manager ", @@ -2715,7 +2710,7 @@ "leave-c_description": "Разрешение покидать каналы", "leave-p": "Оставить личные группы", "leave-p_description": "Разрешение покидать приватные группы", - "Lets_get_you_new_one": "Давайте получим новый!", + "Lets_get_you_new_one_": "Давайте получим новый!", "License": "Лицензия", "List_of_Channels": "Список чатов", "List_of_departments_for_forward": "Список департаментов, разрешенных к перенаправлению (необязательно)", @@ -3030,6 +3025,7 @@ "Message_HideType_subscription_role_removed": "Скрыть сообщения \"Роль больше не определена\"", "Message_HideType_uj": "Не показывать сообщение \"Пользователь присоединился к чату\"", "Message_HideType_ujt": "Скрыть сообщения \"Пользователь присоединился к рабочей группе\"", + "New_Call_Enterprise_Edition_Only": "Новый звонок (Только для ЕЕ)", "Message_HideType_ul": "Не показывать сообщение \"Пользователь покинул чат\"", "Message_HideType_ult": "Скрыть сообщения \"Пользователь вышел из рабочей группы\"", "Message_HideType_user_added_room_to_team": "Скрыть сообщения \"Пользователь добавил комнату в рабочую группу\"", @@ -3160,7 +3156,6 @@ "New_Application": "Новое приложение", "New_Business_Hour": "Новые рабочие часы", "New_Call": "Новый звонок", - "New_Call_Enterprise_Edition_Only": "Новый звонок (Только для ЕЕ)", "New_chat_in_queue": "Новый чат в очереди", "New_chat_priority": "Приоритет изменен: {{user}} изменил приоритет на {{priority}}", "New_chat_transfer": "Новый чат-трансфер: {{transfer}}", @@ -3566,7 +3561,6 @@ "Random": "Случайный", "Rate_Limiter_Limit_RegisterUser": "Звонки с номера по умолчанию на ограничитель скорости для регистрации пользователя", "Rate_Limiter_Limit_RegisterUser_Description": "Количество вызовов по умолчанию для регистрации конечных точек пользователем (API REST и API реального времени), разрешенных в пределах временного диапазона, указанного в разделе \"Ограничение частоты запросов к API\".", - "Reached_seat_limit_banner_warning": "*Больше нет доступных рабочих мест* \nВ этом рабочем пространстве достигнуто ограничение по количеству мест, поэтому новые участники не смогут присоединиться. *[Запросить дополнительные рабочие места]({{url}})*", "React_when_read_only": "Разрешить реакции", "React_when_read_only_changed_successfully": "Разрешение на реакции при включенном режиме только для чтения изменено", "Reacted_with": "Реагирует с", @@ -3659,11 +3653,6 @@ "Report_this_message_question_mark": "Сообщить об этом сообщении?", "Reporting": "Сбор статистики", "Request": "Запрос", - "Request_seats": "Запросить рабочие места", - "Request_more_seats": "Запросите дополнительные рабочие места.", - "Request_more_seats_out_of_seats": "Вы не сможете добавить участников, так как в этом рабочем пространстве закончились места. Запросите дополнительные рабочие места.", - "Request_more_seats_sales_team": "После отправки запроса наши специалисты из отдела продаж рассмотрят его и свяжутся с вами в течение следующих нескольких дней.", - "Request_more_seats_title": "Запросить дополнительные рабочие места", "Request_comment_when_closing_conversation": "Запросить комментарий при закрытии разговора", "Request_comment_when_closing_conversation_description": "Если эта функция включена, то перед закрытием разговора агенту необходимо будет задать комментарий.", "Request_tag_before_closing_chat": "Запросить метки до закрытия разговора", @@ -3852,8 +3841,8 @@ "SAML_LogoutRequest_Template": "Шаблон запроса на выход из системы", "SAML_LogoutRequest_Template_Description": "Доступны следующие переменные: \n- **\\_\\_\\_newId\\_\\_**: Случайно сгенерированная строка идентификатора \n- **\\_\\_\\_\\_стоянная\\_\\_**: Текущая метка времени \n- **\\_\\_idpSLORedirectURL\\_\\_**: URL IDP Single LogOut для перенаправления. \n- **\\_\\_\\_\\_issuer\\_\\_**: Значение параметра {{Custom Issuer}}. \n- **\\_\\_identifierFormat\\_\\_**: Значение параметра __Формат идентификатора__. \n- **\\_\\_\\_\\_nameID\\_\\_\\_**: Идентификатор имени, полученный от IdP, когда пользователь вошел в систему. \n- **\\_\\_sessionIndex\\_\\_**: Индекс сессии, полученный от IdP, когда пользователь вошел в систему.", "SAML_LogoutResponse_Template": "Шаблон выхода из системы", - "SAML_LogoutResponse_Template_Description": "Доступны следующие переменные: \n- **__newId__**: Случайно сгенерированная идентификационная строка \n- **__inResponseToId__**: Идентификатор запроса на выход из системы, полученный от IdP \n- **instant_**: Текущая метка времени \n- **__idpSLORedirectURL__**: URL одиночного входа в систему IDP для переадресации. \n- **issuer_**: Значение параметра {{Custom Issuer}}. \n- **{{identifierFormat}}**: Значение параметра {{Identifier Format}}. \n- **__nameID___**: Идентификатор имени, полученный из запроса на выход из системы IdP. \n- **__sessionIndex__**: СессияИндекс, полученный из запроса на выход из системы IdP.", - "SAML_Metadata_Certificate_Template_Description": "Доступны следующие переменные: \n- **__certificate__**: Частный сертификат для шифрования утверждения.", + "SAML_LogoutResponse_Template_Description": "Доступны следующие переменные: \n- **\\_\\_newId\\_\\_**: Случайно сгенерированная идентификационная строка \n- **\\_\\_inResponseToId\\_\\_**: Идентификатор запроса на выход из системы, полученный от IdP \n- **\\_\\_instant\\_\\_**: Текущая метка времени \n- **\\_\\_idpSLORedirectURL\\_\\_**: URL одиночного входа в систему IDP для переадресации. \n- **\\_\\_issuer\\_\\_**: Значение параметра {{Custom Issuer}}. \n- **\\_\\_identifierFormat\\_\\_**: Значение параметра {{Identifier Format}}. \n- **\\_\\_nameID\\_\\_**: Идентификатор имени, полученный из запроса на выход из системы IdP. \n- **\\_\\_sessionIndex\\_\\_**: СессияИндекс, полученный из запроса на выход из системы IdP.", + "SAML_Metadata_Certificate_Template_Description": "Доступны следующие переменные: \n- **\\_\\_certificate\\_\\_**: Частный сертификат для шифрования утверждения.", "SAML_Metadata_Template": "Шаблон метаданных", "SAML_Metadata_Template_Description": "Доступны следующие переменные: \n- **\\_\\_sloLocation\\_\\_**:URL одиночного входа в систему Rocket.Chat. \n- **\\__\\issuer\\__\\_**: Значение параметра {{Custom Issuer}}. \n- **\\_\\_identifierFormat\\_\\_**: Значение параметра {{Identifier Format}}. \n- **\\__\\certificateTag\\__\\_**: Если настроен личный сертификат, он будет включать {{Metadata Certificate Template}}, в противном случае он будет проигнорирован. \n- **\\__\\callbackUrl\\__\\_**: URL обратного вызова Rocket.Chat.", "SAML_MetadataCertificate_Template": "Шаблон сертификата метаданных", @@ -3920,6 +3909,7 @@ "See_documentation": "Открыть документацию", "See_full_profile": "Смотреть полный профиль", "See_on_Engagement_Dashboard": "Смотри на панели взаимодействия", + "Select": "Выбрать", "Select_a_department": "Выберите отдел", "Select_a_room": "Выберите чат", "Select_a_user": "Выберите пользователя", @@ -4280,8 +4270,12 @@ "Teams_Search_teams": "Поиск Команд", "Teams_New_Read_only_Label": "Только для чтения", "Technology_Services": "Технологические услуги", + "Upgrade_tab_connection_error_description": "Кажется у вас нет подключения к интернету. Это возможно потому, что ваш воркспейс развернут на полностью защищенном изолированном сервере.", "Terms": "Условия", + "Upgrade_tab_connection_error_restore": "Восстановите подключение, чтобы узнать у всех возможностях, которые вы упускаете.", "Test_Connection": "Проверка соединения", + "Upgrade_tab_go_fully_featured": "Полнофункциональная версия", + "Upgrade_tab_trial_guide": "Руководство по пробному периоду", "Test_Desktop_Notifications": "Тест десктопных уведомлений", "Test_LDAP_Search": "Проверить поиск по LDAP", "test-admin-options": "Проверка настроек административной панели таких как вход по LDAP и мобильные уведомления", @@ -4546,10 +4540,6 @@ "Update_to_version": "Обновить до {{version}}", "Update_your_RocketChat": "Обновите ваш Rocket.Chat", "Updated_at": "Обновлено в", - "Upgrade_tab_connection_error_description": "Кажется у вас нет подключения к интернету. Это возможно потому, что ваш воркспейс развернут на полностью защищенном изолированном сервере.", - "Upgrade_tab_connection_error_restore": "Восстановите подключение, чтобы узнать у всех возможностях, которые вы упускаете.", - "Upgrade_tab_go_fully_featured": "Полнофункциональная версия", - "Upgrade_tab_trial_guide": "Руководство по пробному периоду", "Upgrade_tab_upgrade_your_plan": "Улучшить ваш план", "Upload": "Загрузить", "Uploads": "Загрузки", @@ -4759,6 +4749,7 @@ "view-l-room": "Просматривать LiveChat комнаты", "view-l-room_description": "Разрешение на просмотр LiveChat комнат", "view-livechat-analytics": "Просмотр Livechat Analytics", + "onboarding.page.awaitingConfirmation.subtitle": "Мы отправили вам электронное письмо по адресу {{emailAddress}} со ссылкой для подтверждения. Убедитесь, что указанный ниже код безопасности совпадает с кодом, указанным в письме.", "view-livechat-analytics_description": "Разрешение на просмотр аналитики Livechat", "view-livechat-appearance": "Просмотр внешний вид Omnichannel", "view-livechat-appearance_description": "Разрешение на просмотр внешнего вида Livechat", @@ -5008,11 +4999,10 @@ "onboarding.component.form.action.skip": "Пропустить этот шаг", "onboarding.component.form.action.register": "Зарегистрироваться", "onboarding.component.form.action.confirm": "Подтвердить", + "onboarding.component.form.action.pasteHere": "Вставить сюда...", "onboarding.component.form.termsAndConditions": "Я принимаю <1>Положения и условия и <3>Политику конфиденциальности", "onboarding.component.emailCodeFallback": "Не получили электронное письмо? <1>Отправить повторно или <3>Изменить адрес электронной почты", - "onboarding.page.form.title": "<1>Запустим ваше рабочее пространство", - "onboarding.page.awaitingConfirmation.title": "Ожидает подтверждения", - "onboarding.page.awaitingConfirmation.subtitle": "Мы отправили вам электронное письмо по адресу {{emailAddress}} со ссылкой для подтверждения. Убедитесь, что указанный ниже код безопасности совпадает с кодом, указанным в письме.", + "onboarding.page.form.title": "Запустим ваше рабочее пространство", "onboarding.page.emailConfirmed.title": "Адрес электронной почты подтвержден!", "onboarding.page.emailConfirmed.subtitle": "Вы можете вернуться в приложение Rocket.Chat — мы уже запустили ваше рабочее пространство.", "onboarding.page.checkYourEmail.title": "Проверьте адрес электронной почты", @@ -5048,6 +5038,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Пароль", "onboarding.form.adminInfoForm.fields.password.placeholder": "Создать пароль", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Сообщайте мне информацию об обновлениях Rocket.Chat", + "onboarding.form.awaitConfirmationForm.title": "Ожидает подтверждения", "onboarding.form.organizationInfoForm.title": "Информация об организации", "onboarding.form.organizationInfoForm.subtitle": "Оставайтесь с нами. Эта информация поможет нам персонализировать ваше рабочее пространство", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Название организации", @@ -5060,6 +5051,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Выбрать", "onboarding.form.organizationInfoForm.fields.country.label": "Страна", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Выбрать", + "onboarding.form.registerOfflineForm.title": "Зарегистрироваться вручную", "onboarding.form.registeredServerForm.title": "Зарегистрируйте сервер", "onboarding.form.registeredServerForm.included.push": "Push-уведомления на мобильных устройствах", "onboarding.form.registeredServerForm.included.externalProviders": "Интеграция с внешними поставщиками (WhatsApp, Facebook, Telegram, Twitter)", @@ -5092,5 +5084,8 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Настройки Omnichannel", "RegisterWorkspace_Setup_Label": "Адрес электронной почты учетной записи в облаке", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Я принимаю <1>Положения и условия и <3>Политику конфиденциальности", - "Theme_Appearence": "Внешний вид" + "Theme_Appearence": "Внешний вид", + "Enterprise": "Корпорация", + "UpgradeToGetMore_engagement-dashboard_Title": "Аналитика", + "UpgradeToGetMore_auditing_Title": "Аудит сообщений" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json index dd4830288374..b3062bd2787a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json @@ -959,6 +959,7 @@ "Email_Placeholder": "Prosím, zadajte svoju e-mailovú adresu...", "Email_Placeholder_any": "Zadajte e-mailové adresy ...", "Email_subject": "predmet", + "Enterprise_License": "Enterprise licencia", "Email_verified": "E-mail bol overený", "Emoji": "Emoji", "EmojiCustomFilesystem": "Vlastný súborový systém Emoji", @@ -981,8 +982,6 @@ "Enter_name_here": "Tu zadajte názov", "Enter_Normal": "Normálny režim (odoslať pomocou Enter)", "Enter_to": "Zadajte do", - "Enterprise": "podnik", - "Enterprise_License": "Enterprise licencia", "Entertainment": "zábava", "Error": "Chyba", "Error_404": "Chyba: 404", @@ -2762,5 +2761,7 @@ "registration.component.form.reasonToJoin": "Dôvod pripojenia", "registration.component.form.invalidConfirmPass": "Potvrdenie hesla sa nezhoduje s heslom", "registration.component.form.confirmPassword": "Potvrďte svoje heslo", - "registration.component.form.sendConfirmationEmail": "Pošlite potvrdzovací e-mail" + "registration.component.form.sendConfirmationEmail": "Pošlite potvrdzovací e-mail", + "Enterprise": "podnik", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytika" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json index fb52e11295fe..d36f64dee4a8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json @@ -970,7 +970,6 @@ "Enter_name_here": "Vnesite ime tukaj", "Enter_Normal": "Navadni način (pošljite s tipko enter)", "Enter_to": "Enter za", - "Enterprise": "Podjetje", "Entertainment": "Zabava", "Error": "Napaka", "Error_404": "Napaka: 404", @@ -2742,5 +2741,7 @@ "registration.component.form.reasonToJoin": "Razlog za pridružitev", "registration.component.form.invalidConfirmPass": "Potrditev gesla se ne ujema z geslom", "registration.component.form.confirmPassword": "Potrdi geslo", - "registration.component.form.sendConfirmationEmail": "Pošlji potrditveno e-poštno sporočilo" + "registration.component.form.sendConfirmationEmail": "Pošlji potrditveno e-poštno sporočilo", + "Enterprise": "Podjetje", + "UpgradeToGetMore_engagement-dashboard_Title": "Analiza" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json index fdb85c4fe51b..8754bcdf3ea4 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json @@ -974,7 +974,6 @@ "Enter_name_here": "Shkruani emrin këtu", "Enter_Normal": "Modaliteti normal (dërgoni me Enter)", "Enter_to": "Enter për të", - "Enterprise": "Ndërmarrje", "Entertainment": "argëtim", "Error": "gabim", "Error_404": "Error: 404", @@ -2753,5 +2752,7 @@ "registration.component.form.reasonToJoin": "Arsyeja për t'u bashkuar", "registration.component.form.invalidConfirmPass": "Konfirmimi Fjalëkalimi nuk përputhet me fjalëkalimin", "registration.component.form.confirmPassword": "Konfirmoni fjalëkalimin tuaj", - "registration.component.form.sendConfirmationEmail": "Dërgo email konfirmimi" + "registration.component.form.sendConfirmationEmail": "Dërgo email konfirmimi", + "Enterprise": "Ndërmarrje", + "UpgradeToGetMore_engagement-dashboard_Title": "Analitikë" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json index 73a4e9f57c4e..629b20286646 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json @@ -883,7 +883,6 @@ "Enter_name_here": "Овде унесите име", "Enter_Normal": "Нормални режим (пошаљи са Ентер)", "Enter_to": "Ентер да", - "Enterprise": "Предузеће", "Entertainment": "Забава", "Error": "Грешка", "Error_404": "Грешка: 404", @@ -2563,5 +2562,7 @@ "registration.component.form.reasonToJoin": "Разлог за придруживање", "registration.component.form.invalidConfirmPass": "Потврдна лозинка се не поклапа са лозинком", "registration.component.form.confirmPassword": "Потврдите лозинку", - "registration.component.form.sendConfirmationEmail": "Пошаљи потврдну поруку" + "registration.component.form.sendConfirmationEmail": "Пошаљи потврдну поруку", + "Enterprise": "Предузеће", + "UpgradeToGetMore_engagement-dashboard_Title": "Аналитика" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json index 51fb0ab8fc02..4c33e371214d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -1,5 +1,6 @@ { "500": "Internt serverfel", + "__agents__agents_and__count__conversations__period__": "{{agents}} agenter och {{count}} konversationer, {{period}}", "__count__empty_rooms_will_be_removed_automatically": "{{count}} tomma rum tas bort automatiskt.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} tomma rum tas bort automatiskt:
{{rooms}}.", "__count__message_pruned": "{{counter}} meddelande rensat", @@ -471,6 +472,7 @@ "App_Details": "Appdetaljer", "App_Info": "Appinfo", "App_Information": "Appinformation", + "Apps_context_enterprise": "Enterprise", "App_Installation": "Appinstallation", "App_not_enabled": "Appen är inte aktiverad", "App_not_found": "Hittar inte appen", @@ -480,6 +482,7 @@ "App_status_error_disabled": "Inaktiverad: Okänt fel", "App_status_initialized": "initierad", "App_status_invalid_license_disabled": "Inaktiverad: Ogiltig licens", + "Apps_disabled_when_Enterprise_trial_ended": "Appar inaktiverade när Enterprise trial avslutades", "App_status_invalid_settings_disabled": "Inaktiverad: Konfiguration behövs", "App_status_manually_disabled": "Inaktiverad: manuellt", "App_status_manually_enabled": "Aktiverad", @@ -498,18 +501,16 @@ "Apply_and_refresh_all_clients": "Tillämpa och uppdatera alla klienter", "Apps": "Appar", "Apps_context_explore": "Utforska", - "Apps_context_enterprise": "Enterprise", "Apps_context_installed": "Installerad", - "Apps_context_requested": "Begärt", + "Apps_context_requested": "Förfrågningar", "Apps_context_private": "Privata appar", "Apps_Count_Enabled": "{{counter}} app aktiverad", "Apps_Count_Enabled_plural": "{{counter}} appar aktiverade", "Private_Apps_Count_Enabled": "{{counter}} privat app aktiverad", "Private_Apps_Count_Enabled_plural": "{{counter}} privata appar aktiverade", "Apps_Count_Enabled_tooltip": "Arbetsytorna i Community Edition kan aktivera upp till {{number}} {{context}} appar", - "Apps_disabled_when_Enterprise_trial_ended": "Appar inaktiverade när Enterprise trial avslutades", - "Apps_disabled_when_Enterprise_trial_ended_description": "Arbetsytorna i Community Edition kan ha upp till 5 marknadsplatsappar och 3 privata appar aktiverade. Be din arbetsrumsadministratör att återaktivera appar.", - "Apps_disabled_when_Enterprise_trial_ended_description_admin": "Arbetsytorna i Community Edition kan ha upp till 5 marknadsplatsappar och 3 privata appar aktiverade. Återaktivera de appar du behöver.", + "Apps_disabled_when_Premium_trial_ended_description": "Arbetsytorna i Community Edition kan ha upp till 5 marknadsplatsappar och 3 privata appar aktiverade. Be din arbetsrumsadministratör att återaktivera appar.", + "Apps_disabled_when_Premium_trial_ended_description_admin": "Arbetsytorna i Community Edition kan ha upp till 5 marknadsplatsappar och 3 privata appar aktiverade. Återaktivera de appar du behöver.", "Apps_Engine_Version": "App Engine-version", "Apps_Essential_Alert": "Den här appen behövs för följande händelser:", "Apps_Essential_Disclaimer": "De händelser som anges ovan avbryts om appen inaktiveras. Vill du använda Rocket.Chat utan den här appens funktioner måste du avinstallera den", @@ -782,6 +783,7 @@ "Broadcasting_media_server_url": "URL till medieserver för sändning", "Browse_Files": "Bläddra bland filer", "Browser_does_not_support_audio_element": "Webbläsaren har inte stöd för ljudkomponenten.", + "Call_number_enterprise_only": "Ring upp nummer (endast Enterprise Edition)", "Browser_does_not_support_video_element": "Webbläsaren har inte stöd för videokomponenten.", "Browser_does_not_support_recording_video": "Webbläsaren har inte stöd för videoinspelning", "Bugsnag_api_key": "Bugsnag API-nyckel", @@ -821,7 +823,6 @@ "Call_provider": "Samtalsleverantör", "Call_Already_Ended": "Samtalet har redan avslutats", "Call_number": "Ring upp nummer", - "Call_number_enterprise_only": "Ring upp nummer (endast Enterprise Edition)", "call-management": "Samtalshantering", "call-management_description": "Behörighet att starta ett möte", "Call_ongoing": "Samtal pågår", @@ -966,8 +967,6 @@ "Close": "Stäng", "Close_chat": "Stäng chatt", "Close_room_description": "Du håller på att stänga chatten. Vill du fortsätta?", - "Close_to_seat_limit_banner_warning": "*Du har [{{seats}}] platser kvar* \nArbetsytans användarlicenser är nästan slut. När gränsen har uppnåtts kan inga nya medlemmar läggas till. *[Begär fler användarlicenser]({{url}})*", - "Close_to_seat_limit_warning": "Du kan inte lägga till fler användare när gränsen för användare har uppnåtts.", "close-livechat-room": "Stäng Omnichannel-rum \n", "close-livechat-room_description": "Behörighet att stänga den aktuella Omnichannel-kanalen", "Close_menu": "Stäng meny", @@ -1005,8 +1004,6 @@ "Cloud_register_offline_finish_helper": "När du har slutfört registreringen i molnkonsolen ska text visas för dig. Klistra in den här för att slutföra registreringen.", "Cloud_register_offline_helper": "Arbetsytor kan registreras manuellt om nätverket är airgap-skyddat eller om nätverksåtkomsten är begränsad. Kopiera texten nedan och gå till molnkonsolen för att slutföra processen.", "Cloud_register_success": "Arbetsytan har registrerats.", - "Cloud_registration_pending_html": "Pushmeddelanden kan inte användas förrän registreringen är slutförd. Mer information", - "Cloud_registration_pending_title": "Molnregistreringen är fortfarande inte slutförd", "Cloud_registration_required": "Registrering krävs", "Cloud_registration_required_description": "Du verkar inte ha valt att registrera din arbetsyta under konfigurationen.", "Cloud_registration_required_link_text": "Klicka här för att registrera arbetsytan.", @@ -1498,7 +1495,6 @@ "Delete_message": "Ta bort meddelande", "Delete_my_account": "Radera mitt konto", "Delete_Role_Warning": "När du tar bort en roll tas den bort permanent. Du kan inte ångra åtgärden.", - "Delete_Role_Warning_Community_Edition": "Detta kan inte göras ogjort. Observera att det inte är möjligt att skapa nya anpassade roller i Community Edition", "Delete_Room_Warning": "Om man raderar ett rum, raderas alla postade meddelanden i det rummet. Denna åtgärd kan inte ångras.", "Delete_User_Warning": "Radering av en användare kommer att radera alla meddelanden från den användaren. Detta kan inte ångras.", "Delete_User_Warning_Delete": "Radering av en användare kommer att radera alla meddelanden från den användaren. Detta kan inte ångras.", @@ -1693,7 +1689,7 @@ "E2E_key_reset_email": "Meddelande om återställning av E2E-nyckel", "E2E_message_encrypted_placeholder": "Det här meddelandet är end-to-end-krypterat. Vill du visa det måste du ange din krypteringsnyckel i kontoinställningarna.", "E2E_password_request_text": "Ange krypteringslösenordet för att komma åt dina krypterade privata grupper och direktmeddelanden.
Du måste ange det här lösenordet för att koda/avkoda dina meddelanden på varje klient du använder eftersom nyckeln inte lagras i servern.", - "E2E_password_reveal_text": "Nu kan du skapa krypterade privata grupper och direktmeddelanden. Du kan också kryptera befintliga privata grupper och direktmeddelanden.

Det här görs med end-to-end-kryptering, så nyckeln för att koda/avkoda meddelanden sparas inte på servern. Därför behöver du spara lösenordet på en säker plats. Du måste ange det på andra enheter du vill använda end-to-end-kryptering på. Du hittar mer information här.

Ditt lösenord är: %s

Det här är ett automatiskt genererat lösenord. Du kan när som helst ställa in ett nytt lösenord för krypteringsnyckeln via en webbläsare i vilken du angett det befintliga lösenordet.
Lösenordet sparas bara i den här webbläsaren tills du har lagrat lösenordet och stänger det här meddelandet.", + "E2E_password_reveal_text": "Nu kan du skapa krypterade privata grupper och direktmeddelanden. Du kan också kryptera befintliga privata grupper och direktmeddelanden.

Det här görs med end-to-end-kryptering, så nyckeln för att koda/avkoda meddelanden sparas inte på servern. Därför behöver du spara lösenordet på en säker plats. Du måste ange det på andra enheter du vill använda end-to-end-kryptering på. Du hittar mer information här.

Ditt lösenord är: {{randomPassword}}

Det här är ett automatiskt genererat lösenord. Du kan när som helst ställa in ett nytt lösenord för krypteringsnyckeln via en webbläsare i vilken du angett det befintliga lösenordet.
Lösenordet sparas bara i den här webbläsaren tills du har lagrat lösenordet och stänger det här meddelandet.", "E2E_Reset_Email_Content": "Du har loggats ut. När du loggar in igen genererar Rocket.Chat en ny nyckel och återställer din åtkomst till de krypterade rum som har en eller flera medlemmar online. På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomsten till krypterade rum utan användare som är online.", "E2E_Reset_Key_Explanation": "Med det här alternativet tas din aktuella E2E-nyckel bort och du loggas ut.
När du loggar in igen genererar Rocket.Chat en ny nyckel och återställer din åtkomst till de krypterade rum som har en eller flera medlemmar online.
På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomsten till krypterade rum utan användare som är online.", "E2E_Reset_Other_Key_Warning": "Om du återställer den aktuella E2E-nyckeln loggas användaren ut. När användaren loggar in igen genererar Rocket.Chat en ny nyckel och återställer användarens åtkomst till krypterade rum som har en eller flera medlemmar online. På grund av hur E2E-kryptering fungerar kan Rocket.Chat inte återställa åtkomst till krypterade rum som inte har användare som är online.", @@ -1782,13 +1778,21 @@ "Email_notification_show_message": "Visa meddelande i e-postavisering", "Email_Notifications_Change_Disabled": "Rocket.Chat-administratören har inaktiverat e-postaviseringar", "Email_or_username": "Epost eller användarnamn", + "Enterprise_capability": "Enterprise-funktioner", "Email_Placeholder": "Skriv in din e-postadress...", + "Enterprise_capabilities": "Enterprise-funktioner", "Email_Placeholder_any": "Ange e-postadresser...", "email_plain_text_only": "Skicka bara e-postmeddelanden med oformaterad text", + "Enterprise_Departments_description_upgrade": "Arbetsytorna i Community Edition kan bara skapa en avdelning. Uppgradera till Enterprise för att ta bort begränsningar och ge ditt arbetsområde mer kraft.", + "Enterprise_Departments_description_free_trial": "Arbetsytorna i Community Edition kan skapa en avdelning. Starta en kostnadsfri testversion för Enterprise för att skapa flera avdelningar idag!", "email_style_description": "Undvik kapslade väljare", "email_style_label": "E-postformat", + "Enterprise_Description": "Uppdatera Enterprise-licensen manuellt.", "Email_subject": "Ämne", + "Enterprise_License": "Enterprise-licens", + "Enterprise_License_Description": "Om din arbetsyta är registrerad och en licens har tillhandahållits av Rocket.Chat-molnet behöver du inte uppdatera licensen manuellt här.", "Email_verified": "E-post verifierad", + "Enterprise_Only": "Endast Enterprise", "Email_sent": "E-postmeddelandet har skickats", "Emoji": "Emoji", "EmojiCustomFilesystem": "Anpassat emoji-filsystem", @@ -1848,16 +1852,7 @@ "Enter_your_E2E_password": "Ange ditt E2E-lösenord", "Enter_your_password_to_delete_your_account": "Ange ditt lösenord för att radera ditt konto. Detta kan inte göras ogjort.", "Enter_your_username_to_delete_your_account": "Ange ditt användarnamn för att radera ditt konto. Detta kan inte göras ogjort.", - "Enterprise": "Enterprise", - "Enterprise_capability": "Enterprise-funktioner", - "Enterprise_capabilities": "Enterprise-funktioner", - "Enterprise_Departments_title": "Tilldela kunder till köer och förbättra agenternas produktivitet", - "Enterprise_Departments_description_upgrade": "Arbetsytorna i Community Edition kan bara skapa en avdelning. Uppgradera till Enterprise för att ta bort begränsningar och ge ditt arbetsområde mer kraft.", - "Enterprise_Departments_description_free_trial": "Arbetsytorna i Community Edition kan skapa en avdelning. Starta en kostnadsfri testversion för Enterprise för att skapa flera avdelningar idag!", - "Enterprise_Description": "Uppdatera Enterprise-licensen manuellt.", - "Enterprise_License": "Enterprise-licens", - "Enterprise_License_Description": "Om din arbetsyta är registrerad och en licens har tillhandahållits av Rocket.Chat-molnet behöver du inte uppdatera licensen manuellt här.", - "Enterprise_Only": "Endast Enterprise", + "Premium_Departments_title": "Tilldela kunder till köer och förbättra agenternas produktivitet", "Entertainment": "Underhållning", "Error": "Fel", "Error_something_went_wrong": "Ojdå! Något gick fel. Läs in sidan igen eller kontakta en administratör.", @@ -1880,7 +1875,7 @@ "error-avatar-invalid-url": "Ogiltig avatar-URL: {{url}}", "error-avatar-url-handling": "Fel vid hantering av avatarinställning från en URL ({{url}}) för {{username}}", "error-business-hours-are-closed": "Kontorstiden är slut", - "error-blocked-username": "{{field}} är låst och kan inte användas.", + "error-blocked-username": "**{{field}}** är låst och kan inte användas.", "error-canned-response-not-found": "Standardsvaret hittades inte", "error-cannot-delete-app-user": "Det är inte tillåtet att ta bort appanvändaren. Avinstallera den motsvarande appen om du vill ta bort användaren.", "error-cant-add-federated-users": "Kan inte lägga till samordnade användare i ett icke federerat rum", @@ -1932,6 +1927,7 @@ "error-invalid-email-address": "Ogiltig e-postadress", "error-invalid-email-inbox": "Ogiltig inkorg för e-post", "error-email-inbox-not-found": "Inkorgen för e-post hittades inte", + "error-this-is-an-ee-feature": "Det här är en funktion för Enterprise Edition", "error-invalid-file-height": "Felaktig filhöjd", "error-invalid-file-type": "Felaktig filtyp", "error-invalid-file-width": "Felaktig filbredd", @@ -2006,7 +2002,6 @@ "error-tags-must-be-assigned-before-closing-chat": "Taggar måste tilldelas innan chatten stängs", "error-the-field-is-required": "Fältet {{field}} krävs.", "error-this-is-not-a-livechat-room": "Detta är inte ett Omnichannel-rum", - "error-this-is-an-ee-feature": "Det här är en funktion för Enterprise Edition", "error-token-already-exists": "Det finns redan en token med det namnet", "error-token-does-not-exists": "Token finns inte", "error-too-many-requests": "Fel, alltför många förfrågningar. Snälla sakta ner. Du måste vänta {{seconds}} sekunder innan du försöker igen.", @@ -2047,6 +2042,7 @@ "Exact": "Exakt", "Example_payload": "Exempel på nyttolast", "Example_s": "Exempel: %s", + "Federation_Matrix_join_public_rooms_is_enterprise": "Gå med i federerade rum är en funktion i Enterprise Edition", "except_pinned": "(förutom de som är pinnade)", "Exclude_Botnames": "Exkludera botar", "Exclude_Botnames_Description": "Sprid inte meddelanden från botar, vars namn matchar det reguljära uttrycket ovan. Om tomt kommer alla meddelanden från botar att spridas.", @@ -2139,7 +2135,6 @@ "Federation_Matrix_losing_privileges_warning": "Du kommer inte att kunna ångra denna åtgärd eftersom du degraderar dig själv. Om du är den sista privilegierade användaren kan du inte återfå dessa privilegier. Vill du fortsätta ändå?", "Federation_Matrix_not_allowed_to_change_moderator": "Du får inte ändra moderatorn", "Federation_Matrix_not_allowed_to_change_owner": "Du får inte byta ägare", - "Federation_Matrix_join_public_rooms_is_enterprise": "Gå med i federerade rum är en funktion i Enterprise Edition", "Field": "Fält", "Field_removed": "Fältet borttaget", "Field_required": "Fält krävs", @@ -2211,10 +2206,12 @@ "FileUpload_S3_BucketURL": "Bucket-URL", "FileUpload_S3_CDN": "CDN-domän för nedladdningar", "FileUpload_S3_ForcePathStyle": "Tvinga stilsökväg", + "Google_Meet_Enterprise_only": "Google Meet (endast Enterprise Edition)", "FileUpload_S3_Proxy_Avatars": "Proxyavatarer", "FileUpload_S3_Proxy_Avatars_Description": "Proxyavatar-filöverföringar via din server istället för direkt tillgång till URL", "FileUpload_S3_Proxy_Uploads": "Proxy-uppladdningar", "FileUpload_S3_Proxy_Uploads_Description": "Proxy överför filöverföringar via din server istället för direkt tillgång till tillgångens URL", + "Hold_Call_EE_only": "Parkera samtal (endast Enterprise Edition)", "FileUpload_S3_Region": "Område", "FileUpload_S3_SignatureVersion": "Signaturversion", "FileUpload_S3_URLExpiryTimeSpan": "URL-sändningstiden", @@ -2269,6 +2266,7 @@ "Forgot_Password_Email": "Klicka på här för att återställa ditt lösenord.", "Forgot_Password_Email_Subject": "[Site_Name] - Återställning av lösenord", "Forgot_password_section": "Glömt lösenord", + "Hold_EE_only": "Spärra (endast Enterprise Edition)", "Format": "Format", "Forward": "Vidarebefodra", "Forward_chat": "Vidarebefodra chatt", @@ -2312,10 +2310,8 @@ "Global_purge_override_warning": "Det finns en global policy för lagring av information. Om du inte väljer \"åsidosätt global lagringspolicy\" kan du bara tillämpa en policy som är strängare än den globala policyn.", "Global_Search": "Global sökning", "Go_to_your_workspace": "Gå till din arbetsyta", - "Google_Meet_Enterprise_only": "Google Meet (endast Enterprise Edition)", "Google_Play": "Google Play", "Hold_Call": "Parkera samtal", - "Hold_Call_EE_only": "Parkera samtal (endast Enterprise Edition)", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "JSON-fil för tjänstekontonyckel. Mer information finns [här] (https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", "GoogleTagManager_id": "Google Tag manager id", @@ -2371,7 +2367,6 @@ "History": "Historik", "Hold_Time": "Spärrtid", "Hold": "Spärra", - "Hold_EE_only": "Spärra (endast Enterprise Edition)", "Home": "Hem", "Homepage": "Hemsida", "Homepage_Custom_Content_Default_Message": "Administratörer kan lägga in html-innehåll som ska återges i detta vita utrymme.", @@ -2763,8 +2758,8 @@ "LDAP_DataSync_Advanced": "Avancerad synkronisering", "LDAP_DataSync_CustomFields": "Synkronisera anpassade fält", "LDAP_DataSync_Roles": "Synkronisera roller", - "LDAP_DataSync_Channels": "Synkronisera Channel", - "LDAP_DataSync_Teams": "Synkronisera team", + "LDAP_DataSync_Channels": "Synkronisera kanaler", + "LDAP_DataSync_Teams": "Synkronisera teams", "LDAP_Enterprise": "Enterprise", "LDAP_DataSync_BackgroundSync": "Synkronisering i bakgrunden", "LDAP_Server_Type": "Servertyp", @@ -2897,6 +2892,8 @@ "Lead_capture_email_regex": "Lead capture email regex", "Lead_capture_phone_regex": "Lead capture phone regex", "Learn_more": "Mer information", + "Learn_more_about_conversations": "Läs mer om konversationer här", + "Learn_more_about_voice_channel": "Läs mer om röstsamtal här", "Least_recent_updated": "Uppdaterades senast", "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "Ta reda på hur du kan utnyttja alla möjligheter med Rocket.Chat.", "Leave": "Lämna", @@ -2912,7 +2909,7 @@ "leave-c_description": "Behörighet att lämna kanaler", "leave-p": "Lämna privata grupper", "leave-p_description": "Tillstånd att lämna privata grupper", - "Lets_get_you_new_one": "Vi ordnar en ny.", + "Lets_get_you_new_one_": "Vi ordnar en ny.", "License": "Licens", "Line": "Linje", "Link": "Länk", @@ -3023,16 +3020,28 @@ "Load_Rotation": "Belastningsrotation", "Loading": "Läser in", "Loading_more_from_history": "Laddar mer från historiken", + "marketplace_featured_section_community_featured": "Utvalda communityappar", "Loading_suggestion": "Laddar förslag", + "marketplace_featured_section_community_supported": "Appar som stöds av communityn", "Loading...": "Laddar...", + "marketplace_featured_section_enterprise": "Utvalda Enterprise-sappar", "Local": "Lokal", + "marketplace_featured_section_featured": "Utvalda appar", + "marketplace_featured_section_most_popular": "De populäraste apparna", "Local_Domains": "Lokala domäner", + "marketplace_featured_section_new_arrivals": "Nyheter", "Local_Password": "Lokalt lösenord", + "marketplace_featured_section_popular_this_month": "Populära appar den här månaden ", "Local_Time": "Lokal tid", + "marketplace_featured_section_recommended": "Rekommenderade appar", "Local_Timezone": "Lokal tidszon", + "marketplace_featured_section_social": "Appar för sociala nätverk", "Local_Time_time": "Lokal tid: {{time}}", + "marketplace_featured_section_trending": "Trendande appar", "Localization": "Lokalisering", "Location": "Plats", + "marketplace_featured_section_omnichannel": "Omnichannel-appar", + "marketplace_featured_section_video_conferencing": "Appar för videokonferenser", "Log_Exceptions_to_Channel": "Logga undantag till kanal", "Log_Exceptions_to_Channel_Description": "En kanal som tar emot alla fångade undantag. Lämna tomma för att ignorera undantag.", "Log_File": "Visa fil och rad", @@ -3171,18 +3180,6 @@ "Marketplace_app_last_updated": "Uppdaterades senast {{lastUpdated}}", "Marketplace_view_marketplace": "Visa Marketplace", "Marketplace_error": "Det går inte att ansluta till internet eller så kanske arbetsytan är installerad offline.", - "marketplace_featured_section_community_featured": "Utvalda communityappar", - "marketplace_featured_section_community_supported": "Appar som stöds av communityn", - "marketplace_featured_section_enterprise": "Utvalda Enterprise-sappar", - "marketplace_featured_section_featured": "Utvalda appar", - "marketplace_featured_section_most_popular": "De populäraste apparna", - "marketplace_featured_section_new_arrivals": "Nyheter", - "marketplace_featured_section_popular_this_month": "Populära appar den här månaden ", - "marketplace_featured_section_recommended": "Rekommenderade appar", - "marketplace_featured_section_social": "Appar för sociala nätverk", - "marketplace_featured_section_trending": "Trendande appar", - "marketplace_featured_section_omnichannel": "Omnichannel-appar", - "marketplace_featured_section_video_conferencing": "Appar för videokonferenser", "MAU_value": "MAU {{value}}", "Max_length_is": "Max längd är %s", "Max_number_incoming_livechats_displayed": "Högsta antal objekt som visas i kön", @@ -3293,6 +3290,7 @@ "Message_HideType_subscription_role_removed": "Dölj meddelandet \"Rollen är inte definierad längre\"", "Message_HideType_uj": "Dölj meddelandet \"Användare anslöt\"", "Message_HideType_ujt": "Dölj meddelandet \"Användaren anslöt till teamet\"", + "New_Call_Enterprise_Edition_Only": "Nytt samtal (endast Enterprise Edition)", "Message_HideType_ul": "Dölj meddelanden \"Användare lämnade\"", "Message_HideType_ult": "Dölj meddelandet \"Användaren lämnade teamet\"", "Message_HideType_user_added_room_to_team": "Dölj meddelandet \"Användaren lade till rummet till teamet\"", @@ -3444,7 +3442,6 @@ "New_Application": "Ny applikation", "New_Business_Hour": "Ny kontorstid", "New_Call": "Nytt samtal", - "New_Call_Enterprise_Edition_Only": "Nytt samtal (endast Enterprise Edition)", "New_chat_in_queue": "Ny chatt i kö", "New_chat_priority": "Prioriteten har ändrats: {{user}} ändrade prioriteten till {{priority}}", "New_chat_transfer": "Ny chattöverföring: {{transfer}}", @@ -3491,6 +3488,10 @@ "No_Canned_Responses_Yet-description": "Med standardsvar kan du ge snabba och konsekventa svar på vanliga frågor.", "No_channels_in_team": "Inga kanaler i teamet", "No_channels_yet": "Du är inte med i någon kanal ännu.", + "No_chats_yet": "Inga chattar hittades", + "No_chats_yet_description": "Alla chattar kommer dyka upp här", + "No_calls_yet": "Inga samtal hittades", + "No_calls_yet_description": "Alla samtal kommer dyka upp här", "No_data_found": "Inga data hittades", "No_direct_messages_yet": "Inga direktmeddelanden.", "No_Discussions_found": "Inga diskussioner hittades", @@ -3528,6 +3529,7 @@ "None": "Ingen", "Nonprofit": "Ideellt", "Not_authorized": "Inte auktoriserad", + "Pexip_Enterprise_only": "Pexip (endast Enterprise Edition)", "Normal": "Normal", "Not_Available": "Inte tillgänglig", "Not_assigned": "Ej tilldelad", @@ -3745,7 +3747,6 @@ "Permalink": "Länka meddelande", "Permissions": "Tillstånd", "Personal_Access_Tokens": "Personliga åtkomsttokens", - "Pexip_Enterprise_only": "Pexip (endast Enterprise Edition)", "Phone": "Telefon", "Phone_call": "Telefonsamtal", "Phone_Number": "Telefonnummer", @@ -3911,7 +3912,6 @@ "Rate Limiter_Description": "Kontrollera andelen förfrågningar som skickas eller tas emot av servern för att förhindra cyberangrepp och skrapning.", "Rate_Limiter_Limit_RegisterUser": "Standardantalet anrop till begränsningen vid registrering av en användare", "Rate_Limiter_Limit_RegisterUser_Description": "Antalet standardanrop till slutpunkter för användarregistrering (REST- och realtids-API:er), som tillåts inom det tidsintervall som angetts i avsnittet för API-begränsning.", - "Reached_seat_limit_banner_warning": "*Inga fler tillgängliga användarlicenser* \nAlla arbetsytans användarlicenser används, så inga fler medlemmar kan ansluta. *[Begär fler användarlicenser]({{url}})*", "React_when_read_only": "Tillåt reaktion", "React_when_read_only_changed_successfully": "Tillåta att reagera när ändring av skrivskyddad information har lyckats", "Reacted_with": "Reagerade med", @@ -4024,18 +4024,14 @@ "Report_this_message_question_mark": "Rapportera det här meddelandet?", "Reporting": "Rapportering", "Request": "Förfrågan", - "Request_seats": "Begär användarlicenser", - "Request_more_seats": "Begär fler användarlicenser", - "Request_more_seats_out_of_seats": "Du kan inte lägga till medlemmar eftersom alla arbetsytans användarlicenser används. Begär fler användarlicenser.", - "Request_more_seats_sales_team": "När din förfrågan har skickats tittar vårt säljteam på den och hör av sig till dig inom några dagar.", - "Request_more_seats_title": "Begär fler användarlicenser", "Request_comment_when_closing_conversation": "Begär en kommentar när konversationen avslutas", "Request_comment_when_closing_conversation_description": "Om alternativet är aktiverat måste agenten ange en kommentar innan konversationen avslutas.", "Request_tag_before_closing_chat": "Begär taggar innan konversationen avslutas", "request": "förfrågan", "requests": "förfrågningar", "Requests": "Förfrågningar", - "Requested": "Förfrågat", + "Search_Enterprise_Apps": "Sök efter Enterprise-applikationer", + "Requested": "Förfrågningar", "Requested_apps_will_appear_here": "Här visas appförfrågningar", "request-pdf-transcript": "Begär PDF-utskrift", "request-pdf-transcript_description": "Tillstånd att begära en PDF-utskrift för ett visst Omnichannel-rum", @@ -4290,7 +4286,6 @@ "Search": "Sök", "Searchable": "Sökbart", "Search_Apps": "Sök efter appar", - "Search_Enterprise_Apps": "Sök efter Enterprise-applikationer", "Search_Installed_Apps": "Sök efter installerade appar", "Search_Private_apps": "Sök efter privata appar", "Search_Requested_Apps": "Sök efter efterfrågade appar", @@ -4724,9 +4719,13 @@ "Teams_Search_teams": "Sök efter team", "Teams_New_Read_only_Label": "Läs endast", "Technology_Services": "Tekniska tjänster", + "Upgrade_tab_connection_error_description": "Du verkar inte ha någon internetanslutning. Det kan bero på att din arbetsyta är installerad på en komplett skyddad server med airgap-skydd", "Terms": "Villkor", "Terms_of_use": "Användarvillkor", + "Upgrade_tab_connection_error_restore": "Upprätta anslutningen om du vill veta mer om de funktioner du går miste om.", "Test_Connection": "Testa anslutningen", + "Upgrade_tab_go_fully_featured": "Aktivera alla funktioner", + "Upgrade_tab_trial_guide": "Provperiodsguide", "Test_Desktop_Notifications": "Testa skrivbordsnotifieringar", "Test_LDAP_Search": "Testa LDAP-sökning", "test-admin-options": "Testa alternativ på administrationspanelen", @@ -5013,10 +5012,6 @@ "Update_to_version": "Uppdatera till {{version}}", "Update_your_RocketChat": "Uppdatera din Rocket.Chat", "Updated_at": "Uppdaterad den", - "Upgrade_tab_connection_error_description": "Du verkar inte ha någon internetanslutning. Det kan bero på att din arbetsyta är installerad på en komplett skyddad server med airgap-skydd", - "Upgrade_tab_connection_error_restore": "Upprätta anslutningen om du vill veta mer om de funktioner du går miste om.", - "Upgrade_tab_go_fully_featured": "Aktivera alla funktioner", - "Upgrade_tab_trial_guide": "Provperiodsguide", "Upgrade_tab_upgrade_your_plan": "Uppgradera ditt abonnemang", "Upload": "Ladda upp", "Uploads": "Uppladdningar", @@ -5264,6 +5259,7 @@ "view-full-other-user-info_description": "Tillstånd att visa fullständig profil för andra användare, inklusive datum för registrering av konto, senaste inloggning etc.", "view-history": "Se historik", "view-history_description": "Tillstånd att visa kanalhistoriken", + "onboarding.component.form.action.registerNow": "Registrera dig nu", "view-join-code": "Visa koden för deltagande", "view-join-code_description": "Tillstånd att se koden för kanalanslutning", "view-joined-room": "Visa anslutna Room", @@ -5271,6 +5267,7 @@ "view-l-room": "Visa Omnichannel Room", "view-l-room_description": "Tillstånd att visa Omnichannel-rum", "view-livechat-analytics": "Visa Omnichannel-analys", + "onboarding.page.awaitingConfirmation.subtitle": "Vi har skickat ett meddelande med en länk för att bekräfta till {{emailAddress}}. Bekräfta att säkerhetskoden nedan matchar den i e-postmeddelandet.", "view-livechat-analytics_description": "Behörighet att visa livechattanalyser", "view-livechat-appearance": "Visa Omnichannel-utseende", "view-livechat-appearance_description": "Behörighet att visa livechattutseende", @@ -5370,8 +5367,10 @@ "Wait_activation_warning": "Innan du kan logga in måste ditt konto aktiveras manuellt av en administratör.", "Waiting_for_answer": "Väntar på svar", "Waiting_queue": "Kö", + "Enterprise_cap_description": "Arbetsytorna i Community Edition för Enterprise har inget tak för närvarotjänsten.", "Waiting_queue_message": "Kömeddelande", "Waiting_queue_message_description": "Meddelande som visas för besökare när de placeras i kön", + "More_about_Enterprise_Edition": "Mer om Enterprise Edition", "Waiting_Time": "Väntetid", "Waiting_for_server_connection": "Väntar på serveranslutning", "Warning": "Varning", @@ -5437,6 +5436,7 @@ "Would_you_like_to_return_the_inquiry": "Vill du skicka tillbaka förfrågan?", "Would_you_like_to_return_the_queue": "Vill du flytta tillbaka rummet till kön? All konversationshistorik behålls för rummet.", "Would_you_like_to_place_chat_on_hold": "Vill du parkera chatten?", + "multiple_instance_solutions": "lösningar med flera instanser", "Wrap_up_the_call": "Avsluta samtalet", "Wrap_Up_Notes": "Avslutningsanteckningar", "Workspace": "Arbetsyta", @@ -5545,7 +5545,7 @@ "registration.component.login.incorrectPassword": "Felaktigt lösenord", "registration.component.switchLanguage": "Växla till <1>{{name}}", "registration.component.resetPassword": "Återställ lösenord", - "registration.component.form.emailOrUsername": "E-postadress eller lösenord", + "registration.component.form.emailOrUsername": "E-postadress eller användarnamn", "registration.component.form.username": "Användarnamn", "registration.component.form.name": "Namn", "registration.component.form.nameOptional": "Namn (valfritt)", @@ -5573,13 +5573,10 @@ "onboarding.component.form.action.next": "Nästa", "onboarding.component.form.action.skip": "Hoppa över det här steget", "onboarding.component.form.action.register": "Registrera", - "onboarding.component.form.action.registerNow": "Registrera dig nu", "onboarding.component.form.action.confirm": "Bekräfta", "onboarding.component.form.termsAndConditions": "Jag godkänner <1>villkoren och <3>integritetspolicyn", "onboarding.component.emailCodeFallback": "Fick du inget e-postmeddelande? <1>Skicka igen eller <3>ändra e-postadressen", - "onboarding.page.form.title": "Nu <1>startar vi arbetsytan", - "onboarding.page.awaitingConfirmation.title": "Väntar på bekräftelse", - "onboarding.page.awaitingConfirmation.subtitle": "Vi har skickat ett meddelande med en länk för att bekräfta till {{emailAddress}}. Bekräfta att säkerhetskoden nedan matchar den i e-postmeddelandet.", + "onboarding.page.form.title": "Nu startar vi arbetsytan", "onboarding.page.emailConfirmed.title": "E-postadressen har bekräftats.", "onboarding.page.emailConfirmed.subtitle": "Du kan gå tillbaka till Rocket.Chat-applikationen. Vi har startat din arbetsyta.", "onboarding.page.checkYourEmail.title": "Titta i inkorgen", @@ -5615,6 +5612,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "Lösenord", "onboarding.form.adminInfoForm.fields.password.placeholder": "Skapa lösenord", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Håll mig informerad om Rocket.Chat-uppdateringar", + "onboarding.form.awaitConfirmationForm.title": "Väntar på bekräftelse", "onboarding.form.organizationInfoForm.title": "Organisationsinfo", "onboarding.form.organizationInfoForm.subtitle": "Bara lite till. Vi behöver den här informationen för att anpassa din arbetsyta", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organisationsnamn", @@ -5644,7 +5642,7 @@ "Toolbox_room_actions": "Primära åtgärder i rum", "Theme_light": "Ljus", "Theme_dark": "Mörk", - "Enable_of_limit_apps_currently_enabled": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{kontext}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Inaktivera en annan {{kontex}}-app eller uppgradera till Enterprise för att aktivera den här appen.", + "Enable_of_limit_apps_currently_enabled": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Inaktivera en annan {{context}}-app eller uppgradera till Enterprise för att aktivera den här appen.", "Enable_of_limit_apps_currently_enabled_exceeded": "**{{enabled}} av {{limit}} {{context}} appar som för närvarande är aktiverade.** \n \nGränsen för apparna i gemenskapsutgåvan har överskridits. \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. \n \n**{{appName}} är inaktiverad som standard.** Du måste inaktivera minst {{exceed}} andra {{context}}-appar eller uppgradera till Enterprise för att aktivera den här appen.", "Workspaces_on_Community_edition_install_app": "Arbetsytorna i Community Edition kan ha upp till {{limit}} {{context}} appar aktiverade. Uppgradera till Enterprise för att aktivera obegränsat antal appar.", "Apps_Currently_Enabled": "{{enabled}} av {{limit}} {{context}}-appar är för närvarande aktiverade.", @@ -5682,9 +5680,7 @@ "Undo_request": "Ångra förfrågan", "No_permission": "Inget tillstånd", "Community_cap_description": "Arbetsytorna i Community Edition har ett tak på 200 samtidiga anslutningar, även om du kan ha fler anslutningar aktiva, kan du inte se användarnas status när du har nått gränsen. Detta påverkar inte deras förmåga att skicka och ta emot meddelanden.", - "Enterprise_cap_description": "Arbetsytorna i Community Edition för Enterprise har inget tak för närvarotjänsten.", "Service_status": "Status för tjänsten", - "More_about_Enterprise_Edition": "Mer om Enterprise Edition", "Presence_service_cap": "Tak för närvarotjänster", "User_Status": "Användarstatus", "Active_connections": "Aktiva anslutningar", @@ -5736,7 +5732,7 @@ "RegisterWorkspace_Token_Step_Two": "Kopiera ditt token och klistra in det nedan.", "RegisterWorkspace_with_email": "Registrera arbetsytan med e-post", "RegisterWorkspace_Setup_Subtitle": "För att registrera arbetsytan måste det associeras med ett Rocket.Chat Cloud-konto.", - "RegisterWorkspace_Setup_Steps": "Steg __steg__ av __numberOfSteps__", + "RegisterWorkspace_Setup_Steps": "Steg {{step}} av {{numberOfSteps}}", "RegisterWorkspace_Setup_Label": "E-postadress för molnkonto", "RegisterWorkspace_Setup_Have_Account_Title": "Har du ett konto?", "RegisterWorkspace_Setup_Have_Account_Subtitle": "Ange din e-postadress till Cloud-kontot för att koppla arbetsytan till ditt konto.", @@ -5750,8 +5746,9 @@ "cloud.RegisterWorkspace_Token_Step_One": "1. Gå till: <1>cloud.rocket.chat > Arbetsytor och klicka på \" <3>Register self-managed\".", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Jag godkänner <1>villkoren och <3>integritetspolicyn", "Larger_amounts_of_active_connections": "För större mängder aktiva anslutningar kan du överväga vår", - "multiple_instance_solutions": "lösningar med flera instanser", "Uninstall_grandfathered_app": "Avinstallera {{appName}}?", - "App_will_lose_grandfathered_status": "**Denna {{context}}-app kommer att förlora sin status som gammal app.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} __kontext__-appar aktiverade. Gamla appar inkluderas i gränsen, men gränsen tillämpas inte på dem.", - "Theme_Appearence": "Utseende för tema" + "App_will_lose_grandfathered_status": "**Denna {{context}}-app kommer att förlora sin status som gammal app.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} {{context}}-appar aktiverade. Gamla appar inkluderas i gränsen, men gränsen tillämpas inte på dem.", + "Theme_Appearence": "Utseende för tema", + "Enterprise": "Enterprise", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json index b1d003f0f85c..89366d9df2a0 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json @@ -974,7 +974,6 @@ "Enter_name_here": "இங்கே பெயரை உள்ளிடுக", "Enter_Normal": "இயல்பான பயன்முறை (உள்ளிடவும்)", "Enter_to": "க்கு சேர்க்கவும்", - "Enterprise": "நிறுவன", "Entertainment": "பொழுதுபோக்கு", "Error": "பிழை", "Error_404": "பிழை: 404", @@ -2525,7 +2524,7 @@ "Use_url_for_avatar": "சின்னம் URL ஐ பயன்படுத்த", "Use_User_Preferences_or_Global_Settings": "பயனர் விருப்பங்கள் அல்லது உலகளாவிய அமைப்புகள் பயன்படுத்தவும்", "User": "பயனர்", - "User__username__is_now_a_leader_of__room_name_": "பயனர் __இயக்குநர்__ இப்போது __room_name__ இன் தலைவர்", + "User__username__is_now_a_leader_of__room_name_": "பயனர் {{username}} இப்போது {{room_name}} இன் தலைவர்", "User__username__is_now_a_moderator_of__room_name_": "பயனர் {{username}} இப்போது {{room_name}} ஒரு மதிப்பீட்டாளர்", "User__username__is_now_an_owner_of__room_name_": "பயனர் {{username}} இப்போது {{room_name}} ஒரு உரிமையாளர் ஆவார்", "User__username__removed_from__room_name__leaders": "{{room_name}} தலைவர்களிடமிருந்து பயனர் {{username}} நீக்கப்பட்டது", @@ -2757,5 +2756,7 @@ "registration.component.form.reasonToJoin": "சேர காரணம்", "registration.component.form.invalidConfirmPass": "கடவுச்சொல்லை உறுதிப்படுத்தும் கடவுச்சொல் பொருந்தவில்லை", "registration.component.form.confirmPassword": "உங்கள் கடவுச்சொல்லை உறுதிப்படுத்துக", - "registration.component.form.sendConfirmationEmail": "உறுதிப்படுத்தும் மின்னஞ்சல் அனுப்பவும்" + "registration.component.form.sendConfirmationEmail": "உறுதிப்படுத்தும் மின்னஞ்சல் அனுப்பவும்", + "Enterprise": "நிறுவன", + "UpgradeToGetMore_engagement-dashboard_Title": "அனலிட்டிக்ஸ்" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json index 21b9d0e62439..e97d28e2c30b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json @@ -972,7 +972,6 @@ "Enter_name_here": "ป้อนชื่อที่นี่", "Enter_Normal": "โหมดปกติ (ส่งพร้อมด้วย Enter)", "Enter_to": "เข้าสู่", - "Enterprise": "องค์กร", "Entertainment": "การบันเทิง", "Error": "ความผิดพลาด", "Error_404": "ข้อผิดพลาด: 404", @@ -2740,5 +2739,7 @@ "registration.component.form.reasonToJoin": "เหตุผลที่เข้าร่วม", "registration.component.form.invalidConfirmPass": "การยืนยันรหัสผ่านไม่ตรงกับรหัสผ่าน", "registration.component.form.confirmPassword": "ยืนยันรหัสผ่านของคุณ", - "registration.component.form.sendConfirmationEmail": "ส่งอีเมลยืนยัน" + "registration.component.form.sendConfirmationEmail": "ส่งอีเมลยืนยัน", + "Enterprise": "องค์กร", + "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json index 77bad5262630..9f969914d5d0 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json @@ -1102,7 +1102,7 @@ "E2E_Encryption_Password_Change": "Şifreleme Parolasını Değiştir", "E2E_Encryption_Password_Explanation": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel grupları veya doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.", "E2E_password_request_text": "Şifrelenmiş özel gruplarınıza ve doğrudan iletilerinize erişmek için, şifreleme parolanızını girin.
Anahtar, sunucuda saklanmadığı için kullandığnız her istemcide iletilerinizi şifreleme/şifre çözme için bu parolayı girmeniz gerekmektedir.", - "E2E_password_reveal_text": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel gruplar ve doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.Daha fazlasını buradan öğrenin!

Şifreniz: %s

Bu otomatik oluşturulan şifredir; istediğiniz zaman mevcut şifrenizle oturum açtığınız bir tarayıcıdan şifreleme anahtarınızı yenisi ile değiştirebilirsiniz.
Bu şifre, siz saklayıncaya ve bu iletiyi reddedinceye kadar, yalnızca bu tarayıcıda saklanacaktır.", + "E2E_password_reveal_text": "Artık şifrelenmiş özel gruplar ve doğrudan iletiler oluşturabilirsiniz. Mevcut özel gruplar ve doğrudan iletileri de şifrelenmiş hale getirebilirsiniz.

Uçtan uca şifreleme ile, iletilerinizi şifreleme/şifresini çözme anahtarı sunucuda saklanmayacaktır. Bu nedenle şifrenizi güvenli bir yerde saklamanız gerekmektedir. Uçtan uca şifrelemeyi üzerinde kullanmak istediğiniz diğer aygıtta girmeniz gerekir.Daha fazlasını buradan öğrenin!

Şifreniz: {{randomPassword}}

Bu otomatik oluşturulan şifredir; istediğiniz zaman mevcut şifrenizle oturum açtığınız bir tarayıcıdan şifreleme anahtarınızı yenisi ile değiştirebilirsiniz.
Bu şifre, siz saklayıncaya ve bu iletiyi reddedinceye kadar, yalnızca bu tarayıcıda saklanacaktır.", "Edit": "Düzenle", "Edit_Custom_Field": "Düzenleme Özel Alan", "Edit_Department": "Düzenleme Bölümü", @@ -1185,7 +1185,6 @@ "Enter_Normal": "Normal mod (Enter ile gönder)", "Enter_to": "İçin girin", "Enter_your_E2E_password": "Uçtan uca şifrenizi girin", - "Enterprise": "Kuruluş", "Entertainment": "Eğlence", "Error": "Hata", "Error_404": "Hata:404", @@ -1834,7 +1833,7 @@ "Leave_the_current_channel": "Geçerli kanalı bırak", "leave-c": "Kanallardan Çık", "leave-p": "Özel Grupları Bırak", - "Lets_get_you_new_one": "Size yeni bir tane verelim!", + "Lets_get_you_new_one_": "Size yeni bir tane verelim!", "List_of_Channels": "Kanal Listesi", "List_of_Direct_Messages": "Doğrudan İletiler Listesi", "Livechat": "Canlı Görüşme", @@ -3262,5 +3261,9 @@ "registration.component.form.invalidConfirmPass": "Şifre doğrulaması şifre ile eşleşmiyor", "registration.component.form.confirmPassword": "Parolanızı onaylayın", "registration.component.form.sendConfirmationEmail": "Doğrulama e-postası gönder", - "RegisterWorkspace_Features_Omnichannel_Title": "Çoklu Kanal" + "onboarding.component.form.action.pasteHere": "Buraya yapıştırın...", + "onboarding.form.registerOfflineForm.title": "Manuel Kayıt", + "RegisterWorkspace_Features_Omnichannel_Title": "Çoklu Kanal", + "Enterprise": "Kuruluş", + "UpgradeToGetMore_engagement-dashboard_Title": "Mantıksal Analiz" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json index e8838c82a80e..57a828f92ffb 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json @@ -1242,5 +1242,6 @@ "registration.component.form.submit": "تاپشۇرۇش", "registration.component.form.invalidConfirmPass": "ئىككىنچى قېتىم كىرگۈزۈلگەن مەخپىي نومۇر بىلەن بىرىنچى قېتىم كىرگۈزۈلگىنى بىلەن ماس كەلمىدى.", "registration.component.form.confirmPassword": "مەخپىي نومۇرنى جەزملەشتۈرۈش", - "registration.component.form.sendConfirmationEmail": "جەزملەشتۈرگەن ئىلخەت يوللاندى" + "registration.component.form.sendConfirmationEmail": "جەزملەشتۈرگەن ئىلخەت يوللاندى", + "UpgradeToGetMore_engagement-dashboard_Title": "ئانالىز قىلىش" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json index 43f5ecab66a4..bc31ae328e6a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -1194,7 +1194,7 @@ "E2E_Encryption_Password_Change": "Змінити пароль шифрування", "E2E_Encryption_Password_Explanation": "Тепер ви можете створювати зашифровані приватні групи та особистіі повідомлення. Також Ви можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини Вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e.", "E2E_password_request_text": "Щоб отримати доступ до своїх зашифрованих приватних груп та особистих повідомлень, введіть пароль шифрування.
Вам потрібно ввести цей пароль, щоб кодувати / декодувати Ваші повідомлення для кожного клієнта, який Ви використовуєте, оскільки ключ не зберігається на сервері.", - "E2E_password_reveal_text": "Тепер ви можете створювати зашифровані приватні групи та прямі повідомлення. Ви також можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e. Детальніше тут

Ваш пароль: %s

Це автоматичний згенерований пароль, Ви можете встановити новий пароль для шифрування введіть будь-який час у будь-якому веб-переглядачі, який ви ввели існуючий пароль.
Цей пароль зберігається в цьому веб-переглядачі, поки ви не збережете пароль і не відхилите це повідомлення.", + "E2E_password_reveal_text": "Тепер ви можете створювати зашифровані приватні групи та прямі повідомлення. Ви також можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e. Детальніше тут

Ваш пароль: {{randomPassword}}

Це автоматичний згенерований пароль, Ви можете встановити новий пароль для шифрування введіть будь-який час у будь-якому веб-переглядачі, який ви ввели існуючий пароль.
Цей пароль зберігається в цьому веб-переглядачі, поки ви не збережете пароль і не відхилите це повідомлення.", "E2E_Reset_Key_Explanation": "Ця опція видалить ваш поточний ключ E2E і вийде з системи.
Коли ви знову ввійдете в систему, Rocket.Chat згенерує для вас новий ключ і відновить ваш доступ до усіх зашифрованих кімнати, в яких є хоча б один учасник у стані онлайн.
Rocket.Chat не зможе відновити доступ до кімнат, в яких немає онлайн жодного учасника, бо цього не дозволяє природа шифрування E2E.", "Edit": "Редагувати", "Edit_Business_Hour": "Редагування час роботи", @@ -1256,6 +1256,7 @@ "email_style_description": "Уникайте вкладених селекторів", "email_style_label": "Стиль листа", "Email_subject": "Тема", + "Enterprise_License": "Ліцензія підприємства", "Email_verified": "Електронну адресу підтверджено ", "Emoji": "Emoji", "EmojiCustomFilesystem": "Спеціальна файлова система Emoji", @@ -1289,8 +1290,6 @@ "Enter_Normal": "Нормальний режим (відправляти клавішою \"Enter\")", "Enter_to": "Ввійти в", "Enter_your_E2E_password": "Введіть свій пароль E2E", - "Enterprise": "Підприємство", - "Enterprise_License": "Ліцензія підприємства", "Entertainment": "Розваги", "Error": "Помилка", "Error_404": "Помилка: 404", @@ -3348,5 +3347,9 @@ "registration.component.form.reasonToJoin": "Причина приєднання", "registration.component.form.invalidConfirmPass": "Підтвердження пароля не збігаються пароль", "registration.component.form.confirmPassword": "Підтвердити новий пароль", - "registration.component.form.sendConfirmationEmail": "Надіслати електронною поштою підтвердження" + "registration.component.form.sendConfirmationEmail": "Надіслати електронною поштою підтвердження", + "onboarding.form.registerOfflineForm.title": "Реєстрація вручну", + "Enterprise": "Підприємство", + "UpgradeToGetMore_engagement-dashboard_Title": "Аналітика", + "UpgradeToGetMore_auditing_Title": "Аудит повідомлень" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json index 044baaa73720..88bcf754c10d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json @@ -1068,7 +1068,6 @@ "Enter_name_here": "Nhập tên ở đây", "Enter_Normal": "Chế độ thông thường (gửi kèm với Enter)", "Enter_to": "Nhập vào", - "Enterprise": "Doanh nghiệp", "Entertainment": "Giải trí", "Error": "lỗi", "Error_404": "Lỗi: 404", @@ -2851,5 +2850,7 @@ "registration.component.form.reasonToJoin": "Lý do tham gia", "registration.component.form.invalidConfirmPass": "Xác nhận mật khẩu không khớp với mật khẩu", "registration.component.form.confirmPassword": "Xác nhận mật khẩu của bạn", - "registration.component.form.sendConfirmationEmail": "Gửi email xác nhận" + "registration.component.form.sendConfirmationEmail": "Gửi email xác nhận", + "Enterprise": "Doanh nghiệp", + "UpgradeToGetMore_engagement-dashboard_Title": "phân tích" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json index 18c3d1f9548e..afeecab7fb7c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json @@ -995,7 +995,6 @@ "Enter_name_here": "在此输入姓名", "Enter_Normal": "普通模式(使用回车发送)", "Enter_to": "进入", - "Enterprise": "企业", "Entertainment": "娱乐", "Error": "错误", "Error_404": "错误:404", @@ -2772,5 +2771,7 @@ "registration.component.form.reasonToJoin": "加入的理由", "registration.component.form.invalidConfirmPass": "第二次密码输入与第一次不匹配", "registration.component.form.confirmPassword": "确认密码", - "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件" + "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件", + "Enterprise": "企业", + "UpgradeToGetMore_engagement-dashboard_Title": "分析" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json index 24dedfcf33e7..8bbb614c560b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -829,8 +829,6 @@ "Close": "關閉", "Close_chat": "關閉聊天", "Close_room_description": "您即將關閉此聊天。您確定要繼續嗎?", - "Close_to_seat_limit_banner_warning": "*您還剩 [{{seats}}] 個座位* \n此工作區已接近其座位限制。 一旦達到限制,就不能增加新會員。 *[申請更多席位]({{url}})*", - "Close_to_seat_limit_warning": "一旦到達座位限制,則無法建立新會員。", "close-livechat-room": "關閉客服 Room", "close-livechat-room_description": "有權限關閉當前客服聊天室", "Close_menu": "關閉選單", @@ -864,8 +862,6 @@ "Cloud_register_offline_finish_helper": "在雲端控制介面完成註冊程序之後您應該會顯示一些文字。請貼到這裡來完成註冊。", "Cloud_register_offline_helper": "如果存在間隙或網路存取受到限制,則可以手動註冊工作區。複製下面的文字,然後轉到我們的雲端控制介面以完成該過程。", "Cloud_register_success": "您的工作區已成功註冊!", - "Cloud_registration_pending_html": "在註冊完成之前,手機通知將沒有作用。 了解更多 ", - "Cloud_registration_pending_title": "雲端註冊仍在等待中", "Cloud_registration_required": "必須註冊", "Cloud_registration_required_description": "看起來安裝過程中您沒有選擇您的工作區域。", "Cloud_registration_required_link_text": "點擊這裡來註冊您的工作區域。", @@ -1477,7 +1473,7 @@ "E2E_Encryption_Password_Explanation": "您可以建立加密私人群組和直接訊息。您可能也可以變更已經存在的私人群組或是直接訊息中來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。", "E2E_key_reset_email": "E2E 金鑰重設通知", "E2E_password_request_text": "存取您的加密私人群組和直接訊息,輸入您的加密密碼。
您需要輸入這個密碼來加密/解密您的訊息在每個您使用的客戶端,金鑰不會儲存在伺服器上。", - "E2E_password_reveal_text": "您現在可以建立加密私人群組和直接訊息。您可能也可以變更已存在的私人群組或直接訊息來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。 點擊這裡了解更多!

您的密碼是: %s

這是自動產生的密碼,在任何時間從任何瀏覽器您可以設定新的密碼給您的加密金鑰您可以輸入已存在的密碼。
這個密碼只能存在這個瀏覽器,直到您儲存密碼和關閉這個訊息。", + "E2E_password_reveal_text": "您現在可以建立加密私人群組和直接訊息。您可能也可以變更已存在的私人群組或直接訊息來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。 點擊這裡了解更多!

您的密碼是: {{randomPassword}}

這是自動產生的密碼,在任何時間從任何瀏覽器您可以設定新的密碼給您的加密金鑰您可以輸入已存在的密碼。
這個密碼只能存在這個瀏覽器,直到您儲存密碼和關閉這個訊息。", "E2E_Reset_Email_Content": "您已自動登出。當您再次登入時,Rocket.Chat將生成一個新的金鑰,並復原您對具有一個或多個成員在線上的任何加密房間的存取。由於E2E加密的性質,Rocket.Chat將無法復原對沒有在線成員的任何加密房間的存取。", "E2E_Reset_Key_Explanation": "此選項將刪除您目前的 E2E 金鑰並登出您。
當再次登入時,Rocket.Chat 將為您產生一個新的金鑰並復原您對具有一個或多個線上成員的任何加密房間的存取權限。
由於E2E加密的性質,Rocket.Chat 將無法復原對沒有線上成員的任何加密房間的存取。", "E2E_Reset_Other_Key_Warning": "重設目前的 E2E 金鑰將登出使用者。當使用者再次登入時,Rocket.Chat 將產生一個新的金鑰,並復原使用者對具有一個或多個線上成員的任何加密會議室的存取權限。由於 E2E 加密的特性,Rocket.Chat 將無法復原對離線成員的任何加密房間的存取。", @@ -1559,6 +1555,8 @@ "email_style_description": "避免使用套版選擇器", "email_style_label": "電子郵件型態", "Email_subject": "主旨", + "Enterprise_License": "企業授權", + "Enterprise_License_Description": "如果您的工作區已註冊,並且授權是由Rocket.Chat Cloud提供的,則無需在此處手動更新授權。", "Email_verified": "電子郵件已驗證", "Email_sent": "電子郵件寄件", "Emoji": "表情符號", @@ -1605,9 +1603,6 @@ "Enter_Normal": "普通模式(使用 Enter 發送)", "Enter_to": "進入", "Enter_your_E2E_password": "輸入您的 E2E 密碼", - "Enterprise": "企業", - "Enterprise_License": "企業授權", - "Enterprise_License_Description": "如果您的工作區已註冊,並且授權是由Rocket.Chat Cloud提供的,則無需在此處手動更新授權。", "Entertainment": "娛樂", "Error": "錯誤", "Error_404": "錯誤:404", @@ -1629,7 +1624,7 @@ "error-avatar-invalid-url": "無效的大頭貼網址:{{url}}", "error-avatar-url-handling": "錯誤從{{username}}一個 URL({{url}})辦理大頭貼設定", "error-business-hours-are-closed": "營業時間已關閉", - "error-blocked-username": "{{field}} 被封鎖且無法使用!", + "error-blocked-username": "**{{field}}** 被封鎖且無法使用!", "error-canned-response-not-found": "找不到罐頭訊息", "error-cannot-delete-app-user": "禁止刪除應用程式使用者,請反安裝相關應用程式來移除它。", "error-cant-invite-for-direct-room": "無法邀請使用者進入私訊", @@ -2522,7 +2517,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "如果不想顯示角色,請將描述欄位保持空白", "leave-c": "保留 Channel", "leave-p": "離開私人群組", - "Lets_get_you_new_one": "來取得新的!", + "Lets_get_you_new_one_": "來取得新的!", "List_of_Channels": "Channel 列表", "List_of_departments_for_forward": "允許轉送的部門列表(可選)", "List_of_departments_for_forward_description": "允許設定可以接收從此部門聊天記錄部門的受限列表", @@ -3615,6 +3610,7 @@ "Security": "安全", "See_full_profile": "查看完整檔案", "See_on_Engagement_Dashboard": "在參與儀表板上檢視", + "Select": "選取", "Select_a_department": "選擇一個部門", "Select_a_room": "選擇一個房間", "Select_a_user": "選擇一個使用者", @@ -4310,6 +4306,7 @@ "view-l-room": "檢視即時聊天 Room", "view-l-room_description": "允許檢視即時聊天頻道", "view-livechat-analytics": "檢視即時聊天分析", + "onboarding.page.awaitingConfirmation.subtitle": "我們已向您傳送包含確認連結的電子郵件至 {{emailAddress}}。請驗證下方的安全代碼與電子郵件中的安全代碼相同。", "view-livechat-departments": "檢視即時聊天部門", "view-livechat-manager": "檢視即時聊天管理者", "view-livechat-manager_description": "允許檢視其他即時聊天管理者", @@ -4520,11 +4517,10 @@ "onboarding.component.form.action.skip": "略過此步驟", "onboarding.component.form.action.register": "註冊", "onboarding.component.form.action.confirm": "確認", + "onboarding.component.form.action.pasteHere": "貼在這裡...", "onboarding.component.form.termsAndConditions": "我同意<1>條款及條件和<3>隱私權政策", "onboarding.component.emailCodeFallback": "沒有收到電子郵件?<1>重新傳送或<3>變更電子郵件", - "onboarding.page.form.title": "<1>啟動您的工作空間吧!", - "onboarding.page.awaitingConfirmation.title": "等待確認", - "onboarding.page.awaitingConfirmation.subtitle": "我們已向您傳送包含確認連結的電子郵件至 {{emailAddress}}。請驗證下方的安全代碼與電子郵件中的安全代碼相同。", + "onboarding.page.form.title": "啟動您的工作空間吧!", "onboarding.page.emailConfirmed.title": "電子郵件已確認!", "onboarding.page.emailConfirmed.subtitle": "您可以返回 Rocket.Chat 應用程式 – 我們已啟動您的工作空間。", "onboarding.page.checkYourEmail.title": "請查看您的電子郵件", @@ -4560,6 +4556,7 @@ "onboarding.form.adminInfoForm.fields.password.label": "密碼", "onboarding.form.adminInfoForm.fields.password.placeholder": "建立密碼", "onboarding.form.adminInfoForm.fields.keepPosted.label": "在有 Rocket.Chat 相關更新時通知我", + "onboarding.form.awaitConfirmationForm.title": "等待確認", "onboarding.form.organizationInfoForm.title": "組織資訊", "onboarding.form.organizationInfoForm.subtitle": "請多包涵。這些資料將可協助我們個人化您的工作空間", "onboarding.form.organizationInfoForm.fields.organizationName.label": "組織名稱", @@ -4572,6 +4569,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "選取", "onboarding.form.organizationInfoForm.fields.country.label": "國家/地區", "onboarding.form.organizationInfoForm.fields.country.placeholder": "選取", + "onboarding.form.registerOfflineForm.title": "離線註冊", "onboarding.form.registeredServerForm.title": "註冊您的伺服器", "onboarding.form.registeredServerForm.included.push": "行動推播通知", "onboarding.form.registeredServerForm.included.externalProviders": "與外部提供者 (WhatsApp、Facebook、Telegram、Twitter) 整合", @@ -4588,5 +4586,8 @@ "RegisterWorkspace_Features_Marketplace_Title": "商店", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "雲端帳戶電子郵件", - "cloud.RegisterWorkspace_Setup_Terms_Privacy": "我同意<1>條款及條件和<3>隱私權政策" + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "我同意<1>條款及條件和<3>隱私權政策", + "Enterprise": "企業", + "UpgradeToGetMore_engagement-dashboard_Title": "分析", + "UpgradeToGetMore_auditing_Title": "訊息稽核" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json index 283944175541..7d4a50c8e362 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -764,8 +764,6 @@ "Cloud_register_offline_finish_helper": "在Cloud Console中完成注册过程后,应该显示出一些文本。请粘贴到此处以完成注册。", "Cloud_register_offline_helper": "如果网络访问受到限制,可以手动注册工作区。复制下面的文字并转到Cloud Console以完成本次操作。", "Cloud_register_success": "您的工作区已成功注册!", - "Cloud_registration_pending_html": "完成注册前移动端通知将不可用。了解更多", - "Cloud_registration_pending_title": "云注册尚未完成", "Cloud_registration_required": "要求注册", "Cloud_registration_required_description": "在安装过程中,您似乎没有选择注册工作区。", "Cloud_registration_required_link_text": "点此注册您的工作区。", @@ -1340,7 +1338,7 @@ "E2E_Encryption_Password_Explanation": "您现在可以创建加密的私有组和私聊。您也可以将现有的私人组或直接消息更改为加密。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。因此,您需要将密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入。", "E2E_key_reset_email": "端到端加密重置通知", "E2E_password_request_text": "要访问加密的私人组和私聊,请输入密码。
您需要在使用的每个客户端上输入此密码来对消息进行编码/解码,因为密钥未存储在服务器上。", - "E2E_password_reveal_text": "您现在可以创建加密的组和私聊。您也可以将现有的私有组和私聊转为加密的。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。所以您需要将此密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入它。 点击这里了解更多

您的密码是: %s

这是系统自动生成的密码,您可以为您的密钥设置一个新密码(您可以随时从任何浏览器输入现有密码)。
此浏览器仅存储此密码到您存储密码并关闭此消息前。", + "E2E_password_reveal_text": "您现在可以创建加密的组和私聊。您也可以将现有的私有组和私聊转为加密的。

这是端到端加密,因此编码/解码邮件的密钥不会保存在服务器上。所以您需要将此密码存储在安全的地方。您需要在希望使用端到端加密的其他设备上输入它。 点击这里了解更多

您的密码是: {{randomPassword}}

这是系统自动生成的密码,您可以为您的密钥设置一个新密码(您可以随时从任何浏览器输入现有密码)。
此浏览器仅存储此密码到您存储密码并关闭此消息前。", "E2E_Reset_Email_Content": "您将被自动登出。当您再次登录时,Rocket.Chat 将生成新的密钥并恢复您对任何有至少一个成员在线加密聊天室的访问权。由于端到端加密的原理,Rocket.Chat 将不能恢复您对无成员在线的聊天室访问权。", "E2E_Reset_Key_Explanation": "此选项将删除您当前的E2E密钥并注销您的账户。
再次登录时,Rocket.Chat将为您生成一个新密钥,并恢复您对具有一个以上成员的加密房间。
因E2E加密的性质,Rocket.Chat不能够恢复对没有在线成员加密房间的访问权。", "E2E_Reset_Other_Key_Warning": "重置当前的端到端加密密钥将使用户登出。当用户再次登录时,Rocket.Chat 将生成新的密钥并恢复用户对任何有至少一个成员在线加密聊天室的访问权。由于端到端加密的原理,Rocket.Chat 将不能恢复用户对无成员在线的聊天室访问权。", @@ -1414,6 +1412,8 @@ "email_style_description": "避免嵌套选择器", "email_style_label": "邮箱风格", "Email_subject": "邮件主题", + "Enterprise_License": "企业许可证", + "Enterprise_License_Description": "如果您的工作区已经注册,且您的许可证由Rock.Chat Cloud提供,那么您无需在这里手动更新许可证。", "Email_verified": "邮箱已验证", "Email_sent": "已发送的电子邮件", "Emoji": "表情符号", @@ -1452,9 +1452,6 @@ "Enter_Normal": "常规模式(Enter 发送消息)", "Enter_to": "进入", "Enter_your_E2E_password": "输入您的端到端密码", - "Enterprise": "企业", - "Enterprise_License": "企业许可证", - "Enterprise_License_Description": "如果您的工作区已经注册,且您的许可证由Rock.Chat Cloud提供,那么您无需在这里手动更新许可证。", "Entertainment": "娱乐", "Error": "错误", "Error_404": "错误:404", @@ -2268,7 +2265,7 @@ "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "如果不想显示对应角色,请将描述字段留空", "leave-c": "保留频道", "leave-p": "离开私人组", - "Lets_get_you_new_one": "新版本即将到来", + "Lets_get_you_new_one_": "新版本即将到来", "List_of_Channels": "频道列表", "List_of_departments_for_forward": "允许转发的部门列表(可选)", "List_of_departments_for_forward_description": "允许设置一个列表来限制可从此部门接收聊天的部门", @@ -4134,5 +4131,10 @@ "registration.component.form.reasonToJoin": "加入的理由", "registration.component.form.invalidConfirmPass": "两次输入的密码不一致", "registration.component.form.confirmPassword": "确认密码", - "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件" + "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件", + "onboarding.component.form.action.pasteHere": "在此粘贴", + "onboarding.form.registerOfflineForm.title": "离线注册", + "Enterprise": "企业", + "UpgradeToGetMore_engagement-dashboard_Title": "分析", + "UpgradeToGetMore_auditing_Title": "消息审计" } \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-livechat/assets/demo.html b/apps/meteor/packages/rocketchat-livechat/assets/demo.html index a8269484df63..ee5fd6944d4f 100644 --- a/apps/meteor/packages/rocketchat-livechat/assets/demo.html +++ b/apps/meteor/packages/rocketchat-livechat/assets/demo.html @@ -2,18 +2,6 @@ - @@ -22,6 +10,16 @@

test

Talk to us.

+ + +

changing page title

page 0
page 1
@@ -35,9 +33,12 @@

without changing page title

page 7
diff --git a/apps/meteor/packages/rocketchat-mongo-config/server/index.js b/apps/meteor/packages/rocketchat-mongo-config/server/index.js index 65464a31095c..684620d09054 100644 --- a/apps/meteor/packages/rocketchat-mongo-config/server/index.js +++ b/apps/meteor/packages/rocketchat-mongo-config/server/index.js @@ -4,8 +4,8 @@ import { PassThrough } from 'stream'; import { Email } from 'meteor/email'; import { Mongo } from 'meteor/mongo'; -const shouldDisableOplog = ['yes', 'true'].includes(String(process.env.USE_NATIVE_OPLOG).toLowerCase()); -if (!shouldDisableOplog) { +const shouldUseNativeOplog = ['yes', 'true'].includes(String(process.env.USE_NATIVE_OPLOG).toLowerCase()); +if (!shouldUseNativeOplog) { Package['disable-oplog'] = {}; } diff --git a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js index 20b26b9cdcf0..d22aa55437ff 100644 --- a/apps/meteor/packages/rocketchat-version/plugin/compile-version.js +++ b/apps/meteor/packages/rocketchat-version/plugin/compile-version.js @@ -3,16 +3,58 @@ import os from 'os'; import util from 'util'; import path from 'path'; import fs from 'fs'; +import https from 'https'; const execAsync = util.promisify(exec); class VersionCompiler { async processFilesForTarget(files) { - const processFile = async function (file) { - if (!file.getDisplayPath().match(/rocketchat\.info$/)) { - return; - } + const processVersionFile = async function (file) { + const data = await new Promise((resolve, reject) => { + const currentVersion = + JSON.parse(fs.readFileSync(path.resolve(process.cwd(), './package.json'), { encoding: 'utf8' }))?.version || ''; + + const type = currentVersion.includes('-rc.') ? 'candidate' : currentVersion.includes('-develop') ? 'develop' : 'stable'; + + const url = `https://releases.rocket.chat/v2/server/supportedVersions?includeDraftType=${type}&includeDraftTag=${currentVersion}`; + + function handleError(err) { + console.error(err); + // TODO remove this when we are ready to fail + // if (process.env.NODE_ENV !== 'development') { + // reject(err); + // return; + // } + resolve({}); + } + + https + .get(url, function (response) { + let data = ''; + response.on('data', function (chunk) { + data += chunk; + }); + response.on('end', function () { + const supportedVersions = JSON.parse(data); + if (!supportedVersions?.signed) { + return handleError(new Error(`Invalid supportedVersions result:\n URL: ${url} \n RESULT: ${data}`)); + } + resolve(supportedVersions); + }); + response.on('error', function (err) { + handleError(err); + }); + }) + .end(); + }); + + file.addJavaScript({ + data: `exports.supportedVersions = ${JSON.stringify(data)}`, + path: `${file.getPathInPackage()}.js`, + }); + }; + const processFile = async function (file) { let output = JSON.parse(file.getContentsAsString()); output.build = { date: new Date().toISOString(), @@ -39,6 +81,9 @@ class VersionCompiler { subject: data.join('\n'), }; } catch (e) { + if (process.env.NODE_ENV !== 'development') { + throw e; + } // no git } @@ -57,20 +102,34 @@ class VersionCompiler { output.commit.branch = branch.stdout.replace('\n', ''); } } catch (e) { + if (process.env.NODE_ENV !== 'development') { + throw e; + } + // no branch } - output = `exports.Info = ${JSON.stringify(output, null, 4)}; - exports.minimumClientVersions = ${JSON.stringify(minimumClientVersions, null, 4)};`; - file.addJavaScript({ - data: output, + data: `exports.Info = ${JSON.stringify(output, null, 4)}; + exports.minimumClientVersions = ${JSON.stringify(minimumClientVersions, null, 4)};`, path: `${file.getPathInPackage()}.js`, }); }; for await (const file of files) { - await processFile(file); + switch (true) { + case file.getDisplayPath().endsWith('rocketchat.info'): { + await processFile(file); + break; + } + case file.getDisplayPath().endsWith('rocketchat-supported-versions.info'): { + await processVersionFile(file); + break; + } + default: { + throw new Error(`Unexpected file ${file.getDisplayPath()}`); + } + } } } } diff --git a/apps/meteor/public/images/globe.png b/apps/meteor/public/images/globe.png new file mode 100644 index 000000000000..e1615da2e363 Binary files /dev/null and b/apps/meteor/public/images/globe.png differ diff --git a/apps/meteor/server/cron/statistics.ts b/apps/meteor/server/cron/statistics.ts index 44dcb554824c..846fac2c2e51 100644 --- a/apps/meteor/server/cron/statistics.ts +++ b/apps/meteor/server/cron/statistics.ts @@ -5,16 +5,11 @@ import { serverFetch as fetch } from '@rocket.chat/server-fetch'; import { Meteor } from 'meteor/meteor'; import { getWorkspaceAccessToken } from '../../app/cloud/server'; -import { settings } from '../../app/settings/server'; import { statistics } from '../../app/statistics/server'; async function generateStatistics(logger: Logger): Promise { const cronStatistics = await statistics.save(); - if (!settings.get('Statistics_reporting')) { - return; - } - try { const token = await getWorkspaceAccessToken(); const headers = { ...(token && { Authorization: `Bearer ${token}` }) }; diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts index ebdd9cdcac01..9b1ba98e0f3d 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts @@ -1,3 +1,4 @@ +import { api } from '@rocket.chat/core-services'; import type { ILivechatVisitor, IOmnichannelRoom, @@ -16,6 +17,7 @@ import { Livechat as LivechatTyped } from '../../../app/livechat/server/lib/Live import { QueueManager } from '../../../app/livechat/server/lib/QueueManager'; import { settings } from '../../../app/settings/server'; import { i18n } from '../../lib/i18n'; +import { broadcastMessageSentEvent } from '../../modules/watchers/lib/messages'; import { logger } from './logger'; type FileAttachment = VideoAttachmentProps & ImageAttachmentProps & AudioAttachmentProps; @@ -236,6 +238,10 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme }, ); room && (await LivechatRooms.updateEmailThreadByRoomId(room._id, thread)); + void broadcastMessageSentEvent({ + id: msgId, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); }) .catch((err) => { logger.error({ diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts index 685c7f9e96dd..b66610f326c1 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts @@ -1,3 +1,4 @@ +import { api } from '@rocket.chat/core-services'; import { isIMessageInbox } from '@rocket.chat/core-typings'; import type { IEmailInbox, IUser, IMessage, IOmnichannelRoom, SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { Messages, Uploads, LivechatRooms, Rooms, Users } from '@rocket.chat/models'; @@ -10,6 +11,7 @@ import { settings } from '../../../app/settings/server'; import { slashCommands } from '../../../app/utils/server/slashCommand'; import { callbacks } from '../../../lib/callbacks'; import { i18n } from '../../lib/i18n'; +import { broadcastMessageSentEvent } from '../../modules/watchers/lib/messages'; import { inboxes } from './EmailInbox'; import type { Inbox } from './EmailInbox'; import { logger } from './logger'; @@ -170,6 +172,10 @@ slashCommands.add({ }, }, ); + void broadcastMessageSentEvent({ + id: message._id, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); return sendSuccessReplyMessage({ msgId: message._id, diff --git a/apps/meteor/server/hooks/index.ts b/apps/meteor/server/hooks/index.ts index 28de58998534..64d500b223f2 100644 --- a/apps/meteor/server/hooks/index.ts +++ b/apps/meteor/server/hooks/index.ts @@ -1,2 +1 @@ -import './messages/markdownParser'; import './sauMonitorHooks'; diff --git a/apps/meteor/server/hooks/messages/markdownParser.ts b/apps/meteor/server/hooks/messages/markdownParser.ts deleted file mode 100644 index 770eb142f923..000000000000 --- a/apps/meteor/server/hooks/messages/markdownParser.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { isE2EEMessage, isOTRMessage } from '@rocket.chat/core-typings'; -import type { Options, Root } from '@rocket.chat/message-parser'; -import { parse } from '@rocket.chat/message-parser'; - -import { settings } from '../../../app/settings/server'; -import { callbacks } from '../../../lib/callbacks'; -import { SystemLogger } from '../../lib/logger/system'; - -if (process.env.DISABLE_MESSAGE_PARSER !== 'true') { - callbacks.add( - 'beforeSaveMessage', - (message) => { - if (isE2EEMessage(message) || isOTRMessage(message)) { - return message; - } - try { - if (message.msg) { - message.md = messageTextToAstMarkdown(message.msg); - } - - if (message.attachments?.[0]?.description !== undefined) { - message.attachments[0].descriptionMd = messageTextToAstMarkdown(message.attachments[0].description); - } - } catch (e) { - SystemLogger.error(e); // errors logged while the parser is at experimental stage - } - - return message; - }, - callbacks.priority.MEDIUM, - 'markdownParser', - ); -} - -const messageTextToAstMarkdown = (messageText: string): Root => { - const customDomains = settings.get('Message_CustomDomain_AutoLink') - ? settings - .get('Message_CustomDomain_AutoLink') - .split(',') - .map((domain) => domain.trim()) - : []; - - const parseOptions: Options = { - colors: settings.get('HexColorPreview_Enabled'), - emoticons: true, - customDomains, - ...(settings.get('Katex_Enabled') && { - katex: { - dollarSyntax: settings.get('Katex_Dollar_Syntax'), - parenthesisSyntax: settings.get('Katex_Parenthesis_Syntax'), - }, - }), - }; - - return parse(messageText, parseOptions); -}; diff --git a/apps/meteor/server/importPackages.ts b/apps/meteor/server/importPackages.ts index ec5d68dd6bd0..d92e02f35038 100644 --- a/apps/meteor/server/importPackages.ts +++ b/apps/meteor/server/importPackages.ts @@ -66,7 +66,6 @@ import '../app/slashcommands-status/server'; import '../app/slashcommands-topic/server'; import '../app/slashcommands-unarchiveroom/server'; import '../app/smarsh-connector/server'; -import '../app/spotify/server'; import '../app/theme/server'; import '../app/threads/server'; import '../app/tokenpass/server'; diff --git a/apps/meteor/server/lib/i18n.ts b/apps/meteor/server/lib/i18n.ts index 265305ef71d6..bc3ed6184937 100644 --- a/apps/meteor/server/lib/i18n.ts +++ b/apps/meteor/server/lib/i18n.ts @@ -2,13 +2,20 @@ import type { RocketchatI18nKeys } from '@rocket.chat/i18n'; import i18nDict from '@rocket.chat/i18n'; import type { TOptions } from 'i18next'; -import { i18n } from '../../app/utils/lib/i18n'; +import { availableTranslationNamespaces, defaultTranslationNamespace, extractTranslationNamespaces, i18n } from '../../app/utils/lib/i18n'; void i18n.init({ lng: 'en', - defaultNS: 'core', - resources: Object.fromEntries(Object.entries(i18nDict).map(([key, value]) => [key, { core: value }])), - initImmediate: true, + defaultNS: defaultTranslationNamespace, + ns: availableTranslationNamespaces, + nsSeparator: '.', + resources: Object.fromEntries( + Object.entries(i18nDict).map(([language, source]) => [ + language, + extractTranslationNamespaces(source as unknown as Record), + ]), + ), + initImmediate: false, }); declare module 'i18next' { diff --git a/apps/meteor/server/lib/isRoomCompatibleWithVideoConfRinging.ts b/apps/meteor/server/lib/isRoomCompatibleWithVideoConfRinging.ts new file mode 100644 index 000000000000..3bd4f814b8df --- /dev/null +++ b/apps/meteor/server/lib/isRoomCompatibleWithVideoConfRinging.ts @@ -0,0 +1,4 @@ +import type { IRoom } from '@rocket.chat/core-typings'; + +export const isRoomCompatibleWithVideoConfRinging = (roomType: IRoom['t'], roomUids: IRoom['uids']): boolean => + Boolean(roomType === 'd' && roomUids && roomUids.length <= 2); diff --git a/apps/meteor/server/lib/moderation/deleteReportedMessages.ts b/apps/meteor/server/lib/moderation/deleteReportedMessages.ts index f53817353d65..218714d5a8b0 100644 --- a/apps/meteor/server/lib/moderation/deleteReportedMessages.ts +++ b/apps/meteor/server/lib/moderation/deleteReportedMessages.ts @@ -1,3 +1,4 @@ +import { api } from '@rocket.chat/core-services'; import type { IUser, IMessage } from '@rocket.chat/core-typings'; import { Messages, Uploads, ReadReceipts } from '@rocket.chat/models'; @@ -7,8 +8,8 @@ import { settings } from '../../../app/settings/server'; // heavily inspired from message delete taking place in the user deletion process // in this path we don't care about the apps engine events - it's a "raw" bulk action export async function deleteReportedMessages(messages: IMessage[], user: IUser): Promise { - const keepHistory = settings.get('Message_KeepHistory'); - const showDeletedStatus = settings.get('Message_ShowDeletedStatus'); + const keepHistory = settings.get('Message_KeepHistory'); + const showDeletedStatus = settings.get('Message_ShowDeletedStatus'); const files: string[] = []; const messageIds: string[] = []; for (const message of messages) { @@ -47,4 +48,24 @@ export async function deleteReportedMessages(messages: IMessage[], user: IUser): if (showDeletedStatus) { await Messages.setAsDeletedByIdsAndUser(messageIds, user as any); } + + const transformed = messages.reduce((acc, { rid, _id }) => { + if (!acc[rid]) { + acc[rid] = []; + } + acc[rid].push(_id); + return acc; + }, {} as Record); + + Object.entries(transformed).forEach(([rid, messageIds]) => { + void api.broadcast('notify.deleteMessageBulk', rid, { + rid, + excludePinned: true, + ignoreDiscussion: true, + ts: { $gt: new Date() }, + users: [], + ids: messageIds, + showDeletedStatus, + }); + }); } diff --git a/apps/meteor/server/lib/pushConfig.ts b/apps/meteor/server/lib/pushConfig.ts index d9c7191d2c55..8bd1b49a4a5f 100644 --- a/apps/meteor/server/lib/pushConfig.ts +++ b/apps/meteor/server/lib/pushConfig.ts @@ -4,6 +4,7 @@ import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { getWorkspaceAccessToken } from '../../app/cloud/server'; +import { RateLimiter } from '../../app/lib/server/lib'; import { Push } from '../../app/push/server'; import { settings } from '../../app/settings/server'; import { i18n } from './i18n'; @@ -25,7 +26,7 @@ Meteor.methods({ }); } - if (!(await hasPermissionAsync(user._id, 'test-admin-options'))) { + if (!(await hasPermissionAsync(user._id, 'test-push-notifications'))) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'push_test', }); @@ -82,6 +83,10 @@ Meteor.methods({ }, }); +RateLimiter.limitMethod('push_test', 1, 1000, { + userId: () => true, +}); + settings.watch('Push_enable', async (enabled) => { if (!enabled) { return; diff --git a/apps/meteor/server/lib/rooms/roomCoordinator.ts b/apps/meteor/server/lib/rooms/roomCoordinator.ts index d291f036542b..c640b8fec4b8 100644 --- a/apps/meteor/server/lib/rooms/roomCoordinator.ts +++ b/apps/meteor/server/lib/rooms/roomCoordinator.ts @@ -3,6 +3,7 @@ import { Users } from '@rocket.chat/models'; import { settings } from '../../../app/settings/server'; import type { IRoomTypeConfig, IRoomTypeServerDirectives, RoomSettingsEnum, RoomMemberActions } from '../../../definition/IRoomTypeConfig'; +import { getUserDisplayName } from '../../../lib/getUserDisplayName'; import { RoomCoordinator } from '../../../lib/rooms/coordinator'; class RoomCoordinatorServer extends RoomCoordinator { @@ -40,13 +41,14 @@ class RoomCoordinatorServer extends RoomCoordinator { sender: AtLeast, notificationMessage: string, userId: string, - ): Promise<{ title: string | undefined; text: string }> { + ): Promise<{ title: string | undefined; text: string; name: string | undefined }> { const title = `#${await this.roomName(room, userId)}`; - const name = settings.get('UI_Use_Real_Name') ? sender.name : sender.username; + const useRealName = settings.get('UI_Use_Real_Name'); + const senderName = getUserDisplayName(sender.name, sender.username, useRealName); - const text = `${name}: ${notificationMessage}`; + const text = `${senderName}: ${notificationMessage}`; - return { title, text }; + return { title, text, name: room.name }; }, getMsgSender(senderId: IUser['_id']): Promise { return Users.findOneById(senderId); diff --git a/apps/meteor/server/lib/rooms/roomTypes/direct.ts b/apps/meteor/server/lib/rooms/roomTypes/direct.ts index ad1913345b85..4f28d93040e1 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/direct.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/direct.ts @@ -94,16 +94,20 @@ roomCoordinator.add(DirectMessageRoomType, { async getNotificationDetails(room, sender, notificationMessage, userId) { const useRealName = settings.get('UI_Use_Real_Name'); + const displayRoomName = await this.roomName(room, userId); + if (this.isGroupChat(room)) { return { - title: await this.roomName(room, userId), + title: displayRoomName, text: `${(useRealName && sender.name) || sender.username}: ${notificationMessage}`, + name: room.name || displayRoomName, }; } return { title: (useRealName && sender.name) || sender.username, text: notificationMessage, + name: room.name || displayRoomName, }; }, diff --git a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts index 92d722ac2bb0..fb1415b02f82 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts @@ -35,7 +35,7 @@ roomCoordinator.add(LivechatRoomType, { const title = `[Omnichannel] ${roomName}`; const text = notificationMessage; - return { title, text }; + return { title, text, name: roomName }; }, async getMsgSender(senderId) { diff --git a/apps/meteor/server/lib/rooms/roomTypes/voip.ts b/apps/meteor/server/lib/rooms/roomTypes/voip.ts index f3a7fdb123bb..7925cd65e302 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/voip.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/voip.ts @@ -16,7 +16,7 @@ roomCoordinator.add(VoipRoomType, { const title = `[Omnichannel] ${this.roomName(room, userId)}`; const text = notificationMessage; - return { title, text }; + return { title, text, name: room.name }; }, async getMsgSender(senderId) { diff --git a/apps/meteor/server/lib/spotlight.js b/apps/meteor/server/lib/spotlight.js index 62fcdc3a66b4..62218bd5928f 100644 --- a/apps/meteor/server/lib/spotlight.js +++ b/apps/meteor/server/lib/spotlight.js @@ -236,7 +236,7 @@ export class Spotlight { } } - if (users.length === 0 && canListOutsiders) { + if (users.length === 0 && canListOutsiders && text) { const exactMatch = await Users.findOneByUsernameIgnoringCase(text, { projection: options.projection, readPreference: options.readPreference, @@ -265,7 +265,7 @@ export class Spotlight { if (await this._searchOutsiderUsers(searchParams)) { return users; } - } else if (await this._searchConnectedUsers(userId, searchParams)) { + } else if (await this._searchConnectedUsers(userId, searchParams, 'd')) { return users; } diff --git a/apps/meteor/server/methods/deleteUser.ts b/apps/meteor/server/methods/deleteUser.ts index f8ccd07c6284..4dafad7a3a0c 100644 --- a/apps/meteor/server/methods/deleteUser.ts +++ b/apps/meteor/server/methods/deleteUser.ts @@ -7,7 +7,6 @@ import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { deleteUser } from '../../app/lib/server/functions/deleteUser'; import { AppEvents, Apps } from '../../ee/server/apps/orchestrator'; -import { callbacks } from '../../lib/callbacks'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -52,8 +51,6 @@ Meteor.methods({ await deleteUser(userId, confirmRelinquish, uid); - await callbacks.run('afterDeleteUser', user); - // App IPostUserDeleted event hook await Apps.triggerEvent(AppEvents.IPostUserDeleted, { user, performedBy: await Meteor.userAsync() }); diff --git a/apps/meteor/server/methods/readThreads.ts b/apps/meteor/server/methods/readThreads.ts index d0fc7ee33814..234d0181294c 100644 --- a/apps/meteor/server/methods/readThreads.ts +++ b/apps/meteor/server/methods/readThreads.ts @@ -43,8 +43,8 @@ Meteor.methods({ } await callbacks.run('beforeReadMessages', thread.rid, user?._id); - await readThread({ userId: user?._id, rid: thread.rid, tmid }); if (user?._id) { + await readThread({ userId: user._id, rid: thread.rid, tmid }); callbacks.runAsync('afterReadMessages', room._id, { uid: user._id, tmid }); } }, diff --git a/apps/meteor/server/models/CloudAnnouncements.ts b/apps/meteor/server/models/CloudAnnouncements.ts deleted file mode 100644 index 4f6692d67fc9..000000000000 --- a/apps/meteor/server/models/CloudAnnouncements.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { registerModel } from '@rocket.chat/models'; - -import { db } from '../database/utils'; -import { CloudAnnouncementsRaw } from './raw/CloudAnnouncements'; - -registerModel('ICloudAnnouncementsModel', new CloudAnnouncementsRaw(db)); diff --git a/apps/meteor/server/models/raw/Analytics.ts b/apps/meteor/server/models/raw/Analytics.ts index 254ff32965bb..4e95cadebbcd 100644 --- a/apps/meteor/server/models/raw/Analytics.ts +++ b/apps/meteor/server/models/raw/Analytics.ts @@ -14,7 +14,7 @@ export class AnalyticsRaw extends BaseRaw implements IAnalyticsModel } protected modelIndexes(): IndexDescription[] { - return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true }]; + return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true, partialFilterExpression: { type: 'rooms' } }]; } saveMessageSent({ room, date }: { room: IRoom; date: IAnalytic['date'] }): Promise { diff --git a/apps/meteor/server/models/raw/Banners.ts b/apps/meteor/server/models/raw/Banners.ts index 74ce5abf50ec..2f3dd5f1207e 100644 --- a/apps/meteor/server/models/raw/Banners.ts +++ b/apps/meteor/server/models/raw/Banners.ts @@ -46,10 +46,29 @@ export class BannersRaw extends BaseRaw implements IBannersModel { $or: [{ roles: { $in: roles } }, { roles: { $exists: false } }], }; - return this.col.find(query, options); + return this.find(query, options); } disable(bannerId: string): Promise { - return this.col.updateOne({ _id: bannerId, active: { $ne: false } }, { $set: { active: false, inactivedAt: new Date() } }); + return this.updateOne({ _id: bannerId, active: { $ne: false } }, { $set: { active: false, inactivedAt: new Date() } }); + } + + createOrUpdate(banner: IBanner): Promise { + const invalidPlatform = banner.platform?.some((platform) => !Object.values(BannerPlatform).includes(platform)); + if (invalidPlatform) { + throw new Error('Invalid platform'); + } + + if (banner.startAt > banner.expireAt) { + throw new Error('Start date cannot be later than expire date'); + } + + if (banner.expireAt < new Date()) { + throw new Error('Cannot create banner already expired'); + } + + const { _id: bannerId, ...doc } = banner; + + return this.updateOne({ _id: bannerId }, { $set: { active: true, ...doc } }, { upsert: true }); } } diff --git a/apps/meteor/server/models/raw/BaseRaw.ts b/apps/meteor/server/models/raw/BaseRaw.ts index bfa5a81ddcf0..5ab3b9802105 100644 --- a/apps/meteor/server/models/raw/BaseRaw.ts +++ b/apps/meteor/server/models/raw/BaseRaw.ts @@ -66,23 +66,39 @@ export abstract class BaseRaw< * @param trash Trash collection instance * @param options Model options */ - constructor(private db: Db, protected name: string, protected trash?: Collection, options?: ModelOptions) { + constructor(private db: Db, protected name: string, protected trash?: Collection, private options?: ModelOptions) { this.collectionName = options?.collectionNameResolver ? options.collectionNameResolver(name) : getCollectionName(name); this.col = this.db.collection(this.collectionName, options?.collection || {}); + void this.createIndexes().catch((e) => { + console.warn(`Some indexes for collection '${this.collectionName}' could not be created:\n\t${e.message}`); + }); + + this.preventSetUpdatedAt = options?.preventSetUpdatedAt ?? false; + } + + private pendingIndexes: Promise | undefined; + + public async createIndexes() { const indexes = this.modelIndexes(); - if (options?._updatedAtIndexOptions) { - indexes?.push({ ...options._updatedAtIndexOptions, key: { _updatedAt: 1 } }); + if (this.options?._updatedAtIndexOptions) { + indexes?.push({ ...this.options._updatedAtIndexOptions, key: { _updatedAt: 1 } }); } if (indexes?.length) { - this.col.createIndexes(indexes).catch((e) => { - console.warn(`Some indexes for collection '${this.collectionName}' could not be created:\n\t${e.message}`); + if (this.pendingIndexes) { + await this.pendingIndexes; + } + + this.pendingIndexes = this.col.createIndexes(indexes) as unknown as Promise; + + void this.pendingIndexes.finally(() => { + this.pendingIndexes = undefined; }); - } - this.preventSetUpdatedAt = options?.preventSetUpdatedAt ?? false; + return this.pendingIndexes; + } } protected modelIndexes(): IndexDescription[] | undefined { @@ -137,6 +153,7 @@ export abstract class BaseRaw< } public findOneAndUpdate(query: Filter, update: UpdateFilter | T, options?: FindOneAndUpdateOptions): Promise> { + this.setUpdatedAt(update); return this.col.findOneAndUpdate(query, update, options || {}); } diff --git a/apps/meteor/server/models/raw/CloudAnnouncements.ts b/apps/meteor/server/models/raw/CloudAnnouncements.ts deleted file mode 100644 index 21b4304b2bd5..000000000000 --- a/apps/meteor/server/models/raw/CloudAnnouncements.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Cloud } from '@rocket.chat/core-typings'; -import type { ICloudAnnouncementsModel } from '@rocket.chat/model-typings'; -import type { Db } from 'mongodb'; - -import { BaseRaw } from './BaseRaw'; - -export class CloudAnnouncementsRaw extends BaseRaw implements ICloudAnnouncementsModel { - constructor(db: Db) { - super(db, 'cloud_announcements'); - } -} diff --git a/apps/meteor/server/models/raw/Imports.ts b/apps/meteor/server/models/raw/Imports.ts index e0e89d0cd878..b708c42e8119 100644 --- a/apps/meteor/server/models/raw/Imports.ts +++ b/apps/meteor/server/models/raw/Imports.ts @@ -17,11 +17,7 @@ export class ImportsModel extends BaseRaw implements IImportsModel { async findLastImport(): Promise { const imports = await this.find({}, { sort: { ts: -1 }, limit: 1 }).toArray(); - if (imports?.length) { - return imports.shift(); - } - - return undefined; + return imports.shift(); } async hasValidOperationInStatus(allowedStatus: IImport['status'][]): Promise { diff --git a/apps/meteor/server/models/raw/LivechatAgentActivity.ts b/apps/meteor/server/models/raw/LivechatAgentActivity.ts index 63563f571436..acf84bc39355 100644 --- a/apps/meteor/server/models/raw/LivechatAgentActivity.ts +++ b/apps/meteor/server/models/raw/LivechatAgentActivity.ts @@ -155,6 +155,22 @@ export class LivechatAgentActivityRaw extends BaseRaw im .toArray(); } + findAvailableServiceTimeHistory(p: { + start: string; + end: string; + fullReport: boolean; + onlyCount: true; + options?: { sort?: Record; offset?: number; count?: number }; + }): AggregationCursor<{ total: number }>; + + findAvailableServiceTimeHistory(p: { + start: string; + end: string; + fullReport: boolean; + onlyCount?: false; + options?: { sort?: Record; offset?: number; count?: number }; + }): AggregationCursor; + findAvailableServiceTimeHistory({ start, end, @@ -165,9 +181,9 @@ export class LivechatAgentActivityRaw extends BaseRaw im start: string; end: string; fullReport: boolean; - onlyCount: boolean; - options: any; - }): AggregationCursor { + onlyCount?: boolean; + options?: { sort?: Record; offset?: number; count?: number }; + }): AggregationCursor | AggregationCursor<{ total: number }> { const match = { $match: { date: { @@ -209,7 +225,7 @@ export class LivechatAgentActivityRaw extends BaseRaw im const params = [match, lookup, unwind, group, project, sort] as object[]; if (onlyCount) { params.push({ $count: 'total' }); - return this.col.aggregate(params); + return this.col.aggregate<{ total: number }>(params); } if (options.offset) { params.push({ $skip: options.offset }); @@ -217,6 +233,6 @@ export class LivechatAgentActivityRaw extends BaseRaw im if (options.count) { params.push({ $limit: options.count }); } - return this.col.aggregate(params, { allowDiskUse: true, readPreference: readSecondaryPreferred() }); + return this.col.aggregate(params, { allowDiskUse: true, readPreference: readSecondaryPreferred() }); } } diff --git a/apps/meteor/server/models/raw/LivechatBusinessHours.ts b/apps/meteor/server/models/raw/LivechatBusinessHours.ts index aaf2abeb4518..19b37f4ba02f 100644 --- a/apps/meteor/server/models/raw/LivechatBusinessHours.ts +++ b/apps/meteor/server/models/raw/LivechatBusinessHours.ts @@ -63,7 +63,7 @@ export class LivechatBusinessHoursRaw extends BaseRaw imp active: true, workHours: { $elemMatch: { - $or: [{ 'start.cron.dayOfWeek': day, 'finish.cron.dayOfWeek': day }], + $or: [{ 'start.cron.dayOfWeek': day }, { 'finish.cron.dayOfWeek': day }], open: true, }, }, diff --git a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts index ec4e60948932..91f3f4e22e34 100644 --- a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts @@ -238,7 +238,7 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw implemen async findNextAndLock(queueSortBy: OmnichannelSortingMechanismSettingType, department?: string): Promise { const date = new Date(); - const result = await this.col.findOneAndUpdate( + const result = await this.findOneAndUpdate( { status: LivechatInquiryStatus.QUEUED, ...(department ? { department } : { department: { $exists: false } }), @@ -172,6 +172,10 @@ export class LivechatInquiryRaw extends BaseRaw implemen } async unlock(inquiryId: string): Promise { + return this.updateOne({ _id: inquiryId }, { $unset: { locked: 1, lockedAt: 1 } }); + } + + async unlockAndQueue(inquiryId: string): Promise { return this.updateOne( { _id: inquiryId }, { $unset: { locked: 1, lockedAt: 1 }, $set: { status: LivechatInquiryStatus.QUEUED, queuedAt: new Date() } }, @@ -283,7 +287,7 @@ export class LivechatInquiryRaw extends BaseRaw implemen }, { $set: { status: LivechatInquiryStatus.TAKEN, takenAt: new Date() }, - $unset: { defaultAgent: 1, estimatedInactivityCloseTimeAt: 1 }, + $unset: { defaultAgent: 1, estimatedInactivityCloseTimeAt: 1, queuedAt: 1 }, }, ); } @@ -419,4 +423,8 @@ export class LivechatInquiryRaw extends BaseRaw implemen await this.deleteMany(query); } + + async markInquiryActiveForPeriod(rid: string, period: string): Promise { + return this.updateOne({ rid }, { $addToSet: { 'v.activity': period } }); + } } diff --git a/apps/meteor/server/models/raw/LivechatRooms.ts b/apps/meteor/server/models/raw/LivechatRooms.ts index 974c2b5cb570..1423476a708b 100644 --- a/apps/meteor/server/models/raw/LivechatRooms.ts +++ b/apps/meteor/server/models/raw/LivechatRooms.ts @@ -51,7 +51,6 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive { key: { 'omnichannel.predictedVisitorAbandonmentAt': 1 }, sparse: true }, { key: { closedAt: 1 }, sparse: true }, { key: { servedBy: 1 }, sparse: true }, - { key: { 'v.token': 1 }, sparse: true }, { key: { 'v.token': 1, 'email.thread': 1 }, sparse: true }, { key: { 'v._id': 1 }, sparse: true }, { key: { t: 1, departmentId: 1, closedAt: 1 }, partialFilterExpression: { closedAt: { $exists: true } } }, @@ -1892,7 +1891,7 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive findOneOpenByVisitorTokenAndDepartmentIdAndSource( visitorToken: string, - departmentId: string, + departmentId?: string, source?: string, options: FindOptions = {}, ) { diff --git a/apps/meteor/server/models/raw/LivechatVisitors.ts b/apps/meteor/server/models/raw/LivechatVisitors.ts index 7b478bab43d6..7974867a289b 100644 --- a/apps/meteor/server/models/raw/LivechatVisitors.ts +++ b/apps/meteor/server/models/raw/LivechatVisitors.ts @@ -435,6 +435,9 @@ export class LivechatVisitorsRaw extends BaseRaw implements IL ip: 1, host: 1, userAgent: 1, + username: 1, + ts: 1, + status: 1, }, }, ); diff --git a/apps/meteor/server/models/raw/Messages.ts b/apps/meteor/server/models/raw/Messages.ts index 49930a8c92ea..eb0ef0790ebb 100644 --- a/apps/meteor/server/models/raw/Messages.ts +++ b/apps/meteor/server/models/raw/Messages.ts @@ -9,7 +9,6 @@ import type { IMessageWithPendingFileImport, } from '@rocket.chat/core-typings'; import type { FindPaginated, IMessagesModel } from '@rocket.chat/model-typings'; -import { Rooms } from '@rocket.chat/models'; import type { PaginatedRequest } from '@rocket.chat/rest-typings'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { @@ -27,6 +26,7 @@ import type { UpdateResult, Document, UpdateFilter, + ModifyResult, } from 'mongodb'; import { otrSystemMessages } from '../../../app/otr/lib/constants'; @@ -149,6 +149,34 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { return this.findPaginated(query, options); } + findAllNumberOfTransferredRooms({ + start, + end, + departmentId, + onlyCount, + options, + }: { + start: Date; + end: Date; + departmentId?: ILivechatDepartment['_id']; + onlyCount: true; + options?: PaginatedRequest; + }): AggregationCursor<{ total: number }>; + + findAllNumberOfTransferredRooms({ + start, + end, + departmentId, + onlyCount, + options, + }: { + start: Date; + end: Date; + departmentId?: ILivechatDepartment['_id']; + onlyCount?: false; + options?: PaginatedRequest; + }): AggregationCursor<{ _id: string | null; numberOfTransferredRooms: number }>; + findAllNumberOfTransferredRooms({ start, end, @@ -156,12 +184,12 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { onlyCount = false, options = {}, }: { - start: string; - end: string; - departmentId: ILivechatDepartment['_id']; - onlyCount: boolean; - options: PaginatedRequest; - }): AggregationCursor { + start: Date; + end: Date; + departmentId?: ILivechatDepartment['_id']; + onlyCount?: boolean; + options?: PaginatedRequest; + }): AggregationCursor<{ total: number }> | AggregationCursor<{ _id: string | null; numberOfTransferredRooms: number }> { // FIXME: aggregation type definitions const match = { $match: { @@ -210,7 +238,7 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { const params = [...firstParams, group, project, sort]; if (onlyCount) { params.push({ $count: 'total' }); - return this.col.aggregate(params, { readPreference: readSecondaryPreferred() }); + return this.col.aggregate<{ total: number }>(params, { readPreference: readSecondaryPreferred() }); } if (options.offset) { params.push({ $skip: options.offset }); @@ -218,7 +246,10 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { if (options.count) { params.push({ $limit: options.count }); } - return this.col.aggregate(params, { allowDiskUse: true, readPreference: readSecondaryPreferred() }); + return this.col.aggregate<{ _id: string | null; numberOfTransferredRooms: number }>(params, { + allowDiskUse: true, + readPreference: readSecondaryPreferred(), + }); } getTotalOfMessagesSentByDate({ start, end, options = {} }: { start: Date; end: Date; options?: PaginatedRequest }): Promise { @@ -1308,8 +1339,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { const data = Object.assign(record, extraData); - await Rooms.incMsgCountById(rid, 1); - return this.insertOne(data); } @@ -1432,10 +1461,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { if (!limit) { const count = (await this.deleteMany(query)).deletedCount - notCountedMessages; - if (count) { - // decrease message count - await Rooms.decreaseMessageCountById(rid, count); - } return count; } @@ -1449,11 +1474,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { }) ).deletedCount - notCountedMessages; - if (count) { - // decrease message count - await Rooms.decreaseMessageCountById(rid, count); - } - return count; } @@ -1593,19 +1613,23 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { * to race conditions: If multiple updates occur, the current state will be updated * only if the new state of the discussion room is really newer. */ - async refreshDiscussionMetadata(room: Pick): Promise { + async refreshDiscussionMetadata(room: Pick): Promise> { const { _id: drid, msgs: dcount, lm: dlm } = room; const query = { drid, }; - return this.updateMany(query, { - $set: { - dcount, - dlm, + return this.findOneAndUpdate( + query, + { + $set: { + dcount, + dlm, + }, }, - }); + { returnDocument: 'after' }, + ); } // ////////////////////////////////////////////////////////////////// diff --git a/apps/meteor/server/models/raw/NotificationQueue.ts b/apps/meteor/server/models/raw/NotificationQueue.ts index 9602b029e075..0832844a21bf 100644 --- a/apps/meteor/server/models/raw/NotificationQueue.ts +++ b/apps/meteor/server/models/raw/NotificationQueue.ts @@ -71,7 +71,7 @@ export class NotificationQueueRaw extends BaseRaw implements INot async findNextInQueueOrExpired(expired: Date): Promise { const now = new Date(); - const result = await this.col.findOneAndUpdate( + const result = await this.findOneAndUpdate( { $and: [ { diff --git a/apps/meteor/server/models/raw/Nps.ts b/apps/meteor/server/models/raw/Nps.ts index 82fb39ac3304..1a12f68bff21 100644 --- a/apps/meteor/server/models/raw/Nps.ts +++ b/apps/meteor/server/models/raw/Nps.ts @@ -27,7 +27,7 @@ export class NpsRaw extends BaseRaw implements INpsModel { status: NPSStatus.SENDING, }, }; - const { value } = await this.col.findOneAndUpdate(query, update, { sort: { expireAt: 1 } }); + const { value } = await this.findOneAndUpdate(query, update, { sort: { expireAt: 1 } }); return value; } diff --git a/apps/meteor/server/models/raw/OAuthAccessTokens.ts b/apps/meteor/server/models/raw/OAuthAccessTokens.ts index b8b3daac8772..6143a6379e2f 100644 --- a/apps/meteor/server/models/raw/OAuthAccessTokens.ts +++ b/apps/meteor/server/models/raw/OAuthAccessTokens.ts @@ -18,11 +18,17 @@ export class OAuthAccessTokensRaw extends BaseRaw implements ]; } - findOneByAccessToken(accessToken: string, options?: FindOptions): Promise { + async findOneByAccessToken(accessToken: string, options?: FindOptions): Promise { + if (!accessToken) { + return null; + } return this.findOne({ accessToken }, options); } - findOneByRefreshToken(refreshToken: string, options?: FindOptions): Promise { + async findOneByRefreshToken(refreshToken: string, options?: FindOptions): Promise { + if (!refreshToken) { + return null; + } return this.findOne({ refreshToken }, options); } } diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index 8b8a6637284c..06b6d030424b 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -53,9 +53,6 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { key: { muted: 1 }, sparse: true, }, - { - key: { t: 1 }, - }, { key: { 'u._id': 1 }, }, @@ -565,6 +562,15 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.findOne(query, options); } + findOneByJoinCodeAndId(joinCode: string, rid: IRoom['_id'], options: FindOptions = {}): Promise { + const query: Filter = { + _id: rid, + joinCode, + }; + + return this.findOne(query, options); + } + async findOneByNonValidatedName(name: NonNullable, options: FindOptions = {}) { const room = await this.findOneByNameOrFname(name, options); if (room) { @@ -1569,20 +1575,13 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage']): Promise { + async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage'] | null, msgCountDelta?: number): Promise { const query: Filter = { _id }; - const update: UpdateFilter = lastMessage - ? { - $set: { - lastMessage, - }, - } - : { - $unset: { - lastMessage: 1, - }, - }; + const update = { + ...(lastMessage ? { $set: { lastMessage } } : { $unset: { lastMessage: 1 as const } }), + ...(msgCountDelta ? { $inc: { msgs: msgCountDelta } } : {}), + }; return this.updateOne(query, update); } diff --git a/apps/meteor/server/models/raw/Subscriptions.ts b/apps/meteor/server/models/raw/Subscriptions.ts index a7b9bb347511..72a91e6ab17c 100644 --- a/apps/meteor/server/models/raw/Subscriptions.ts +++ b/apps/meteor/server/models/raw/Subscriptions.ts @@ -60,7 +60,6 @@ export class SubscriptionsRaw extends BaseRaw implements ISubscri { key: { 'userHighlights.0': 1 }, sparse: true }, { key: { prid: 1 } }, { key: { 'u._id': 1, 'open': 1, 'department': 1 } }, - { key: { rid: 1 } }, { key: { rid: 1, ls: 1 } }, ]; } diff --git a/apps/meteor/server/models/raw/Uploads.ts b/apps/meteor/server/models/raw/Uploads.ts index 1c02fffab2a8..fc1b72bce53b 100644 --- a/apps/meteor/server/models/raw/Uploads.ts +++ b/apps/meteor/server/models/raw/Uploads.ts @@ -1,5 +1,5 @@ // TODO: Lib imports should not exists inside the raw models -import type { IUpload, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { IUpload, RocketChatRecordDeleted, IRoom } from '@rocket.chat/core-typings'; import type { FindPaginated, IUploadsModel } from '@rocket.chat/model-typings'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { Collection, FindCursor, Db, IndexDescription, WithId, Filter, FindOptions } from 'mongodb'; @@ -50,11 +50,34 @@ export class UploadsRaw extends BaseUploadModelRaw implements IUploadsModel { findPaginatedWithoutThumbs(query: Filter = {}, options?: FindOptions): FindPaginated>> { return this.findPaginated( { + typeGroup: { $ne: 'thumb' }, ...query, _hidden: { $ne: true }, - typeGroup: { $ne: 'thumb' }, }, options, ); } + + findImagesByRoomId( + rid: IRoom['_id'], + uploadedAt?: Date, + options: Omit, 'sort'> = {}, + ): FindPaginated>> { + return this.findPaginated( + { + rid, + _hidden: { $ne: true }, + typeGroup: 'image', + ...(Boolean(uploadedAt) && { + uploadedAt: { + $lte: uploadedAt, + }, + }), + }, + { + ...options, + sort: { uploadedAt: -1 }, + }, + ); + } } diff --git a/apps/meteor/server/models/raw/Users.js b/apps/meteor/server/models/raw/Users.js index c8cee8f2f6bf..0d56fc76bccf 100644 --- a/apps/meteor/server/models/raw/Users.js +++ b/apps/meteor/server/models/raw/Users.js @@ -56,7 +56,6 @@ export class UsersRaw extends BaseRaw { { key: { lastLogin: 1 } }, { key: { status: 1 } }, { key: { statusText: 1 } }, - { key: { active: 1 }, sparse: 1 }, { key: { statusConnection: 1 }, sparse: 1 }, { key: { appId: 1 }, sparse: 1 }, { key: { type: 1 } }, @@ -1652,7 +1651,7 @@ export class UsersRaw extends BaseRaw { }, }; - const user = await this.col.findOneAndUpdate(query, update, { sort, returnDocument: 'after' }); + const user = await this.findOneAndUpdate(query, update, { sort, returnDocument: 'after' }); if (user && user.value) { return { agentId: user.value._id, @@ -1682,7 +1681,7 @@ export class UsersRaw extends BaseRaw { }, }; - const user = await this.col.findOneAndUpdate(query, update, { sort, returnDocument: 'after' }); + const user = await this.findOneAndUpdate(query, update, { sort, returnDocument: 'after' }); if (user?.value) { return { agentId: user.value._id, @@ -1937,45 +1936,63 @@ export class UsersRaw extends BaseRaw { ); } - removeExpiredEmailCodesOfUserId(userId) { + removeExpiredEmailCodeOfUserId(userId) { return this.updateOne( - { _id: userId }, + { '_id': userId, 'services.emailCode.expire': { $lt: new Date() } }, { - $pull: { - 'services.emailCode': { - expire: { $lt: new Date() }, - }, - }, + $unset: { 'services.emailCode': 1 }, }, ); } - removeEmailCodeByUserIdAndCode(userId, code) { + removeEmailCodeOfUserId(userId) { return this.updateOne( { _id: userId }, { - $pull: { - 'services.emailCode': { - code, - }, + $unset: { 'services.emailCode': 1 }, + }, + ); + } + + incrementInvalidEmailCodeAttempt(userId) { + return this.findOneAndUpdate( + { _id: userId }, + { + $inc: { 'services.emailCode.attempts': 1 }, + }, + { + returnDocument: 'after', + projection: { + 'services.emailCode.attempts': 1, + }, + }, + ); + } + + async maxInvalidEmailCodeAttemptsReached(userId, maxAttempts) { + const result = await this.findOne( + { + '_id': userId, + 'services.emailCode.attempts': { $gte: maxAttempts }, + }, + { + projection: { + _id: 1, }, }, ); + return !!result?._id; } addEmailCodeByUserId(userId, code, expire) { return this.updateOne( { _id: userId }, { - $push: { + $set: { 'services.emailCode': { - $each: [ - { - code, - expire, - }, - ], - $slice: -5, + code, + expire, + attempts: 0, }, }, }, diff --git a/apps/meteor/server/models/startup.ts b/apps/meteor/server/models/startup.ts index d355d1febd16..14b26e0f188f 100644 --- a/apps/meteor/server/models/startup.ts +++ b/apps/meteor/server/models/startup.ts @@ -68,4 +68,3 @@ import './Imports'; import './AppsTokens'; import './CronHistory'; import './Migrations'; -import './CloudAnnouncements'; diff --git a/apps/meteor/server/modules/core-apps/banner.module.ts b/apps/meteor/server/modules/core-apps/banner.module.ts index fac891e5ea73..cf5bdebd50fe 100644 --- a/apps/meteor/server/modules/core-apps/banner.module.ts +++ b/apps/meteor/server/modules/core-apps/banner.module.ts @@ -1,11 +1,12 @@ import { Banner } from '@rocket.chat/core-services'; import type { IUiKitCoreApp, UiKitCoreAppPayload } from '@rocket.chat/core-services'; +import type * as UiKit from '@rocket.chat/ui-kit'; export class BannerModule implements IUiKitCoreApp { appId = 'banner-core'; - // when banner view is closed we need to dissmiss that banner for that user - async viewClosed(payload: UiKitCoreAppPayload) { + // when banner view is closed we need to dismiss that banner for that user + async viewClosed(payload: UiKitCoreAppPayload): Promise { const { payload: { view: { viewId: bannerId } = {} }, user: { _id: userId } = {}, @@ -19,6 +20,17 @@ export class BannerModule implements IUiKitCoreApp { throw new Error('invalid banner'); } - return Banner.dismiss(userId, bannerId); + if (!payload.triggerId) { + throw new Error('invalid triggerId'); + } + + await Banner.dismiss(userId, bannerId); + + return { + type: 'banner.close', + triggerId: payload.triggerId, + appId: payload.appId, + viewId: bannerId, + }; } } diff --git a/apps/meteor/server/modules/core-apps/cloudAnnouncements.module.ts b/apps/meteor/server/modules/core-apps/cloudAnnouncements.module.ts new file mode 100644 index 000000000000..68599162cdef --- /dev/null +++ b/apps/meteor/server/modules/core-apps/cloudAnnouncements.module.ts @@ -0,0 +1,274 @@ +import { Banner } from '@rocket.chat/core-services'; +import type { IUiKitCoreApp, UiKitCoreAppPayload } from '@rocket.chat/core-services'; +import type { Cloud, IBanner, IUser } from '@rocket.chat/core-typings'; +import { Banners } from '@rocket.chat/models'; +import { serverFetch as fetch } from '@rocket.chat/server-fetch'; +import type * as UiKit from '@rocket.chat/ui-kit'; + +import { getWorkspaceAccessToken } from '../../../app/cloud/server'; +import { syncWorkspace } from '../../../app/cloud/server/functions/syncWorkspace'; +import { settings } from '../../../app/settings/server'; +import { CloudWorkspaceConnectionError } from '../../../lib/errors/CloudWorkspaceConnectionError'; +import { InvalidCloudAnnouncementInteractionError } from '../../../lib/errors/InvalidCloudAnnouncementInteractionError'; +import { InvalidCoreAppInteractionError } from '../../../lib/errors/InvalidCoreAppInteractionError'; +import { SystemLogger } from '../../lib/logger/system'; + +type CloudAnnouncementInteractant = + | { + user: Pick; + } + | { + visitor: Pick['visitor'], 'id' | 'username' | 'name' | 'department' | 'phone'>; + }; + +type CloudAnnouncementInteractionRequest = UiKit.UserInteraction & CloudAnnouncementInteractant; + +export class CloudAnnouncementsModule implements IUiKitCoreApp { + appId = 'cloud-announcements-core'; + + protected async getWorkspaceAccessToken() { + return getWorkspaceAccessToken(true); + } + + protected getCloudUrl() { + return settings.get('Cloud_Url'); + } + + blockAction(payload: UiKitCoreAppPayload): Promise { + return this.handlePayload(payload); + } + + viewSubmit(payload: UiKitCoreAppPayload): Promise { + return this.handlePayload(payload); + } + + async viewClosed(payload: UiKitCoreAppPayload): Promise { + const { + payload: { view: { viewId } = {} }, + user: { _id: userId } = {}, + } = payload; + + if (!userId) { + throw new Error('invalid user'); + } + + if (!viewId) { + throw new Error('invalid view'); + } + + if (!payload.triggerId) { + throw new Error('invalid triggerId'); + } + + await Banner.dismiss(userId, viewId); + + const announcement = await Banners.findOneById>(viewId, { projection: { surface: 1 } }); + + const type = announcement?.surface === 'banner' ? 'banner.close' : 'modal.close'; + + // for viewClosed we just need to let Cloud know that the banner was closed, no need to wait for the response + setImmediate(async () => { + await this.handlePayload(payload); + }); + + return { + type, + triggerId: payload.triggerId, + appId: payload.appId, + viewId, + }; + } + + protected async handlePayload(payload: UiKitCoreAppPayload): Promise { + const interactant = this.getInteractant(payload); + const interaction = this.getInteraction(payload); + + try { + const serverInteraction = await this.pushUserInteraction(interactant, interaction); + + if (serverInteraction.appId !== this.appId) { + throw new InvalidCloudAnnouncementInteractionError(`Invalid appId`); + } + + if (serverInteraction.triggerId !== interaction.triggerId) { + throw new InvalidCloudAnnouncementInteractionError(`Invalid triggerId`); + } + + return serverInteraction; + } catch (error) { + SystemLogger.error(error); + } + } + + protected getInteractant(payload: UiKitCoreAppPayload): CloudAnnouncementInteractant { + if (payload.user) { + return { + user: { + _id: payload.user._id, + username: payload.user.username, + name: payload.user.name, + }, + }; + } + + if (payload.visitor) { + return { + visitor: { + id: payload.visitor.id, + username: payload.visitor.username, + name: payload.visitor.name, + department: payload.visitor.department, + phone: payload.visitor.phone, + }, + }; + } + + throw new CloudWorkspaceConnectionError(`Invalid user data received from Rocket.Chat Cloud`); + } + + /** + * Transform the payload received from the Core App back to the format the UI sends from the client + */ + protected getInteraction(payload: UiKitCoreAppPayload): UiKit.UserInteraction { + if (payload.type === 'blockAction' && payload.container?.type === 'message') { + const { + actionId, + payload: { blockId, value }, + message, + room, + triggerId, + } = payload; + + if (!actionId || !blockId || !triggerId) { + throw new InvalidCoreAppInteractionError(); + } + + return { + type: 'blockAction', + actionId, + payload: { + blockId, + value, + }, + container: { + type: 'message', + id: String(message), + }, + mid: String(message), + tmid: undefined, + rid: String(room), + triggerId, + }; + } + + if (payload.type === 'blockAction' && payload.container?.type === 'view') { + const { + actionId, + payload: { blockId, value }, + container: { id }, + triggerId, + } = payload; + + if (!actionId || !blockId || !triggerId) { + throw new InvalidCoreAppInteractionError(); + } + + return { + type: 'blockAction', + actionId, + payload: { + blockId, + value, + }, + container: { + type: 'view', + id, + }, + triggerId, + }; + } + + if (payload.type === 'viewClosed') { + const { + payload: { view, isCleared }, + triggerId, + } = payload; + + if (!view?.id || !triggerId) { + throw new InvalidCoreAppInteractionError(); + } + + return { + type: 'viewClosed', + payload: { + viewId: view.id, + view: view as any, + isCleared: Boolean(isCleared), + }, + triggerId, + }; + } + + if (payload.type === 'viewSubmit') { + const { + payload: { view }, + triggerId, + } = payload; + + if (!view?.id || !triggerId) { + throw new InvalidCoreAppInteractionError(); + } + + return { + type: 'viewSubmit', + payload: { + view: view as any, + }, + triggerId, + viewId: view.id, + }; + } + + throw new InvalidCoreAppInteractionError(); + } + + protected async pushUserInteraction( + interactant: CloudAnnouncementInteractant, + userInteraction: UiKit.UserInteraction, + ): Promise { + const token = await this.getWorkspaceAccessToken(); + + const request: CloudAnnouncementInteractionRequest = { + ...interactant, + ...userInteraction, + }; + + const response = await fetch(`${this.getCloudUrl()}/api/v3/comms/workspace/interaction`, { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(request), + }); + + if (!response.ok) { + const { error } = await response.json(); + throw new CloudWorkspaceConnectionError(`Failed to connect to Rocket.Chat Cloud: ${error}`); + } + + const payload: Cloud.WorkspaceInteractionResponsePayload = await response.json(); + + const { serverInteraction, serverAction } = payload; + + if (serverAction) { + switch (serverAction) { + case 'syncWorkspace': { + await syncWorkspace(); + break; + } + } + } + + return serverInteraction; + } +} diff --git a/apps/meteor/server/modules/core-apps/mention.module.ts b/apps/meteor/server/modules/core-apps/mention.module.ts new file mode 100644 index 000000000000..ac615def8a5a --- /dev/null +++ b/apps/meteor/server/modules/core-apps/mention.module.ts @@ -0,0 +1,125 @@ +import { api } from '@rocket.chat/core-services'; +import type { IUiKitCoreApp } from '@rocket.chat/core-services'; +import type { IMessage } from '@rocket.chat/core-typings'; +import { Subscriptions, Messages } from '@rocket.chat/models'; +import { Meteor } from 'meteor/meteor'; + +import { processWebhookMessage } from '../../../app/lib/server/functions/processWebhookMessage'; +import { addUsersToRoomMethod } from '../../../app/lib/server/methods/addUsersToRoom'; +import { i18n } from '../../lib/i18n'; +import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; + +const retrieveMentionsFromPayload = (stringifiedMentions: string): Exclude => { + try { + const mentions = JSON.parse(stringifiedMentions); + if (!Array.isArray(mentions) || !mentions.length || !('username' in mentions[0])) { + throw new Error('Invalid payload'); + } + return mentions; + } catch (error) { + throw new Error('Invalid payload'); + } +}; + +export class MentionModule implements IUiKitCoreApp { + appId = 'mention-core'; + + async blockAction(payload: any): Promise { + const { + actionId, + payload: { value: stringifiedMentions, blockId: referenceMessageId }, + } = payload; + + const mentions = retrieveMentionsFromPayload(stringifiedMentions); + + const usernames = mentions.map(({ username }) => username); + + const message = await Messages.findOneById(referenceMessageId, { projection: { _id: 1, tmid: 1 } }); + + if (!message) { + throw new Error('Mention bot - Failed to retrieve message information'); + } + + const joinedUsernames = `@${usernames.join(', @')}`; + + if (actionId === 'dismiss') { + void api.broadcast('notify.ephemeralMessage', payload.user._id, payload.room, { + msg: i18n.t( + 'You_mentioned___mentions__but_theyre_not_in_this_room', + { + mentions: joinedUsernames, + }, + payload.user.language, + ), + _id: payload.message, + tmid: message.tmid, + mentions, + }); + return; + } + + if (actionId === 'add-users') { + void addUsersToRoomMethod(payload.user._id, { rid: payload.room, users: usernames as string[] }, payload.user); + void api.broadcast('notify.ephemeralMessage', payload.user._id, payload.room, { + msg: i18n.t( + 'You_mentioned___mentions__but_theyre_not_in_this_room', + { + mentions: joinedUsernames, + }, + payload.user.language, + ), + tmid: message.tmid, + _id: payload.message, + mentions, + }); + return; + } + + if (actionId === 'share-message') { + const sub = await Subscriptions.findOneByRoomIdAndUserId(payload.room, payload.user._id, { projection: { t: 1, rid: 1, name: 1 } }); + // this should exist since the event is fired from withing the room (e.g the user sent a message) + if (!sub) { + throw new Error('Mention bot - Failed to retrieve room information'); + } + + const roomPath = roomCoordinator.getRouteLink(sub.t, { rid: sub.rid, name: sub.name }); + if (!roomPath) { + throw new Error('Mention bot - Failed to retrieve path to room'); + } + + const messageText = i18n.t( + 'Youre_not_a_part_of__channel__and_I_mentioned_you_there', + { + channel: `#${sub.name}`, + }, + payload.user.language, + ); + + const link = new URL(Meteor.absoluteUrl(roomPath)); + link.searchParams.set('msg', message._id); + const text = `[ ](${link.toString()})\n${messageText}`; + + // forwards message to all DMs + await processWebhookMessage( + { + roomId: mentions.map(({ _id }) => _id), + text, + }, + payload.user, + ); + + void api.broadcast('notify.ephemeralMessage', payload.user._id, payload.room, { + msg: i18n.t( + 'You_mentioned___mentions__but_theyre_not_in_this_room_You_let_them_know_via_dm', + { + mentions: joinedUsernames, + }, + payload.user.language, + ), + tmid: message.tmid, + _id: payload.message, + mentions, + }); + } + } +} diff --git a/apps/meteor/server/modules/listeners/listeners.module.ts b/apps/meteor/server/modules/listeners/listeners.module.ts index c580b47d7c6e..ae78f78b0e39 100644 --- a/apps/meteor/server/modules/listeners/listeners.module.ts +++ b/apps/meteor/server/modules/listeners/listeners.module.ts @@ -1,7 +1,7 @@ import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { ISetting as AppsSetting } from '@rocket.chat/apps-engine/definition/settings'; import type { IServiceClass } from '@rocket.chat/core-services'; -import { EnterpriseSettings } from '@rocket.chat/core-services'; +import { EnterpriseSettings, listenToMessageSentEvent } from '@rocket.chat/core-services'; import { UserStatus, isSettingColor, isSettingEnterprise } from '@rocket.chat/core-typings'; import type { IUser, IRoom, VideoConference, ISetting, IOmnichannelRoom } from '@rocket.chat/core-typings'; import { Logger } from '@rocket.chat/logger'; @@ -99,9 +99,10 @@ export class ListenersModule { }); }); - service.onEvent('user.deleted', ({ _id: userId }) => { + service.onEvent('user.deleted', ({ _id: userId }, data) => { notifications.notifyLoggedInThisInstance('Users:Deleted', { userId, + ...data, }); }); @@ -166,7 +167,7 @@ export class ListenersModule { }); }); - service.onEvent('watch.messages', ({ message }) => { + listenToMessageSentEvent(service, async (message) => { if (!message.rid) { return; } @@ -181,6 +182,10 @@ export class ListenersModule { notifications.streamRoomMessage.emitWithoutBroadcast(message.rid, message); }); + service.onEvent('notify.messagesRead', ({ rid, until, tmid }): void => { + notifications.notifyRoomInThisInstance(rid, 'messagesRead', { tmid, until }); + }); + service.onEvent('watch.subscriptions', ({ clientAction, subscription }) => { if (!subscription.u?._id) { return; @@ -415,6 +420,13 @@ export class ListenersModule { notifications.notifyUserInThisInstance(uid, 'calendar', data); }); + service.onEvent('notify.importedMessages', ({ roomIds }): void => { + roomIds.forEach((rid) => { + // couldnt get TS happy by providing no data, so had to provide null + notifications.notifyRoomInThisInstance(rid, 'messagesImported', null); + }); + }); + service.onEvent('connector.statuschanged', (enabled): void => { notifications.notifyLoggedInThisInstance('voip.statuschanged', enabled); }); diff --git a/apps/meteor/server/modules/notifications/notifications.module.ts b/apps/meteor/server/modules/notifications/notifications.module.ts index ba66a31e5ee4..979603c92650 100644 --- a/apps/meteor/server/modules/notifications/notifications.module.ts +++ b/apps/meteor/server/modules/notifications/notifications.module.ts @@ -4,7 +4,7 @@ import { Rooms, Subscriptions, Users, Settings } from '@rocket.chat/models'; import type { StreamerCallbackArgs, StreamKeys, StreamNames } from '@rocket.chat/ui-contexts'; import type { IStreamer, IStreamerConstructor, IPublication } from 'meteor/rocketchat:streamer'; -import type { Progress } from '../../../app/importer/server/classes/ImporterProgress'; +import type { ImporterProgress } from '../../../app/importer/server/classes/ImporterProgress'; import { emit, StreamPresence } from '../../../app/notifications/server/lib/Presence'; import { SystemLogger } from '../../lib/logger/system'; @@ -536,7 +536,7 @@ export class NotificationsModule { return this.streamPresence.emitWithoutBroadcast(uid, args); } - progressUpdated(progress: { rate: number } | Progress): void { + progressUpdated(progress: { rate: number } | ImporterProgress): void { this.streamImporters.emit('progress', progress); } } diff --git a/apps/meteor/server/modules/watchers/lib/messages.ts b/apps/meteor/server/modules/watchers/lib/messages.ts new file mode 100644 index 000000000000..ded1c2389e17 --- /dev/null +++ b/apps/meteor/server/modules/watchers/lib/messages.ts @@ -0,0 +1,52 @@ +import type { IMessage, SettingValue, IUser } from '@rocket.chat/core-typings'; +import { Messages, Settings, Users } from '@rocket.chat/models'; +import mem from 'mem'; + +const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); + +const getUserNameCached = mem( + async (userId: string): Promise => { + const user = await Users.findOne>(userId, { projection: { name: 1 } }); + return user?.name; + }, + { maxAge: 10000 }, +); + +export const broadcastMessageSentEvent = async ({ + id, + data, + broadcastCallback, +}: { + id: IMessage['_id']; + broadcastCallback: (message: IMessage) => Promise; + data?: IMessage; +}): Promise => { + const message = data ?? (await Messages.findOneById(id)); + if (!message) { + return; + } + + if (message._hidden !== true && message.imported == null) { + const UseRealName = (await getSettingCached('UI_Use_Real_Name')) === true; + + if (UseRealName) { + if (message.u?._id) { + const name = await getUserNameCached(message.u._id); + if (name) { + message.u.name = name; + } + } + + if (message.mentions?.length) { + for await (const mention of message.mentions) { + const name = await getUserNameCached(mention._id); + if (name) { + mention.name = name; + } + } + } + } + + void broadcastCallback(message); + } +}; diff --git a/apps/meteor/server/modules/watchers/watchers.module.ts b/apps/meteor/server/modules/watchers/watchers.module.ts index 1d8402786a2f..efa0866ab4a0 100644 --- a/apps/meteor/server/modules/watchers/watchers.module.ts +++ b/apps/meteor/server/modules/watchers/watchers.module.ts @@ -1,4 +1,5 @@ import type { EventSignatures } from '@rocket.chat/core-services'; +import { dbWatchersDisabled } from '@rocket.chat/core-services'; import type { ISubscription, IUser, @@ -13,7 +14,6 @@ import type { IIntegration, IEmailInbox, IPbxEvent, - SettingValue, ILivechatInquiryRecord, IRole, ILivechatPriority, @@ -36,10 +36,10 @@ import { Permissions, LivechatPriority, } from '@rocket.chat/models'; -import mem from 'mem'; import { subscriptionFields, roomFields } from '../../../lib/publishFields'; import type { DatabaseWatcher } from '../../database/DatabaseWatcher'; +import { broadcastMessageSentEvent } from './lib/messages'; type BroadcastCallback = (event: T, ...args: Parameters) => Promise; @@ -64,52 +64,26 @@ export function isWatcherRunning(): boolean { return watcherStarted; } -export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallback): void { - const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); - - const getUserNameCached = mem( - async (userId: string): Promise => { - const user = await Users.findOne>(userId, { projection: { name: 1 } }); - return user?.name; - }, - { maxAge: 10000 }, - ); - +const messageWatcher = (watcher: DatabaseWatcher, broadcast: BroadcastCallback): void => { watcher.on(Messages.getCollectionName(), async ({ clientAction, id, data }) => { switch (clientAction) { case 'inserted': case 'updated': - const message = data ?? (await Messages.findOneById(id)); - if (!message) { - return; - } - - if (message._hidden !== true && message.imported == null) { - const UseRealName = (await getSettingCached('UI_Use_Real_Name')) === true; - - if (UseRealName) { - if (message.u?._id) { - const name = await getUserNameCached(message.u._id); - if (name) { - message.u.name = name; - } - } - - if (message.mentions?.length) { - for await (const mention of message.mentions) { - const name = await getUserNameCached(mention._id); - if (name) { - mention.name = name; - } - } - } - } - - void broadcast('watch.messages', { clientAction, message }); - } + void broadcastMessageSentEvent({ + id, + data, + broadcastCallback: (message) => broadcast('watch.messages', { clientAction, message }), + }); break; } }); +}; + +export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallback): void { + const dbWatchersEnabled = !dbWatchersDisabled; + if (dbWatchersEnabled) { + messageWatcher(watcher, broadcast); + } watcher.on(Subscriptions.getCollectionName(), async ({ clientAction, id, data, diff }) => { switch (clientAction) { @@ -365,7 +339,13 @@ export function initWatchers(watcher: DatabaseWatcher, broadcast: BroadcastCallb }); watcher.on(LoginServiceConfiguration.getCollectionName(), async ({ clientAction, id }) => { + if (clientAction === 'removed') { + void broadcast('watch.loginServiceConfiguration', { clientAction, id }); + return; + } + const data = await LoginServiceConfiguration.findOne>(id, { projection: { secret: 0 } }); + if (!data) { return; } diff --git a/apps/meteor/server/routes/i18n.ts b/apps/meteor/server/routes/i18n.ts index 8aa1c30a3085..1bdba1f09cc8 100644 --- a/apps/meteor/server/routes/i18n.ts +++ b/apps/meteor/server/routes/i18n.ts @@ -7,7 +7,8 @@ import { match } from 'path-to-regexp'; const matchRoute = match<{ lng: string }>('/:lng.json', { decode: decodeURIComponent }); const i18nHandler = async function (req: IncomingMessage, res: ServerResponse) { - const match = matchRoute(req.url ?? '/'); + const url = new URL(req.url ?? '/', `https://${req.headers.host}`); + const match = matchRoute(url.pathname); if (match === false) { res.writeHead(400); diff --git a/apps/meteor/server/services/authorization/service.ts b/apps/meteor/server/services/authorization/service.ts index 6918d40af871..075fe569bfff 100644 --- a/apps/meteor/server/services/authorization/service.ts +++ b/apps/meteor/server/services/authorization/service.ts @@ -39,16 +39,20 @@ export class Authorization extends ServiceClass implements IAuthorization { } async started(): Promise { - if (!(await License.hasValidLicense())) { - return; - } + try { + if (!(await License.hasValidLicense())) { + return; + } - const permissions = await License.getGuestPermissions(); - if (!permissions) { - return; - } + const permissions = await License.getGuestPermissions(); + if (!permissions) { + return; + } - AuthorizationUtils.addRolePermissionWhiteList('guest', permissions); + AuthorizationUtils.addRolePermissionWhiteList('guest', permissions); + } catch (error) { + console.error('Authorization Service did not start correctly', error); + } } async hasAllPermission(userId: string, permissions: string[], scope?: string): Promise { diff --git a/apps/meteor/server/services/banner/service.ts b/apps/meteor/server/services/banner/service.ts index d20b9e780875..76f8d19e4729 100644 --- a/apps/meteor/server/services/banner/service.ts +++ b/apps/meteor/server/services/banner/service.ts @@ -29,10 +29,10 @@ export class BannerService extends ServiceClassInternal implements IBannerServic async create(doc: Optional): Promise { const bannerId = doc._id || uuidv4(); - doc.view.appId = 'banner-core'; + doc.view.appId = doc.view.appId ?? 'banner-core'; doc.view.viewId = bannerId; - await Banners.create({ + await Banners.createOrUpdate({ ...doc, _id: bannerId, }); @@ -64,7 +64,13 @@ export class BannerService extends ServiceClassInternal implements IBannerServic const dismissed = new Set(result.map(({ bannerId }) => bannerId)); - return banners.filter((banner) => !dismissed.has(banner._id)); + return banners + .filter((banner) => !dismissed.has(banner._id)) + .map((banner) => ({ + ...banner, + // add surface to legacy banners + surface: !banner.surface ? 'banner' : banner.surface, + })); } async dismiss(userId: string, bannerId: string): Promise { diff --git a/apps/meteor/server/services/federation/application/room/sender/RoomInternalValidator.ts b/apps/meteor/server/services/federation/application/room/sender/RoomInternalValidator.ts index fecc262d80af..41cc6f76a5e8 100644 --- a/apps/meteor/server/services/federation/application/room/sender/RoomInternalValidator.ts +++ b/apps/meteor/server/services/federation/application/room/sender/RoomInternalValidator.ts @@ -46,7 +46,7 @@ export class FederationRoomInternalValidator extends AbstractFederationApplicati return; } if (this.isAddingANewExternalUser(internalUser) && !isDirectMessageRoom(internalRoom)) { - throw new Error('error-this-is-an-ee-feature'); + throw new Error('error-this-is-a-premium-feature'); } const inviter = await this.internalUserAdapter.getFederatedUserByInternalId(internalInviter._id); @@ -72,7 +72,7 @@ export class FederationRoomInternalValidator extends AbstractFederationApplicati const addingAnExternalUser = invitee?.isRemote(); const addingExternalUserToNonDirectMessageRoom = addingAnExternalUser && !isDirectMessageRoom(internalRoom); if (addingExternalUserToNonDirectMessageRoom) { - throw new Error('error-this-is-an-ee-feature'); + throw new Error('error-this-is-a-premium-feature'); } } @@ -89,7 +89,7 @@ export class FederationRoomInternalValidator extends AbstractFederationApplicati !FederatedUser.isOriginalFromTheProxyServer(this.bridge.extractHomeserverOrigin(username), this.internalHomeServerDomain), ) || internalUsers.filter((user) => !this.isAddingANewExternalUser(user)).some((user) => isUserFederated(user as IUser)); if (atLeastOneExternalUser) { - throw new Error('error-this-is-an-ee-feature'); + throw new Error('error-this-is-a-premium-feature'); } } diff --git a/apps/meteor/server/services/import/service.ts b/apps/meteor/server/services/import/service.ts index 2a61050fad33..cb95b2d1aa8f 100644 --- a/apps/meteor/server/services/import/service.ts +++ b/apps/meteor/server/services/import/service.ts @@ -4,8 +4,8 @@ import type { IImportUser, IImport, ImportStatus } from '@rocket.chat/core-typin import { Imports, ImportData } from '@rocket.chat/models'; import { ObjectId } from 'mongodb'; -import { Importers } from '../../../app/importer/lib/Importers'; -import { Selection } from '../../../app/importer/server/classes/ImporterSelection'; +import { Importers } from '../../../app/importer/server'; +import { ImporterSelection } from '../../../app/importer/server/classes/ImporterSelection'; import { settings } from '../../../app/settings/server'; import { validateRoleList } from '../../lib/roles/validateRoleList'; import { getNewUserRoles } from '../user/lib/getNewUserRoles'; @@ -92,7 +92,7 @@ export class ImportService extends ServiceClassInternal implements IImportServic }; } - private assertsValidStateForNewData(operation: IImport | null): asserts operation is IImport { + private assertsValidStateForNewData(operation: IImport | undefined): asserts operation is IImport { if (!operation?.valid) { throw new Error('Import operation not initialized.'); } @@ -172,12 +172,10 @@ export class ImportService extends ServiceClassInternal implements IImportServic skipDefaultChannels: true, enableEmail2fa: settings.get('Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In'), quickUserInsertion: true, - // Do not update the data of existing users, but add the importId to them if it's missing skipExistingUsers: true, - bindSkippedUsers: true, }); - const selection = new Selection(importer.name, [], [], 0); + const selection = new ImporterSelection(importer.name, [], [], 0); await instance.startImport(selection, userId); } } diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts new file mode 100644 index 000000000000..92e0a57ac7f1 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveBadWords.ts @@ -0,0 +1,49 @@ +import { type IMessage } from '@rocket.chat/core-typings'; +import type BadWordsFilter from 'bad-words'; + +export class BeforeSaveBadWords { + badWords: BadWordsFilter | null = null; + + async configure(badWordsList?: string, goodWordsList?: string) { + const { default: Filter } = await import('bad-words'); + + const options = { + list: + badWordsList + ?.split(',') + .map((word) => word.trim()) + .filter(Boolean) || [], + // library definition does not allow optional definition + exclude: undefined, + splitRegex: undefined, + placeHolder: undefined, + regex: undefined, + replaceRegex: undefined, + emptyList: undefined, + }; + + this.badWords = new Filter(options); + + if (goodWordsList?.length) { + this.badWords.removeWords(...goodWordsList.split(',').map((word) => word.trim())); + } + } + + disable() { + this.badWords = null; + } + + async filterBadWords({ message }: { message: IMessage }): Promise { + if (!message.msg || !this.badWords) { + return message; + } + + try { + message.msg = this.badWords.clean(message.msg); + } catch (error) { + // ignore + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveCheckMAC.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveCheckMAC.ts new file mode 100644 index 000000000000..6ba276971e6b --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveCheckMAC.ts @@ -0,0 +1,24 @@ +import { MeteorError, Omnichannel } from '@rocket.chat/core-services'; +import type { IRoom } from '@rocket.chat/core-typings'; +import { isOmnichannelRoom, type IMessage } from '@rocket.chat/core-typings'; + +export class BeforeSaveCheckMAC { + async isWithinLimits({ message, room }: { message: IMessage; room: IRoom }): Promise { + if (!isOmnichannelRoom(room)) { + return; + } + + if (message.token) { + return; + } + + if (message.t) { + return; + } + + const canSendMessage = await Omnichannel.isWithinMACLimit(room); + if (!canSendMessage) { + throw new MeteorError('error-mac-limit-reached'); + } + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveJumpToMessage.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveJumpToMessage.ts new file mode 100644 index 000000000000..c88a27cb2b73 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveJumpToMessage.ts @@ -0,0 +1,162 @@ +import QueryString from 'querystring'; +import URL from 'url'; + +import type { MessageAttachment, IMessage, IUser, IOmnichannelRoom, IRoom } from '@rocket.chat/core-typings'; +import { isOmnichannelRoom, isQuoteAttachment } from '@rocket.chat/core-typings'; + +import { createQuoteAttachment } from '../../../../lib/createQuoteAttachment'; + +const recursiveRemoveAttachments = (attachments: MessageAttachment, deep = 1, quoteChainLimit: number): MessageAttachment => { + if (attachments && isQuoteAttachment(attachments)) { + if (deep < quoteChainLimit - 1) { + attachments.attachments?.map((msg) => recursiveRemoveAttachments(msg, deep + 1, quoteChainLimit)); + } else { + delete attachments.attachments; + } + } + + return attachments; +}; + +const validateAttachmentDeepness = (message: IMessage, quoteChainLimit: number): IMessage => { + if (!message?.attachments) { + return message; + } + + if ((message.attachments && quoteChainLimit < 2) || isNaN(quoteChainLimit)) { + delete message.attachments; + } + + message.attachments = message.attachments?.map((attachment) => recursiveRemoveAttachments(attachment, 1, quoteChainLimit)); + + return message; +}; + +type JumpToMessageInit = { + getMessages(messageIds: IMessage['_id'][]): Promise; + getRooms(roomIds: IRoom['_id'][]): Promise; + canAccessRoom(room: IRoom, user: Pick): Promise; + getUserAvatarURL(user?: string): string; +}; + +/** + * Transform URLs in messages into quote attachments + */ +export class BeforeSaveJumpToMessage { + private getMessages: JumpToMessageInit['getMessages']; + + private getRooms: JumpToMessageInit['getRooms']; + + private canAccessRoom: JumpToMessageInit['canAccessRoom']; + + private getUserAvatarURL: JumpToMessageInit['getUserAvatarURL']; + + constructor(options: JumpToMessageInit) { + this.getMessages = options.getMessages; + this.getRooms = options.getRooms; + this.canAccessRoom = options.canAccessRoom; + this.getUserAvatarURL = options.getUserAvatarURL; + } + + async createAttachmentForMessageURLs({ + message, + user: currentUser, + config, + }: { + message: IMessage; + user: Pick; + config: { + chainLimit: number; + siteUrl: string; + useRealName: boolean; + }; + }): Promise { + // if no message is present, or the message doesn't have any URL, skip + if (!message?.urls?.length) { + return message; + } + + const linkedMessages = message.urls + .filter((item) => item.url.includes(config.siteUrl)) + .map((item) => { + const urlObj = URL.parse(item.url); + + // if the URL doesn't have query params (doesn't reference message) skip + if (!urlObj.query) { + return; + } + + const { msg: msgId } = QueryString.parse(urlObj.query); + + if (typeof msgId !== 'string') { + return; + } + + return { msgId, url: item.url }; + }) + .filter(Boolean); + + const msgs = await this.getMessages(linkedMessages.map((linkedMsg) => linkedMsg?.msgId) as string[]); + + const validMessages = msgs.filter((msg) => validateAttachmentDeepness(msg, config.chainLimit)); + + const rooms = await this.getRooms(validMessages.map((msg) => msg.rid)); + + const roomsWithPermission = + rooms && + (await Promise.all( + rooms.map(async (room) => { + if (!!message.token && isOmnichannelRoom(room) && !!room.v?.token && message.token === room.v.token) { + return room; + } + + if (currentUser && (await this.canAccessRoom(room, currentUser))) { + return room; + } + }), + )); + + const validRooms = roomsWithPermission?.filter((room) => !!room); + + const { useRealName } = config; + + const quotes = []; + + for (const item of message.urls) { + if (!item.url.includes(config.siteUrl)) { + continue; + } + + const linkedMessage = linkedMessages.find((msg) => msg?.url === item.url); + if (!linkedMessage) { + continue; + } + + const messageFromUrl = validMessages.find((msg) => msg._id === linkedMessage.msgId); + if (!messageFromUrl) { + continue; + } + + if (!validRooms?.find((room) => room?._id === messageFromUrl.rid)) { + continue; + } + + item.ignoreParse = true; + + // Only QuoteAttachments have "message_link" property + const index = message.attachments?.findIndex((a) => isQuoteAttachment(a) && a.message_link === item.url); + if (index !== undefined && index > -1) { + message.attachments?.splice(index, 1); + } + + quotes.push(createQuoteAttachment(messageFromUrl, item.url, useRealName, this.getUserAvatarURL(messageFromUrl.u.username))); + } + + if (quotes.length > 0) { + message.attachments = message.attachments || []; + message.attachments.push(...quotes); + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts new file mode 100644 index 000000000000..b4b099485de3 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts @@ -0,0 +1,43 @@ +import { isE2EEMessage, isOTRMessage, isOTRAckMessage } from '@rocket.chat/core-typings'; +import type { IMessage } from '@rocket.chat/core-typings'; +import { parse } from '@rocket.chat/message-parser'; + +type ParserConfig = { + colors?: boolean; + emoticons?: boolean; + customDomains?: string[]; + katex?: { + dollarSyntax: boolean; + parenthesisSyntax: boolean; + }; +}; + +export class BeforeSaveMarkdownParser { + constructor(private enabled: boolean = true) { + // no op + } + + async parseMarkdown({ message, config }: { message: IMessage; config: ParserConfig }): Promise { + if (!this.enabled) { + return message; + } + + if (isE2EEMessage(message) || isOTRMessage(message) || isOTRAckMessage(message)) { + return message; + } + + try { + if (message.msg) { + message.md = parse(message.msg, config); + } + + if (message.attachments?.[0]?.description !== undefined) { + message.attachments[0].descriptionMd = parse(message.attachments[0].description, config); + } + } catch (e) { + console.error(e); // errors logged while the parser is at experimental stage + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveMentions.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveMentions.ts new file mode 100644 index 000000000000..bcf022587e8a --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveMentions.ts @@ -0,0 +1,87 @@ +import { api, Team, MeteorError } from '@rocket.chat/core-services'; +import type { IMessage, IUser, IRoom } from '@rocket.chat/core-typings'; +import { Subscriptions, Users, Rooms } from '@rocket.chat/models'; + +import { MentionsServer } from '../../../../app/mentions/server/Mentions'; +import { settings } from '../../../../app/settings/server'; +import { i18n } from '../../../lib/i18n'; + +class MentionQueries { + async getUsers(usernames: string[]): Promise<{ type: 'team' | 'user'; _id: string; username?: string; name?: string }[]> { + const uniqueUsernames = [...new Set(usernames)]; + + const teams = await Team.listByNames(uniqueUsernames, { projection: { name: 1 } }); + + const users = await Users.find>( + { username: { $in: uniqueUsernames } }, + { projection: { _id: 1, username: 1, name: 1 } }, + ).toArray(); + + const taggedUsers = users.map((user) => ({ + ...user, + type: 'user' as const, + })); + + if (settings.get('Troubleshoot_Disable_Teams_Mention')) { + return taggedUsers; + } + + const taggedTeams = teams.map((team) => ({ + ...team, + type: 'team' as const, + })); + + return [...taggedUsers, ...taggedTeams]; + } + + async getUser(userId: string): Promise { + return Users.findOneById(userId); + } + + getTotalChannelMembers(rid: string): Promise { + return Subscriptions.countByRoomId(rid); + } + + getChannels(channels: string[]): Promise[]> { + return Rooms.find( + { + $and: [ + { + $or: [ + { $and: [{ $or: [{ federated: { $exists: false } }, { federated: false }], name: { $in: [...new Set(channels)] } }] }, + { federated: true, fname: { $in: [...new Set(channels)] } }, + ], + }, + ], + t: { $in: ['c', 'p'] }, + }, + { projection: { _id: 1, name: 1, fname: 1, federated: 1 } }, + ).toArray(); + } +} + +const queries = new MentionQueries(); + +export const mentionServer = new MentionsServer({ + pattern: () => settings.get('UTF8_User_Names_Validation'), + messageMaxAll: () => settings.get('Message_MaxAll'), + getUsers: async (usernames: string[]) => queries.getUsers(usernames), + getUser: async (userId: string) => queries.getUser(userId), + getTotalChannelMembers: (rid: string) => queries.getTotalChannelMembers(rid), + getChannels: (channels: string[]) => queries.getChannels(channels), + async onMaxRoomMembersExceeded({ sender, rid }: { sender: IMessage['u']; rid: string }): Promise { + // Get the language of the user for the error notification. + const { language } = (await this.getUser(sender._id)) || {}; + const msg = i18n.t('Group_mentions_disabled_x_members', { total: this.messageMaxAll(), lng: language }); + + void api.broadcast('notify.ephemeralMessage', sender._id, rid, { + msg, + }); + + // Also throw to stop propagation of 'sendMessage'. + throw new MeteorError('error-action-not-allowed', msg, { + method: 'filterATAllTag', + action: msg, + }); + }, +}); diff --git a/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts b/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts new file mode 100644 index 000000000000..b87c0e613d2d --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSavePreventMention.ts @@ -0,0 +1,47 @@ +import { Authorization, MeteorError, type IApiService } from '@rocket.chat/core-services'; +import { type IMessage, type IUser } from '@rocket.chat/core-typings'; + +import { i18n } from '../../../lib/i18n'; + +export class BeforeSavePreventMention { + constructor(private api?: IApiService) {} + + async preventMention({ + message, + user, + mention, + permission, + }: { + message: IMessage; + user: Pick; + mention: 'here' | 'all'; + permission: string; + }): Promise { + if (!message.mentions?.some(({ _id }) => _id === mention)) { + return true; + } + + // Check if the user has permissions to use @all in both global and room scopes. + if (await Authorization.hasPermission(message.u._id, permission)) { + return true; + } + + if (await Authorization.hasPermission(message.u._id, permission, message.rid)) { + return true; + } + + const action = i18n.t('Notify_all_in_this_room', { lng: user.language }); + + // Add a notification to the chat, informing the user that this + // action is not allowed. + void this.api?.broadcast('notify.ephemeralMessage', message.u._id, message.rid, { + // TODO: i18n + msg: i18n.t('error-action-not-allowed', { action } as any, user.language), + }); + + // Also throw to stop propagation of 'sendMessage'. + throw new MeteorError('error-action-not-allowed', `Notify ${mention} in this room not allowed`, { + action: 'Notify_all_in_this_room', + }); + } +} diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts new file mode 100644 index 000000000000..8d0ceca98437 --- /dev/null +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveSpotify.ts @@ -0,0 +1,38 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +// look for spotify syntax (e.g.: spotify:track:1q6IK1l4qpYykOaWaLJkWG) on the message and add them to the urls array +export class BeforeSaveSpotify { + async convertSpotifyLinks({ message }: { message: IMessage }): Promise { + if (!message.msg?.trim()) { + return message; + } + + const urls = Array.isArray(message.urls) ? message.urls : []; + + let changed = false; + + const msgParts = message.msg.split(/(```\w*[\n ]?[\s\S]*?```+?)|(`(?:[^`]+)`)/); + for (let index = 0; index < msgParts.length; index++) { + const part = msgParts[index]; + + if (!/(?:```(\w*)[\n ]?([\s\S]*?)```+?)|(?:`(?:[^`]+)`)/.test(part)) { + const re = /(?:^|\s)spotify:([^:\s]+):([^:\s]+)(?::([^:\s]+))?(?::(\S+))?(?:\s|$)/g; + + let match; + while ((match = re.exec(part)) != null) { + const data = match.slice(1).filter(Boolean); + const path = data.map((value) => encodeURI(value)).join('/'); + const url = `https://open.spotify.com/${path}`; + urls.push({ url, source: `spotify:${data.join(':')}`, meta: {} }); + changed = true; + } + } + } + + if (changed) { + message.urls = urls; + } + + return message; + } +} diff --git a/apps/meteor/server/services/messages/hooks/badwords.ts b/apps/meteor/server/services/messages/hooks/badwords.ts deleted file mode 100644 index 17641d8f9c7f..000000000000 --- a/apps/meteor/server/services/messages/hooks/badwords.ts +++ /dev/null @@ -1,26 +0,0 @@ -export async function configureBadWords(badWordsList?: string, goodWordsList?: string) { - const { default: Filter } = await import('bad-words'); - - const options = { - list: - badWordsList - ?.split(',') - .map((word) => word.trim()) - .filter(Boolean) || [], - // library definition does not allow optional definition - exclude: undefined, - splitRegex: undefined, - placeHolder: undefined, - regex: undefined, - replaceRegex: undefined, - emptyList: undefined, - }; - - const badWords = new Filter(options); - - if (goodWordsList?.length) { - badWords.removeWords(...goodWordsList.split(',').map((word) => word.trim())); - } - - return badWords; -} diff --git a/apps/meteor/server/services/messages/service.ts b/apps/meteor/server/services/messages/service.ts index f981422727f7..f20c545f6abe 100644 --- a/apps/meteor/server/services/messages/service.ts +++ b/apps/meteor/server/services/messages/service.ts @@ -1,8 +1,7 @@ import type { IMessageService } from '@rocket.chat/core-services'; -import { ServiceClassInternal } from '@rocket.chat/core-services'; -import type { IMessage, MessageTypesValues, IUser, IRoom } from '@rocket.chat/core-typings'; -import { Messages } from '@rocket.chat/models'; -import type BadWordsFilter from 'bad-words'; +import { Authorization, ServiceClassInternal } from '@rocket.chat/core-services'; +import { type IMessage, type MessageTypesValues, type IUser, type IRoom, isEditedMessage } from '@rocket.chat/core-typings'; +import { Messages, Rooms } from '@rocket.chat/models'; import { deleteMessage } from '../../../app/lib/server/functions/deleteMessage'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; @@ -10,14 +9,58 @@ import { updateMessage } from '../../../app/lib/server/functions/updateMessage'; import { executeSendMessage } from '../../../app/lib/server/methods/sendMessage'; import { executeSetReaction } from '../../../app/reactions/server/setReaction'; import { settings } from '../../../app/settings/server'; -import { configureBadWords } from './hooks/badwords'; +import { getUserAvatarURL } from '../../../app/utils/server/getUserAvatarURL'; +import { BeforeSaveCannedResponse } from '../../../ee/server/hooks/messages/BeforeSaveCannedResponse'; +import { broadcastMessageSentEvent } from '../../modules/watchers/lib/messages'; +import { BeforeSaveBadWords } from './hooks/BeforeSaveBadWords'; +import { BeforeSaveCheckMAC } from './hooks/BeforeSaveCheckMAC'; +import { BeforeSaveJumpToMessage } from './hooks/BeforeSaveJumpToMessage'; +import { BeforeSaveMarkdownParser } from './hooks/BeforeSaveMarkdownParser'; +import { mentionServer } from './hooks/BeforeSaveMentions'; +import { BeforeSavePreventMention } from './hooks/BeforeSavePreventMention'; +import { BeforeSaveSpotify } from './hooks/BeforeSaveSpotify'; + +const disableMarkdownParser = ['yes', 'true'].includes(String(process.env.DISABLE_MESSAGE_PARSER).toLowerCase()); export class MessageService extends ServiceClassInternal implements IMessageService { protected name = 'message'; - private badWordsFilter?: BadWordsFilter; + private preventMention: BeforeSavePreventMention; + + private badWords: BeforeSaveBadWords; + + private spotify: BeforeSaveSpotify; + + private jumpToMessage: BeforeSaveJumpToMessage; + + private cannedResponse: BeforeSaveCannedResponse; + + private markdownParser: BeforeSaveMarkdownParser; + + private checkMAC: BeforeSaveCheckMAC; async created() { + this.preventMention = new BeforeSavePreventMention(this.api); + this.badWords = new BeforeSaveBadWords(); + this.spotify = new BeforeSaveSpotify(); + this.jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages(messageIds) { + return Messages.findVisibleByIds(messageIds).toArray(); + }, + getRooms(roomIds) { + return Rooms.findByIds(roomIds).toArray(); + }, + canAccessRoom(room: IRoom, user: IUser): Promise { + return Authorization.canAccessRoom(room, user); + }, + getUserAvatarURL(user?: string): string { + return (user && getUserAvatarURL(user)) || ''; + }, + }); + this.cannedResponse = new BeforeSaveCannedResponse(); + this.markdownParser = new BeforeSaveMarkdownParser(!disableMarkdownParser); + this.checkMAC = new BeforeSaveCheckMAC(); + await this.configureBadWords(); } @@ -26,10 +69,10 @@ export class MessageService extends ServiceClassInternal implements IMessageServ ['Message_AllowBadWordsFilter', 'Message_BadWordsFilterList', 'Message_BadWordsWhitelist'], async ([enabled, badWordsList, whiteList]) => { if (!enabled) { - this.badWordsFilter = undefined; + this.badWords.disable(); return; } - this.badWordsFilter = await configureBadWords(badWordsList as string, whiteList as string); + await this.badWords.configure(badWordsList as string, whiteList as string); }, ); } @@ -65,54 +108,88 @@ export class MessageService extends ServiceClassInternal implements IMessageServ if (!username) { throw new Error('The username cannot be empty.'); } - const result = await Messages.createWithTypeRoomIdMessageUserAndUnread( - type, - rid, - message, - { _id: userId, username, name }, - settings.get('Message_Read_Receipt_Enabled'), - extraData, - ); + + const [result] = await Promise.all([ + Messages.createWithTypeRoomIdMessageUserAndUnread( + type, + rid, + message, + { _id: userId, username, name }, + settings.get('Message_Read_Receipt_Enabled'), + extraData, + ), + Rooms.incMsgCountById(rid, 1), + ]); + + void broadcastMessageSentEvent({ + id: result.insertedId, + broadcastCallback: async (message) => this.api?.broadcast('message.sent', message), + }); return result.insertedId; } async beforeSave({ message, - room: _room, - user: _user, + room, + user, }: { message: IMessage; room: IRoom; - user: Pick; + user: Pick; }): Promise { // TODO looks like this one was not being used (so I'll left it commented) // await this.joinDiscussionOnMessage({ message, room, user }); - // conditionals here should be fast, so they won't add up for each message - if (this.isBadWordsFilterEnabled()) { - message = await this.filterBadWords(message); + message = await mentionServer.execute(message); + message = await this.cannedResponse.replacePlaceholders({ message, room, user }); + message = await this.markdownParser.parseMarkdown({ message, config: this.getMarkdownConfig() }); + message = await this.badWords.filterBadWords({ message }); + message = await this.spotify.convertSpotifyLinks({ message }); + message = await this.jumpToMessage.createAttachmentForMessageURLs({ + message, + user, + config: { + chainLimit: settings.get('Message_QuoteChainLimit'), + siteUrl: settings.get('Site_Url'), + useRealName: settings.get('UI_Use_Real_Name'), + }, + }); + + if (!this.isEditedOrOld(message)) { + await Promise.all([ + this.checkMAC.isWithinLimits({ message, room }), + this.preventMention.preventMention({ message, user, mention: 'all', permission: 'mention-all' }), + this.preventMention.preventMention({ message, user, mention: 'here', permission: 'mention-here' }), + ]); } return message; } - private isBadWordsFilterEnabled() { - return !!settings.get('Message_AllowBadWordsFilter'); + private getMarkdownConfig() { + const customDomains = settings.get('Message_CustomDomain_AutoLink') + ? settings + .get('Message_CustomDomain_AutoLink') + .split(',') + .map((domain) => domain.trim()) + : []; + + return { + colors: settings.get('HexColorPreview_Enabled'), + emoticons: true, + customDomains, + ...(settings.get('Katex_Enabled') && { + katex: { + dollarSyntax: settings.get('Katex_Dollar_Syntax'), + parenthesisSyntax: settings.get('Katex_Parenthesis_Syntax'), + }, + }), + }; } - private async filterBadWords(message: IMessage): Promise { - if (!message.msg || !this.badWordsFilter) { - return message; - } - - try { - message.msg = this.badWordsFilter.clean(message.msg); - } catch (error) { - // ignore - } - - return message; + private isEditedOrOld(message: IMessage): boolean { + return isEditedMessage(message) || !message.ts || Math.abs(Date.now() - message.ts.getTime()) > 60000; } // joinDiscussionOnMessage diff --git a/apps/meteor/server/services/meteor/service.ts b/apps/meteor/server/services/meteor/service.ts index 2420a70d7ada..95d2061e2f67 100644 --- a/apps/meteor/server/services/meteor/service.ts +++ b/apps/meteor/server/services/meteor/service.ts @@ -1,13 +1,13 @@ -import { api, ServiceClassInternal } from '@rocket.chat/core-services'; +import { api, ServiceClassInternal, listenToMessageSentEvent } from '@rocket.chat/core-services'; import type { AutoUpdateRecord, IMeteor } from '@rocket.chat/core-services'; -import type { ILivechatAgent } from '@rocket.chat/core-typings'; +import type { ILivechatAgent, UserStatus } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { MongoInternals } from 'meteor/mongo'; import { ServiceConfiguration } from 'meteor/service-configuration'; import { triggerHandler } from '../../../app/integrations/server/lib/triggerHandler'; -import { Livechat } from '../../../app/livechat/server'; +import { Livechat } from '../../../app/livechat/server/lib/LivechatTyped'; import { onlineAgents, monitorAgents } from '../../../app/livechat/server/lib/stream/agentStatus'; import { metrics } from '../../../app/metrics/server'; import notifications from '../../../app/notifications/server/lib/Notifications'; @@ -152,9 +152,11 @@ export class MeteorService extends ServiceClassInternal implements IMeteor { return; } - serviceConfigCallbacks.forEach((callbacks) => { - callbacks[clientAction === 'inserted' ? 'added' : 'changed']?.(id, data); - }); + if (data) { + serviceConfigCallbacks.forEach((callbacks) => { + callbacks[clientAction === 'inserted' ? 'added' : 'changed']?.(id, data); + }); + } }); } @@ -221,9 +223,9 @@ export class MeteorService extends ServiceClassInternal implements IMeteor { }); if (!disableMsgRoundtripTracking) { - this.onEvent('watch.messages', ({ message }) => { - if (message?._updatedAt) { - metrics.messageRoundtripTime.set(Date.now() - message._updatedAt.getDate()); + listenToMessageSentEvent(this, async (message) => { + if (message?._updatedAt instanceof Date) { + metrics.messageRoundtripTime.observe(Date.now() - message._updatedAt.getTime()); } }); } @@ -275,7 +277,7 @@ export class MeteorService extends ServiceClassInternal implements IMeteor { }; } - async notifyGuestStatusChanged(token: string, status: string): Promise { + async notifyGuestStatusChanged(token: string, status: UserStatus): Promise { return Livechat.notifyGuestStatusChanged(token, status); } diff --git a/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts b/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts index 8e4c06941c81..f6da6e682b11 100644 --- a/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts +++ b/apps/meteor/server/services/nps/getAndCreateNpsSurvey.ts @@ -1,6 +1,7 @@ import { Banner } from '@rocket.chat/core-services'; -import type { UiKit, IBanner, BannerPlatform } from '@rocket.chat/core-typings'; +import type { IBanner, BannerPlatform } from '@rocket.chat/core-typings'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; +import type * as UiKit from '@rocket.chat/ui-kit'; import { getWorkspaceAccessToken } from '../../../app/cloud/server'; import { settings } from '../../../app/settings/server'; @@ -57,6 +58,7 @@ export const getAndCreateNpsSurvey = async function getNpsSurvey(npsId: string) username: 'rocket.cat', }, view: surveyData.survey, + surface: 'banner', }; await Banner.create(banner); diff --git a/apps/meteor/server/services/nps/notification.ts b/apps/meteor/server/services/nps/notification.ts index 692b9bc6291f..e8e7e621d2c7 100644 --- a/apps/meteor/server/services/nps/notification.ts +++ b/apps/meteor/server/services/nps/notification.ts @@ -1,5 +1,6 @@ import type { IBanner } from '@rocket.chat/core-typings'; import { BannerPlatform } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; import moment from 'moment'; import { settings } from '../../../app/settings/server'; @@ -20,8 +21,9 @@ export const getBannerForAdmins = (expireAt: Date): Omit => { username: 'rocket.cat', }, _updatedAt: new Date(), + surface: 'banner', view: { - viewId: '', + viewId: Random.id(), appId: '', blocks: [ { diff --git a/apps/meteor/server/services/nps/service.ts b/apps/meteor/server/services/nps/service.ts index a3ee9b7eebed..9554a472fb0a 100644 --- a/apps/meteor/server/services/nps/service.ts +++ b/apps/meteor/server/services/nps/service.ts @@ -82,7 +82,7 @@ export class NPSService extends ServiceClassInternal implements INPSService { const sending = await Promise.all( votesToSend.map(async (vote) => { - const { value } = await NpsVote.col.findOneAndUpdate( + const { value } = await NpsVote.findOneAndUpdate( { _id: vote._id, status: INpsVoteStatus.NEW, diff --git a/apps/meteor/server/services/omnichannel-analytics/AgentData.ts b/apps/meteor/server/services/omnichannel-analytics/AgentData.ts new file mode 100644 index 000000000000..7475dc4a2d5e --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/AgentData.ts @@ -0,0 +1,410 @@ +/* eslint-disable new-cap */ +import type { ConversationData } from '@rocket.chat/core-services'; +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import type { Filter } from 'mongodb'; + +import { secondsToHHMMSS } from '../../../lib/utils/secondsToHHMMSS'; + +type AgentOverviewValidActions = + | 'Total_conversations' + | 'Avg_chat_duration' + | 'Total_messages' + | 'Avg_first_response_time' + | 'Best_first_response_time' + | 'Avg_response_time' + | 'Avg_reaction_time'; + +export class AgentOverviewData { + constructor(private readonly roomsModel: ILivechatRoomsModel) {} + + updateMap(map: Map, key: K, value: number) { + const currentKeyValue = map.get(key); + map.set(key, currentKeyValue ? currentKeyValue + value : value); + } + + sortByValue(data: { value: string }[], inv = false) { + data.sort((a, b) => { + // sort array + if (parseFloat(a.value) > parseFloat(b.value)) { + return inv ? -1 : 1; // if inv, reverse sort + } + if (parseFloat(a.value) < parseFloat(b.value)) { + return inv ? 1 : -1; + } + return 0; + }); + } + + isActionAllowed(action: string | undefined): action is AgentOverviewValidActions { + if (!action) { + return false; + } + return [ + 'Total_conversations', + 'Avg_chat_duration', + 'Total_messages', + 'Avg_first_response_time', + 'Best_first_response_time', + 'Avg_response_time', + 'Avg_reaction_time', + ].includes(action); + } + + callAction(action: T, ...args: [moment.Moment, moment.Moment, string?, Filter?]) { + switch (action) { + case 'Total_conversations': + return this.Total_conversations(...args); + case 'Avg_chat_duration': + return this.Avg_chat_duration(...args); + case 'Total_messages': + return this.Total_messages(...args); + case 'Avg_first_response_time': + return this.Avg_first_response_time(...args); + case 'Best_first_response_time': + return this.Best_first_response_time(...args); + case 'Avg_response_time': + return this.Avg_response_time(...args); + case 'Avg_reaction_time': + return this.Avg_reaction_time(...args); + default: + throw new Error('Invalid action'); + } + } + + async Total_conversations(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + let total = 0; + const agentConversations = new Map(); // stores total conversations for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: '%_of_conversations', + }, + ], + data: [], + }; + + await this.roomsModel + .getAnalyticsMetricsBetweenDateWithMessages( + 'l', + date, + { + departmentId, + }, + {}, + extraQuery, + ) + .forEach((room) => { + if (room.servedBy) { + this.updateMap(agentConversations, room.servedBy.username, 1); + total++; + } + }); + + agentConversations.forEach((value, key) => { + // calculate percentage + const percentage = ((value / total) * 100).toFixed(2); + + data.data.push({ + name: key, + value: `${percentage}%`, + }); + }); + + this.sortByValue(data.data, true); // reverse sort array + + return data; + } + + async Avg_chat_duration(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentChatDurations = new Map(); // stores total conversations for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_chat_duration', + }, + ], + data: [], + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics, servedBy }) => { + if (servedBy && metrics && metrics.chatDuration) { + if (agentChatDurations.has(servedBy.username)) { + agentChatDurations.set(servedBy.username, { + chatDuration: agentChatDurations.get(servedBy.username).chatDuration + metrics.chatDuration, + total: agentChatDurations.get(servedBy.username).total + 1, + }); + } else { + agentChatDurations.set(servedBy.username, { + chatDuration: metrics.chatDuration, + total: 1, + }); + } + } + }); + + agentChatDurations.forEach((obj, key) => { + // calculate percentage + const avg = (obj.chatDuration / obj.total).toFixed(2); + + data.data.push({ + name: key, + value: secondsToHHMMSS(avg), + }); + }); + + this.sortByValue(data.data, true); // reverse sort array + + return data; + } + + async Total_messages(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentMessages = new Map(); // stores total conversations for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Total_messages', + }, + ], + data: [], + }; + + // we don't want to count visitor messages + const extraFilter = { $lte: ['$token', null] }; + await this.roomsModel + .getAnalyticsMetricsBetweenDateWithMessages('l', date, { departmentId }, extraFilter, extraQuery) + .forEach(({ servedBy, msgs }) => { + if (servedBy) { + this.updateMap(agentMessages, servedBy.username, msgs); + } + }); + + agentMessages.forEach((value, key) => { + // calculate percentage + data.data.push({ + name: key, + value, + }); + }); + + this.sortByValue(data.data, true); // reverse sort array + + return data; + } + + async Avg_first_response_time(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentAvgRespTime = new Map(); // stores avg response time for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_first_response_time', + }, + ], + data: [], + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics, servedBy }) => { + if (servedBy && metrics && metrics.response && metrics.response.ft) { + if (agentAvgRespTime.has(servedBy.username)) { + agentAvgRespTime.set(servedBy.username, { + frt: agentAvgRespTime.get(servedBy.username).frt + metrics.response.ft, + total: agentAvgRespTime.get(servedBy.username).total + 1, + }); + } else { + agentAvgRespTime.set(servedBy.username, { + frt: metrics.response.ft, + total: 1, + }); + } + } + }); + + agentAvgRespTime.forEach((obj, key) => { + // calculate avg + const avg = obj.frt / obj.total; + + data.data.push({ + name: key, + value: secondsToHHMMSS(avg.toFixed(2)), + }); + }); + + this.sortByValue(data.data, false); // sort array + + return data; + } + + async Best_first_response_time(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentFirstRespTime = new Map(); // stores avg response time for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Best_first_response_time', + }, + ], + data: [], + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics, servedBy }) => { + if (servedBy && metrics && metrics.response && metrics.response.ft) { + if (agentFirstRespTime.has(servedBy.username)) { + agentFirstRespTime.set(servedBy.username, Math.min(agentFirstRespTime.get(servedBy.username), metrics.response.ft)); + } else { + agentFirstRespTime.set(servedBy.username, metrics.response.ft); + } + } + }); + + agentFirstRespTime.forEach((value, key) => { + // calculate avg + data.data.push({ + name: key, + value: secondsToHHMMSS(value.toFixed(2)), + }); + }); + + this.sortByValue(data.data, false); // sort array + + return data; + } + + async Avg_response_time(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentAvgRespTime = new Map(); // stores avg response time for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + data: [], + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics, servedBy }) => { + if (servedBy && metrics && metrics.response && metrics.response.avg) { + if (agentAvgRespTime.has(servedBy.username)) { + agentAvgRespTime.set(servedBy.username, { + avg: agentAvgRespTime.get(servedBy.username).avg + metrics.response.avg, + total: agentAvgRespTime.get(servedBy.username).total + 1, + }); + } else { + agentAvgRespTime.set(servedBy.username, { + avg: metrics.response.avg, + total: 1, + }); + } + } + }); + + agentAvgRespTime.forEach((obj, key) => { + // calculate avg + const avg = obj.avg / obj.total; + + data.data.push({ + name: key, + value: secondsToHHMMSS(avg.toFixed(2)), + }); + }); + + this.sortByValue(data.data, false); // sort array + + return data; + } + + async Avg_reaction_time(from: moment.Moment, to: moment.Moment, departmentId?: string, extraQuery: Filter = {}) { + const agentAvgReactionTime = new Map(); // stores avg reaction time for each agent + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + const data: ConversationData = { + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + data: [], + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics, servedBy }) => { + if (servedBy && metrics && metrics.reaction && metrics.reaction.ft) { + if (agentAvgReactionTime.has(servedBy.username)) { + agentAvgReactionTime.set(servedBy.username, { + frt: agentAvgReactionTime.get(servedBy.username).frt + metrics.reaction.ft, + total: agentAvgReactionTime.get(servedBy.username).total + 1, + }); + } else { + agentAvgReactionTime.set(servedBy.username, { + frt: metrics.reaction.ft, + total: 1, + }); + } + } + }); + + agentAvgReactionTime.forEach((obj, key) => { + // calculate avg + const avg = obj.frt / obj.total; + + data.data.push({ + name: key, + value: secondsToHHMMSS(avg.toFixed(2)), + }); + }); + + this.sortByValue(data.data, false); // sort array + + return data; + } +} diff --git a/apps/meteor/server/services/omnichannel-analytics/ChartData.ts b/apps/meteor/server/services/omnichannel-analytics/ChartData.ts new file mode 100644 index 000000000000..044dca954c6d --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/ChartData.ts @@ -0,0 +1,140 @@ +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import type { Filter } from 'mongodb'; + +/* eslint-disable new-cap */ +type ChartDataValidActions = + | 'Total_conversations' + | 'Avg_chat_duration' + | 'Total_messages' + | 'Avg_first_response_time' + | 'Avg_reaction_time'; + +type DateParam = { + gte: Date; + lt: Date; +}; + +export class ChartData { + constructor(private readonly roomsModel: ILivechatRoomsModel) {} + + isActionAllowed(action: string | undefined): action is ChartDataValidActions { + if (!action) { + return false; + } + return ['Total_conversations', 'Avg_chat_duration', 'Total_messages', 'Avg_first_response_time', 'Avg_reaction_time'].includes(action); + } + + callAction(action: T, ...args: [DateParam, string?, Filter?]) { + switch (action) { + case 'Total_conversations': + return this.Total_conversations(...args); + case 'Avg_chat_duration': + return this.Avg_chat_duration(...args); + case 'Total_messages': + return this.Total_messages(...args); + case 'Avg_first_response_time': + return this.Avg_first_response_time(...args); + case 'Avg_reaction_time': + return this.Avg_reaction_time(...args); + default: + throw new Error('Invalid action'); + } + } + + async Total_conversations(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + // @ts-expect-error - Check extraquery usage on this func + return this.roomsModel.getTotalConversationsBetweenDate('l', date, { departmentId }, extraQuery); + } + + async Avg_chat_duration(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let total = 0; + let count = 0; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.chatDuration) { + total += metrics.chatDuration; + count++; + } + }); + + const avgCD = count ? total / count : 0; + return Math.round(avgCD * 100) / 100; + } + + async Total_messages(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let total = 0; + + // we don't want to count visitor messages + const extraFilter = { $lte: ['$token', null] }; + await this.roomsModel + .getAnalyticsMetricsBetweenDateWithMessages('l', date, { departmentId }, extraFilter, extraQuery) + .forEach(({ msgs }) => { + if (msgs) { + total += msgs; + } + }); + + return total; + } + + async Avg_first_response_time(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let frt = 0; + let count = 0; + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.response?.ft) { + frt += metrics.response.ft; + count++; + } + }); + + const avgFrt = count ? frt / count : 0; + return Math.round(avgFrt * 100) / 100; + } + + async Best_first_response_time(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let maxFrt = 0; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.response?.ft) { + maxFrt = maxFrt ? Math.min(maxFrt, metrics.response.ft) : metrics.response.ft; + } + }); + + if (!maxFrt) { + maxFrt = 0; + } + + return Math.round(maxFrt * 100) / 100; + } + + async Avg_response_time(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let art = 0; + let count = 0; + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.response?.avg) { + art += metrics.response.avg; + count++; + } + }); + + const avgArt = count ? art / count : 0; + + return Math.round(avgArt * 100) / 100; + } + + async Avg_reaction_time(date: DateParam, departmentId?: string, extraQuery: Filter = {}) { + let arnt = 0; + let count = 0; + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.reaction?.ft) { + arnt += metrics.reaction.ft; + count++; + } + }); + + const avgArnt = count ? arnt / count : 0; + + return Math.round(avgArnt * 100) / 100; + } +} diff --git a/apps/meteor/server/services/omnichannel-analytics/OverviewData.ts b/apps/meteor/server/services/omnichannel-analytics/OverviewData.ts new file mode 100644 index 000000000000..a05823dd0fe4 --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/OverviewData.ts @@ -0,0 +1,219 @@ +/* eslint-disable new-cap */ +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import moment from 'moment-timezone'; +import type { Filter } from 'mongodb'; + +import { secondsToHHMMSS } from '../../../lib/utils/secondsToHHMMSS'; + +type OverviewDataValidActions = 'Conversations' | 'Productivity'; + +export class OverviewData { + constructor(private readonly roomsModel: ILivechatRoomsModel) {} + + isActionAllowed(action: string | undefined): action is OverviewDataValidActions { + if (!action) { + return false; + } + return ['Conversations', 'Productivity'].includes(action); + } + + callAction( + action: T, + ...args: [moment.Moment, moment.Moment, string?, string?, ((v: string) => string)?, Filter?] + ) { + switch (action) { + case 'Conversations': + return this.Conversations(...args); + case 'Productivity': + return this.Productivity(...args); + default: + throw new Error('Invalid action'); + } + } + + getKeyHavingMaxValue(map: Map, def: T): T { + let maxValue = 0; + let maxKey = def; // default + + map.forEach((value, key) => { + if (value > maxValue) { + maxValue = value; + maxKey = key; + } + }); + + return maxKey; + } + + sumAllMapKeys(map: Map): number { + let sum = 0; + + map.forEach((value) => { + sum += value; + }); + + return sum; + } + + getBusiestDay(map: Map>): string { + let mostMessages = -1; + let busiestDay = '-'; + + map.forEach((value, key) => { + const v = this.sumAllMapKeys(value); + if (v > mostMessages) { + mostMessages = v; + busiestDay = key; + } + }); + + return busiestDay; + } + + getAllMapKeysSize(map: Map>): number { + let size = 0; + + [...map.keys()].forEach((key) => { + size += map.get(key)?.size || 0; + }); + + return size; + } + + async Conversations( + from: moment.Moment, + to: moment.Moment, + departmentId?: string, + timezone = 'UTC', + t = (v: string): string => v, + extraQuery: Filter = {}, + ) { + const analyticsMap = new Map(); + let openConversations = 0; // open conversations + let totalMessages = 0; // total msgs + let totalConversations = 0; // Total conversations + const days = to.diff(from, 'days') + 1; // total days + + const date = { + gte: moment.tz(from, timezone).startOf('day').utc(), + lt: moment.tz(to, timezone).endOf('day').utc(), + }; + + // @ts-expect-error - Check extraquery usage on this func + const cursor = this.roomsModel.getAnalyticsBetweenDate(date, { departmentId }, extraQuery); + + for await (const room of cursor) { + totalConversations++; + + if (room.metrics && !room.metrics.chatDuration && !room.onHold) { + openConversations++; + } + const creationDay = moment.tz(room.ts, timezone).format('DD-MM-YYYY'); // @string: 01-01-2021 + const creationHour = moment.tz(room.ts, timezone).format('H'); // @int : 0, 1, ... 23 + + if (!analyticsMap.has(creationDay)) { + analyticsMap.set(creationDay, new Map()); + } + + const dayMap = analyticsMap.get(creationDay); + + if (!dayMap.has(creationHour)) { + dayMap.set(creationHour, 0); + } + + dayMap.set(creationHour, dayMap.get(creationHour) ? dayMap.get(creationHour) + room.msgs : room.msgs); + totalMessages += room.msgs; + } + + // @ts-expect-error - Check extraquery usage on this func + const onHoldConversations = await this.roomsModel.getOnHoldConversationsBetweenDate(from, to, departmentId, extraQuery); + const busiestDayFromMap = this.getBusiestDay(analyticsMap); // returns busiest day based on the number of messages sent on that day + const busiestHour = this.getKeyHavingMaxValue(analyticsMap.get(busiestDayFromMap) || new Map(), -1); // returns key with max value + const busiestTimeFrom = busiestHour >= 0 ? moment.tz(`${busiestHour}`, 'H', timezone).format('hA') : ''; // @string: 12AM, 1AM ... + const busiestTimeTo = busiestHour >= 0 ? moment.tz(`${busiestHour}`, 'H', timezone).add(1, 'hour').format('hA') : ''; // @string: 1AM, 2AM ... + const busiestDay = busiestDayFromMap !== '-' ? moment.tz(busiestDayFromMap, 'DD-MM-YYYY', timezone).format('dddd') : ''; // @string: Monday, Tuesday ... + + return [ + { + title: 'Total_conversations', + value: totalConversations, + }, + { + title: 'Open_conversations', + value: openConversations, + }, + { + title: 'On_Hold_conversations', + value: onHoldConversations, + }, + { + title: 'Total_messages', + value: totalMessages, + }, + { + title: 'Busiest_day', + value: t(busiestDay) || '-', + }, + { + title: 'Conversations_per_day', + value: (totalConversations / days).toFixed(2), + }, + { + title: 'Busiest_time', + value: `${busiestTimeFrom}${busiestTimeTo ? ` - ${busiestTimeTo}` : ''}` || '-', + }, + ]; + } + + async Productivity( + from: moment.Moment, + to: moment.Moment, + departmentId?: string, + _timezone?: string, + _t = (v: string): string => v, + extraQuery?: Filter, + ) { + let avgResponseTime = 0; + let firstResponseTime = 0; + let avgReactionTime = 0; + let count = 0; + + const date = { + gte: from.toDate(), + lt: to.add(1, 'days').toDate(), + }; + + await this.roomsModel.getAnalyticsMetricsBetweenDate('l', date, { departmentId }, extraQuery).forEach(({ metrics }) => { + if (metrics?.response && metrics.reaction) { + avgResponseTime += metrics.response.avg; + firstResponseTime += metrics.response.ft; + avgReactionTime += metrics.reaction.ft; + count++; + } + }); + + if (count) { + avgResponseTime /= count; + firstResponseTime /= count; + avgReactionTime /= count; + } + + const data = [ + { + title: 'Avg_response_time', + value: secondsToHHMMSS(avgResponseTime.toFixed(2)), + }, + { + title: 'Avg_first_response_time', + value: secondsToHHMMSS(firstResponseTime.toFixed(2)), + }, + { + title: 'Avg_reaction_time', + value: secondsToHHMMSS(avgReactionTime.toFixed(2)), + }, + ]; + + return data; + } +} diff --git a/apps/meteor/server/services/omnichannel-analytics/logger.ts b/apps/meteor/server/services/omnichannel-analytics/logger.ts new file mode 100644 index 000000000000..d32a3cc1344e --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/logger.ts @@ -0,0 +1,3 @@ +import { Logger } from '@rocket.chat/logger'; + +export const serviceLogger = new Logger('OmnichannelAnalyticsService'); diff --git a/apps/meteor/server/services/omnichannel-analytics/service.ts b/apps/meteor/server/services/omnichannel-analytics/service.ts new file mode 100644 index 000000000000..d40b5d341f71 --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/service.ts @@ -0,0 +1,168 @@ +/* eslint-disable new-cap */ +import { ServiceClassInternal } from '@rocket.chat/core-services'; +import type { + AgentOverviewDataOptions, + AnalyticsOverviewDataOptions, + ChartDataOptions, + IOmnichannelAnalyticsService, +} from '@rocket.chat/core-services'; +import { LivechatRooms } from '@rocket.chat/models'; +import moment from 'moment-timezone'; + +import { getTimezone } from '../../../app/utils/server/lib/getTimezone'; +import { callbacks } from '../../../lib/callbacks'; +import { i18n } from '../../lib/i18n'; +import { AgentOverviewData } from './AgentData'; +import { ChartData } from './ChartData'; +import { OverviewData } from './OverviewData'; +import { serviceLogger } from './logger'; +import { dayIterator } from './utils'; + +const HOURS_IN_DAY = 24; + +// TODO: move EE analytics to this service & remove callback usage +export class OmnichannelAnalyticsService extends ServiceClassInternal implements IOmnichannelAnalyticsService { + protected name = 'omnichannel-analytics'; + + readonly overview: OverviewData; + + readonly chart: ChartData; + + readonly agentOverview: AgentOverviewData; + + constructor() { + super(); + this.overview = new OverviewData(LivechatRooms); + this.chart = new ChartData(LivechatRooms); + this.agentOverview = new AgentOverviewData(LivechatRooms); + } + + async getAgentOverviewData(options: AgentOverviewDataOptions) { + const { departmentId, utcOffset, daterange: { from: fDate, to: tDate } = {}, chartOptions: { name } = {} } = options; + const timezone = getTimezone({ utcOffset }); + const from = moment + .tz(fDate || '', 'YYYY-MM-DD', timezone) + .startOf('day') + .utc(); + const to = moment + .tz(tDate || '', 'YYYY-MM-DD', timezone) + .endOf('day') + .utc(); + + if (!moment(from).isValid() || !moment(to).isValid()) { + serviceLogger.error('AgentOverview -> Invalid dates'); + return; + } + + if (!this.agentOverview.isActionAllowed(name)) { + serviceLogger.error(`AgentOverview.${name} is not a valid action`); + return; + } + + const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); + return this.agentOverview.callAction(name, from, to, departmentId, extraQuery); + } + + async getAnalyticsChartData(options: ChartDataOptions) { + const { + utcOffset, + departmentId, + daterange: { from: fDate, to: tDate } = {}, + chartOptions: { name: chartLabel }, + } = options; + + // Check if function exists, prevent server error in case property altered + if (!this.chart.isActionAllowed(chartLabel)) { + serviceLogger.error(`ChartData.${chartLabel} is not a valid action`); + return; + } + + const timezone = getTimezone({ utcOffset }); + const from = moment + .tz(fDate || '', 'YYYY-MM-DD', timezone) + .startOf('day') + .utc(); + const to = moment + .tz(tDate || '', 'YYYY-MM-DD', timezone) + .endOf('day') + .utc(); + const isSameDay = from.diff(to, 'days') === 0; + + if (!moment(from).isValid() || !moment(to).isValid()) { + serviceLogger.error('ChartData -> Invalid dates'); + return; + } + + const data: { + chartLabel: string; + dataLabels: string[]; + dataPoints: number[]; + } = { + chartLabel, + dataLabels: [], + dataPoints: [], + }; + + const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); + if (isSameDay) { + // data for single day + const m = moment(from); + for await (const currentHour of Array.from({ length: HOURS_IN_DAY }, (_, i) => i)) { + const hour = parseInt(m.add(currentHour ? 1 : 0, 'hour').format('H')); + const label = { + from: moment.utc().set({ hour }).tz(timezone).format('hA'), + to: moment.utc().set({ hour }).add(1, 'hour').tz(timezone).format('hA'), + }; + data.dataLabels.push(`${label.from}-${label.to}`); + + const date = { + gte: m.toDate(), + lt: moment(m).add(1, 'hours').toDate(), + }; + + data.dataPoints.push(await this.chart.callAction(chartLabel, date, departmentId, extraQuery)); + } + } else { + for await (const m of dayIterator(from, to)) { + data.dataLabels.push(m.format('M/D')); + + const date = { + gte: m.toDate(), + lt: moment(m).add(1, 'days').toDate(), + }; + + data.dataPoints.push(await this.chart.callAction(chartLabel, date, departmentId, extraQuery)); + } + } + + return data; + } + + async getAnalyticsOverviewData(options: AnalyticsOverviewDataOptions) { + const { departmentId, utcOffset = 0, language, daterange: { from: fDate, to: tDate } = {}, analyticsOptions: { name } = {} } = options; + const timezone = getTimezone({ utcOffset }); + const from = moment + .tz(fDate || '', 'YYYY-MM-DD', timezone) + .startOf('day') + .utc(); + const to = moment + .tz(tDate || '', 'YYYY-MM-DD', timezone) + .endOf('day') + .utc(); + + if (!moment(from).isValid() || !moment(to).isValid()) { + serviceLogger.error('OverviewData -> Invalid dates'); + return; + } + + if (!this.overview.isActionAllowed(name)) { + serviceLogger.error(`OverviewData.${name} is not a valid action`); + return; + } + + const t = (s: string) => i18n.t(s, { lng: language }); + + const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); + return this.overview.callAction(name, from, to, departmentId, timezone, t, extraQuery); + } +} diff --git a/apps/meteor/server/services/omnichannel-analytics/utils.ts b/apps/meteor/server/services/omnichannel-analytics/utils.ts new file mode 100644 index 000000000000..92af92e3f629 --- /dev/null +++ b/apps/meteor/server/services/omnichannel-analytics/utils.ts @@ -0,0 +1,30 @@ +import moment from 'moment'; + +const HOURS_IN_DAY = 24; + +export async function* dayIterator(from: moment.Moment, to: moment.Moment): AsyncGenerator { + const m = from.clone().startOf('day'); + const f = to.clone().startOf('day'); + while (m.diff(f, 'days') <= 0) { + yield m; + m.add(1, 'days'); + } +} + +export async function* weekIterator(from: moment.Moment, to: moment.Moment, timezone: string): AsyncGenerator { + const m = moment.tz(from, timezone); + while (m.diff(to, 'weeks') <= 0) { + yield moment(m); + m.add(1, 'weeks'); + } +} + +export async function* hourIterator(day: moment.Moment): AsyncGenerator { + const m = moment(day).startOf('day'); + let passedHours = 0; + while (passedHours < HOURS_IN_DAY) { + yield moment(m); + m.add(1, 'hours'); + passedHours++; + } +} diff --git a/apps/meteor/server/services/omnichannel/queue.ts b/apps/meteor/server/services/omnichannel/queue.ts index cbedf1cdcdec..603c5197ed30 100644 --- a/apps/meteor/server/services/omnichannel/queue.ts +++ b/apps/meteor/server/services/omnichannel/queue.ts @@ -1,4 +1,5 @@ import type { InquiryWithAgentInfo, IOmnichannelQueue } from '@rocket.chat/core-typings'; +import { License } from '@rocket.chat/license'; import { LivechatInquiry } from '@rocket.chat/models'; import { dispatchAgentDelegated } from '../../../app/livechat/server/lib/Helper'; @@ -19,6 +20,10 @@ export class OmnichannelQueue implements IOmnichannelQueue { return timeout < 1 ? DEFAULT_RACE_TIMEOUT : timeout * 1000; } + public isRunning() { + return this.running; + } + async start() { if (this.running) { return; @@ -59,9 +64,15 @@ export class OmnichannelQueue implements IOmnichannelQueue { return; } + if (await License.shouldPreventAction('monthlyActiveContacts', 1)) { + queueLogger.debug('MAC limit reached. Queue wont execute'); + this.running = false; + return; + } + const queue = await this.nextQueue(); const queueDelayTimeout = this.delay(); - queueLogger.info(`Executing queue ${queue || 'Public'} with timeout of ${queueDelayTimeout}`); + queueLogger.debug(`Executing queue ${queue || 'Public'} with timeout of ${queueDelayTimeout}`); setTimeout(this.checkQueue.bind(this, queue), queueDelayTimeout); } @@ -81,8 +92,10 @@ export class OmnichannelQueue implements IOmnichannelQueue { // Note: this removes the "one-shot" behavior of queue, allowing it to take a conversation again in the future // And sorting them by _updatedAt: -1 will make it so that the oldest inquiries are taken first // preventing us from playing with the same inquiry over and over again - await LivechatInquiry.unlock(nextInquiry._id); + return await LivechatInquiry.unlockAndQueue(nextInquiry._id); } + + await LivechatInquiry.unlock(nextInquiry._id); } catch (e) { queueLogger.error({ msg: 'Error processing queue', @@ -94,7 +107,7 @@ export class OmnichannelQueue implements IOmnichannelQueue { } } - shouldStart() { + async shouldStart() { if (!settings.get('Livechat_enabled')) { void this.stop(); return; diff --git a/apps/meteor/server/services/omnichannel/service.ts b/apps/meteor/server/services/omnichannel/service.ts index 61c22505ca98..34599cbc7a33 100644 --- a/apps/meteor/server/services/omnichannel/service.ts +++ b/apps/meteor/server/services/omnichannel/service.ts @@ -1,6 +1,8 @@ import { ServiceClassInternal } from '@rocket.chat/core-services'; import type { IOmnichannelService } from '@rocket.chat/core-services'; -import type { IOmnichannelQueue } from '@rocket.chat/core-typings'; +import type { AtLeast, IOmnichannelQueue, IOmnichannelRoom } from '@rocket.chat/core-typings'; +import { License } from '@rocket.chat/license'; +import moment from 'moment'; import { Livechat } from '../../../app/livechat/server/lib/LivechatTyped'; import { RoutingManager } from '../../../app/livechat/server/lib/RoutingManager'; @@ -34,9 +36,28 @@ export class OmnichannelService extends ServiceClassInternal implements IOmnicha settings.watch('Livechat_enabled', (enabled) => { void (enabled && RoutingManager.isMethodSet() ? this.queueWorker.shouldStart() : this.queueWorker.stop()); }); + + License.onLimitReached('monthlyActiveContacts', async (): Promise => { + this.queueWorker.isRunning() && (await this.queueWorker.stop()); + }); + + License.onValidateLicense(async (): Promise => { + RoutingManager.isMethodSet() && (await this.queueWorker.shouldStart()); + }); + + // NOTE: When there's no license or license is invalid, we fallback to CE behavior + // CE behavior means there's no MAC limit, so we start the queue + License.onInvalidateLicense(async (): Promise => { + this.queueWorker.isRunning() && (await this.queueWorker.shouldStart()); + }); } getQueueWorker(): IOmnichannelQueue { return this.queueWorker; } + + async isWithinMACLimit(room: AtLeast): Promise { + const currentMonth = moment.utc().format('YYYY-MM'); + return room.v?.activity?.includes(currentMonth) || !(await License.shouldPreventAction('monthlyActiveContacts')); + } } diff --git a/apps/meteor/server/services/push/service.ts b/apps/meteor/server/services/push/service.ts index 437db7b391d8..2d2c1c61ea38 100644 --- a/apps/meteor/server/services/push/service.ts +++ b/apps/meteor/server/services/push/service.ts @@ -9,7 +9,8 @@ export class PushService extends ServiceClassInternal implements IPushService { super(); this.onEvent('watch.users', async (data) => { - if (!('diff' in data) || !('services.resume.loginTokens' in data.diff)) { + // for some reason data.diff can be set to undefined + if (!('diff' in data) || !data.diff || !('services.resume.loginTokens' in data.diff)) { return; } if (data.diff['services.resume.loginTokens'] === undefined) { diff --git a/apps/meteor/server/services/room/service.ts b/apps/meteor/server/services/room/service.ts index 7b9b85cecbd0..dcfb4276bb0c 100644 --- a/apps/meteor/server/services/room/service.ts +++ b/apps/meteor/server/services/room/service.ts @@ -1,7 +1,7 @@ import { ServiceClassInternal, Authorization, MeteorError } from '@rocket.chat/core-services'; import type { ICreateRoomParams, IRoomService } from '@rocket.chat/core-services'; import { type AtLeast, type IRoom, type IUser, isRoomWithJoinCode } from '@rocket.chat/core-typings'; -import { Users } from '@rocket.chat/models'; +import { Rooms, Users } from '@rocket.chat/models'; import { saveRoomTopic } from '../../../app/channel-settings/server/functions/saveRoomTopic'; import { addUserToRoom } from '../../../app/lib/server/functions/addUserToRoom'; @@ -106,14 +106,18 @@ export class RoomService extends ServiceClassInternal implements IRoomService { throw new MeteorError('error-not-allowed', 'Not allowed', { method: 'joinRoom' }); } - if ( - isRoomWithJoinCode(room) && - (!joinCode || joinCode !== room.joinCode) && - !(await Authorization.hasPermission(user._id, 'join-without-join-code')) - ) { - throw new MeteorError('error-code-invalid', 'Invalid Room Password', { - method: 'joinRoom', - }); + if (isRoomWithJoinCode(room) && !(await Authorization.hasPermission(user._id, 'join-without-join-code'))) { + if (!joinCode) { + throw new MeteorError('error-code-required', 'Code required', { method: 'joinRoom' }); + } + + const isCorrectJoinCode = !!(await Rooms.findOneByJoinCodeAndId(joinCode, room._id, { + projection: { _id: 1 }, + })); + + if (!isCorrectJoinCode) { + throw new MeteorError('error-code-invalid', 'Invalid code', { method: 'joinRoom' }); + } } return addUserToRoom(room._id, user); diff --git a/apps/meteor/server/services/startup.ts b/apps/meteor/server/services/startup.ts index 28ab5a35b553..3b13ff75497b 100644 --- a/apps/meteor/server/services/startup.ts +++ b/apps/meteor/server/services/startup.ts @@ -16,6 +16,7 @@ import { LDAPService } from './ldap/service'; import { MessageService } from './messages/service'; import { MeteorService } from './meteor/service'; import { NPSService } from './nps/service'; +import { OmnichannelAnalyticsService } from './omnichannel-analytics/service'; import { OmnichannelIntegrationService } from './omnichannel-integrations/service'; import { OmnichannelVoipService } from './omnichannel-voip/service'; import { OmnichannelService } from './omnichannel/service'; @@ -57,6 +58,7 @@ api.registerService(new TranslationService()); api.registerService(new SettingsService()); api.registerService(new OmnichannelIntegrationService()); api.registerService(new ImportService()); +api.registerService(new OmnichannelAnalyticsService()); // if the process is running in micro services mode we don't need to register services that will run separately if (!isRunningMs()) { diff --git a/apps/meteor/server/services/video-conference/service.ts b/apps/meteor/server/services/video-conference/service.ts index 818280fd4d31..f1cf01e6538d 100644 --- a/apps/meteor/server/services/video-conference/service.ts +++ b/apps/meteor/server/services/video-conference/service.ts @@ -19,7 +19,6 @@ import type { VideoConferenceCapabilities, VideoConferenceCreateData, Optional, - UiKit, } from '@rocket.chat/core-typings'; import { VideoConferenceStatus, @@ -29,7 +28,7 @@ import { } from '@rocket.chat/core-typings'; import { Users, VideoConference as VideoConferenceModel, Rooms, Messages, Subscriptions } from '@rocket.chat/models'; import type { PaginatedResult } from '@rocket.chat/rest-typings'; -import type { MessageSurfaceLayout } from '@rocket.chat/ui-kit'; +import type * as UiKit from '@rocket.chat/ui-kit'; import { MongoInternals } from 'meteor/mongo'; import { RocketChatAssets } from '../../../app/assets/server'; @@ -47,8 +46,10 @@ import { callbacks } from '../../../lib/callbacks'; import { availabilityErrors } from '../../../lib/videoConference/constants'; import { readSecondaryPreferred } from '../../database/readSecondaryPreferred'; import { i18n } from '../../lib/i18n'; +import { isRoomCompatibleWithVideoConfRinging } from '../../lib/isRoomCompatibleWithVideoConfRinging'; import { videoConfProviders } from '../../lib/videoConfProviders'; import { videoConfTypes } from '../../lib/videoConfTypes'; +import { broadcastMessageSentEvent } from '../../modules/watchers/lib/messages'; const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; @@ -74,7 +75,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf } if (type === 'direct') { - if (room.t !== 'd' || !room.uids || room.uids.length > 2) { + if (!isRoomCompatibleWithVideoConfRinging(room.t, room.uids)) { throw new Error('type-and-room-not-compatible'); } @@ -326,6 +327,11 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf (settings.get('UI_Use_Real_Name') ? call.createdBy.name : call.createdBy.username) || call.createdBy.username || ''; const text = i18n.t('video_livechat_missed', { username: name }); await Messages.setBlocksById(call.messages.started, [this.buildMessageBlock(text)]); + + await broadcastMessageSentEvent({ + id: call.messages.started, + broadcastCallback: (message) => api.broadcast('message.sent', message), + }); } await VideoConferenceModel.setDataById(call._id, { @@ -495,13 +501,18 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf msg: '', groupable: false, blocks: customBlocks || [this.buildVideoConfBlock(call._id)], - }; + } satisfies Partial; const room = await Rooms.findOneById(call.rid); const appId = videoConfProviders.getProviderAppId(call.providerName); const user = createdBy || (appId && (await Users.findOneByAppId(appId))) || (await Users.findOneById('rocket.cat')); const message = await sendMessage(user, record, room, false); + + if (!message) { + throw new Error('failed-to-create-message'); + } + return message._id; } @@ -571,7 +582,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf ]); } - private buildVideoConfBlock(callId: string): MessageSurfaceLayout[number] { + private buildVideoConfBlock(callId: string): UiKit.MessageSurfaceLayout[number] { return { type: 'video_conf', blockId: callId, @@ -580,7 +591,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf }; } - private buildMessageBlock(text: string): MessageSurfaceLayout[number] { + private buildMessageBlock(text: string): UiKit.MessageSurfaceLayout[number] { return { type: 'section', appId: 'videoconf-core', @@ -627,8 +638,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf image: RocketChatAssets.getURL('Assets_favicon_192'), }, apn: { - category: 'MESSAGE_NOREPLY', - topicSuffix: '.voip', + category: 'VIDEOCONF', }, }); } diff --git a/apps/meteor/server/settings/accounts.ts b/apps/meteor/server/settings/accounts.ts index ccc87b0ffd24..2b1dac892c07 100644 --- a/apps/meteor/server/settings/accounts.ts +++ b/apps/meteor/server/settings/accounts.ts @@ -57,6 +57,19 @@ export const createAccountSettings = () => ], }); + await this.add('Accounts_TwoFactorAuthentication_Max_Invalid_Email_Code_Attempts', 5, { + type: 'int', + enableQuery: [ + enable2FA, + { + _id: 'Accounts_TwoFactorAuthentication_By_Email_Enabled', + value: true, + }, + ], + i18nLabel: 'Accounts_TwoFactorAuthentication_Max_Invalid_Email_Code_Attempts', + i18nDescription: 'Accounts_TwoFactorAuthentication_Max_Invalid_Email_Code_Attempts_Description', + }); + await this.add('Accounts_TwoFactorAuthentication_RememberFor', 1800, { type: 'int', enableQuery: enable2FA, @@ -72,7 +85,7 @@ export const createAccountSettings = () => const enableQueryCollectData = { _id: 'Block_Multiple_Failed_Logins_Enabled', value: true }; await this.section('Login_Attempts', async function () { - await this.add('Block_Multiple_Failed_Logins_Enabled', false, { + await this.add('Block_Multiple_Failed_Logins_Enabled', true, { type: 'boolean', }); @@ -282,13 +295,6 @@ export const createAccountSettings = () => await this.add('Accounts_EmailVerification', false, { type: 'boolean', public: true, - enableQuery: { - _id: 'SMTP_Host', - value: { - $exists: true, - $ne: '', - }, - }, }); await this.add('Accounts_Verify_Email_For_External_Accounts', true, { type: 'boolean', diff --git a/apps/meteor/server/settings/email.ts b/apps/meteor/server/settings/email.ts index 9de6ecf7efc0..fdfd43c7557a 100644 --- a/apps/meteor/server/settings/email.ts +++ b/apps/meteor/server/settings/email.ts @@ -499,7 +499,7 @@ export const createEmailSettings = () => await this.add( 'Forgot_Password_Email', - '

{Forgot_password}

{Lets_get_you_new_one}

{Reset}

{If_you_didnt_ask_for_reset_ignore_this_email}

', + '

{Forgot_password}

{Lets_get_you_new_one_}

{Reset}

{If_you_didnt_ask_for_reset_ignore_this_email}

', { type: 'code', code: 'text/html', diff --git a/apps/meteor/server/settings/file-upload.ts b/apps/meteor/server/settings/file-upload.ts index fce9a0059803..643c46ed8489 100644 --- a/apps/meteor/server/settings/file-upload.ts +++ b/apps/meteor/server/settings/file-upload.ts @@ -31,7 +31,7 @@ export const createFileUploadSettings = () => i18nDescription: 'FileUpload_ProtectFilesDescription', }); - await this.add('FileUpload_Restrict_to_room_members', false, { + await this.add('FileUpload_Restrict_to_room_members', true, { type: 'boolean', enableQuery: { _id: 'FileUpload_ProtectFiles', diff --git a/apps/meteor/server/settings/general.ts b/apps/meteor/server/settings/general.ts index c0a02d2dba32..784aaf1358cb 100644 --- a/apps/meteor/server/settings/general.ts +++ b/apps/meteor/server/settings/general.ts @@ -287,6 +287,7 @@ export const createGeneralSettings = () => await this.section('Reporting', async function () { return this.add('Statistics_reporting', true, { type: 'boolean', + hidden: true, }); }); await this.section('Notifications', async function () { diff --git a/apps/meteor/server/settings/message.ts b/apps/meteor/server/settings/message.ts index 17dd1f7b230d..e83189579085 100644 --- a/apps/meteor/server/settings/message.ts +++ b/apps/meteor/server/settings/message.ts @@ -337,23 +337,23 @@ export const createMessageSettings = () => public: true, }); - await this.section('Katex', async () => { + await this.section('Katex', async function () { const enableQuery = { _id: 'Katex_Enabled', value: true, }; - await settingsRegistry.add('Katex_Enabled', true, { + await this.add('Katex_Enabled', true, { type: 'boolean', public: true, i18nDescription: 'Katex_Enabled_Description', }); - await settingsRegistry.add('Katex_Parenthesis_Syntax', true, { + await this.add('Katex_Parenthesis_Syntax', true, { type: 'boolean', public: true, enableQuery, i18nDescription: 'Katex_Parenthesis_Syntax_Description', }); - await settingsRegistry.add('Katex_Dollar_Syntax', false, { + await this.add('Katex_Dollar_Syntax', false, { type: 'boolean', public: true, enableQuery, @@ -361,14 +361,14 @@ export const createMessageSettings = () => }); }); - await this.section('Google Maps', async () => { - await settingsRegistry.add('MapView_Enabled', false, { + await this.section('Google Maps', async function () { + await this.add('MapView_Enabled', false, { type: 'boolean', public: true, i18nLabel: 'MapView_Enabled', i18nDescription: 'MapView_Enabled_Description', }); - await settingsRegistry.add('MapView_GMapsAPIKey', '', { + await this.add('MapView_GMapsAPIKey', '', { type: 'string', public: true, i18nLabel: 'MapView_GMapsAPIKey', diff --git a/apps/meteor/server/settings/misc.ts b/apps/meteor/server/settings/misc.ts index fa7b6bbde3d0..e04c4d6d3b8e 100644 --- a/apps/meteor/server/settings/misc.ts +++ b/apps/meteor/server/settings/misc.ts @@ -46,10 +46,6 @@ const verifyFingerPrint = async function () { await updateFingerprint(fingerprint, false); }; -settings.watch('Site_Url', () => { - void verifyFingerPrint(); -}); - // Insert server unique id if it doesn't exist export const createMiscSettings = async () => { await settingsRegistry.add('uniqueID', process.env.DEPLOYMENT_ID || uuidv4(), { @@ -61,12 +57,16 @@ export const createMiscSettings = async () => { readonly: true, }); - await settingsRegistry.add('Deployment_FingerPrint_Verified', false, { + await settingsRegistry.add('Deployment_FingerPrint_Verified', true, { type: 'boolean', public: true, readonly: true, }); + settings.watch('Site_Url', () => { + void verifyFingerPrint(); + }); + await settingsRegistry.add('Initial_Channel_Created', false, { type: 'boolean', hidden: true, diff --git a/apps/meteor/server/settings/setup-wizard.ts b/apps/meteor/server/settings/setup-wizard.ts index 9799c2017afd..25b2fab19cbd 100644 --- a/apps/meteor/server/settings/setup-wizard.ts +++ b/apps/meteor/server/settings/setup-wizard.ts @@ -12,7 +12,7 @@ export const createSetupWSettings = () => }, { key: 'enterprise', - i18nLabel: 'Enterprise', + i18nLabel: 'Premium', }, { key: 'government', @@ -34,6 +34,7 @@ export const createSetupWSettings = () => step: 2, order: 1, }, + public: true, }); await this.add('Industry', '', { type: 'select', @@ -1353,5 +1354,15 @@ export const createSetupWSettings = () => }, secret: true, }); + await this.add('Cloud_Billing_Url', 'https://billing.rocket.chat', { + type: 'string', + hidden: true, + readonly: true, + enableQuery: { + _id: 'Register_Server', + value: true, + }, + secret: true, + }); }); }); diff --git a/apps/meteor/server/settings/slackbridge.ts b/apps/meteor/server/settings/slackbridge.ts index ea16f07db42a..bf3b8c090c9a 100644 --- a/apps/meteor/server/settings/slackbridge.ts +++ b/apps/meteor/server/settings/slackbridge.ts @@ -8,18 +8,90 @@ export const createSlackBridgeSettings = () => public: true, }); - await this.add('SlackBridge_APIToken', '', { - type: 'string', - multiline: true, + await this.add('SlackBridge_UseLegacy', true, { + type: 'boolean', enableQuery: { _id: 'SlackBridge_Enabled', value: true, }, + i18nLabel: 'SlackBridge_UseLegacy', + i18nDescription: 'SlackBridge_UseLegacy_Description', + public: true, + packageValue: true, + }); + + await this.add('SlackBridge_APIToken', '', { + type: 'string', + multiline: true, + enableQuery: [ + { + _id: 'SlackBridge_UseLegacy', + value: true, + }, + { + _id: 'SlackBridge_Enabled', + value: true, + }, + ], i18nLabel: 'SlackBridge_APIToken', i18nDescription: 'SlackBridge_APIToken_Description', secret: true, }); + await this.add('SlackBridge_BotToken', '', { + type: 'string', + multiline: true, + enableQuery: [ + { + _id: 'SlackBridge_UseLegacy', + value: false, + }, + { + _id: 'SlackBridge_Enabled', + value: true, + }, + ], + i18nLabel: 'SlackBridge_BotToken', + i18nDescription: 'SlackBridge_BotToken_Description', + secret: true, + }); + + await this.add('SlackBridge_SigningSecret', '', { + type: 'string', + multiline: true, + enableQuery: [ + { + _id: 'SlackBridge_UseLegacy', + value: false, + }, + { + _id: 'SlackBridge_Enabled', + value: true, + }, + ], + i18nLabel: 'SlackBridge_SigningSecret', + i18nDescription: 'SlackBridge_SigningSecret_Description', + secret: true, + }); + + await this.add('SlackBridge_AppToken', '', { + type: 'string', + multiline: true, + enableQuery: [ + { + _id: 'SlackBridge_UseLegacy', + value: false, + }, + { + _id: 'SlackBridge_Enabled', + value: true, + }, + ], + i18nLabel: 'SlackBridge_AppToken', + i18nDescription: 'SlackBridge_AppToken_Description', + secret: true, + }); + await this.add('SlackBridge_FileUpload_Enabled', true, { type: 'boolean', enableQuery: { diff --git a/apps/meteor/server/settings/troubleshoot.ts b/apps/meteor/server/settings/troubleshoot.ts index bfecb1a344f6..7919970af9cc 100644 --- a/apps/meteor/server/settings/troubleshoot.ts +++ b/apps/meteor/server/settings/troubleshoot.ts @@ -58,4 +58,9 @@ export const createTroubleshootSettings = () => hidden: true, readonly: true, }); + + await this.add('Troubleshoot_Force_Caching_Version', '', { + type: 'string', + i18nDescription: 'Troubleshoot_Force_Caching_Version_Alert', + }); }); diff --git a/apps/meteor/server/startup/cloudRegistration.ts b/apps/meteor/server/startup/cloudRegistration.ts new file mode 100644 index 000000000000..e69d4446d6ec --- /dev/null +++ b/apps/meteor/server/startup/cloudRegistration.ts @@ -0,0 +1,20 @@ +import { Settings } from '@rocket.chat/models'; + +export async function ensureCloudWorkspaceRegistered(): Promise { + const cloudWorkspaceClientId = await Settings.getValueById('Cloud_Workspace_Client_Id'); + const cloudWorkspaceClientSecret = await Settings.getValueById('Cloud_Workspace_Client_Secret'); + const showSetupWizard = await Settings.getValueById('Show_Setup_Wizard'); + + // skip if both fields are already set, which means the workspace is already registered + if (!!cloudWorkspaceClientId && !!cloudWorkspaceClientSecret) { + return; + } + + // skip if the setup wizard still not completed + if (showSetupWizard !== 'completed') { + return; + } + + // otherwise, set the setup wizard to in_progress forcing admins to complete the registration + await Settings.updateValueById('Show_Setup_Wizard', 'in_progress'); +} diff --git a/apps/meteor/server/startup/coreApps.ts b/apps/meteor/server/startup/coreApps.ts index dbc4606ea38a..9638d99ab559 100644 --- a/apps/meteor/server/startup/coreApps.ts +++ b/apps/meteor/server/startup/coreApps.ts @@ -1,8 +1,12 @@ import { BannerModule } from '../modules/core-apps/banner.module'; +import { CloudAnnouncementsModule } from '../modules/core-apps/cloudAnnouncements.module'; +import { MentionModule } from '../modules/core-apps/mention.module'; import { Nps } from '../modules/core-apps/nps.module'; import { VideoConfModule } from '../modules/core-apps/videoconf.module'; import { registerCoreApp } from '../services/uikit-core-app/service'; +registerCoreApp(new CloudAnnouncementsModule()); registerCoreApp(new Nps()); registerCoreApp(new BannerModule()); registerCoreApp(new VideoConfModule()); +registerCoreApp(new MentionModule()); diff --git a/apps/meteor/server/startup/initialData.js b/apps/meteor/server/startup/initialData.js index 61fbdf9f3328..58fc3bf91577 100644 --- a/apps/meteor/server/startup/initialData.js +++ b/apps/meteor/server/startup/initialData.js @@ -13,6 +13,36 @@ import { validateEmail } from '../../lib/emailValidator'; import { addUserRolesAsync } from '../lib/roles/addUserRoles'; Meteor.startup(async () => { + const dynamicImport = { + 'dynamic-import': { + useLocationOrigin: true, + }, + }; + + if (!Meteor.settings) { + Meteor.settings = { + public: { + packages: { + 'dynamic-import': dynamicImport, + }, + }, + }; + } + + if (!Meteor.settings.public) { + Meteor.settings.public = { + packages: { + 'dynamic-import': dynamicImport, + }, + }; + } + + if (!Meteor.settings.public.packages) { + Meteor.settings.public.packages = dynamicImport; + } + + Meteor.settings.public.packages['dynamic-import'] = dynamicImport['dynamic-import']; + if (!settings.get('Initial_Channel_Created')) { const exists = await Rooms.findOneById('GENERAL', { projection: { _id: 1 } }); if (!exists) { diff --git a/apps/meteor/server/startup/migrations/index.ts b/apps/meteor/server/startup/migrations/index.ts index 26bc4f992ee2..8247f9a72bb5 100644 --- a/apps/meteor/server/startup/migrations/index.ts +++ b/apps/meteor/server/startup/migrations/index.ts @@ -36,4 +36,5 @@ import './v299'; import './v300'; import './v301'; import './v303'; +import './v304'; import './xrun'; diff --git a/apps/meteor/server/startup/migrations/v304.ts b/apps/meteor/server/startup/migrations/v304.ts new file mode 100644 index 000000000000..48cb217643d0 --- /dev/null +++ b/apps/meteor/server/startup/migrations/v304.ts @@ -0,0 +1,22 @@ +import { Analytics } from '@rocket.chat/models'; + +import { addMigration } from '../../lib/migrations'; + +addMigration({ + version: 304, + name: 'Drop wrong index from analytics collection', + async up() { + const indexes = await Analytics.col.indexes(); + + if ( + indexes.find( + (index) => index.name === 'room._id_1_date_1' && index.partialFilterExpression && index.partialFilterExpression.type === 'rooms', + ) + ) { + return; + } + + await Analytics.col.dropIndex('room._id_1_date_1'); + await Analytics.createIndexes(); + }, +}); diff --git a/apps/meteor/server/startup/migrations/xrun.ts b/apps/meteor/server/startup/migrations/xrun.ts index 1af7cb8ad8ad..c560d488187c 100644 --- a/apps/meteor/server/startup/migrations/xrun.ts +++ b/apps/meteor/server/startup/migrations/xrun.ts @@ -1,5 +1,6 @@ import { upsertPermissions } from '../../../app/authorization/server/functions/upsertPermissions'; import { migrateDatabase, onServerVersionChange } from '../../lib/migrations'; +import { ensureCloudWorkspaceRegistered } from '../cloudRegistration'; const { MIGRATION_VERSION = 'latest' } = process.env; @@ -7,5 +8,8 @@ const [version, ...subcommands] = MIGRATION_VERSION.split(','); await migrateDatabase(version === 'latest' ? version : parseInt(version), subcommands); -// if the server is starting with a different version we update the permissions -await onServerVersionChange(() => upsertPermissions()); +// perform operations when the server is starting with a different version +await onServerVersionChange(async () => { + await upsertPermissions(); + await ensureCloudWorkspaceRegistered(); +}); diff --git a/apps/meteor/server/ufs/ufs-methods.ts b/apps/meteor/server/ufs/ufs-methods.ts index 05228e059292..23a6048fda45 100644 --- a/apps/meteor/server/ufs/ufs-methods.ts +++ b/apps/meteor/server/ufs/ufs-methods.ts @@ -71,7 +71,7 @@ export async function ufsComplete(fileId: string, storeName: string): Promise { + return request.get(api('licenses.info')).set(credentials).query({ loadValues }).expect(200); +} \ No newline at end of file diff --git a/apps/meteor/tests/data/livechat/rooms.ts b/apps/meteor/tests/data/livechat/rooms.ts index 5efb279dcb18..a3981a67c3d3 100644 --- a/apps/meteor/tests/data/livechat/rooms.ts +++ b/apps/meteor/tests/data/livechat/rooms.ts @@ -1,6 +1,6 @@ import { faker } from '@faker-js/faker'; import type { - IInquiry, + ILivechatInquiryRecord, ILivechatAgent, ILivechatDepartment, ILivechatVisitor, @@ -68,12 +68,12 @@ export const takeInquiry = async (inquiryId: string, agentCredentials?: IUserCre await request.post(api('livechat/inquiries.take')).set(agentCredentials || credentials).send({ userId, inquiryId }).expect(200); }; -export const fetchInquiry = (roomId: string): Promise => { +export const fetchInquiry = (roomId: string): Promise => { return new Promise((resolve, reject) => { request .get(api(`livechat/inquiries.getOne?roomId=${roomId}`)) .set(credentials) - .end((err: Error, res: DummyResponse) => { + .end((err: Error, res: DummyResponse) => { if (err) { return reject(err); } @@ -82,7 +82,7 @@ export const fetchInquiry = (roomId: string): Promise => { }); }; -export const createDepartment = (agents?: { agentId: string }[], name?: string, enabled = true): Promise => { +export const createDepartment = (agents?: { agentId: string }[], name?: string, enabled = true, opts: Record = {}): Promise => { return new Promise((resolve, reject) => { request .post(api('livechat/department')) @@ -94,6 +94,7 @@ export const createDepartment = (agents?: { agentId: string }[], name?: string, showOnOfflineForm: true, showOnRegistration: true, email: 'a@b.com', + ...opts, }, agents, }) @@ -313,3 +314,19 @@ export const placeRoomOnHold = async (roomId: string): Promise => { .send({ roomId }) .expect(200); } + +export const moveBackToQueue = async (roomId: string, overrideCredentials?: IUserCredentialsHeader): Promise => { + await request + .post(methodCall('livechat:returnAsInquiry')) + .set(overrideCredentials || credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: [roomId], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); +}; diff --git a/apps/meteor/tests/data/livechat/units.ts b/apps/meteor/tests/data/livechat/units.ts index 63c2eb2b2168..c42d7ad5b345 100644 --- a/apps/meteor/tests/data/livechat/units.ts +++ b/apps/meteor/tests/data/livechat/units.ts @@ -25,7 +25,7 @@ export const createMonitor = async (username: string): Promise<{ _id: string; us }); }; -export const createUnit = async (monitorId: string, username: string, departmentIds: string[]): Promise => { +export const createUnit = async (monitorId: string, username: string, departmentIds: string[], name?: string): Promise => { return new Promise((resolve, reject) => { request .post(methodCall(`livechat:saveUnit`)) @@ -33,7 +33,7 @@ export const createUnit = async (monitorId: string, username: string, department .send({ message: JSON.stringify({ method: 'livechat:saveUnit', - params: [null, { name: faker.person.firstName(), visibility: faker.helpers.arrayElement(['public', 'private']) }, [{ monitorId, username }], departmentIds.map((departmentId) => ({ departmentId }))], + params: [null, { name: name || faker.person.firstName(), visibility: faker.helpers.arrayElement(['public', 'private']) }, [{ monitorId, username }], departmentIds.map((departmentId) => ({ departmentId }))], id: '101', msg: 'method', }), diff --git a/apps/meteor/tests/data/livechat/utils.ts b/apps/meteor/tests/data/livechat/utils.ts index b6fd3a4bf6b3..3d82ecdd58f7 100644 --- a/apps/meteor/tests/data/livechat/utils.ts +++ b/apps/meteor/tests/data/livechat/utils.ts @@ -8,3 +8,11 @@ export type WithRequiredProperty = Type & { export const sleep = (ms: number) => { return new Promise((resolve) => setTimeout(resolve, ms)); } + +export const parseMethodResponse = (response: any) => { + if (response.message) { + return JSON.parse(response.message); + } + + return {}; +} \ No newline at end of file diff --git a/apps/meteor/tests/data/users.helper.js b/apps/meteor/tests/data/users.helper.js index 82ab8446547d..d69b0413ae0b 100644 --- a/apps/meteor/tests/data/users.helper.js +++ b/apps/meteor/tests/data/users.helper.js @@ -1,3 +1,4 @@ +import { UserStatus } from '@rocket.chat/core-typings'; import { api, credentials, request } from './api-data'; import { password } from './user'; @@ -34,12 +35,9 @@ export const login = (username, password) => }); export const deleteUser = async (user) => - request - .post(api('users.delete')) - .set(credentials) - .send({ - userId: user._id, - }); + request.post(api('users.delete')).set(credentials).send({ + userId: user._id, + }); export const getUserByUsername = (username) => new Promise((resolve) => { @@ -86,3 +84,9 @@ export const setUserActiveStatus = (userId, activeStatus = true) => }) .end(resolve); }); + +export const setUserStatus = (overrideCredentials = credentials, status = UserStatus.ONLINE) => + request.post(api('users.setStatus')).set(overrideCredentials).send({ + message: '', + status, + }); diff --git a/apps/meteor/tests/e2e/administration-menu.spec.ts b/apps/meteor/tests/e2e/administration-menu.spec.ts index e105b4a2a0d4..292827435dcd 100644 --- a/apps/meteor/tests/e2e/administration-menu.spec.ts +++ b/apps/meteor/tests/e2e/administration-menu.spec.ts @@ -14,18 +14,11 @@ test.describe.serial('administration-menu', () => { await page.goto('/home'); }); - test('expect open upgrade page', async ({ page }) => { - test.skip(IS_EE, 'Community Only'); - await poHomeDiscussion.sidenav.openAdministrationByLabel('Go fully featured ⚡'); - - await expect(page).toHaveURL('admin/upgrade/go-fully-featured'); - }); - - test('expect open info page', async ({ page }) => { + test('expect open Workspace page', async ({ page }) => { test.skip(!IS_EE, 'Enterprise only'); await poHomeDiscussion.sidenav.openAdministrationByLabel('Workspace'); - await expect(page).toHaveURL('admin/workspace'); + await expect(page).toHaveURL('admin/info'); }); test('expect open omnichannel page', async ({ page }) => { diff --git a/apps/meteor/tests/e2e/administration.spec.ts b/apps/meteor/tests/e2e/administration.spec.ts index b439258429f8..f2103dbd3c82 100644 --- a/apps/meteor/tests/e2e/administration.spec.ts +++ b/apps/meteor/tests/e2e/administration.spec.ts @@ -3,12 +3,14 @@ import { faker } from '@faker-js/faker'; import { IS_EE } from './config/constants'; import { Users } from './fixtures/userStates'; import { Admin } from './page-objects'; +import { createTargetChannel } from './utils'; import { test, expect } from './utils/test'; test.use({ storageState: Users.admin.state }); test.describe.parallel('administration', () => { let poAdmin: Admin; + let targetChannel: string; test.beforeEach(async ({ page }) => { poAdmin = new Admin(page); @@ -16,11 +18,11 @@ test.describe.parallel('administration', () => { test.describe('Workspace', () => { test.beforeEach(async ({ page }) => { - await page.goto('/admin/workspace'); + await page.goto('/admin/info'); }); test('expect download info as JSON', async ({ page }) => { - const [download] = await Promise.all([page.waitForEvent('download'), page.locator('button:has-text("Download Info")').click()]); + const [download] = await Promise.all([page.waitForEvent('download'), page.locator('button:has-text("Download info")').click()]); await expect(download.suggestedFilename()).toBe('statistics.json'); }); @@ -38,7 +40,7 @@ test.describe.parallel('administration', () => { }); test('expect create a user', async () => { - await poAdmin.tabs.users.btnNew.click(); + await poAdmin.tabs.users.btnNewUser.click(); await poAdmin.tabs.users.inputName.type(faker.person.firstName()); await poAdmin.tabs.users.inputUserName.type(faker.internet.userName()); await poAdmin.tabs.users.inputEmail.type(faker.internet.email()); @@ -56,6 +58,9 @@ test.describe.parallel('administration', () => { }); test.describe('Rooms', () => { + test.beforeAll(async ({ api }) => { + targetChannel = await createTargetChannel(api); + }); test.beforeEach(async ({ page }) => { await page.goto('/admin/rooms'); }); @@ -64,6 +69,15 @@ test.describe.parallel('administration', () => { await poAdmin.inputSearchRooms.type('general'); await page.waitForSelector('[qa-room-id="GENERAL"]'); }); + + test('should edit target channel', async () => { + await poAdmin.inputSearchRooms.type(targetChannel); + await poAdmin.getRoomRow(targetChannel).click(); + await poAdmin.privateLabel.click(); + await poAdmin.btnSave.click(); + await expect(poAdmin.getRoomRow(targetChannel)).toContainText('Private Channel'); + }); + }); test.describe('Permissions', () => { diff --git a/apps/meteor/tests/e2e/create-direct.spec.ts b/apps/meteor/tests/e2e/create-direct.spec.ts index 6f75c20101f1..4e74840619ba 100644 --- a/apps/meteor/tests/e2e/create-direct.spec.ts +++ b/apps/meteor/tests/e2e/create-direct.spec.ts @@ -14,7 +14,7 @@ test.describe.serial('channel-direct-message', () => { }); test('expect create a direct room', async ({ page }) => { - await poHomeChannel.sidenav.openNewByLabel('Direct Messages'); + await poHomeChannel.sidenav.openNewByLabel('Direct messages'); await poHomeChannel.sidenav.inputDirectUsername.click(); await page.keyboard.type('rocket.cat'); diff --git a/apps/meteor/tests/e2e/e2e-encryption.spec.ts b/apps/meteor/tests/e2e/e2e-encryption.spec.ts index 7cc04efba3a0..dc10729f3b79 100644 --- a/apps/meteor/tests/e2e/e2e-encryption.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption.spec.ts @@ -31,13 +31,13 @@ test.describe.serial('e2e-encryption initial setup', () => { test.beforeAll(async ({ api }) => { const statusCode = (await api.post('/settings/E2E_Enable', { value: true })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); }); test.afterAll(async ({ api }) => { const statusCode = (await api.post('/settings/E2E_Enable', { value: false })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); }); test.afterEach(async ({ api }) => { @@ -131,7 +131,7 @@ test.describe.serial('e2e-encryption', () => { test.beforeEach(async ({ page, api }) => { const statusCode = (await api.post('/settings/E2E_Enable', { value: true })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); poHomeChannel = new HomeChannel(page); diff --git a/apps/meteor/tests/e2e/federation/page-objects/channel.ts b/apps/meteor/tests/e2e/federation/page-objects/channel.ts index 50ac5f04fc27..e22494786325 100644 --- a/apps/meteor/tests/e2e/federation/page-objects/channel.ts +++ b/apps/meteor/tests/e2e/federation/page-objects/channel.ts @@ -74,12 +74,12 @@ export class FederationChannel { } async createDirectMessagesUsingModal(usernamesToInvite: string[]) { - await this.sidenav.openNewByLabel('Direct Messages'); + await this.sidenav.openNewByLabel('Direct messages'); for await (const username of usernamesToInvite) { await this.sidenav.inviteUserToDM(username); } await this.page - .locator('//*[@id="modal-root"]//*[contains(@class, "rcx-modal__title") and contains(text(), "Direct Messages")]') + .locator('//*[@id="modal-root"]//*[contains(@class, "rcx-modal__title") and contains(text(), "Direct messages")]') .click(); await this.sidenav.btnCreateChannel.click(); } diff --git a/apps/meteor/tests/e2e/fixtures/collections/users.ts b/apps/meteor/tests/e2e/fixtures/collections/users.ts index 661f096c8753..cc437597a5e0 100644 --- a/apps/meteor/tests/e2e/fixtures/collections/users.ts +++ b/apps/meteor/tests/e2e/fixtures/collections/users.ts @@ -42,7 +42,7 @@ export function createUserFixture(user: IUserState): UserFixture { }, ], }, - emailCode: [{ code: '', expire: new Date() }], + emailCode: { code: '', attempts: 0, expire: new Date() }, }, createdAt: new Date(), _updatedAt: new Date(), diff --git a/apps/meteor/tests/e2e/fixtures/inject-initial-data.ts b/apps/meteor/tests/e2e/fixtures/inject-initial-data.ts index 11cea78b3f3d..38835db4aaa6 100644 --- a/apps/meteor/tests/e2e/fixtures/inject-initial-data.ts +++ b/apps/meteor/tests/e2e/fixtures/inject-initial-data.ts @@ -57,6 +57,10 @@ export default async function injectInitialData() { _id: 'API_Enable_Rate_Limiter_Dev', value: false, }, + { + _id: 'Accounts_OAuth_Google', + value: false, + }, ].map((setting) => connection .db() diff --git a/apps/meteor/tests/e2e/fixtures/userStates.ts b/apps/meteor/tests/e2e/fixtures/userStates.ts index d79679107889..7bcab213f8fc 100644 --- a/apps/meteor/tests/e2e/fixtures/userStates.ts +++ b/apps/meteor/tests/e2e/fixtures/userStates.ts @@ -99,9 +99,11 @@ export async function restoreState(page: Page, user: IUserState, options: { exce ls = ls.filter(({ name }) => !options.except?.includes(name)); } - return page.evaluate((items) => { + await page.evaluate((items) => { items.forEach(({ name, value }) => { window.localStorage.setItem(name, value); }); }, ls); + + await page.waitForTimeout(2000); // Wait for the login to be completed } diff --git a/apps/meteor/tests/e2e/homepage.spec.ts b/apps/meteor/tests/e2e/homepage.spec.ts index 4f8f9d09a2f3..89aa905744df 100644 --- a/apps/meteor/tests/e2e/homepage.spec.ts +++ b/apps/meteor/tests/e2e/homepage.spec.ts @@ -50,7 +50,7 @@ test.describe.serial('homepage', () => { test('visibility and button functionality in custom body with empty custom content', async () => { await test.step('expect default value in custom body', async () => { await expect( - adminPage.locator('role=status[name="Admins may insert content html to be rendered in this white space."]'), + adminPage.locator('div >> text="Admins may insert content html to be rendered in this white space."'), ).toBeVisible(); }); @@ -60,7 +60,7 @@ test.describe.serial('homepage', () => { }); await test.step('expect visibility tag to show "not visible"', async () => { - await expect(adminPage.locator('role=status[name="Not visible to workspace"]')).toBeVisible(); + await expect(adminPage.locator('span >> text="Not visible to workspace"')).toBeVisible(); }); }); }); @@ -72,7 +72,7 @@ test.describe.serial('homepage', () => { test('visibility and button functionality in custom body with custom content', async () => { await test.step('expect custom body to be visible', async () => { - await expect(adminPage.locator('role=status[name="Hello admin"]')).toBeVisible(); + await expect(adminPage.locator('div >> text="Hello admin"')).toBeVisible(); }); await test.step('expect correct state for card buttons', async () => { @@ -101,7 +101,7 @@ test.describe.serial('homepage', () => { }); await test.step('expect visibility tag to show "visible to workspace"', async () => { - await expect(adminPage.locator('role=status[name="Visible to workspace"]')).toBeVisible(); + await expect(adminPage.locator('span >> text="Visible to workspace"')).toBeVisible(); }); }); }); @@ -188,7 +188,7 @@ test.describe.serial('homepage', () => { }); test('expect custom body to be visible', async () => { - await expect(regularUserPage.locator('role=status[name="Hello"]')).toBeVisible(); + await expect(regularUserPage.locator('div >> text="Hello"')).toBeVisible(); }); test.describe('enterprise edition', () => { @@ -208,7 +208,7 @@ test.describe.serial('homepage', () => { }); await test.step('expect custom body to be visible', async () => { - await expect(regularUserPage.locator('role=status[name="Hello"]')).toBeVisible(); + await expect(regularUserPage.locator('div >> text="Hello"')).toBeVisible(); }); }); }); diff --git a/apps/meteor/tests/e2e/message-actions.spec.ts b/apps/meteor/tests/e2e/message-actions.spec.ts index 7cfa089326b2..97fbc2c238b7 100644 --- a/apps/meteor/tests/e2e/message-actions.spec.ts +++ b/apps/meteor/tests/e2e/message-actions.spec.ts @@ -1,8 +1,7 @@ -import type { Page } from '@playwright/test'; - import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; import { createTargetChannel } from './utils'; +import { setUserPreferences } from './utils/setUserPreferences'; import { expect, test } from './utils/test'; test.use({ storageState: Users.admin.state }); @@ -65,11 +64,13 @@ test.describe.serial('message-actions', () => { await expect(poHomeChannel.content.lastMessageTextAttachmentEqualsText).toHaveText(message); }); + test('expect star the message', async ({ page }) => { await poHomeChannel.content.sendMessage('Message to star'); await poHomeChannel.content.openLastMessageMenu(); await page.locator('[data-qa-id="star-message"]').click(); - await page.getByRole('button').and(page.getByTitle('Options')).click(); + await poHomeChannel.dismissToast(); + await page.locator('role=button[name="Options"]').click(); await page.locator('[data-key="starred-messages"]').click(); await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('Message to star'); }); @@ -87,22 +88,11 @@ test.describe.serial('message-actions', () => { }); test.describe('Preference Hide Contextual Bar by clicking outside of it Enabled', () => { - let adminPage: Page; - test.beforeAll(async ({ browser }) => { - adminPage = await browser.newPage({ storageState: Users.admin.state }); - await adminPage.goto('/account/preferences'); - await adminPage.locator('role=heading[name="Messages"]').click(); - await adminPage.locator('text="Hide Contextual Bar by clicking outside of it"').click(); - }); - test.afterAll(async () => { - await adminPage.close(); + test.beforeAll(async ({ api }) => { + await setUserPreferences(api, { hideFlexTab: true }); }); - test.afterAll(async ({ browser }) => { - adminPage = await browser.newPage({ storageState: Users.admin.state }); - await adminPage.goto('/account/preferences'); - await adminPage.locator('role=heading[name="Messages"]').click(); - await adminPage.locator('text="Hide Contextual Bar by clicking outside of it"').click(); - await adminPage.close(); + test.afterAll(async ({ api }) => { + await setUserPreferences(api, { hideFlexTab: false }); }); test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); diff --git a/apps/meteor/tests/e2e/message-composer.spec.ts b/apps/meteor/tests/e2e/message-composer.spec.ts new file mode 100644 index 000000000000..861ee17de215 --- /dev/null +++ b/apps/meteor/tests/e2e/message-composer.spec.ts @@ -0,0 +1,37 @@ +import { Users } from './fixtures/userStates'; +import { HomeChannel } from './page-objects'; +import { createTargetChannel } from './utils'; +import { expect, test } from './utils/test'; + +test.use({ storageState: Users.user1.state }); + +test.describe.serial('Composer', () => { + let poHomeChannel: HomeChannel; + let targetChannel: string; + + test.beforeAll(async ({ api }) => { + targetChannel = await createTargetChannel(api); + }); + + test.beforeEach(async ({ page }) => { + poHomeChannel = new HomeChannel(page); + + await page.goto('/home'); + }); + + test('should have all formatters and the main actions visible on toolbar', async () => { + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.content.sendMessage('hello composer'); + + await expect(poHomeChannel.composerToolboxActions).toHaveCount(11); + }); + + test('should have only the main formatter and the main action', async ({ page }) => { + await page.setViewportSize({ width: 768, height: 600 }); + + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.content.sendMessage('hello composer'); + + await expect(poHomeChannel.composerToolboxActions).toHaveCount(5); + }); +}); diff --git a/apps/meteor/tests/e2e/message-mentions.spec.ts b/apps/meteor/tests/e2e/message-mentions.spec.ts index aa3e5b73036e..7645d5b14470 100644 --- a/apps/meteor/tests/e2e/message-mentions.spec.ts +++ b/apps/meteor/tests/e2e/message-mentions.spec.ts @@ -1,9 +1,26 @@ +import { faker } from '@faker-js/faker'; + import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; +import { createTargetPrivateChannel } from './utils'; import { test, expect } from './utils/test'; + test.use({ storageState: Users.admin.state }); +const getMentionText = (username: string, kind?: number): string => { + if (kind === 1) { + return `You mentioned ${username}, but they're not in this room.`; + } + if (kind === 2) { + return `You mentioned ${username}, but they're not in this room. You can ask a room admin to add them.`; + } + if (kind === 3) { + return `You mentioned ${username}, but they're not in this room. You let them know via DM.`; + } + return `Hello @${username}, how are you`; +}; + test.describe.serial('message-mentions', () => { let poHomeChannel: HomeChannel; @@ -20,4 +37,180 @@ test.describe.serial('message-mentions', () => { await expect(poHomeChannel.content.messagePopupUsers.locator('role=listitem >> text="all"')).toBeVisible(); await expect(poHomeChannel.content.messagePopupUsers.locator('role=listitem >> text="here"')).toBeVisible(); }); + + test.describe('users not in channel', () => { + let targetChannel: string; + let targetChannel2: string; + test.beforeAll(async ({ api }) => { + targetChannel = await createTargetPrivateChannel(api); + }); + + test('all actions', async ({ page }) => { + const adminPage = new HomeChannel(page); + const mentionText = getMentionText(Users.user1.data.username, 1); + + await test.step('receive bot message', async () => { + await adminPage.sidenav.openChat(targetChannel); + await adminPage.content.sendMessage(getMentionText(Users.user1.data.username)); + await expect(adminPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + + await test.step('show "Do nothing" action', async () => { + await expect(adminPage.content.lastUserMessage.locator('button >> text="Do nothing"')).toBeVisible(); + }); + await test.step('show "Add them" action', async () => { + await expect(adminPage.content.lastUserMessage.locator('button >> text="Add them"')).toBeVisible(); + }); + await test.step('show "Let them know" action', async () => { + await expect(adminPage.content.lastUserMessage.locator('button >> text="Let them know"')).toBeVisible(); + }); + + await test.step('dismiss', async () => { + await adminPage.content.lastUserMessage.locator('button >> text="Do nothing"').click(); + }); + + await test.step('receive second bot message', async () => { + await adminPage.content.sendMessage(getMentionText(Users.user1.data.username)); + await expect(adminPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + await test.step('send message to users', async () => { + await adminPage.content.lastUserMessage.locator('button >> text="Let them know"').click(); + await expect(adminPage.content.lastUserMessageBody).toContainText(getMentionText(Users.user1.data.username, 3)); + }); + + await test.step('receive third bot message', async () => { + await adminPage.content.sendMessage(getMentionText(Users.user1.data.username)); + await expect(adminPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + await test.step('add users to room', async () => { + await adminPage.content.lastUserMessage.locator('button >> text="Add them"').click(); + await expect(adminPage.content.lastSystemMessageBody).toContainText('added'); + }); + }); + + test.describe(() => { + test.use({ storageState: Users.user1.state }); + + test('dismiss and share message actions', async ({ page }) => { + const mentionText = getMentionText(Users.user2.data.username, 1); + const userPage = new HomeChannel(page); + + await test.step('receive bot message', async () => { + await userPage.sidenav.openChat(targetChannel); + await userPage.content.sendMessage(getMentionText(Users.user2.data.username)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + + await test.step('show "Do nothing" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Do nothing"')).toBeVisible(); + }); + await test.step('show "Let them know" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Let them know"')).toBeVisible(); + }); + await test.step('not show "Add them action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Add them"')).not.toBeVisible(); + }); + + await test.step('dismiss', async () => { + await userPage.content.lastUserMessage.locator('button >> text="Do nothing"').click(); + }); + + await test.step('receive second bot message', async () => { + await userPage.sidenav.openChat(targetChannel); + await userPage.content.sendMessage(getMentionText(Users.user2.data.username)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + await test.step('send message to users', async () => { + await userPage.content.lastUserMessage.locator('button >> text="Let them know"').click(); + await expect(userPage.content.lastUserMessageBody).toContainText(getMentionText(Users.user2.data.username, 3)); + }); + }); + }) + + test.describe(() => { + test.use({ storageState: Users.user1.state }); + test.beforeAll(async ({ api }) => { + expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin'] }] })).status()).toBe(200); + }); + + test.afterAll(async ({ api }) => { + expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin', 'user', 'bot', 'app'] }] })).status()).toBe(200); + }); + + test('dismiss and add users actions', async ({ page }) => { + const mentionText = getMentionText(Users.user2.data.username, 1); + const userPage = new HomeChannel(page); + + await test.step('create private room', async () => { + targetChannel2 = faker.string.uuid(); + + await poHomeChannel.sidenav.openNewByLabel('Channel'); + await poHomeChannel.sidenav.inputChannelName.type(targetChannel2); + await poHomeChannel.sidenav.btnCreate.click(); + + await expect(page).toHaveURL(`/group/${targetChannel2}`); + }) + + await test.step('receive bot message', async () => { + await userPage.sidenav.openChat(targetChannel2); + await userPage.content.sendMessage(getMentionText(Users.user2.data.username)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + await test.step('show "Do nothing" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Do nothing"')).toBeVisible(); + }); + await test.step('show "Add them" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Add them"')).toBeVisible(); + }); + await test.step('not show "Let them know" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Let them know"')).not.toBeVisible(); + }); + + await test.step('dismiss', async () => { + await userPage.content.lastUserMessage.locator('button >> text="Do nothing"').click(); + }); + + await test.step('receive second bot message', async () => { + await userPage.sidenav.openChat(targetChannel2); + await userPage.content.sendMessage(getMentionText(Users.user2.data.username)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(mentionText); + }); + await test.step('add users to room', async () => { + await userPage.content.lastUserMessage.locator('button >> text="Add them"').click(); + await expect(userPage.content.lastSystemMessageBody).toContainText('added'); + }); + }); + }); + + test.describe(() => { + test.use({ storageState: Users.user2.state }); + test.beforeAll(async ({ api }) => { + expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin'] }] })).status()).toBe(200); + }); + + test.afterAll(async ({ api }) => { + expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin', 'user', 'bot', 'app'] }] })).status()).toBe(200); + }); + test('no actions', async ({ page }) => { + const userPage = new HomeChannel(page); + + await test.step('receive bot message', async () => { + await userPage.sidenav.openChat(targetChannel2); + await userPage.content.sendMessage(getMentionText(Users.user3.data.username)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(getMentionText(Users.user3.data.username, 2)); + }); + + await test.step('not show "Do nothing" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Do nothing"')).not.toBeVisible(); + }); + await test.step('not show "Add them" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Add them"')).not.toBeVisible(); + }); + await test.step('not show "Let them know" action', async () => { + await expect(userPage.content.lastUserMessage.locator('button >> text="Let them know"')).not.toBeVisible(); + }); + }); + }) + + }) }); diff --git a/apps/meteor/tests/e2e/oauth.spec.ts b/apps/meteor/tests/e2e/oauth.spec.ts new file mode 100644 index 000000000000..e8ad6a6c7e54 --- /dev/null +++ b/apps/meteor/tests/e2e/oauth.spec.ts @@ -0,0 +1,26 @@ +import { Registration } from './page-objects'; +import { setSettingValueById } from './utils/setSettingValueById'; +import { test, expect } from './utils/test'; + +test.describe('OAuth', () => { + let poRegistration: Registration; + + test.beforeEach(async ({ page }) => { + poRegistration = new Registration(page); + + await page.goto('/home'); + }); + + test('Login Page', async ({ api }) => { + await test.step('expect OAuth button to be visible', async () => { + await expect((await setSettingValueById(api, 'Accounts_OAuth_Google', true)).status()).toBe(200); + await expect(poRegistration.btnLoginWithGoogle).toBeVisible({ timeout: 10000 }); + }); + + await test.step('expect OAuth button to not be visible', async () => { + await expect((await setSettingValueById(api, 'Accounts_OAuth_Google', false)).status()).toBe(200); + + await expect(poRegistration.btnLoginWithGoogle).not.toBeVisible({ timeout: 10000 }); + }); + }); +}); \ No newline at end of file diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts index 263c5660ec18..658296fb3387 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts @@ -1,12 +1,21 @@ +import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; import { OmnichannelAgents } from '../page-objects'; +import { createDepartment } from '../utils/omnichannel/departments'; import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); -test.describe.serial('omnichannel-agents', () => { +test.describe.serial('OC - Manage Agents', () => { let poOmnichannelAgents: OmnichannelAgents; + let department: Awaited>; + // Create agent and department + test.beforeEach(async ({ api }) => { + department = await createDepartment(api); + }); + + // Create page object and redirect to home test.beforeEach(async ({ page }) => { poOmnichannelAgents = new OmnichannelAgents(page); @@ -14,31 +23,86 @@ test.describe.serial('omnichannel-agents', () => { await poOmnichannelAgents.sidenav.linkAgents.click(); }); - test('expect add "user1" as agent', async ({ page }) => { - await poOmnichannelAgents.inputUsername.type('user1'); - await page.locator('role=option[name="user1"]').click(); - await poOmnichannelAgents.btnAdd.click(); + // Ensure that there is no leftover data even if test fails + test.afterEach(async ({ api }) => { + await await api.delete('/livechat/users/agent/user1'); + await api.post('/settings/Omnichannel_enable_department_removal', { value: true }).then((res) => expect(res.status()).toBe(200)); + await department.delete(); + await api.post('/settings/Omnichannel_enable_department_removal', { value: false }).then((res) => expect(res.status()).toBe(200)); + }); - await poOmnichannelAgents.inputSearch.fill('user1'); - await expect(poOmnichannelAgents.firstRowInTable).toBeVisible(); + test('OC - Manage Agents - Add, search and remove using table', async ({ page }) => { + await test.step('expect "user1" be first ', async () => { + await poOmnichannelAgents.inputUsername.type('user'); + await expect(page.locator('role=option[name="user1"]')).toContainText('user1'); + + await poOmnichannelAgents.inputUsername.fill(''); + }); + + await test.step('expect add "user1" as agent', async () => { + await poOmnichannelAgents.selectUsername('user1'); + await poOmnichannelAgents.btnAdd.click(); + + await poOmnichannelAgents.inputSearch.fill('user1'); + await expect(poOmnichannelAgents.firstRowInTable).toBeVisible(); + await expect(poOmnichannelAgents.firstRowInTable).toHaveText('user1'); + }); + + await test.step('expect remove "user1" as agent', async () => { + await poOmnichannelAgents.inputSearch.fill('user1'); + await poOmnichannelAgents.btnDeletefirstRowInTable.click(); + await poOmnichannelAgents.btnModalRemove.click(); + + await poOmnichannelAgents.inputSearch.fill('user1'); + await expect(poOmnichannelAgents.findRowByUsername('user1')).not.toBeVisible(); + }); }); - test('expect update "user1" status', async ({ page }) => { + test('OC - Manage Agents [CE]- Edit and Remove', async () => { + test.skip(IS_EE, 'Community Edition Only'); + + await poOmnichannelAgents.selectUsername('user1'); + await poOmnichannelAgents.btnAdd.click(); + await poOmnichannelAgents.inputSearch.fill('user1'); await poOmnichannelAgents.firstRowInTable.click(); - await poOmnichannelAgents.btnEdit.click(); - await poOmnichannelAgents.btnStatus.click(); - await page.locator(`.rcx-option__content:has-text("Not available")`).click(); - await poOmnichannelAgents.btnSave.click(); + + await test.step('expect max chats fields to be hidden', async () => { + await expect(poOmnichannelAgents.inputMaxChats).toBeHidden(); + }); + + await test.step('expect update "user1" information', async () => { + await poOmnichannelAgents.selectStatus('Not available'); + await poOmnichannelAgents.selectDepartment(department.data.name); + await poOmnichannelAgents.btnSave.click(); + }); + + await test.step('expect removing "user1" via sidebar', async () => { + await poOmnichannelAgents.inputSearch.fill('user1'); + await poOmnichannelAgents.firstRowInTable.click(); + await poOmnichannelAgents.btnRemove.click(); + }); }); - test('expect remove "user1" as agent', async () => { - await poOmnichannelAgents.inputSearch.fill('user1'); - await poOmnichannelAgents.btnDeletefirstRowInTable.click(); - await poOmnichannelAgents.btnModalRemove.click(); + test('OC - Manage Agents [EE] - Edit ', async () => { + test.skip(!IS_EE, 'Enterprise Only'); + + await poOmnichannelAgents.selectUsername('user1'); + await poOmnichannelAgents.btnAdd.click(); await poOmnichannelAgents.inputSearch.fill('user1'); - await expect(poOmnichannelAgents.firstRowInTable).toBeHidden(); + await poOmnichannelAgents.findRowByUsername('user1').click(); + await poOmnichannelAgents.btnEdit.click(); + + await test.step('expect max chats field to be visible', async () => { + await expect(poOmnichannelAgents.inputMaxChats).toBeVisible(); + }); + + await test.step('expect update "user1" information', async () => { + await poOmnichannelAgents.inputMaxChats.click(); + await poOmnichannelAgents.inputMaxChats.fill('2'); + await poOmnichannelAgents.btnSave.click(); + }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts new file mode 100644 index 000000000000..fd5715c691fe --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts @@ -0,0 +1,487 @@ +import { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; +import { createAuxContext } from '../fixtures/createAuxContext'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { addAgentToDepartment, createDepartment } from '../utils/omnichannel/departments'; +import { createManager } from '../utils/omnichannel/managers'; +import { createMonitor } from '../utils/omnichannel/monitors'; +import { createConversation } from '../utils/omnichannel/rooms'; +import { createOrUpdateUnit } from '../utils/omnichannel/units'; +import { expect, test } from '../utils/test'; + +const wrapSession = async ({ page }: { page: Page }) => ({ page, poHomeOmnichannel: new HomeOmnichannel(page) }); + +test.use({ storageState: Users.user3.state }); + +test.skip(!IS_EE, 'Enterprise Edition Only'); + +test.describe('OC - Chat transfers [Monitor role]', () => { + let departments: Awaited>[]; + let conversations: Awaited>[]; + let agents: Awaited>[]; + let monitors: Awaited>[]; + let units: Awaited>[]; + let sessions: { page: Page; poHomeOmnichannel: HomeOmnichannel }[]; + + let poOmnichannel: HomeOmnichannel; + + // Create agents + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2'), createAgent(api, 'rocketchat.internal.admin.test')]); + + (await Promise.all(agents.map(({ data: agent }) => makeAgentAvailable(api, agent._id)))).forEach((res) => { + expect(res.status()).toBe(200); + }); + }); + + // Create departments + test.beforeAll(async ({ api }) => { + departments = await Promise.all([createDepartment(api), createDepartment(api)]); + }); + + // Add agents to departments + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + const promises = await Promise.all([ + addAgentToDepartment(api, { department: departmentA, agentId: 'user1' }), + addAgentToDepartment(api, { department: departmentA, agentId: 'rocketchat.internal.admin.test' }), + addAgentToDepartment(api, { department: departmentB, agentId: 'user2' }), + ]); + + promises.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create conversations + test.beforeAll(async ({ api }) => { + const [departmentA] = departments.map(({ data }) => data); + + conversations = await Promise.all([ + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + ]); + }); + + // Create monitors + test.beforeAll(async ({ api }) => { + monitors = await Promise.all([createMonitor(api, 'user3')]); + }); + + // Create units + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + units = await Promise.all([ + createOrUpdateUnit(api, { + monitors: [{ monitorId: 'user3', username: 'user3' }], + departments: [{ departmentId: departmentA._id }], + }), + createOrUpdateUnit(api, { + monitors: [{ monitorId: 'rocketchat.internal.admin.test', username: 'rocketchat.internal.admin.test' }], + departments: [{ departmentId: departmentB._id }], + }), + ]); + }); + + // Create sessions + test.beforeEach(async ({ browser }) => { + sessions = await Promise.all([ + createAuxContext(browser, Users.user1).then(wrapSession), + createAuxContext(browser, Users.user2).then(wrapSession), + createAuxContext(browser, Users.admin).then(wrapSession), + ]); + }); + + test.beforeEach(async ({ page }) => { + poOmnichannel = new HomeOmnichannel(page); + + await page.goto('/omnichannel/current'); + }); + + // Close sessions + test.afterEach(async () => { + await Promise.all(sessions.map(({ page }) => page.close())); + }); + + test.afterAll(async () => { + await Promise.all([ + ...conversations.map((conversation) => conversation.delete()), + ...monitors.map((monitor) => monitor.delete()), + ...agents.map((agent) => agent.delete()), + ...units.map((unit) => unit.delete()), + ...departments.map((department) => department.delete()), + ]); + }); + + test(`OC - Chat transfers [Monitor role] - Transfer to another department`, async ({ page }) => { + const [, departmentB] = departments.map(({ data }) => data); + const [roomA] = conversations.map(({ data }) => data.room); + const [agentA, agentB] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomA.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomA._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from dep a to dep b', async () => { + await poOmnichannel.content.forwardChatModal.selectDepartment(departmentB.name); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).not.toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname).click(); + await agentB.poHomeOmnichannel.content.findSystemMessage( + `Transfer: user3 transferred the chat to the department ${departmentB.name}}`, + ); + await agentB.poHomeOmnichannel.content.findSystemMessage('left the channel'); + }); + }); + + test(`OC - Chat transfers [Monitor role] - Transfer to another agent, different department`, async ({ page }) => { + const [, roomB] = conversations.map(({ data }) => data.room); + const [agentA, agentB] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomB.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomB._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from user1 to user2', async () => { + await poOmnichannel.content.forwardChatModal.selectUser(`user2`); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).not.toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname).click(); + await expect( + agentB.poHomeOmnichannel.content.findSystemMessage( + `New Chat Transfer: user3 transferred the chat to user2 with a comment: any_comment`, + ), + ).toBeVisible(); + await expect(agentB.poHomeOmnichannel.content.findSystemMessage('left the channel')).toBeVisible(); + }); + }); + + test(`OC - Chat transfers [Monitor role] - Transfer to another agent, same department`, async ({ page }) => { + const [, , roomC] = conversations.map(({ data }) => data.room); + const [agentA, , agentC] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomC.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomC._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from dep a to dep b', async () => { + await poOmnichannel.content.forwardChatModal.selectUser('rocketchat.internal.admin.test'); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).not.toBeVisible(); + await expect(agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname).click(); + await expect( + agentC.poHomeOmnichannel.content.findSystemMessage( + `New Chat Transfer: user3 transferred the chat to RocketChat Internal Admin Test with a comment: any_comment`, + ), + ).toBeVisible(); + await expect(agentC.poHomeOmnichannel.content.findSystemMessage('left the channel')).toBeVisible(); + }); + }); +}); + +test.describe('OC - Chat transfers [Manager role]', () => { + let departments: Awaited>[]; + let conversations: Awaited>[]; + let agents: Awaited>[]; + let managers: Awaited>[]; + let sessions: { page: Page; poHomeOmnichannel: HomeOmnichannel }[]; + + let poOmnichannel: HomeOmnichannel; + + // Create agents + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2'), createAgent(api, 'rocketchat.internal.admin.test')]); + + (await Promise.all(agents.map(({ data: agent }) => makeAgentAvailable(api, agent._id)))).forEach((res) => { + expect(res.status()).toBe(200); + }); + }); + + // Create managers + test.beforeAll(async ({ api }) => { + managers = await Promise.all([createManager(api, 'user3')]); + }); + + // Create departments + test.beforeAll(async ({ api }) => { + departments = await Promise.all([createDepartment(api), createDepartment(api)]); + }); + + // Add agents to departments + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + const promises = await Promise.all([ + addAgentToDepartment(api, { department: departmentA, agentId: 'user1' }), + addAgentToDepartment(api, { department: departmentA, agentId: 'rocketchat.internal.admin.test' }), + addAgentToDepartment(api, { department: departmentB, agentId: 'user2' }), + ]); + + promises.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create conversations + test.beforeAll(async ({ api }) => { + const [departmentA] = departments.map(({ data }) => data); + + conversations = await Promise.all([ + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + agentId: `user1`, + departmentId: departmentA._id, + }), + ]); + }); + + // Create sessions + test.beforeEach(async ({ browser }) => { + sessions = await Promise.all([ + createAuxContext(browser, Users.user1).then(wrapSession), + createAuxContext(browser, Users.user2).then(wrapSession), + createAuxContext(browser, Users.admin).then(wrapSession), + ]); + }); + + test.beforeEach(async ({ page }) => { + poOmnichannel = new HomeOmnichannel(page); + + await page.goto('/omnichannel/current'); + }); + + // Close sessions + test.afterEach(async () => { + await Promise.all(sessions.map(({ page }) => page.close())); + }); + + test.afterAll(async () => { + await Promise.all([ + ...conversations.map((conversation) => conversation.delete()), + ...managers.map((manager) => manager.delete()), + ...agents.map((agent) => agent.delete()), + ...departments.map((department) => department.delete()), + ]); + }); + + test(`OC - Chat transfers [Manager role] - Transfer to another department`, async ({ page }) => { + const [, departmentB] = departments.map(({ data }) => data); + const [roomA] = conversations.map(({ data }) => data.room); + const [agentA, agentB] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomA.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomA._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from dep a to dep b', async () => { + await poOmnichannel.content.forwardChatModal.selectDepartment(departmentB.name); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).not.toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomA.fname).click(); + await agentB.poHomeOmnichannel.content.findSystemMessage( + `Transfer: user3 transferred the chat to the department ${departmentB.name}}`, + ); + await agentB.poHomeOmnichannel.content.findSystemMessage('left the channel'); + }); + }); + + test(`OC - Chat transfers [Manager role] - Transfer to another agent, different department`, async ({ page }) => { + const [, roomB] = conversations.map(({ data }) => data.room); + const [agentA, agentB] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomB.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomB._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from user1 to user2', async () => { + await poOmnichannel.content.forwardChatModal.selectUser(`user2`); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).not.toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(roomB.fname).click(); + await expect( + agentB.poHomeOmnichannel.content.findSystemMessage( + `New Chat Transfer: user3 transferred the chat to user2 with a comment: any_comment`, + ), + ).toBeVisible(); + await expect(agentB.poHomeOmnichannel.content.findSystemMessage('left the channel')).toBeVisible(); + }); + }); + + test(`OC - Chat transfers [Manager role] - Transfer to another agent, same department`, async ({ page }) => { + const [, , roomC] = conversations.map(({ data }) => data.room); + const [agentA, , agentC] = sessions; + + await test.step('expect room a to bot be visible for user2', async () => { + await expect(agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(roomC.fname).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomC._id}`); + await poOmnichannel.content.btnForwardChat.click(); + }); + + await test.step('expect agent and department fields to be visible and enabled', async () => { + await expect(poOmnichannel.content.forwardChatModal.inputFowardUser).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.inputFowardDepartment).toBeEnabled(); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeDisabled(); + }); + + await test.step('expect to transfer from dep a to dep b', async () => { + await poOmnichannel.content.forwardChatModal.selectUser('rocketchat.internal.admin.test'); + await poOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await expect(poOmnichannel.content.forwardChatModal.btnForward).toBeEnabled(); + await poOmnichannel.content.forwardChatModal.btnForward.click(); + // await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); + }); + + await test.step('expect conversation to have been assigned to user 2', async () => { + await expect(agentA.page).toHaveURL(`/home`); + await expect(agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).not.toBeVisible(); + await expect(agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname)).toBeVisible(); + }); + + await test.step('expect user 1 to have left the conversation', async () => { + await agentC.poHomeOmnichannel.sidenav.getSidebarItemByName(roomC.fname).click(); + await expect( + agentC.poHomeOmnichannel.content.findSystemMessage( + `New Chat Transfer: user3 transferred the chat to RocketChat Internal Admin Test with a comment: any_comment`, + ), + ).toBeVisible(); + await expect(agentC.poHomeOmnichannel.content.findSystemMessage('left the channel')).toBeVisible(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts index 85c523c20663..e77484cbd4f2 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts @@ -49,7 +49,7 @@ test.describe('Omnichannel close inquiry', () => { await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { await agent.poHomeOmnichannel.sidenav.openQueuedOmnichannelChat(newUser.name); - await expect(agent.poHomeOmnichannel.content.takeOmnichannelChatButton).toBeVisible(); + await expect(agent.poHomeOmnichannel.content.btnTakeChat).toBeVisible(); }); await test.step('Expect to be able to close an inquiry conversation', async () => { @@ -62,8 +62,8 @@ test.describe('Omnichannel close inquiry', () => { await test.step('Expect to inquiry be closed when navigate back', async () => { await agent.poHomeOmnichannel.sidenav.openAdministrationByLabel('Omnichannel'); await agent.poHomeOmnichannel.omnisidenav.linkCurrentChats.click(); - await agent.poHomeOmnichannel.currentChats.openChat(newUser.name); - await expect(agent.poHomeOmnichannel.content.takeOmnichannelChatButton).not.toBeVisible(); + await agent.poHomeOmnichannel.currentChats.findRowByName(newUser.name).click(); + await expect(agent.poHomeOmnichannel.content.btnTakeChat).not.toBeVisible(); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts index 8138ab839b75..a3d105136efe 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts @@ -1,15 +1,326 @@ +import { faker } from '@faker-js/faker'; +import { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; +import { OmnichannelCurrentChats } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { addAgentToDepartment, createDepartment } from '../utils/omnichannel/departments'; +import { createConversation, updateRoom } from '../utils/omnichannel/rooms'; +import { createTag } from '../utils/omnichannel/tags'; import { test, expect } from '../utils/test'; +const visitorA = faker.person.firstName(); +const visitorB = faker.person.firstName(); +const visitorC = faker.person.firstName(); + +test.skip(!IS_EE, 'OC - Current Chats > Enterprise Only'); + test.use({ storageState: Users.admin.state }); -test.describe.parallel('Omnichannel current chats', () => { - test.beforeEach(async ({ page }) =>{ - await page.goto('/omnichannel/current') - }) +test.describe('OC - Current Chats [Auto Selection]', async () => { + let poCurrentChats: OmnichannelCurrentChats; + let departments: Awaited>[]; + let conversations: Awaited>[]; + let agents: Awaited>[]; + + // Allow manual on hold + test.beforeAll(async ({ api }) => { + const responses = await Promise.all([ + api.post('/settings/Livechat_allow_manual_on_hold', { value: true }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: false }), + ]); + responses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create departments + test.beforeAll(async ({ api }) => { + departments = await Promise.all([createDepartment(api), createDepartment(api)]); + }); + + // Create agents + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2')]); + + const agentsStatuses = await Promise.all(agents.map(({ data: agent }) => makeAgentAvailable(api, agent._id))); + + agentsStatuses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Add agents to departments + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + const promises = await Promise.all([ + addAgentToDepartment(api, { department: departmentA, agentId: 'user1' }), + addAgentToDepartment(api, { department: departmentB, agentId: 'user2' }), + ]); + + promises.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create tags + test.beforeAll(async ({ api }) => { + const promises = await Promise.all([createTag(api, 'tagA'), createTag(api, 'tagB')]); + + promises.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create rooms + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + conversations = await Promise.all([ + createConversation(api, { + visitorName: visitorA, + visitorToken: visitorA, + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + visitorName: visitorB, + visitorToken: visitorB, + agentId: `user2`, + departmentId: departmentB._id, + }), + createConversation(api, { + visitorName: visitorC, + visitorToken: visitorC, + }), + ]); + + const [conversationA, conversationB] = conversations.map(({ data }) => data); + + await Promise.all([ + updateRoom(api, { + roomId: conversationA.room._id, + visitorId: conversationA.visitor._id, + tags: ['tagA'], + }), + updateRoom(api, { + roomId: conversationB.room._id, + visitorId: conversationB.visitor._id, + tags: ['tagB'], + }), + ]); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poCurrentChats = new OmnichannelCurrentChats(page); + + await page.goto('/omnichannel'); + await poCurrentChats.sidenav.linkCurrentChats.click(); + }); + + test.afterAll(async ({ api }) => { + await Promise.all([ + // Delete conversations + ...conversations.map((conversation) => conversation.delete()), + // // Delete departments + ...departments.map((department) => department.delete()), + // Delete agents + ...agents.map((agent) => agent.delete()), + // Reset setting + api.post('/settings/Livechat_allow_manual_on_hold', { value: false }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: true }), + // TODO: remove tags + ]); + }); + + // Change conversation A to on hold and close conversation B + test.beforeAll(async ({ api }) => { + const [conversationA, , conversationC] = conversations.map(({ data }) => data); + + const statesPromises = await Promise.all([ + api.post('/livechat/room.onHold', { roomId: conversationA.room._id }), + api.post('/livechat/room.close', { rid: conversationC.room._id, token: visitorC }), + ]); + + statesPromises.forEach((res) => expect(res.status()).toBe(200)); + }); + + test.skip('OC - Current chats - Accessibility violations', async ({ makeAxeBuilder }) => { + const results = await makeAxeBuilder().analyze(); + expect(results.violations).toEqual([]); + }); + + test('OC - Current chats - Filters', async () => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + await test.step('expect to filter by guest', async () => { + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + + await poCurrentChats.inputGuest.fill(visitorA); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + + await poCurrentChats.inputGuest.fill(''); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + }); + + await test.step('expect to filter by server', async () => { + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + + await poCurrentChats.selectServedBy('user1'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + + await poCurrentChats.selectServedBy('user2'); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorA)).not.toBeVisible(); + + await poCurrentChats.selectServedBy('all'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + }); + + await test.step('expect to filter by status', async () => { + await poCurrentChats.selectStatus('closed'); + await expect(poCurrentChats.findRowByName(visitorA)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).toBeVisible(); + + await poCurrentChats.selectStatus('opened'); + await expect(poCurrentChats.findRowByName(visitorA)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).not.toBeVisible(); + + await poCurrentChats.selectStatus('onhold'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).not.toBeVisible(); + + await poCurrentChats.selectStatus('all'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).toBeVisible(); + }); + + await test.step('expect to filter by department', async () => { + await poCurrentChats.selectDepartment(departmentA.name); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).not.toBeVisible(); + + await poCurrentChats.selectDepartment(departmentB.name); + await expect(poCurrentChats.findRowByName(visitorA)).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).not.toBeVisible(); + + await poCurrentChats.selectDepartment('All'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).toBeVisible(); + }); + + await test.step('expect to filter by tags', async () => { + await poCurrentChats.addTag('tagA'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).not.toBeVisible(); + + await poCurrentChats.addTag('tagB'); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + + await poCurrentChats.removeTag('tagA'); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorA)).not.toBeVisible(); + + await poCurrentChats.removeTag('tagB'); + await expect(poCurrentChats.findRowByName(visitorB)).toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorA)).toBeVisible(); + }); + + // TODO: Unit test await test.step('expect to filter by period', async () => {}); + + // TODO: Unit test await test.step('expect to filter by custom fields', async () => {}); + + // TODO: Unit test await test.step('expect to filter clear all', async () => {}); + }); + + test('OC - Current chats - Basic navigation', async ({ page }) => { + await test.step('expect to be return using return button', async () => { + const { room: roomA } = conversations[0].data; + await poCurrentChats.findRowByName(visitorA).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomA._id}`); + await poCurrentChats.content.btnReturn.click(); + await expect(page).toHaveURL(`/omnichannel/current`); + }); + }); + + test('OC - Current chats - Access in progress conversation from another agent', async ({ page }) => { + await test.step('expect to be able to join', async () => { + const { room: roomB, visitor: visitorB } = conversations[1].data; + await poCurrentChats.findRowByName(visitorB.name).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomB._id}`); + await expect(poCurrentChats.content.btnJoinRoom).toBeVisible(); + await poCurrentChats.content.btnJoinRoom.click(); + await expect(poCurrentChats.content.btnJoinRoom).not.toBeVisible(); + }); + }); + + test('OC - Current chats - Remove conversations', async () => { + await test.step('expect to be able to remove conversation from table', async () => { + await poCurrentChats.btnRemoveByName(visitorC).click(); + await expect(poCurrentChats.modalConfirmRemove).toBeVisible(); + await poCurrentChats.btnConfirmRemove.click(); + await expect(poCurrentChats.modalConfirmRemove).not.toBeVisible(); + await expect(poCurrentChats.findRowByName(visitorC)).not.toBeVisible(); + }); + + // TODO: await test.step('expect to be able to close all closes conversations', async () => {}); + }); +}); + +test.describe('OC - Current Chats [Manual Selection]', () => { + let queuedConversation: Awaited>; + let poCurrentChats: OmnichannelCurrentChats; + let agent: Awaited>; + + test.beforeAll(async ({ api }) => { + const res = await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }); + expect(res.status()).toBe(200); + }); + + test.beforeAll(async ({ api }) => { + agent = await createAgent(api, 'rocketchat.internal.admin.test'); + + const agentStatus = await makeAgentAvailable(api, agent.data._id); + + expect(agentStatus.status()).toBe(200); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poCurrentChats = new OmnichannelCurrentChats(page); + + await page.goto('/omnichannel'); + await poCurrentChats.sidenav.linkCurrentChats.click(); + }); + + test('OC - Current chats - Access queued conversation', async ({ page, api }) => { + queuedConversation = await createConversation(api, { visitorToken: 'visitorQueued' }); + + await test.step('expect to be able to take it', async () => { + const { room, visitor } = queuedConversation.data; + await poCurrentChats.inputGuest.fill(visitor.name); + await poCurrentChats.findRowByName(visitor.name).click(); + await expect(page).toHaveURL(`/omnichannel/current/${room._id}`); + await expect(poCurrentChats.content.btnTakeChat).toBeVisible(); + await poCurrentChats.content.btnTakeChat.click(); + await expect(poCurrentChats.content.btnTakeChat).not.toBeVisible(); + }); + }); + + test.afterAll(async ({ api }) => { + const res = await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }); + expect(res.status()).toBe(200); + }); - test.skip('should not have any accessibility violations', async ({ makeAxeBuilder }) => { - const results = await makeAxeBuilder().analyze(); - expect(results.violations).toEqual([]); - }) -}) + test.afterAll(async () => { + await queuedConversation.delete(); + await agent.delete(); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-custom-fields.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-custom-fields.spec.ts index dd5c93609f6e..6749f6905466 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-custom-fields.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-custom-fields.spec.ts @@ -4,7 +4,7 @@ import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); -test.describe.serial('omnichannel-agents', () => { +test.describe('omnichannel-customFields', () => { let poOmnichannelCustomFields: OmnichannelCustomFields; const newField = 'any_field'; test.beforeEach(async ({ page }) => { @@ -32,14 +32,16 @@ test.describe.serial('omnichannel-agents', () => { await poOmnichannelCustomFields.firstRowInTable(newField).click(); await poOmnichannelCustomFields.inputLabel.fill('new_any_label'); - await poOmnichannelCustomFields.btnEditSave.click(); + await poOmnichannelCustomFields.visibleLabel.click(); + await poOmnichannelCustomFields.btnSave.click(); await expect(page.locator(`[qa-user-id="${newField}"] td:nth-child(2)`)).toHaveText(newLabel); }); test('expect remove "new_field"', async () => { await poOmnichannelCustomFields.inputSearch.fill(newField); - await poOmnichannelCustomFields.btnDeletefirstRowInTable.click(); + await poOmnichannelCustomFields.firstRowInTable(newField).click(); + await poOmnichannelCustomFields.btnDeleteCustomField.click(); await poOmnichannelCustomFields.btnModalRemove.click(); await poOmnichannelCustomFields.inputSearch.fill(newField); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts index dc30077b671d..5f5db5c69166 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments-ce.spec.ts @@ -8,7 +8,7 @@ import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); -test.describe.serial('omnichannel-departments', () => { +test.describe.serial('OC - Manage Departments (CE)', () => { test.skip(IS_EE, 'Community Edition Only'); let poOmnichannelDepartments: OmnichannelDepartments; @@ -25,7 +25,7 @@ test.describe.serial('omnichannel-departments', () => { await poOmnichannelDepartments.sidenav.linkDepartments.click(); }); - test('CE departments', async () => { + test('OC - Manage Departments (CE) - Create department', async () => { await test.step('expect create new department', async () => { await poOmnichannelDepartments.headingButtonNew('Create department').click(); await poOmnichannelDepartments.btnEnabled.click(); @@ -37,6 +37,7 @@ test.describe.serial('omnichannel-departments', () => { await poOmnichannelDepartments.inputSearch.fill(departmentName); await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); }); + await test.step('expect to not be possible adding a second department ', async () => { await poOmnichannelDepartments.headingButtonNew('Create department').click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts index a6d3207a95e1..0e368565cdc0 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts @@ -4,6 +4,7 @@ import type { Page } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; import { OmnichannelDepartments } from '../page-objects'; +import { createDepartment, deleteDepartment } from '../utils/omnichannel/departments'; import { test, expect } from '../utils/test'; const ERROR = { @@ -14,14 +15,12 @@ const ERROR = { test.use({ storageState: Users.admin.state }); -test.describe.serial('omnichannel-departments', () => { +test.describe('OC - Manage Departments', () => { test.skip(!IS_EE, 'Enterprise Edition Only'); - let poOmnichannelDepartments: OmnichannelDepartments; - let departmentName: string; + let poOmnichannelDepartments: OmnichannelDepartments; test.beforeAll(async ({ api }) => { - departmentName = faker.string.uuid(); // turn on department removal const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status(); await expect(statusCode).toBe(200); @@ -40,17 +39,13 @@ test.describe.serial('omnichannel-departments', () => { await poOmnichannelDepartments.sidenav.linkDepartments.click(); }); - test('Manage departments', async ({ page }) => { - await test.step('expect page to be empty', async () => { - await page.goto('/omnichannel/departments/edit/this-department-dont-exist'); - await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); - await page.goBack(); - }); + test('OC - Manage Departments - Create department', async () => { + const departmentName = faker.string.uuid(); + + await poOmnichannelDepartments.headingButtonNew('Create department').click(); await test.step('expect name and email to be required', async () => { - await poOmnichannelDepartments.headingButtonNew('Create department').click(); await expect(poOmnichannelDepartments.invalidInputEmail).not.toBeVisible(); - await poOmnichannelDepartments.inputName.fill('any_text'); await poOmnichannelDepartments.inputName.fill(''); await expect(poOmnichannelDepartments.invalidInputName).toBeVisible(); @@ -82,90 +77,116 @@ test.describe.serial('omnichannel-departments', () => { await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); }); - await test.step('expect update department name', async () => { + await test.step('expect to delete department', async () => { await poOmnichannelDepartments.search(departmentName); + await poOmnichannelDepartments.selectedDepartmentMenu(departmentName).click(); + await poOmnichannelDepartments.menuDeleteOption.click(); + + await test.step('expect confirm delete department', async () => { + await expect(poOmnichannelDepartments.modalConfirmDelete).toBeVisible(); + + await test.step('expect delete to be disabled when name is incorrect', async () => { + await expect(poOmnichannelDepartments.btnModalConfirmDelete).toBeDisabled(); + await poOmnichannelDepartments.inputModalConfirmDelete.fill('someramdomname'); + await expect(poOmnichannelDepartments.btnModalConfirmDelete).toBeDisabled(); + }); + + await test.step('expect to successfuly delete if department name is correct', async () => { + await expect(poOmnichannelDepartments.btnModalConfirmDelete).toBeDisabled(); + await poOmnichannelDepartments.inputModalConfirmDelete.fill(departmentName); + await expect(poOmnichannelDepartments.btnModalConfirmDelete).toBeEnabled(); + await poOmnichannelDepartments.btnModalConfirmDelete.click(); + }); + }); + + await test.step('expect department to have been deleted', async () => { + await poOmnichannelDepartments.search(departmentName); + await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); + }); + }); + }); + + test('OC - Manage Departments - Edit department', async ({ api }) => { + const department = await test.step('expect create new department', async () => { + const { data: department } = await createDepartment(api); + + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + + return department; + }); + + await test.step('expect update department name', async () => { + await poOmnichannelDepartments.search(department.name); await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuEditOption.click(); - await poOmnichannelDepartments.inputName.fill(`edited-${departmentName}`); + await poOmnichannelDepartments.inputName.fill(`edited-${department.name}`); await poOmnichannelDepartments.btnSave.click(); await poOmnichannelDepartments.btnCloseToastSuccess.click(); - await poOmnichannelDepartments.search(`edited-${departmentName}`); + await poOmnichannelDepartments.search(`edited-${department.name}`); await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); }); - await test.step('expect archive department', async () => { + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); + }); + }); + + test('OC - Manage Departments - Archive department', async ({ api }) => { + const department = await test.step('expect create new department', async () => { + const { data: department } = await createDepartment(api); + + await poOmnichannelDepartments.search(department.name); await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - await poOmnichannelDepartments.search(`edited-${departmentName}`); + return department; + }); - await poOmnichannelDepartments.firstRowInTableMenu.click(); + await test.step('expect archive department', async () => { + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuArchiveOption.click(); - await expect(poOmnichannelDepartments.toastSuccess).toBeVisible(); - }); - await test.step('expect archived department to not be editable', async () => { await poOmnichannelDepartments.archivedDepartmentsTab.click(); + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); + await test.step('expect archived department to not be editable', async () => { await poOmnichannelDepartments.firstRowInTableMenu.click(); - - await expect(poOmnichannelDepartments.btnEnabled).not.toBeVisible(); - - await poOmnichannelDepartments.allDepartmentsTab.click(); + await expect(poOmnichannelDepartments.menuEditOption).not.toBeVisible(); }); await test.step('expect unarchive department', async () => { - await poOmnichannelDepartments.archivedDepartmentsTab.click(); - - await poOmnichannelDepartments.search(`edited-${departmentName}`); - - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuUnarchiveOption.click(); - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); }); - await test.step('expect delete department', async () => { - await poOmnichannelDepartments.allDepartmentsTab.click(); - - await poOmnichannelDepartments.search(`edited-${departmentName}`); - - await poOmnichannelDepartments.selectedDepartmentMenu(`edited-${departmentName}`).click(); - - await poOmnichannelDepartments.menuDeleteOption.click(); - - await poOmnichannelDepartments.inputModalConfirmDelete.fill(`edited-${departmentName}`); - - await poOmnichannelDepartments.btnModalConfirmDelete.click(); - - await poOmnichannelDepartments.search(`edited-${departmentName}`); - - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); }); }); - test('Tags', async () => { - const tagsDepartmentName = faker.string.uuid(); - - await test.step('expect create new department', async () => { - await poOmnichannelDepartments.headingButtonNew('Create department').click(); - await poOmnichannelDepartments.btnEnabled.click(); - await poOmnichannelDepartments.inputName.fill(tagsDepartmentName); - await poOmnichannelDepartments.inputEmail.fill(faker.internet.email()); - await poOmnichannelDepartments.btnSave.click(); - await poOmnichannelDepartments.btnCloseToastSuccess.click(); + test('OC - Manage Departments - Request tag(s) before closing conversation', async ({ api }) => { + const department = await test.step('expect create new department', async () => { + const { data: department } = await createDepartment(api); - await poOmnichannelDepartments.search(tagsDepartmentName); + await poOmnichannelDepartments.search(department.name); await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + + return department; }); await test.step('expect save form button be disabled', async () => { - await poOmnichannelDepartments.search(tagsDepartmentName); + await poOmnichannelDepartments.search(department.name); await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuEditOption.click(); await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); @@ -173,13 +194,14 @@ test.describe.serial('omnichannel-departments', () => { }); await test.step('Disabled tags state', async () => { - await poOmnichannelDepartments.search(tagsDepartmentName); + await poOmnichannelDepartments.search(department.name); await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuEditOption.click(); await test.step('expect to have department tags toggle button', async () => { await expect(poOmnichannelDepartments.toggleRequestTags).toBeVisible(); }); + await test.step('expect have no add tag to department', async () => { await expect(poOmnichannelDepartments.inputTags).not.toBeVisible(); await expect(poOmnichannelDepartments.btnTagsAdd).not.toBeVisible(); @@ -190,7 +212,7 @@ test.describe.serial('omnichannel-departments', () => { await test.step('Enabled tags state', async () => { const tagName = faker.string.sample(5); - await poOmnichannelDepartments.search(tagsDepartmentName); + await poOmnichannelDepartments.search(department.name); await poOmnichannelDepartments.firstRowInTableMenu.click(); await poOmnichannelDepartments.menuEditOption.click(); @@ -232,4 +254,42 @@ test.describe.serial('omnichannel-departments', () => { }); }); }); + + test('OC - Manage Departments - Toggle department removal', async ({ api }) => { + const department = await test.step('expect create new department', async () => { + const { data: department } = await createDepartment(api); + + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + + return department; + }); + + await test.step('expect to be able to delete department', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); + await expect(poOmnichannelDepartments.menuDeleteOption).toBeEnabled(); + }); + + await test.step('expect to disable department removal setting', async () => { + const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: false })).status(); + await expect(statusCode).toBe(200); + }); + + await test.step('expect not to be able to delete department', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); + await expect(poOmnichannelDepartments.menuDeleteOption).toBeDisabled(); + }); + + await test.step('expect to enable department removal setting', async () => { + const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status(); + await expect(statusCode).toBe(200); + }); + + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); + }); + }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts new file mode 100644 index 000000000000..617d5ba268cd --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts @@ -0,0 +1,721 @@ +import { faker } from '@faker-js/faker'; +import type { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; +import { createAuxContext } from '../fixtures/createAuxContext'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel, OmnichannelLiveChatEmbedded } from '../page-objects'; +import { createAgent } from '../utils/omnichannel/agents'; +import { test, expect } from '../utils/test'; + +// TODO: Use official widget typing once that is merged +declare const window: Window & { + // TODO: Improve tests to no longer use window object properties + onPrechatFormSubmit: boolean; + onAssignAgent: boolean; + onAgentStatusChange: boolean; + onOfflineFormSubmit: boolean; + onChatStarted: boolean; + onChatEnded: boolean; + + RocketChat: { + livechat: { + clearBusinessUnit: () => void; + clearDepartment: () => void; + initialize: () => void; + maximizeWidget: () => void; + minimizeWidget: () => void; + hideWidget: () => void; + showWidget: () => void; + pageVisited: () => void; + registerGuest: (visitor: { name: string; email: string; token: string }) => void; + setAgent: (agent: { username: string; _id: string }) => void; + setBusinessUnit: (businessUnit?: string) => void; + setCustomField: (field: { key: string; value: string }) => void; + setDepartment: (department: { _id: string; name: string }) => void; + setGuestEmail: (email: string) => void; + setGuestName: (name: string) => void; + setGuestToken: (token: string) => void; + setParentUrl: (url: string) => void; + setTheme: (theme: { color?: string; fontColor?: string; iconColor?: string; title?: string; offlineTitle?: string }) => void; + setLanguage: (language: string) => void; + onChatMaximized: (callback: () => void) => void; + onChatMinimized: (callback: () => void) => void; + onChatStarted: (callback: () => void) => void; + onChatEnded: (callback: () => void) => void; + onPrechatFormSubmit: (callback: () => void) => void; + onAssignAgent: (callback: () => void) => void; + onAgentStatusChange: (callback: () => void) => void; + onOfflineFormSubmit: (callback: () => void) => void; + onWidgetHidden: (callback: () => void) => void; + onWidgetShown: (callback: () => void) => void; + onServiceOffline: (callback: () => void) => void; + onQueuePositionChange: (callback: () => void) => void; + }; + }; +}; + +test.describe('OC - Livechat API', () => { + // TODO: Check if there is a way to add livechat to the global window object + + test.describe('Basic Widget Interactions', () => { + // Tests that rely only on the widget itself, without requiring further interaction from the main RC app + let poAuxContext: { page: Page; poHomeOmnichannel: HomeOmnichannel }; + let poLiveChat: OmnichannelLiveChatEmbedded; + let page: Page; + let agent: Awaited>; + + test.beforeAll(async ({ browser, api }) => { + agent = await createAgent(api, 'user1') + + page = await browser.newPage(); + await expect((await api.post('/settings/Enable_CSP', { value: false })).status()).toBe(200); + + poLiveChat = new OmnichannelLiveChatEmbedded(page, api); + + const { page: pageCtx } = await createAuxContext(browser, Users.user1); + poAuxContext = { page: pageCtx, poHomeOmnichannel: new HomeOmnichannel(pageCtx) }; + + await page.goto('/packages/rocketchat_livechat/assets/demo.html'); + }); + + test.afterAll(async ({ api }) => { + await expect((await api.post('/settings/Enable_CSP', { value: true })).status()).toBe(200); + await agent.delete(); + await poAuxContext.page.close(); + await page.close(); + }); + + test('OC - Livechat API - Open and Close widget', async () => { + await test.step('Expect widget to be visible after maximizeWidget()', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + }); + + await test.step('Expect widget not be visible after minimizeWidget()', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.minimizeWidget()); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + }); + }); + + test('OC - Livechat API - Show and Hide widget', async () => { + await test.step('Expect livechat button not be visible after minimizeWidget()', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.hideWidget()); + + await expect(page.frameLocator('#rocketchat-iframe').getByRole('button', { name: 'Rocket.Chat' })).not.toBeVisible(); + }); + + await test.step('Expect livechat button to be visible after show()', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.showWidget()); + + await expect(page.frameLocator('#rocketchat-iframe').getByRole('button', { name: 'Rocket.Chat' })).toBeVisible(); + }); + }); + + test.skip('OC - Livechat API - setAgent', async () => { + // Set agent does not actually set the agent, it just sets the default agent on the widget state + // Maybe that is used in an integration? Since as it is now, when the user starts a chat, the agent will be overriden + // TODO: Find the use case of the setAgent method + await test.step('Expect setAgent to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setAgent({ username: 'user1', _id: 'user1' })); + }); + }); + + test('OC - Livechat API - setLanguage', async () => { + await test.step('Expect language to be pt-BR', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setLanguage('pt-BR')); + + await expect( + page.frameLocator('#rocketchat-iframe').getByText('Por favor, nos passe algumas informações antes de iniciar o chat'), + ).toBeVisible(); + }); + + await test.step('Expect language to be en', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setLanguage('en')); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Please, tell us some information to start the chat')).toBeVisible(); + }); + }); + + test('OC - Livechat API - setTheme', async () => { + const registerGuestVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + token: faker.string.uuid(), + }; + + await test.step('Expect setTheme set color', async () => { + await poLiveChat.page.evaluate(() => { + window.RocketChat.livechat.maximizeWidget(); + window.RocketChat.livechat.setTheme({ color: 'rgb(50, 50, 50)' }); + }); + + await expect(page.frameLocator('#rocketchat-iframe').locator('header')).toHaveCSS('background-color', 'rgb(50, 50, 50)'); + }); + + await test.step('Expect setTheme set fontColor', async () => { + await poLiveChat.page.evaluate(() => { + window.RocketChat.livechat.maximizeWidget(); + window.RocketChat.livechat.setTheme({ fontColor: 'rgb(50, 50, 50)' }); + }); + + await expect(page.frameLocator('#rocketchat-iframe').locator('header')).toHaveCSS('color', 'rgb(50, 50, 50)'); + }); + + // TODO: fix iconColor setTheme property + // await test.step('Expect setTheme set iconColor', async () => { + // await poLiveChat.page.evaluate(() => { + // window.RocketChat.livechat.maximizeWidget(); + // window.RocketChat.livechat.setTheme({ iconColor: 'rgb(50, 50, 50)' }); + // }); + + // await expect(page.frameLocator('#rocketchat-iframe').locator('header')).toHaveCSS('color', 'rgb(50, 50, 50)'); + // }); + + await test.step('Expect setTheme set title', async () => { + await poLiveChat.page.evaluate(() => { + window.RocketChat.livechat.maximizeWidget(); + window.RocketChat.livechat.setTheme({ title: 'CustomTitle' }); + }); + + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('CustomTitle')).toBeVisible(); + }); + + // await test.step('Expect setTheme set offlineTitle', async () => { + // await poLiveChat.page.evaluate(() => { + // window.RocketChat.livechat.maximizeWidget(); + // window.RocketChat.livechat.setTheme({ offlineTitle: 'CustomOfflineTitle' }); + // }); + + // await expect(page.frameLocator('#rocketchat-iframe').getByText('CustomTitle')).toBeVisible(); + // }); + }); + + test.skip('OC - Livechat API - setParentUrl', async () => { + // TODO: check how to test this, not sure there is a clear indication of parent url changes + await test.step('Expect setParentUrl to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setParentUrl('http://localhost:3000')); + }); + }); + }); + + test.describe('Complex Widget Interactions', () => { + // Needs Departments to test this, so needs an EE license for multiple deps + test.skip(!IS_EE, 'Enterprise Only'); + // Tests that requires interaction from an agent or more + let poAuxContext: { page: Page; poHomeOmnichannel: HomeOmnichannel }; + let poLiveChat: OmnichannelLiveChatEmbedded; + let page: Page; + let depId: string; + let agent: Awaited>; + + test.beforeAll(async ({ api }) => { + agent = await createAgent(api, 'user1') + + const response = await api.post('/livechat/department', {department: { + enabled: true, + email: faker.internet.email(), + showOnRegistration: true, + showOnOfflineForm: true, + name: `new department ${Date.now()}`, + description: 'created from api', + }}); + + expect(response.status()).toBe(200); + + const resBody = await response.json(); + depId = resBody.department._id; + await expect((await api.post('/settings/Enable_CSP', { value: false })).status()).toBe(200); + await expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); + }); + + test.beforeEach(async ({ browser, api }, testInfo) => { + page = await browser.newPage(); + + poLiveChat = new OmnichannelLiveChatEmbedded(page, api); + + const { page: pageCtx } = await createAuxContext(browser, Users.user1); + poAuxContext = { page: pageCtx, poHomeOmnichannel: new HomeOmnichannel(pageCtx) }; + + // This is needed since the livechat will not react to online/offline status changes if already loaded in a page + if (testInfo.title === 'Expect onOfflineFormSubmit to trigger callback') { + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('offline'); + } else { + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('online'); + } + + await page.goto('/packages/rocketchat_livechat/assets/demo.html'); + }); + + test.afterEach(async () => { + await poAuxContext.page.close(); + await page.close(); + }); + + test.afterAll(async ({ api }) => { + await expect((await api.post('/settings/Enable_CSP', { value: true })).status()).toBe(200); + await agent.delete(); + await expect((await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status()).toBe(200); + const response = await api.delete(`/livechat/department/${depId}`, { name: 'TestDep', email: 'TestDep@email.com' }); + expect(response.status()).toBe(200); + await expect((await api.post('/settings/Omnichannel_enable_department_removal', { value: false })).status()).toBe(200); + }); + + // clearBusinessUnit + // clearDepartment + // initialize + // maximizeWidget + // minimizeWidget + // pageVisited + // registerGuest + // setAgent + // setBusinessUnit + // setCustomField + // setDepartment + // setGuestEmail + // setGuestName + // setGuestToken + // setParentUrl + // setTheme + + test.skip('OC - Livechat API - clearBusinessUnit', async () => { + // TODO: check how to test this, and if this is working as intended + await test.step('Expect clearBusinessUnit to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.clearBusinessUnit()); + }); + }); + + test.skip('OC - Livechat API - setBusinessUnit', async () => { + // TODO + await test.step('Expect setBusinessUnit to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setBusinessUnit()); + }); + }); + + test.skip('OC - Livechat API - setCustomField', async () => { + // TODO + await test.step('Expect setCustomField to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.setCustomField({ key: 'test', value: 'test' })); + }); + }); + + test.skip('OC - Livechat API - clearDepartment', async () => { + // TODO + await test.step('Expect clearDepartment to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.clearDepartment()); + }); + }); + + test('OC - Livechat API - registerGuest', async ({ browser }) => { + const registerGuestVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + token: faker.string.uuid(), + }; + + await test.step('Expect registerGuest to create a valid guest', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + }); + + await test.step('Expect registered guest to have valid info', async () => { + await poAuxContext.poHomeOmnichannel.sidenav.openChat(registerGuestVisitor.name); + + await poAuxContext.poHomeOmnichannel.content.btnGuestInfo.click(); + // For some reason the guest info email information is being set to lowercase + await expect(poAuxContext.poHomeOmnichannel.content.infoContactEmail).toHaveText(registerGuestVisitor.email.toLowerCase()); + }); + + await test.step('Expect registerGuest to log in an existing guest and load chat history', async () => { + const { page: pageCtx } = await createAuxContext(browser, Users.user1); + + await pageCtx.goto('/packages/rocketchat_livechat/assets/demo.html'); + + await pageCtx.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + + await pageCtx.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('this_a_test_message_from_visitor')).toBeVisible(); + }); + }); + + test('OC - Livechat API - setGuestEmail', async () => { + const registerGuestVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + token: faker.string.uuid(), + }; + // Start Chat + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await test.step('Expect setGuestEmail to change a guest email', async () => { + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.setGuestEmail(`changed${registerGuestVisitor.email}`), + registerGuestVisitor, + ); + }); + + await test.step('Expect registered guest to have valid info', async () => { + await poAuxContext.poHomeOmnichannel.sidenav.openChat(registerGuestVisitor.name); + + await poAuxContext.poHomeOmnichannel.content.btnGuestInfo.click(); + // For some reason the guest info email information is being set to lowercase + await expect(poAuxContext.poHomeOmnichannel.content.infoContactEmail).toHaveText( + `changed${registerGuestVisitor.email}`.toLowerCase(), + ); + }); + }); + + test('OC - Livechat API - setGuestName', async () => { + const registerGuestVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + token: faker.string.uuid(), + }; + // Start Chat + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await test.step('Expect setGuestEmail to change a guest email', async () => { + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.setGuestName(`changed${registerGuestVisitor.name}`), + registerGuestVisitor, + ); + }); + + await test.step('Expect registered guest to have valid info', async () => { + await poAuxContext.poHomeOmnichannel.sidenav.openChat(registerGuestVisitor.name); + + await expect(poAuxContext.poHomeOmnichannel.content.infoContactName).toContainText(`changed${registerGuestVisitor.name}`); + }); + }); + + test('OC - Livechat API - setGuestToken', async ({ browser }) => { + const registerGuestVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + token: faker.string.uuid(), + }; + + // Register guest and send a message + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + + await poLiveChat.page.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.registerGuest(registerGuestVisitor), + registerGuestVisitor, + ); + + await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await test.step('Expect setGuestToken to log in an existing guest and load chat history', async () => { + const { page: pageCtx } = await createAuxContext(browser, Users.user1); + + await pageCtx.goto('/packages/rocketchat_livechat/assets/demo.html'); + + await pageCtx.evaluate(() => window.RocketChat.livechat.maximizeWidget()); + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); + + await pageCtx.evaluate( + (registerGuestVisitor) => window.RocketChat.livechat.setGuestToken(registerGuestVisitor.token), + registerGuestVisitor, + ); + + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); + await expect(pageCtx.frameLocator('#rocketchat-iframe').getByText('this_a_test_message_from_visitor')).toBeVisible(); + }); + }); + }); + + test.describe('Widget Listeners', () => { + // Tests that listen to events from the widget, and check if they are being triggered + + let poAuxContext: { page: Page; poHomeOmnichannel: HomeOmnichannel }; + let poLiveChat: OmnichannelLiveChatEmbedded; + let page: Page; + let agent: Awaited>; + + test.beforeAll(async ({ api }) => { + agent = await createAgent(api, 'user1') + await expect((await api.post('/settings/Enable_CSP', { value: false })).status()).toBe(200); + await expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); + }); + + test.beforeEach(async ({ browser, api }, testInfo) => { + page = await browser.newPage(); + + poLiveChat = new OmnichannelLiveChatEmbedded(page, api); + + const { page: pageCtx } = await createAuxContext(browser, Users.user1); + poAuxContext = { page: pageCtx, poHomeOmnichannel: new HomeOmnichannel(pageCtx) }; + + // This is needed since the livechat will not react to online/offline status changes if already loaded in a page + if (testInfo.title === 'Expect onOfflineFormSubmit to trigger callback') { + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('offline'); + } else { + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('online'); + } + + await page.goto('/packages/rocketchat_livechat/assets/demo.html'); + }); + + test.afterEach(async () => { + await poAuxContext.page.close(); + await page.close(); + }); + + test.afterAll(async ({ api }) => { + await expect((await api.post('/settings/Enable_CSP', { value: true })).status()).toBe(200); + await agent.delete(); + }); + + test('OC - Livechat API - onChatMaximized & onChatMinimized', async () => { + await test.step('Expect onChatMaximized to trigger callback', async () => { + await poLiveChat.page.evaluate( + () => + new Promise((resolve: (value?: unknown) => void) => { + window.RocketChat.livechat.onChatMaximized(() => { + resolve(); + }); + + window.RocketChat.livechat.maximizeWidget(); + }), + ); + }); + + await test.step('Expect onChatMinimized to trigger callback', async () => { + await poLiveChat.page.evaluate( + () => + new Promise((resolve: (value?: unknown) => void) => { + window.RocketChat.livechat.onChatMinimized(() => { + resolve(); + }); + + window.RocketChat.livechat.minimizeWidget(); + }), + ); + }); + }); + + test('OC - Livechat API - onChatStarted & onChatEnded', async () => { + const newVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + }; + + await test.step('Expect onChatStarted to trigger callback', async () => { + const watchForTrigger = page.waitForFunction(() => window.onChatStarted === true); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onChatStarted(() => { + window.onChatStarted = true; + }), + ); + + await poLiveChat.openLiveChat(false); + await poLiveChat.sendMessage(newVisitor, false); + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await watchForTrigger; + }); + + await test.step('Expect onChatEnded to trigger callback', async () => { + const watchForTrigger = page.waitForFunction(() => window.onChatEnded === true); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onChatEnded(() => { + window.onChatEnded = true; + }), + ); + + await poAuxContext.poHomeOmnichannel.sidenav.openChat(newVisitor.name); + await poAuxContext.poHomeOmnichannel.content.btnCloseChat.click(); + await poAuxContext.poHomeOmnichannel.content.closeChatModal.inputComment.fill('this_is_a_test_comment'); + await poAuxContext.poHomeOmnichannel.content.closeChatModal.btnConfirm.click(); + await expect(poAuxContext.poHomeOmnichannel.toastSuccess).toBeVisible(); + + await watchForTrigger; + }); + }); + + test('OC - Livechat API - onPrechatFormSubmit & onAssignAgent', async () => { + const newVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + }; + + await test.step('Expect onPrechatFormSubmit to trigger callback', async () => { + const watchForTrigger = page.waitForFunction(() => window.onPrechatFormSubmit === true); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onPrechatFormSubmit(() => { + window.onPrechatFormSubmit = true; + }), + ); + + await poLiveChat.openLiveChat(false); + await poLiveChat.sendMessage(newVisitor, false); + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await watchForTrigger; + }); + + await test.step('Expect onAssignAgent to trigger callback', async () => { + const watchForTrigger = page.waitForFunction(() => window.onAssignAgent === true); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onAssignAgent(() => { + window.onAssignAgent = true; + }), + ); + + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await watchForTrigger; + }); + }); + + // TODO: Fix this Flaky test + test.skip('onAgentStatusChange', async () => { + const newVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + }; + + await poLiveChat.openLiveChat(false); + await poLiveChat.sendMessage(newVisitor, false); + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + + const watchForTrigger = page.waitForFunction(() => window.onAgentStatusChange === true); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onAgentStatusChange(() => { + window.onAgentStatusChange = true; + }), + ); + + await poAuxContext.poHomeOmnichannel.sidenav.openChat(newVisitor.name); + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('offline'); + + await watchForTrigger; + }); + + test('OC - Livechat API - onOfflineFormSubmit', async () => { + const newVisitor = { + name: faker.person.firstName(), + email: faker.internet.email(), + }; + + await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('offline'); + + const watchForTrigger = page.waitForFunction(() => window.onOfflineFormSubmit === true); + + await poLiveChat.page.reload(); + + await poLiveChat.page.evaluate(() => + window.RocketChat.livechat.onOfflineFormSubmit(() => { + window.onOfflineFormSubmit = true; + }), + ); + + await poLiveChat.openLiveChat(true); + await poLiveChat.sendMessage(newVisitor, true); + + await watchForTrigger; + }); + + test('OC - Livechat API - onWidgetHidden & onWidgetShown', async () => { + await test.step('Expect onWidgetHidden to trigger callback', async () => { + await poLiveChat.page.evaluate( + () => + new Promise((resolve: (value?: unknown) => void) => { + window.RocketChat.livechat.onWidgetHidden(() => { + resolve(); + }); + + window.RocketChat.livechat.hideWidget(); + }), + ); + }); + + await test.step('Expect onWidgetShown to trigger callback', async () => { + await poLiveChat.page.evaluate( + () => + new Promise((resolve: (value?: unknown) => void) => { + window.RocketChat.livechat.onWidgetShown(() => { + resolve(); + }); + + window.RocketChat.livechat.showWidget(); + }), + ); + }); + }); + + test.skip('OC - Livechat API - onServiceOffline', async () => { + // TODO: Not sure how to test this, need to check if playwright has a way to mock a server disconnect + await test.step('Expect onServiceOffline to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.onServiceOffline(() => console.log('onServiceOffline'))); + }); + }); + + test.skip('OC - Livechat API - onQueuePositionChange', async () => { + // TODO + await test.step('Expect onQueuePositionChange to do something', async () => { + await poLiveChat.page.evaluate(() => window.RocketChat.livechat.onQueuePositionChange(() => console.log('onQueuePositionChange'))); + }); + }); + }); + +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts new file mode 100644 index 000000000000..812a2496c740 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-widget.spec.ts @@ -0,0 +1,31 @@ +import type { Page } from '@playwright/test'; + +import { test, expect } from '../utils/test'; + +test.describe('Omnichannel - Livechat Widget Embedded', () => { + test.describe('Widget is working on Embedded View', () => { + let page: Page; + let siteName: string; + + test.beforeAll(async ({ browser, api }) => { + page = await browser.newPage(); + await expect((await api.post('/settings/Enable_CSP', { value: false })).status()).toBe(200); + const { value } = await(await api.get('/settings/Site_Name')).json(); + siteName = value; + + + await page.goto('/packages/rocketchat_livechat/assets/demo.html'); + }); + + test.afterAll(async ({ api }) => { + await expect((await api.post('/settings/Enable_CSP', { value: true })).status()).toBe(200); + await page.close(); + }); + + test('Open and Close widget', async () => { + await test.step('Expect widget to be visible while embedded in an iframe', async () => { + await expect(page.frameLocator('#rocketchat-iframe').locator(`role=button[name="${siteName}"]`)).toBeVisible(); + }); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts index 8d8bf3eed191..fe1e64536779 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts @@ -1,5 +1,4 @@ import { faker } from '@faker-js/faker'; -import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -10,78 +9,87 @@ const newUser = { name: `${faker.person.firstName()} ${faker.string.uuid()}}`, email: faker.internet.email(), }; -test.describe('Livechat', () => { - test.describe('Send message', () => { - let poAuxContext: { page: Page; poHomeOmnichannel: HomeOmnichannel }; - let poLiveChat: OmnichannelLiveChat; - let page: Page; - test.beforeAll(async ({ browser, api }) => { - const statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); +test.use({ storageState: Users.user1.state }); - page = await browser.newPage(); - poLiveChat = new OmnichannelLiveChat(page, api); +test.describe.serial('OC - Livechat', () => { + let poLiveChat: OmnichannelLiveChat; + let poHomeOmnichannel: HomeOmnichannel; - const { page: pageCtx } = await createAuxContext(browser, Users.user1); - poAuxContext = { page: pageCtx, poHomeOmnichannel: new HomeOmnichannel(pageCtx) }; + test.beforeAll(async ({ api }) => { + const statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); + await expect(statusCode).toBe(200); + }); + + test.beforeAll(async ({ browser, api }) => { + const { page: livechatPage } = await createAuxContext(browser, Users.user1, '/livechat', false); + + poLiveChat = new OmnichannelLiveChat(livechatPage, api); + }); + + test.beforeEach(async ({ page }) => { + poHomeOmnichannel = new HomeOmnichannel(page); + + await page.goto('/'); + await page.locator('.main-content').waitFor(); + }); + + test.afterAll(async ({ api }) => { + await api.delete('/livechat/users/agent/user1'); + await poLiveChat.page?.close(); + }); + + test('OC - Livechat - Send message to online agent', async () => { + await test.step('expect message to be sent by livechat', async () => { + await poLiveChat.page.reload(); + await poLiveChat.openLiveChat(); + await poLiveChat.sendMessage(newUser, false); - await page.goto('/livechat'); + await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_user'); + await poLiveChat.btnSendMessageToOnlineAgent.click(); + + await expect(poLiveChat.page.locator('div >> text="this_a_test_message_from_user"')).toBeVisible(); }); - test.afterAll(async ({ api }) => { - await api.delete('/livechat/users/agent/user1'); - await poAuxContext.page.close(); - await page.close(); + await test.step('expect message to be received by agent', async () => { + await poHomeOmnichannel.sidenav.openChat(newUser.name); + await expect(poHomeOmnichannel.content.lastUserMessage).toBeVisible(); + await expect(poHomeOmnichannel.content.lastUserMessage).toContainText('this_a_test_message_from_user'); }); + }); - test('Send message to online agent', async () => { - await test.step('Expect message to be sent by livechat', async () => { - await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + test('OC - Livechat - Send message to livechat costumer', async () => { + await poHomeOmnichannel.sidenav.openChat(newUser.name); - await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_user'); - await poLiveChat.btnSendMessageToOnlineAgent.click(); + await test.step('expect message to be sent by agent', async () => { + await poHomeOmnichannel.content.sendMessage('this_a_test_message_from_agent'); + await expect(poLiveChat.page.locator('div >> text="this_a_test_message_from_agent"')).toBeVisible(); + }); - await expect(page.locator('div >>text="this_a_test_message_from_user"')).toBeVisible(); - }); + await test.step('expect when user minimizes the livechat screen, the composer should be hidden', async () => { + await poLiveChat.openLiveChat(); + await expect(poLiveChat.page.locator('[contenteditable="true"]')).not.toBeVisible(); + }); - await test.step('expect message to be received by agent', async () => { - await poAuxContext.poHomeOmnichannel.sidenav.openChat(newUser.name); - await expect(poAuxContext.poHomeOmnichannel.content.lastUserMessage).toBeVisible(); - await expect(poAuxContext.poHomeOmnichannel.content.lastUserMessage).toContainText('this_a_test_message_from_user'); - }); + await test.step('expect message to be received by minimized livechat', async () => { + await poHomeOmnichannel.content.sendMessage('this_a_test_message_again_from_agent'); + await expect(poLiveChat.unreadMessagesBadge(1)).toBeVisible(); }); - test('Send message to livechat costumer', async () => { - await test.step('Expect message to be sent by agent', async () => { - await poAuxContext.poHomeOmnichannel.content.sendMessage('this_a_test_message_from_agent'); - await expect(page.locator('div >>text="this_a_test_message_from_agent"')).toBeVisible(); - }); - - await test.step('Expect when user minimizes the livechat screen, the composer should be hidden', async () => { - await poLiveChat.openLiveChat(); - await expect(page.locator('[contenteditable="true"]')).not.toBeVisible(); - }); - - await test.step('expect message to be received by minimized livechat', async () => { - await poAuxContext.poHomeOmnichannel.content.sendMessage('this_a_test_message_again_from_agent'); - await expect(poLiveChat.unreadMessagesBadge(1)).toBeVisible(); - }); - - await test.step('expect unread messages to be visible after a reload', async () => { - await page.reload(); - await expect(poLiveChat.unreadMessagesBadge(1)).toBeVisible(); - }); + await test.step('expect unread messages to be visible after a reload', async () => { + await poLiveChat.page.reload(); + await expect(poLiveChat.unreadMessagesBadge(1)).toBeVisible(); }); + }); + + test('OC - Livechat - Close livechat conversation', async () => { + await poHomeOmnichannel.sidenav.openChat(newUser.name); - test.describe('close livechat conversation', () => { - test('expect livechat conversation to be closed by agent', async () => { - await poAuxContext.poHomeOmnichannel.content.btnCloseChat.click(); - await poAuxContext.poHomeOmnichannel.content.omnichannelCloseChatModal.inputComment.fill('this_is_a_test_comment'); - await poAuxContext.poHomeOmnichannel.content.omnichannelCloseChatModal.btnConfirm.click(); - await expect(poAuxContext.poHomeOmnichannel.toastSuccess).toBeVisible(); - }); + await test.step('expect livechat conversation to be closed by agent', async () => { + await poHomeOmnichannel.content.btnCloseChat.click(); + await poHomeOmnichannel.content.closeChatModal.inputComment.fill('this_is_a_test_comment'); + await poHomeOmnichannel.content.closeChatModal.btnConfirm.click(); + await expect(poHomeOmnichannel.toastSuccess).toBeVisible(); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts new file mode 100644 index 000000000000..74bcaff7c919 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts @@ -0,0 +1,253 @@ +import { faker } from '@faker-js/faker'; +import { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { createDepartment } from '../utils/omnichannel/departments'; +import { createManager } from '../utils/omnichannel/managers'; +import { createConversation } from '../utils/omnichannel/rooms'; +import { test, expect } from '../utils/test'; + +const MANAGER = 'user3'; +const ROOM_A = faker.person.fullName(); +const ROOM_B = faker.person.fullName(); +const ROOM_C = faker.person.fullName(); + +test.use({ storageState: Users.user3.state }); + +test.describe('OC - Manager Role', () => { + test.skip(!IS_EE, 'Enterprise Edition Only'); + + let departments: Awaited>[]; + let conversations: Awaited>[]; + let agents: Awaited>[]; + let poOmnichannel: HomeOmnichannel; + + let manager: Awaited>; + + // Allow manual on hold + test.beforeAll(async ({ api }) => { + const responses = await Promise.all([ + api.post('/settings/Livechat_allow_manual_on_hold', { value: true }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: false }), + ]); + responses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create agents + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2'), createAgent(api, MANAGER)]); + + const agentsStatuses = await Promise.all(agents.slice(0, 2).map(({ data: agent }) => makeAgentAvailable(api, agent._id))); + + agentsStatuses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create departments + test.beforeAll(async ({ api }) => { + departments = await Promise.all([createDepartment(api), createDepartment(api)]); + }); + + // Create manager + test.beforeAll(async ({ api }) => { + manager = await createManager(api, MANAGER); + }); + + // Create conversations + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + conversations = await Promise.all([ + createConversation(api, { + visitorName: ROOM_A, + visitorToken: 'roomA', + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + visitorName: ROOM_B, + visitorToken: 'roomB', + agentId: `user2`, + departmentId: departmentB._id, + }), + createConversation(api, { + visitorName: ROOM_C, + visitorToken: 'roomC', + agentId: `user2`, + }), + ]); + }); + + // Delete all created data + test.afterAll(async ({ api }) => { + await Promise.all([ + ...agents.map((agent) => agent.delete()), + ...departments.map((department) => department.delete()), + ...conversations.map((conversation) => conversation.delete()), + manager.delete(), + // Reset setting + api.post('/settings/Livechat_allow_manual_on_hold', { value: false }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: true }), + ]); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannel = new HomeOmnichannel(page); + + await page.goto('/omnichannel'); + }); + + test('OC - Manager Role - Basic permissions', async () => { + await test.step('expect agent to not have access to omnichannel administration', async () => { + await expect(poOmnichannel.omnisidenav.linkCurrentChats).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkAnalytics).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkRealTimeMonitoring).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkAgents).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkDepartments).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkBusinessHours).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkReports).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkCannedResponses).toBeVisible(); + }); + }); + + test('OC - Manager Role - Current Chats', async ({ page }) => { + const [conversationA] = conversations; + const { room: roomA } = conversationA.data; + + await test.step('expect to be able to view all chats', async () => { + await expect(poOmnichannel.currentChats.findRowByName(ROOM_A)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_B)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_C)).toBeVisible(); + }); + + await test.step('expect to be able to join chats', async () => { + await poOmnichannel.currentChats.findRowByName(ROOM_A).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomA._id}`); + await expect(poOmnichannel.content.btnJoinRoom).toBeVisible(); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + + await poOmnichannel.content.btnJoinRoom.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel'); + await expect(poOmnichannel.content.btnJoinRoom).not.toBeVisible(); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + }); + + await test.step('expect to be able to put a conversation from another agent on hold', async () => { + await poOmnichannel.content.btnOnHold.click({ clickCount: 2 }); + await expect(poOmnichannel.content.modalOnHold).toBeVisible(); + await poOmnichannel.content.btnOnHoldConfirm.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText( + `Chat On Hold: The chat was manually placed On Hold by ${MANAGER}`, + ); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + await expect(poOmnichannel.content.btnResume).toBeVisible(); + }); + + await test.step('expect to be able resume a conversation from another agent on hold', async () => { + await poOmnichannel.content.btnResume.click(); + await expect(poOmnichannel.content.btnResume).not.toBeVisible(); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + await expect(poOmnichannel.content.btnOnHold).toBeVisible(); + }); + + await test.step('expect to be able to close a conversation from another agent', async () => { + await poOmnichannel.content.btnCloseChat.click(); + await poOmnichannel.content.inputModalClosingComment.type('any_comment'); + await poOmnichannel.content.btnModalConfirm.click(); + await expect(poOmnichannel.toastSuccess).toBeVisible(); + await page.waitForURL('/omnichannel/current'); + }); + + await test.step('expect to be able to remove closed rooms', async () => { + await poOmnichannel.currentChats.btnRemoveByName(ROOM_A).click(); + await expect(poOmnichannel.currentChats.modalConfirmRemove).toBeVisible(); + await poOmnichannel.currentChats.btnConfirmRemove.click(); + await expect(poOmnichannel.currentChats.modalConfirmRemove).not.toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_A)).not.toBeVisible(); + }); + }); + + test('OC - Manager Role - Add/remove agents', async ({ page }) => { + await poOmnichannel.agents.sidenav.linkAgents.click(); + + await test.step('expect add "user1" as agent', async () => { + await poOmnichannel.agents.inputUsername.type('user1'); + await page.locator('role=option[name="user1"]').click(); + await poOmnichannel.agents.btnAdd.click(); + + await poOmnichannel.agents.inputSearch.fill('user1'); + await expect(poOmnichannel.agents.findRowByName('user1')).toBeVisible(); + }); + + await test.step('expect remove "user1" as agent', async () => { + await poOmnichannel.agents.inputSearch.fill('user1'); + await poOmnichannel.agents.btnDeletefirstRowInTable.click(); + await poOmnichannel.agents.btnModalRemove.click(); + + await poOmnichannel.agents.inputSearch.fill(''); + await poOmnichannel.agents.inputSearch.type('user1'); + await expect(poOmnichannel.agents.findRowByName('user1')).toBeHidden(); + }); + }); + + test('OC - Manager Role - Add/remove managers', async ({ page }) => { + await poOmnichannel.omnisidenav.linkManagers.click(); + + await test.step('expect add "user1" as manager', async () => { + await poOmnichannel.managers.inputUsername.type('user1'); + await page.locator('role=option[name="user1"]').click(); + await poOmnichannel.managers.btnAdd.click(); + + await expect(poOmnichannel.managers.firstRowInTable('user1')).toBeVisible(); + }); + + await test.step('expect search for manager', async () => { + await poOmnichannel.managers.search('user1'); + await expect(poOmnichannel.managers.firstRowInTable('user1')).toBeVisible(); + + await poOmnichannel.managers.search('NonExistingUser'); + await expect(poOmnichannel.managers.firstRowInTable('user1')).toBeHidden(); + + await poOmnichannel.managers.clearSearch(); + }); + + await test.step('expect remove "user1" as manager', async () => { + await poOmnichannel.managers.search('user1'); + await poOmnichannel.managers.btnDeleteSelectedAgent('user1').click(); + await poOmnichannel.managers.btnModalRemove.click(); + + await expect(poOmnichannel.managers.firstRowInTable('user1')).toBeHidden(); + }); + }); + + test('OC - Manager Role - Add/remove monitors', async () => { + await poOmnichannel.omnisidenav.linkMonitors.click(); + + await test.step('expect to add agent as monitor', async () => { + await expect(poOmnichannel.monitors.findRowByName('user1')).not.toBeVisible(); + await poOmnichannel.monitors.selectMonitor('user1'); + await poOmnichannel.monitors.btnAddMonitor.click(); + await expect(poOmnichannel.monitors.findRowByName('user1')).toBeVisible(); + }); + + await test.step('expect to remove agent from monitor', async () => { + await poOmnichannel.monitors.btnRemoveByName('user1').click(); + await expect(poOmnichannel.monitors.modalConfirmRemove).toBeVisible(); + await poOmnichannel.monitors.btnConfirmRemove.click(); + await expect(poOmnichannel.monitors.findRowByName('user1')).not.toBeVisible(); + }); + }); + + test('OC - Manager Role - Permission revoked', async ({ page }) => { + await poOmnichannel.omnisidenav.linkCurrentChats.click(); + + await test.step('expect not to be able to see current chats once role is removed', async () => { + const res = await manager.delete(); + await expect(res.status()).toBe(200); + await page.reload(); + await expect(page.locator('p >> text="You are not authorized to view this page."')).toBeVisible(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts index 85c0f518d362..c7b1ff4a86c0 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager.spec.ts @@ -14,7 +14,14 @@ test.describe.serial('omnichannel-manager', () => { await poOmnichannelManagers.sidenav.linkManagers.click(); }); - test('Managers', async ({ page }) => { + test('OC - Manage Managers - Add, Search and Remove', async ({ page }) => { + await test.step('expect "user1" be first ', async () => { + await poOmnichannelManagers.inputUsername.type('user'); + await expect(page.locator('role=option[name="user1"]')).toContainText('user1'); + + await poOmnichannelManagers.inputUsername.type(''); + }); + await test.step('expect add "user1" as manager', async () => { await poOmnichannelManagers.inputUsername.type('user1'); await page.locator('role=option[name="user1"]').click(); @@ -22,7 +29,19 @@ test.describe.serial('omnichannel-manager', () => { await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); }); + + await test.step('expect search for manager', async () => { + await poOmnichannelManagers.search('user1'); + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeVisible(); + + await poOmnichannelManagers.search('NonExistingUser'); + await expect(poOmnichannelManagers.firstRowInTable('user1')).toBeHidden(); + + await poOmnichannelManagers.clearSearch(); + }); + await test.step('expect remove "user1" as manager', async () => { + await poOmnichannelManagers.search('user1'); await poOmnichannelManagers.btnDeleteSelectedAgent('user1').click(); await poOmnichannelManagers.btnModalRemove.click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts new file mode 100644 index 000000000000..12443722160a --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts @@ -0,0 +1,99 @@ +import { Page } from '@playwright/test'; + +import { createAuxContext } from '../fixtures/createAuxContext'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { createConversation } from '../utils/omnichannel/rooms'; +import { test, expect } from '../utils/test'; + +test.use({ storageState: Users.user3.state }); + +test.describe('OC - Manual Selection', () => { + let poOmnichannel: HomeOmnichannel; + let agents: Awaited>[]; + let agentB: { page: Page; poHomeOmnichannel: HomeOmnichannel }; + + // Change routing method to manual selection + test.beforeAll(async ({ api }) => { + const res = await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }); + expect(res.status()).toBe(200); + }); + + // Create agent and make it available + test.beforeAll(async ({ api }) => { + agents = await Promise.all([await createAgent(api, 'user3'), await createAgent(api, 'user1')]); + (await Promise.all(agents.map(({ data: agent }) => makeAgentAvailable(api, agent._id)))).forEach((res) => { + expect(res.status()).toBe(200); + }); + }); + + // Create page object and redirect to home + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannel = new HomeOmnichannel(page); + await page.goto('/home'); + }); + + // Create agent b session + test.beforeEach(async ({ browser }) => { + agentB = await createAuxContext(browser, Users.user1).then(({ page }) => ({ page, poHomeOmnichannel: new HomeOmnichannel(page) })); + }); + + // Delete all data + test.afterAll(async ({ api }) => { + await Promise.all([ + agentB.page.close(), + ...agents.map(agent => agent.delete()), + api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), + ]); + }); + + test('OC - Manual Selection - Queue', async ({ page, api }) => { + const { data: { room } } = await createConversation(api); + + await test.step('expect not be able to see queue when livechat is disabled', async () => { + await poOmnichannel.sidenav.switchOmnichannelStatus('offline'); + await agentB.poHomeOmnichannel.sidenav.switchOmnichannelStatus('offline'); + await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).not.toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(room.fname)).not.toBeVisible(); + await poOmnichannel.sidenav.switchOmnichannelStatus('online'); + await agentB.poHomeOmnichannel.sidenav.switchOmnichannelStatus('online'); + await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + }); + + await test.step('expect to be able join chat in read mode', async () => { + await poOmnichannel.sidenav.getSidebarItemByName(room.fname).click(); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + await expect(poOmnichannel.content.btnTakeChat).toBeVisible(); + }); + + await test.step('expect to be able take chat', async () => { + await poOmnichannel.content.btnTakeChat.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel'); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + await expect(poOmnichannel.content.btnTakeChat).not.toBeVisible(); + await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + }); + + await test.step('expect chat to leave the queue', async () => { + await page.waitForTimeout(250); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(room.fname)).not.toBeVisible(); + }); + + await test.step('expect to be able return to queue', async () => { + await poOmnichannel.content.btnReturnToQueue.click(); + await poOmnichannel.content.btnReturnToQueueConfirm.click(); + await expect(page).toHaveURL('/home'); + }); + + await test.step('expect chat to be back in queue', async () => { + await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + await expect(agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + + await poOmnichannel.sidenav.getSidebarItemByName(room.fname).click(); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + await expect(poOmnichannel.content.btnTakeChat).toBeVisible(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts new file mode 100644 index 000000000000..3d4469a76b08 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts @@ -0,0 +1,275 @@ +import { faker } from '@faker-js/faker'; +import { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { createDepartment } from '../utils/omnichannel/departments'; +import { createMonitor } from '../utils/omnichannel/monitors'; +import { createConversation } from '../utils/omnichannel/rooms'; +import { createOrUpdateUnit, fetchUnitMonitors } from '../utils/omnichannel/units'; +import { test, expect } from '../utils/test'; + +const MONITOR = 'user3'; +const MONITOR_ADMIN = 'rocketchat.internal.admin.test'; +const ROOM_A = faker.person.fullName(); +const ROOM_B = faker.person.fullName(); +const ROOM_C = faker.person.fullName(); +const ROOM_D = faker.person.fullName(); + +test.use({ storageState: Users.user3.state }); + +test.describe('OC - Monitor Role', () => { + test.skip(!IS_EE, 'Enterprise Edition Only'); + + let departments: Awaited>[]; + let conversations: Awaited>[]; + let agents: Awaited>[]; + let monitors: Awaited>[]; + let units: Awaited>[]; + let poOmnichannel: HomeOmnichannel; + + // Reset user3 roles + test.beforeAll(async ({ api }) => { + const res = await api.post('/users.update', { + data: { roles: ['user'] }, + userId: 'user3', + }); + await expect(res.status()).toBe(200); + }); + + // Allow manual on hold + test.beforeAll(async ({ api }) => { + const responses = await Promise.all([ + api.post('/settings/Livechat_allow_manual_on_hold', { value: true }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: false }), + ]); + responses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create agents + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2')]); + + const agentsStatuses = await Promise.all(agents.map(({ data: agent }) => makeAgentAvailable(api, agent._id))); + + agentsStatuses.forEach((res) => expect(res.status()).toBe(200)); + }); + + // Create departments + test.beforeAll(async ({ api }) => { + departments = await Promise.all([createDepartment(api), createDepartment(api), createDepartment(api)]); + }); + + // Create conversations + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB] = departments.map(({ data }) => data); + + conversations = await Promise.all([ + createConversation(api, { + visitorName: ROOM_A, + agentId: `user1`, + departmentId: departmentA._id, + }), + createConversation(api, { + visitorName: ROOM_B, + agentId: `user2`, + departmentId: departmentA._id, + }), + createConversation(api, { + visitorName: ROOM_C, + agentId: `user2`, + departmentId: departmentB._id, + }), + createConversation(api, { + visitorName: ROOM_D, + }), + ]); + }); + + // Create monitors + test.beforeAll(async ({ api }) => { + monitors = await Promise.all([createMonitor(api, MONITOR), createMonitor(api, MONITOR_ADMIN)]); + }); + + // Create units + test.beforeAll(async ({ api }) => { + const [departmentA, departmentB, departmentC] = departments.map(({ data }) => data); + + units = await Promise.all([ + createOrUpdateUnit(api, { + monitors: [{ monitorId: MONITOR, username: MONITOR }], + departments: [{ departmentId: departmentA._id }, { departmentId: departmentB._id }], + }), + createOrUpdateUnit(api, { + monitors: [{ monitorId: MONITOR_ADMIN, username: MONITOR_ADMIN }], + departments: [{ departmentId: departmentC._id }], + }), + ]); + }); + + // Delete all created data + test.afterAll(async ({ api }) => { + await Promise.all([ + ...agents.map((agent) => agent.delete()), + ...departments.map((department) => department.delete()), + ...conversations.map((conversation) => conversation.delete()), + ...units.map((unit) => unit.delete()), + ...monitors.map((monitor) => monitor.delete()), + // Reset setting + api.post('/settings/Livechat_allow_manual_on_hold', { value: false }), + api.post('/settings/Livechat_allow_manual_on_hold_upon_agent_engagement_only', { value: true }), + ]); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannel = new HomeOmnichannel(page); + + await page.goto('/omnichannel'); + }); + + test('OC - Monitor Role - Basic permissions', async () => { + await test.step('expect agent to not have access to omnichannel administration', async () => { + await expect(poOmnichannel.omnisidenav.linkCurrentChats).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkAnalytics).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkRealTimeMonitoring).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkAgents).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkDepartments).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkBusinessHours).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkReports).toBeVisible(); + await expect(poOmnichannel.omnisidenav.linkCannedResponses).toBeVisible(); + }); + + // await test.step('expect to be able to see contact center', async () => {}); + + // await test.step('expect to be able to see queue', async () => {}); + + // await test.step('expect to be able to edit custom fields', async () => {}); + }); + + test('OC - Monitor Role - Canned responses', async () => { + // TODO: move to unit test + await test.step('expect not to be able to create public canned responses (administration)', async () => { + await poOmnichannel.omnisidenav.linkCannedResponses.click(); + await poOmnichannel.cannedResponses.btnNew.click(); + await expect(poOmnichannel.cannedResponses.radioPublic).toBeDisabled(); + }); + }); + + test('OC - Monitor Role - Current Chats', async ({ page }) => { + const [conversationA] = conversations; + const { room: roomA } = conversationA.data; + + await test.step('expect to be able to view only chats from same unit', async () => { + await expect(poOmnichannel.currentChats.findRowByName(ROOM_A)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_B)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_C)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_D)).not.toBeVisible(); + }); + + await test.step('expect to be able to join chats from same unit', async () => { + await poOmnichannel.currentChats.findRowByName(ROOM_A).click(); + await expect(page).toHaveURL(`/omnichannel/current/${roomA._id}`); + await expect(poOmnichannel.content.btnJoinRoom).toBeVisible(); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + + await poOmnichannel.content.btnJoinRoom.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel'); + await expect(poOmnichannel.content.btnJoinRoom).not.toBeVisible(); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + }); + + await test.step('expect to be able to put a conversation from another agent on hold', async () => { + await poOmnichannel.content.btnOnHold.click({ clickCount: 2 }); + await expect(poOmnichannel.content.modalOnHold).toBeVisible(); + await poOmnichannel.content.btnOnHoldConfirm.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText( + `Chat On Hold: The chat was manually placed On Hold by ${MONITOR}`, + ); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + await expect(poOmnichannel.content.btnResume).toBeVisible(); + }); + + await test.step('expect to be able resume a conversation from another agent on hold', async () => { + await poOmnichannel.content.btnResume.click(); + await expect(poOmnichannel.content.btnResume).not.toBeVisible(); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + await expect(poOmnichannel.content.btnOnHold).toBeVisible(); + }); + + // await test.step('expect to be able to edit room information from another agent', async () => {); + + await test.step('expect to be able to close a conversation from another agent', async () => { + await poOmnichannel.content.btnCloseChat.click(); + await poOmnichannel.content.inputModalClosingComment.type('any_comment'); + await poOmnichannel.content.btnModalConfirm.click(); + await expect(poOmnichannel.toastSuccess).toBeVisible(); + await page.waitForURL('/omnichannel/current'); + }); + + await test.step('expect not to be able to remove closed room', async () => { + await expect(poOmnichannel.currentChats.findRowByName(ROOM_A)).toBeVisible(); + await expect(poOmnichannel.currentChats.btnRemoveByName(ROOM_A)).not.toBeVisible(); + }); + }); + + test('OC - Monitor Role - Permission revoked', async ({ page, api }) => { + const [unitA, unitB] = units; + const [monitor] = monitors; + + await poOmnichannel.omnisidenav.linkCurrentChats.click(); + + await test.step('expect not to be able to see chats from removed department', async () => { + await test.step('expect rooms from both departments to be visible', async () => { + await expect(poOmnichannel.currentChats.findRowByName(ROOM_B)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_C)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_D)).not.toBeVisible(); + }); + + await test.step('expect to remove departmentB from unit', async () => { + const [departmentA] = departments.map(({ data }) => data); + + await createOrUpdateUnit(api, { + id: unitA.data._id, + monitors: [{ monitorId: MONITOR, username: MONITOR }], + departments: [{ departmentId: departmentA._id }], + }); + + await page.reload(); + }); + + await test.step('expect to have only room B visible', async () => { + await expect(poOmnichannel.currentChats.findRowByName(ROOM_B)).toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_C)).not.toBeVisible(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_D)).not.toBeVisible(); + }); + }); + + await test.step('expect not to be able to see conversations once unit is removed', async () => { + const res = await unitA.delete(); + await expect(res.status()).toBe(200); + await page.reload(); + await expect(page.locator('text="No chats yet"')).toBeVisible(); + }); + + await test.step('expect to be able to see all conversations once all units are removed', async () => { + const res = await unitB.delete(); + await expect(res.status()).toBe(200); + await page.reload(); + await expect(poOmnichannel.currentChats.findRowByName(ROOM_D)).toBeVisible(); + }); + + await test.step('expect not to be able to see current chats once role is removed', async () => { + const res = await monitor.delete(); + await expect(res.status()).toBe(200); + await page.reload(); + await expect(page.locator('p >> text="You are not authorized to view this page."')).toBeVisible(); + }); + + await test.step('expect monitor to be automaticaly removed from unit once monitor is removed', async () => { + const { data: monitors } = await fetchUnitMonitors(api, unitA.data._id); + await expect(monitors).toHaveLength(0); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-monitors.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitors.spec.ts new file mode 100644 index 000000000000..c3e2ef16b2c2 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitors.spec.ts @@ -0,0 +1,96 @@ +import { IS_EE } from '../config/constants'; +import { Users } from '../fixtures/userStates'; +import { OmnichannelMonitors } from '../page-objects'; +import { test, expect } from '../utils/test'; + +test.use({ storageState: Users.user1.state }); + +test.skip(!IS_EE, 'OC - Manage Monitors > Enterprise Only'); + +test.describe.serial('OC - Manage Monitors', () => { + let poMonitors: OmnichannelMonitors; + + test.beforeAll(async ({ api }) => { + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }), + api.post('/livechat/users/agent', { username: 'user2' }), + api.post('/livechat/users/manager', { username: 'user1' }), + ]); + }); + + test.afterAll(async ({ api }) => { + await Promise.all([ + api.delete('/livechat/users/agent/user1'), + api.delete('/livechat/users/manager/user1'), + api.delete('/livechat/users/agent/user2'), + api.delete('/livechat/users/manager/user2'), + ]); + }); + + test.beforeEach(async ({ page }) => { + poMonitors = new OmnichannelMonitors(page); + + await page.goto('/omnichannel'); + await page.locator('.main-content').waitFor(); + await poMonitors.sidenav.linkMonitors.click(); + }); + + test('OC - Manager Monitors - Add monitor', async () => { + await test.step('expect to add agent as monitor', async () => { + await expect(poMonitors.findRowByName('user1')).not.toBeVisible(); + await poMonitors.selectMonitor('user1'); + await poMonitors.btnAddMonitor.click(); + await expect(poMonitors.findRowByName('user1')).toBeVisible(); + }); + + await test.step('expect to remove agent from monitor', async () => { + await poMonitors.btnRemoveByName('user1').click(); + await expect(poMonitors.modalConfirmRemove).toBeVisible(); + await poMonitors.btnConfirmRemove.click(); + await expect(poMonitors.findRowByName('user1')).not.toBeVisible(); + }); + }); + + test('OC - Manager Monitors - Search', async () => { + await test.step('expect to add 2 monitors', async () => { + await poMonitors.selectMonitor('user1'); + await poMonitors.btnAddMonitor.click(); + + await poMonitors.selectMonitor('user2'); + await poMonitors.btnAddMonitor.click(); + + await expect(poMonitors.findRowByName('user1')).toBeVisible(); + await expect(poMonitors.findRowByName('user2')).toBeVisible(); + }); + + await test.step('expect to search monitor', async () => { + await expect(poMonitors.findRowByName('user1')).toBeVisible(); + await expect(poMonitors.findRowByName('user2')).toBeVisible(); + + await poMonitors.inputSearch.fill('user1'); + await expect(poMonitors.findRowByName('user1')).toBeVisible(); + await expect(poMonitors.findRowByName('user2')).not.toBeVisible(); + + await poMonitors.inputSearch.fill('user2'); + await expect(poMonitors.findRowByName('user1')).not.toBeVisible(); + await expect(poMonitors.findRowByName('user2')).toBeVisible(); + + await poMonitors.inputSearch.fill(''); + await expect(poMonitors.findRowByName('user1')).toBeVisible(); + await expect(poMonitors.findRowByName('user2')).toBeVisible(); + }); + + await test.step('expect to remove monitors', async () => { + await poMonitors.btnRemoveByName('user1').click(); + await expect(poMonitors.modalConfirmRemove).toBeVisible(); + await poMonitors.btnConfirmRemove.click(); + + await poMonitors.btnRemoveByName('user2').click(); + await expect(poMonitors.modalConfirmRemove).toBeVisible(); + await poMonitors.btnConfirmRemove.click(); + + await expect(poMonitors.findRowByName('user1')).not.toBeVisible(); + await expect(poMonitors.findRowByName('user2')).not.toBeVisible(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts index 559d24889633..f9550ebbac0e 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts @@ -1,10 +1,10 @@ import { faker } from '@faker-js/faker'; import { IS_EE } from '../config/constants'; -import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; -import { HomeChannel, OmnichannelLiveChat } from '../page-objects'; +import { HomeOmnichannel } from '../page-objects'; import { OmnichannelRoomInfo } from '../page-objects/omnichannel-room-info'; +import { createConversation } from '../utils/omnichannel/rooms'; import { test, expect } from '../utils/test'; const NEW_USER = { @@ -19,8 +19,8 @@ test.skip(!IS_EE, 'Omnichannel Priorities > Enterprise Only'); test.use({ storageState: Users.user1.state }); -test.describe.serial('Omnichannel Priorities [Sidebar]', () => { - let poHomeChannel: HomeChannel; +test.describe.serial('OC - Priorities [Sidebar]', () => { + let poHomeChannel: HomeOmnichannel; let poRoomInfo: OmnichannelRoomInfo; test.beforeAll(async ({ api }) => { @@ -33,14 +33,18 @@ test.describe.serial('Omnichannel Priorities [Sidebar]', () => { ).every((res) => expect(res.status()).toBe(200)); }); + test.beforeEach(async ({ page }) => { + poHomeChannel = new HomeOmnichannel(page); + poRoomInfo = new OmnichannelRoomInfo(page); + }); + test.beforeEach(async ({ page }) => { await page.goto('/'); await page.locator('.main-content').waitFor(); }); - test.beforeEach(async ({ page }) => { - poHomeChannel = new HomeChannel(page); - poRoomInfo = new OmnichannelRoomInfo(page); + test.beforeEach(async ({ api }) => { + await createConversation(api, { visitorName: NEW_USER.name }); }); test.afterAll(async ({ api }) => { @@ -53,22 +57,11 @@ test.describe.serial('Omnichannel Priorities [Sidebar]', () => { ).every((res) => expect(res.status()).toBe(200)); }); - test('Priority updates with sidebar', async ({ browser, api }) => { + test('OC - Priorities [Sidebar] - Update conversation priority', async ({ page }) => { const systemMessage = poHomeChannel.content.lastSystemMessageBody; + await page.emulateMedia({ reducedMotion: 'reduce' }); - await test.step('Initiate conversation', async () => { - const poLivechat = await createAuxContext(browser, Users.user1, '/livechat', false).then( - ({ page }) => new OmnichannelLiveChat(page, api), - ); - await poLivechat.openLiveChat(); - await poLivechat.sendMessage(NEW_USER, false); - await poLivechat.onlineAgentMessage.type('this_a_test_message_from_visitor'); - await poLivechat.btnSendMessageToOnlineAgent.click(); - await poHomeChannel.sidenav.getSidebarItemByName(NEW_USER.name).click(); - await poLivechat.page.close(); - }); - - await test.step('Queue: Sidebar priority change', async () => { + await test.step('expect to change inquiry priority using sidebar menu', async () => { await poHomeChannel.sidenav.getSidebarItemByName(NEW_USER.name).click(); await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); @@ -88,9 +81,10 @@ test.describe.serial('Omnichannel Priorities [Sidebar]', () => { await expect(poRoomInfo.getInfo('Unprioritized')).not.toBeVisible(); }); - await test.step('Subscription: Sidebar priority change', async () => { - await poHomeChannel.content.takeOmnichannelChatButton.click(); + await test.step('expect to change subscription priority using sidebar menu', async () => { + await poHomeChannel.content.btnTakeChat.click(); await systemMessage.locator('text="joined the channel"').waitFor(); + await page.waitForTimeout(500); await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts index 4738158ca23c..90087d968bec 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts @@ -3,14 +3,14 @@ import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; -import { OmnichannelLiveChat, HomeChannel } from '../page-objects'; +import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; import { test, expect } from '../utils/test'; test.describe('omnichannel-takeChat', () => { let poLiveChat: OmnichannelLiveChat; let newVisitor: { email: string; name: string }; - let agent: { page: Page; poHomeChannel: HomeChannel }; + let agent: { page: Page; poHomeChannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { await Promise.all([ @@ -20,7 +20,7 @@ test.describe('omnichannel-takeChat', () => { ]); const { page } = await createAuxContext(browser, Users.user1); - agent = { page, poHomeChannel: new HomeChannel(page) }; + agent = { page, poHomeChannel: new HomeOmnichannel(page) }; }); test.afterAll(async ({ api }) => { @@ -52,11 +52,11 @@ test.describe('omnichannel-takeChat', () => { test('expect "user1" to be able to take the chat from the queue', async () => { await agent.poHomeChannel.sidenav.openQueuedOmnichannelChat(newVisitor.name); - await expect(agent.poHomeChannel.content.takeOmnichannelChatButton).toBeVisible(); - await agent.poHomeChannel.content.takeOmnichannelChatButton.click(); + await expect(agent.poHomeChannel.content.btnTakeChat).toBeVisible(); + await agent.poHomeChannel.content.btnTakeChat.click(); await agent.poHomeChannel.sidenav.openChat(newVisitor.name); - await expect(agent.poHomeChannel.content.takeOmnichannelChatButton).not.toBeVisible(); + await expect(agent.poHomeChannel.content.btnTakeChat).not.toBeVisible(); await expect(agent.poHomeChannel.content.inputMessage).toBeVisible(); }); @@ -65,8 +65,8 @@ test.describe('omnichannel-takeChat', () => { await agent.poHomeChannel.sidenav.switchStatus('offline'); await agent.poHomeChannel.sidenav.openQueuedOmnichannelChat(newVisitor.name); - await expect(agent.poHomeChannel.content.takeOmnichannelChatButton).toBeVisible(); - await agent.poHomeChannel.content.takeOmnichannelChatButton.click(); + await expect(agent.poHomeChannel.content.btnTakeChat).toBeVisible(); + await agent.poHomeChannel.content.btnTakeChat.click(); // expect to see error message await expect(agent.page.locator('text=Agent status is offline or Omnichannel service is not active')).toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts index dc31f54be934..272cde5c2c49 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts @@ -1,92 +1,98 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; -import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent } from '../utils/omnichannel/agents'; +import { createManager } from '../utils/omnichannel/managers'; +import { createConversation } from '../utils/omnichannel/rooms'; import { test, expect } from '../utils/test'; -test.describe('omnichannel-transfer-to-another-agent', () => { - let poLiveChat: OmnichannelLiveChat; - let newVisitor: { email: string; name: string }; +test.describe('OC - Chat transfers [Agent role]', () => { + let sessions: { page: Page; poHomeOmnichannel: HomeOmnichannel }[]; + let agents: Awaited>[]; + let managers: Awaited>[]; + let conversations: Awaited>[]; - let agent1: { page: Page; poHomeOmnichannel: HomeOmnichannel }; - let agent2: { page: Page; poHomeOmnichannel: HomeOmnichannel }; - test.beforeAll(async ({ api, browser }) => { - await Promise.all([ - api.post('/livechat/users/agent', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), - api.post('/livechat/users/agent', { username: 'user2' }).then((res) => expect(res.status()).toBe(200)), - api.post('/livechat/users/manager', { username: 'user1' }).then((res) => expect(res.status()).toBe(200)), - api.post('/settings/Livechat_enabled_when_agent_idle', { value: false }).then((res) => expect(res.status()).toBe(200)), - ]); + // Create agents and managers + test.beforeAll(async ({ api }) => { + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2')]); + + managers = await Promise.all([createManager(api, 'user1')]); + }); - const { page } = await createAuxContext(browser, Users.user1); - agent1 = { page, poHomeOmnichannel: new HomeOmnichannel(page) }; + // Livechat when agent idle + test.beforeAll(async ({ api }) => { + await api.post('/settings/Livechat_enabled_when_agent_idle', { value: false }).then((res) => expect(res.status()).toBe(200)); + }); - const { page: page2 } = await createAuxContext(browser, Users.user2); - agent2 = { page: page2, poHomeOmnichannel: new HomeOmnichannel(page2) }; + // Create agent sessions + test.beforeAll(async ({ browser }) => { + sessions = await Promise.all([ + createAuxContext(browser, Users.user1).then(({ page }) => ({ page, poHomeOmnichannel: new HomeOmnichannel(page) })), + createAuxContext(browser, Users.user2).then(({ page }) => ({ page, poHomeOmnichannel: new HomeOmnichannel(page) })), + ]); }); + // Delete all data test.afterAll(async ({ api }) => { await Promise.all([ - api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), - api.delete('/livechat/users/manager/user1').then((res) => expect(res.status()).toBe(200)), - api.delete('/livechat/users/agent/user2').then((res) => expect(res.status()).toBe(200)), + ...conversations.map((conversation) => conversation.delete()), + ...agents.map((agent) => agent.delete()), + ...managers.map((manager) => manager.delete()), api.post('/settings/Livechat_enabled_when_agent_idle', { value: true }).then((res) => expect(res.status()).toBe(200)), ]); + }); + + // Make "user-1" online & "user-2" offline so that chat can be automatically routed to "user-1" + test.beforeEach(async () => { + const [agentA, agentB] = sessions; + await agentA.poHomeOmnichannel.sidenav.switchStatus('online'); + await agentB.poHomeOmnichannel.sidenav.switchStatus('offline'); + }); - await agent1.page.close(); - await agent2.page.close(); + // Close sessions + test.afterEach(async () => { + await Promise.all(sessions.map(({ page }) => page.close())); }); - test.beforeEach(async ({ page, api }) => { - // make "user-1" online & "user-2" offline so that chat can be automatically routed to "user-1" - await agent1.poHomeOmnichannel.sidenav.switchStatus('online'); - await agent2.poHomeOmnichannel.sidenav.switchStatus('offline'); - - // start a new chat for each test - newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; - poLiveChat = new OmnichannelLiveChat(page, api); - await page.goto('/livechat'); - await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newVisitor, false); - await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); - await poLiveChat.btnSendMessageToOnlineAgent.click(); + + // Start a new chat for each test + test.beforeEach(async ({ api }) => { + conversations = [await createConversation(api)]; }); - test('transfer omnichannel chat to another agent', async () => { - await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent1.poHomeOmnichannel.sidenav.getSidebarItemByName(newVisitor.name).click(); + test('OC - Chat transfers [Agent role] - Transfer omnichannel chat to another agent', async () => { + const [agentA, agentB] = sessions; + const [{ visitor }] = conversations.map(({ data }) => data); + + await test.step('expect to have 1 omnichannel assigned to agent 1', async () => { + await agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(visitor.name).click(); }); - await test.step('Expect to not be able to transfer chat to "user-2" when that user is offline', async () => { - await agent2.poHomeOmnichannel.sidenav.switchStatus('offline'); + await test.step('expect to not be able to transfer chat to "user-2" when that user is offline', async () => { + await agentB.poHomeOmnichannel.sidenav.switchStatus('offline'); - await agent1.poHomeOmnichannel.content.btnForwardChat.click(); - await agent1.poHomeOmnichannel.content.inputModalAgentUserName.click(); - await agent1.poHomeOmnichannel.content.inputModalAgentUserName.type('user2'); - await expect(agent1.page.locator('text=Empty')).toBeVisible(); + await agentA.poHomeOmnichannel.content.btnForwardChat.click(); + await agentA.poHomeOmnichannel.content.forwardChatModal.inputFowardUser.click(); + await agentA.poHomeOmnichannel.content.forwardChatModal.inputFowardUser.type('user2'); + await expect(agentA.page.locator('text=Empty')).toBeVisible(); - await agent1.page.goto('/'); + await agentA.page.goto('/'); }); - await test.step('Expect to be able to transfer an omnichannel to conversation to agent 2 as agent 1 when agent 2 is online', async () => { - await agent2.poHomeOmnichannel.sidenav.switchStatus('online'); - - await agent1.poHomeOmnichannel.sidenav.getSidebarItemByName(newVisitor.name).click(); - await agent1.poHomeOmnichannel.content.btnForwardChat.click(); - await agent1.poHomeOmnichannel.content.inputModalAgentUserName.click(); - await agent1.poHomeOmnichannel.content.inputModalAgentUserName.type('user2'); - await agent1.page.locator('.rcx-option .rcx-option__wrapper >> text="user2 (@user2)"').click(); - await agent1.poHomeOmnichannel.content.inputModalAgentForwardComment.type('any_comment'); - await agent1.poHomeOmnichannel.content.btnModalConfirm.click(); - await expect(agent1.poHomeOmnichannel.toastSuccess).toBeVisible(); + await test.step('expect to be able to transfer an omnichannel to conversation to agent 2 as agent 1 when agent 2 is online', async () => { + await agentB.poHomeOmnichannel.sidenav.switchStatus('online'); + + await agentA.poHomeOmnichannel.sidenav.getSidebarItemByName(visitor.name).click(); + await agentA.poHomeOmnichannel.content.btnForwardChat.click(); + await agentA.poHomeOmnichannel.content.forwardChatModal.selectUser('user2'); + await agentA.poHomeOmnichannel.content.forwardChatModal.inputComment.type('any_comment'); + await agentA.poHomeOmnichannel.content.forwardChatModal.btnForward.click(); + await expect(agentA.poHomeOmnichannel.toastSuccess).toBeVisible(); }); - await test.step('Expect to have 1 omnichannel assigned to agent 2', async () => { - await agent2.poHomeOmnichannel.sidenav.getSidebarItemByName(newVisitor.name).click(); + await test.step('expect to have 1 omnichannel assigned to agent 2', async () => { + await agentB.poHomeOmnichannel.sidenav.getSidebarItemByName(visitor.name).click(); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts index 9db221723ebe..548aeb6a2717 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts @@ -6,7 +6,7 @@ import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; import { test, expect } from '../utils/test'; -test.describe.serial('Omnichannel Triggers', () => { +test.describe.serial('omnichannel-triggers', () => { let triggersName: string; let triggerMessage: string; let poLiveChat: OmnichannelLiveChat; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts new file mode 100644 index 000000000000..4f713cb7af7e --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts @@ -0,0 +1,170 @@ +import { faker } from '@faker-js/faker'; +import type { Page } from '@playwright/test'; + +import { IS_EE } from '../config/constants'; +import { Users } from '../fixtures/userStates'; +import { OmnichannelUnits } from '../page-objects'; +import { createAgent } from '../utils/omnichannel/agents'; +import { createDepartment } from '../utils/omnichannel/departments'; +import { createMonitor } from '../utils/omnichannel/monitors'; +import { createOrUpdateUnit } from '../utils/omnichannel/units'; +import { test, expect } from '../utils/test'; + +test.use({ storageState: Users.admin.state }); + +test.describe('OC - Manage Units', () => { + test.skip(!IS_EE, 'OC - Manage Units > Enterprise Edition Only'); + + let poOmnichannelUnits: OmnichannelUnits; + + let department: Awaited>; + + let agent: Awaited>; + + let monitor: Awaited>; + + test.beforeAll(async ({ api }) => { + department = await createDepartment(api); + }); + + test.beforeAll(async ({ api }) => { + agent = await createAgent(api, 'user2'); + }); + + test.beforeAll(async ({ api }) => { + monitor = await createMonitor(api, 'user2'); + }); + + test.afterAll(async () => { + await department.delete(); + await monitor.delete(); + await agent.delete(); + }); + + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannelUnits = new OmnichannelUnits(page); + + await page.goto('/omnichannel'); + await poOmnichannelUnits.sidenav.linkUnits.click(); + }); + + test('OC - Manage Units - Create Unit', async ({ page }) => { + const unitName = faker.string.uuid(); + + await test.step('expect correct form default state', async () => { + await poOmnichannelUnits.btnCreateUnit.click(); + await expect(poOmnichannelUnits.contextualBar).toBeVisible(); + await expect(poOmnichannelUnits.btnSave).toBeDisabled(); + await expect(poOmnichannelUnits.btnCancel).toBeEnabled(); + await poOmnichannelUnits.btnCancel.click(); + await expect(poOmnichannelUnits.contextualBar).not.toBeVisible(); + }); + + await test.step('expect to create new unit', async () => { + await poOmnichannelUnits.btnCreateUnit.click(); + await poOmnichannelUnits.inputName.fill(unitName); + await poOmnichannelUnits.selectVisibility('public'); + await poOmnichannelUnits.selectDepartment(department.data); + await poOmnichannelUnits.selectMonitor('user2'); + await poOmnichannelUnits.btnSave.click(); + await expect(poOmnichannelUnits.contextualBar).not.toBeVisible(); + + await test.step('expect unit to have been created', async () => { + await poOmnichannelUnits.search(unitName); + await expect(poOmnichannelUnits.findRowByName(unitName)).toBeVisible(); + }); + }); + + await test.step('expect to delete unit', async () => { + await test.step('expect confirm delete unit', async () => { + await test.step('expect to be able to cancel delete', async () => { + await poOmnichannelUnits.btnDeleteByName(unitName).click(); + await expect(poOmnichannelUnits.confirmDeleteModal).toBeVisible(); + await poOmnichannelUnits.btnCancelDeleteModal.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).not.toBeVisible(); + }); + + await test.step('expect to confirm delete', async () => { + await poOmnichannelUnits.btnDeleteByName(unitName).click(); + await expect(poOmnichannelUnits.confirmDeleteModal).toBeVisible(); + await poOmnichannelUnits.btnConfirmDeleteModal.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).not.toBeVisible(); + }); + }); + + await test.step('expect to have been deleted', async () => { + if (await poOmnichannelUnits.inputSearch.isVisible()) { + await poOmnichannelUnits.search(unitName); + await expect(poOmnichannelUnits.findRowByName(unitName)).not.toBeVisible(); + } else { + await expect(page.locator('h3 >> text="No units yet"')).toBeVisible(); + } + }); + }); + }); + + test('OC - Manage Units - Edit unit', async ({ api, page }) => { + const edittedUnitName = faker.string.uuid(); + + const unit = await test.step('expect to create new unit', async () => { + const { data: unit } = await createOrUpdateUnit(api, { + name: faker.string.uuid(), + visibility: 'public', + monitors: [{ monitorId: monitor.data._id, username: 'user2' }], + departments: [{ departmentId: department.data._id }], + }); + + return unit; + }); + + await test.step('expect to edit unit', async () => { + await poOmnichannelUnits.search(unit.name); + await poOmnichannelUnits.findRowByName(unit.name).click(); + await expect(poOmnichannelUnits.contextualBar).toBeVisible(); + await poOmnichannelUnits.inputName.fill(edittedUnitName); + await poOmnichannelUnits.btnSave.click(); + }); + + await test.step('expect unit to have been edited', async () => { + await poOmnichannelUnits.sidenav.linkPriorities.click(); + await poOmnichannelUnits.sidenav.linkUnits.click(); // refresh the page + await poOmnichannelUnits.search(edittedUnitName); + await expect(poOmnichannelUnits.findRowByName(edittedUnitName)).toBeVisible(); + }); + + await test.step('expect to delete unit', async () => { + await poOmnichannelUnits.findRowByName(edittedUnitName).click(); + await expect(poOmnichannelUnits.contextualBar).toBeVisible(); + + await test.step('expect confirm delete unit', async () => { + await test.step('expect to be able to cancel delete', async () => { + await poOmnichannelUnits.btnDelete.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).toBeVisible(); + await poOmnichannelUnits.btnCancelDeleteModal.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).not.toBeVisible(); + }); + + await test.step('expect to confirm delete', async () => { + await poOmnichannelUnits.btnDelete.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).toBeVisible(); + await poOmnichannelUnits.btnConfirmDeleteModal.click(); + await expect(poOmnichannelUnits.confirmDeleteModal).not.toBeVisible(); + }); + + await expect(poOmnichannelUnits.contextualBar).not.toBeVisible(); + }); + + await test.step('expect to have been deleted', async () => { + await poOmnichannelUnits.sidenav.linkPriorities.click(); + await poOmnichannelUnits.sidenav.linkUnits.click(); // refresh the page + + if (await poOmnichannelUnits.inputSearch.isVisible()) { + await poOmnichannelUnits.search(edittedUnitName); + await expect(poOmnichannelUnits.findRowByName(edittedUnitName)).not.toBeVisible(); + } else { + await expect(page.locator('h3 >> text="No units yet"')).toBeVisible(); + } + }); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/page-objects/admin-email-inboxes.ts b/apps/meteor/tests/e2e/page-objects/admin-email-inboxes.ts index b6c9632db72e..f1ebc95be0b6 100644 --- a/apps/meteor/tests/e2e/page-objects/admin-email-inboxes.ts +++ b/apps/meteor/tests/e2e/page-objects/admin-email-inboxes.ts @@ -33,7 +33,7 @@ export class AdminEmailInboxes { } get inputSmtpSecure(): Locator { - return this.page.locator('label >> text="Connect with SSL/TLS" >> nth=0 >> i'); + return this.page.locator('label >> text="Connect with SSL/TLS"').first(); } // IMAP @@ -50,7 +50,7 @@ export class AdminEmailInboxes { } get inputImapSecure(): Locator { - return this.page.locator('label >> text="Connect with SSL/TLS" >> nth=1 >> i'); + return this.page.locator('label >> text="Connect with SSL/TLS"').last(); } get btnSave(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/admin.ts b/apps/meteor/tests/e2e/page-objects/admin.ts index 1887adac45ed..f9a365a4d20d 100644 --- a/apps/meteor/tests/e2e/page-objects/admin.ts +++ b/apps/meteor/tests/e2e/page-objects/admin.ts @@ -16,6 +16,18 @@ export class Admin { return this.page.locator('input[placeholder ="Search rooms"]'); } + getRoomRow(name?: string): Locator { + return this.page.locator('[role="link"]', { hasText: name }); + } + + get btnSave(): Locator { + return this.page.locator('button >> text="Save"'); + } + + get privateLabel(): Locator { + return this.page.locator(`label >> text=Private`); + } + get inputSearchUsers(): Locator { return this.page.locator('input[placeholder="Search Users"]'); } @@ -122,7 +134,7 @@ export class Admin { } get btnAssetsSettings(): Locator { - return this.page.locator('[data-qa-id="Assets"] >> role=button[name="Open"]'); + return this.page.locator('[data-qa-id="Assets"] >> role=link[name="Open"]'); } get btnDeleteAssetsLogo(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/auth.ts b/apps/meteor/tests/e2e/page-objects/auth.ts index 9b47d2e44adc..d0a7e13d6505 100644 --- a/apps/meteor/tests/e2e/page-objects/auth.ts +++ b/apps/meteor/tests/e2e/page-objects/auth.ts @@ -20,6 +20,10 @@ export class Registration { return this.page.locator('role=button[name="Login"]'); } + get btnLoginWithGoogle(): Locator { + return this.page.locator('role=button[name="Sign in with Google"]'); + } + get goToRegister(): Locator { return this.page.locator('role=link[name="Create an account"]'); } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts index bd46de6ea00f..23e855b1aa21 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts @@ -7,8 +7,8 @@ export class AdminFlextabUsers { this.page = page; } - get btnNew(): Locator { - return this.page.locator('role=button[name="New"]'); + get btnNewUser(): Locator { + return this.page.locator('role=button[name="New user"]'); } get btnSave(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts index 2ba8cd6428d9..79c9617355e9 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts @@ -149,7 +149,7 @@ export class HomeContent { } get btnRecordAudio(): Locator { - return this.page.locator('[data-qa-id="audio-record"]'); + return this.page.locator('[data-qa-id="audio-message"]'); } get btnMenuMoreActions() { @@ -196,14 +196,6 @@ export class HomeContent { return this.page.locator('.rcx-vertical-bar button:has-text("Create")'); } - get inputModalAgentUserName(): Locator { - return this.page.locator('#modal-root input[placeholder="Username, name or e-mail"]'); - } - - get inputModalAgentForwardComment(): Locator { - return this.page.locator('[data-qa-id="ForwardChatModalTextAreaInputComment"]'); - } - async pickEmoji(emoji: string, section = 'Smileys & People') { await this.page.locator('role=toolbar[name="Composer Primary Actions"] >> role=button[name="Emoji"]').click(); @@ -245,10 +237,6 @@ export class HomeContent { await this.page.locator('//main//aside >> [name="alsoSendThreadToChannel"]').setChecked(isChecked); } - get takeOmnichannelChatButton(): Locator { - return this.page.locator('role=button[name="Take it!"]'); - } - get lastSystemMessageBody(): Locator { return this.page.locator('[data-qa-type="system-message-body"]').last(); } @@ -288,4 +276,8 @@ export class HomeContent { get btnAnonymousTalk(): Locator { return this.page.locator('role=button[name="Or talk as anonymous"]'); } + + findSystemMessage(text: string): Locator { + return this.page.locator(`[data-qa-type="system-message-body"] >> text="${text}"`); + } } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts index 307f94273d32..7243d613c11f 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts @@ -1,14 +1,38 @@ import type { Locator, Page } from '@playwright/test'; +import { OmnichannelTransferChatModal } from '../omnichannel-transfer-chat-modal'; import { HomeContent } from './home-content'; import { OmnichannelCloseChatModal } from './omnichannel-close-chat-modal'; export class HomeOmnichannelContent extends HomeContent { - readonly omnichannelCloseChatModal: OmnichannelCloseChatModal; + readonly closeChatModal: OmnichannelCloseChatModal; + + readonly forwardChatModal: OmnichannelTransferChatModal; constructor(page: Page) { super(page); - this.omnichannelCloseChatModal = new OmnichannelCloseChatModal(page); + this.closeChatModal = new OmnichannelCloseChatModal(page); + this.forwardChatModal = new OmnichannelTransferChatModal(page); + } + + get btnReturnToQueue(): Locator { + return this.page.locator('role=button[name="Move to the queue"]'); + } + + get modalReturnToQueue(): Locator { + return this.page.locator('[data-qa-id="return-to-queue-modal"]'); + } + + get btnReturnToQueueConfirm():Locator { + return this.modalReturnToQueue.locator('role=button[name="Confirm"]'); + } + + get btnReturnToQueueCancel():Locator { + return this.modalReturnToQueue.locator('role=button[name="Cancel"]'); + } + + get btnTakeChat(): Locator { + return this.page.locator('role=button[name="Take it!"]'); } get inputMessage(): Locator { @@ -22,4 +46,36 @@ export class HomeOmnichannelContent extends HomeContent { get btnCloseChat(): Locator { return this.page.locator('[data-qa-id="ToolBoxAction-balloon-close-top-right"]'); } + + get btnGuestInfo(): Locator { + return this.page.locator('[data-qa-id="ToolBoxAction-user"]'); + } + + get infoContactEmail(): Locator { + return this.page.locator('[data-qa-id="contactInfo-email"]'); + } + + get infoContactName(): Locator { + return this.page.locator('[data-qa-id="contactInfo-name"]'); + } + + get btnReturn(): Locator { + return this.page.locator('[data-qa-id="ToolBoxAction-back"]'); + } + + get btnResume(): Locator { + return this.page.locator('role=button[name="Resume"]'); + } + + get modalOnHold(): Locator { + return this.page.locator('[data-qa-id="on-hold-modal"]'); + } + + get btnEditRoomInfo(): Locator { + return this.page.locator('button[data-qa-id="room-info-edit"]'); + } + + get btnOnHoldConfirm(): Locator { + return this.modalOnHold.locator('role=button[name="Place chat On-Hold"]'); + } } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index 4f3d7b4886eb..0a4444c073c6 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -18,9 +18,7 @@ export class HomeSidenav { } get checkboxReadOnly(): Locator { - return this.page.locator( - '//*[@id="modal-root"]//*[contains(@class, "rcx-field") and contains(text(), "Read Only")]/../following-sibling::label/i', - ); + return this.page.locator('role=dialog[name="Create Channel"] >> label >> text="Read Only"'); } get inputChannelName(): Locator { @@ -41,8 +39,8 @@ export class HomeSidenav { async selectPriority(name: string, priority: string) { const sidebarItem = this.getSidebarItemByName(name); - await sidebarItem.hover(); - await sidebarItem.locator(`[data-testid="menu"]`).click(); + await sidebarItem.focus(); + await sidebarItem.locator('.rcx-sidebar-item__menu').click(); await this.page.locator(`li[value="${priority}"]`).click(); } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts index 6b10bcd47b2e..5d606131d017 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/omnichannel-sidenav.ts @@ -38,4 +38,32 @@ export class OmnichannelSidenav { get linkPriorities(): Locator { return this.page.locator('a[href="/omnichannel/priorities"]'); } + + get linkMonitors(): Locator { + return this.page.locator('a[href="/omnichannel/monitors"]'); + } + + get linkBusinessHours(): Locator { + return this.page.locator('a[href="/omnichannel/businessHours"]'); + } + + get linkAnalytics(): Locator { + return this.page.locator('a[href="/omnichannel/analytics"]'); + } + + get linkRealTimeMonitoring(): Locator { + return this.page.locator('a[href="/omnichannel/realtime-monitoring"]'); + } + + get linkReports(): Locator { + return this.page.locator('a[href="/omnichannel/reports"]'); + } + + get linkCannedResponses(): Locator { + return this.page.locator('a[href="/omnichannel/canned-responses"]'); + } + + get linkUnits(): Locator { + return this.page.locator('a[href="/omnichannel/units"]'); + } } diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts index 24403b22b845..8cc5d3245691 100644 --- a/apps/meteor/tests/e2e/page-objects/home-channel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts @@ -40,4 +40,8 @@ export class HomeChannel { await this.toastSuccess.locator('button >> i.rcx-icon--name-cross.rcx-icon').click(); await this.page.mouse.move(0, 0); } + + get composerToolboxActions(): Locator { + return this.page.locator('[role=toolbar][aria-label="Composer Primary Actions"] button'); + } } diff --git a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts index 983d2392a47d..e93e90b0b492 100644 --- a/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-omnichannel.ts @@ -1,7 +1,11 @@ import type { Locator, Page } from '@playwright/test'; import { HomeOmnichannelContent, HomeSidenav, HomeFlextab, OmnichannelSidenav } from './fragments'; +import { OmnichannelAgents } from './omnichannel-agents'; +import { OmnichannelCannedResponses } from './omnichannel-canned-responses'; import { OmnichannelCurrentChats } from './omnichannel-current-chats'; +import { OmnichannelManager } from './omnichannel-manager'; +import { OmnichannelMonitors } from './omnichannel-monitors'; import { OmnichannelTranscript } from './omnichannel-transcript'; import { OmnichannelTriggers } from './omnichannel-triggers'; @@ -22,6 +26,14 @@ export class HomeOmnichannel { readonly transcript: OmnichannelTranscript; + readonly cannedResponses: OmnichannelCannedResponses; + + readonly agents: OmnichannelAgents; + + readonly managers: OmnichannelManager; + + readonly monitors: OmnichannelMonitors; + constructor(page: Page) { this.page = page; this.content = new HomeOmnichannelContent(page); @@ -31,6 +43,10 @@ export class HomeOmnichannel { this.omnisidenav = new OmnichannelSidenav(page); this.currentChats = new OmnichannelCurrentChats(page); this.transcript = new OmnichannelTranscript(page); + this.cannedResponses = new OmnichannelCannedResponses(page); + this.agents = new OmnichannelAgents(page); + this.managers = new OmnichannelManager(page); + this.monitors = new OmnichannelMonitors(page); } get toastSuccess(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/index.ts b/apps/meteor/tests/e2e/page-objects/index.ts index b6f1ca1275aa..312b133bf93c 100644 --- a/apps/meteor/tests/e2e/page-objects/index.ts +++ b/apps/meteor/tests/e2e/page-objects/index.ts @@ -9,7 +9,10 @@ export * from './omnichannel-agents'; export * from './omnichannel-departments'; export * from './omnichannel-current-chats'; export * from './omnichannel-livechat'; +export * from './omnichannel-livechat-embedded'; export * from './omnichannel-manager'; export * from './omnichannel-custom-fields'; +export * from './omnichannel-units'; export * from './home-omnichannel'; +export * from './omnichannel-monitors'; export * from './utils'; diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-administration.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-administration.ts new file mode 100644 index 000000000000..01b8a6ed6ed4 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-administration.ts @@ -0,0 +1,14 @@ +import type { Page } from '@playwright/test'; + +import { OmnichannelSidenav } from './fragments'; + +export class OmnichannelAdministration { + protected readonly page: Page; + + readonly sidenav: OmnichannelSidenav; + + constructor(page: Page) { + this.page = page; + this.sidenav = new OmnichannelSidenav(page); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts index fe000717dada..c6e9f5a0d0e5 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts @@ -7,13 +7,19 @@ export class OmnichannelAgents { readonly sidenav: OmnichannelSidenav; + readonly editCtxBar: Locator; + + readonly infoCtxBar: Locator; + constructor(page: Page) { this.page = page; this.sidenav = new OmnichannelSidenav(page); + this.editCtxBar = page.locator('[data-qa-id="agent-edit-contextual-bar"]'); + this.infoCtxBar = page.locator('[data-qa-id="agent-info-contextual-bar"]'); } get inputUsername(): Locator { - return this.page.locator('input').first(); + return this.page.locator('[data-qa-id="UserAutoComplete"]'); } get inputSearch(): Locator { @@ -25,26 +31,67 @@ export class OmnichannelAgents { } get firstRowInTable() { - return this.page.locator('[data-qa="GenericTableAgentInfoBody"] .rcx-table__row--action .rcx-table__cell:first-child'); + return this.page.locator('[data-qa-id="agents-table"] tr:first-child td:first-child'); } get btnDeletefirstRowInTable() { - return this.page.locator('button[title="Remove"]'); + return this.page.locator('[data-qa-id="agents-table"] tr:first-child').locator('role=button[name="Remove"]'); + } + + get modalRemoveAgent(): Locator { + return this.page.locator('[data-qa-id="remove-agent-modal"]'); } get btnModalRemove(): Locator { - return this.page.locator('#modal-root dialog .rcx-modal__inner .rcx-modal__footer .rcx-button--danger'); + return this.modalRemoveAgent.locator('role=button[name="Delete"]'); } get btnEdit(): Locator { - return this.page.locator('[data-qa="AgentInfoAction-Edit"]'); + return this.infoCtxBar.locator('[data-qa="agent-info-action-edit"]'); } - get btnStatus(): Locator { - return this.page.locator('[data-qa="AgentEditTextInput-Status"]'); + get btnRemove(): Locator { + return this.infoCtxBar.locator('role=button[name="Remove"]'); } get btnSave(): Locator { - return this.page.locator('[data-qa="AgentEditButtonSave"]'); + return this.editCtxBar.locator('[data-qa-id="agent-edit-save"]'); + } + + get inputMaxChats(): Locator { + return this.editCtxBar.locator('input[name="maxNumberSimultaneousChat"]'); + } + + get inputStatus(): Locator { + return this.page.locator('[data-qa-id="agent-edit-status"]'); + } + + get inputDepartment(): Locator { + return this.editCtxBar.locator('[data-qa-id="agent-edit-departments"]'); + } + + async selectDepartment(name: string) { + await this.inputDepartment.click(); + await this.inputDepartment.type(name); + await this.page.locator(`.rcx-option__content:has-text("${name}")`).click(); + } + + async selectStatus(status: string) { + await this.inputStatus.click(); + await this.page.locator(`.rcx-option__content:has-text("${status}")`).click(); + } + + async selectUsername(username: string) { + await this.inputUsername.fill(''); + await this.inputUsername.type(username); + await this.page.locator(`role=option[name="${username}"]`).click(); + } + + findRowByUsername(username: string) { + return this.page.locator(`[data-qa-id="${username}"]`); + } + + findRowByName(name: string) { + return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}"`) }); } } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-canned-responses.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-canned-responses.ts new file mode 100644 index 000000000000..0537090cc0c0 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-canned-responses.ts @@ -0,0 +1,13 @@ +import type { Locator } from '@playwright/test'; + +import { OmnichannelAdministration } from './omnichannel-administration'; + +export class OmnichannelCannedResponses extends OmnichannelAdministration { + get radioPublic(): Locator { + return this.page.locator('[data-qa-id="canned-response-public-radio"]').first(); + } + + get btnNew(): Locator { + return this.page.locator('role=button[name="Create canned response"]').first(); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-current-chats.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-current-chats.ts index b353285897a1..46773e0ca43a 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-current-chats.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-current-chats.ts @@ -1,110 +1,112 @@ import type { Locator, Page } from '@playwright/test'; -import { OmnichannelSidenav } from './fragments'; +import { HomeOmnichannelContent } from './fragments'; +import { OmnichannelAdministration } from './omnichannel-administration'; -export class OmnichannelCurrentChats { - private readonly page: Page; - - readonly sidenav: OmnichannelSidenav; +export class OmnichannelCurrentChats extends OmnichannelAdministration { + readonly content: HomeOmnichannelContent; constructor(page: Page) { - this.page = page; - this.sidenav = new OmnichannelSidenav(page); - } - - get btnToastClose(): Locator { - return this.page.locator('.rcx-toastbar').locator('button'); - } - - get currentChatsLink(): Locator { - return this.page.locator('a[href="omnichannel/current"]'); + super(page); + this.content = new HomeOmnichannelContent(page); } - get guestField(): Locator { + get inputGuest(): Locator { return this.page.locator('[data-qa="current-chats-guest"]'); } - get servedByField(): Locator { - return this.page.locator('[data-qa="autocomplete-agent"]'); + get inputServedBy(): Locator { + return this.page.locator('[data-qa="autocomplete-agent"] input'); } - get statusField(): Locator { + get inputStatus(): Locator { return this.page.locator('[data-qa="current-chats-status"]'); } - get fromField(): Locator { + get inputFrom(): Locator { return this.page.locator('[data-qa="current-chats-from"]'); } - get toField(): Locator { + get inputTo(): Locator { return this.page.locator('[data-qa="current-chats-to"]'); } - get departmentField(): Locator { - return this.page.locator('[data-qa="autocomplete-department"]'); + get inputDepartment(): Locator { + return this.page.locator('[data-qa="autocomplete-department"] input'); } - get tagsField(): Locator { - return this.page.locator('[data-qa="current-chats-tags"]'); + get inputTags(): Locator { + return this.page.locator('[data-qa="current-chats-tags"] [role="listbox"]'); } - get formOptions(): Locator { + get btnFilterOptions(): Locator { return this.page.locator('[data-qa="current-chats-options"]'); } - get clearFiltersOption(): Locator { + get optionClearFilter(): Locator { return this.page.locator('[data-qa="current-chats-options-clearFilters"]'); } - get removeAllClosedOption(): Locator { + get optionRemoveAllClosed(): Locator { return this.page.locator('[data-qa="current-chats-options-removeAllClosed"]'); } - get customFieldsOption(): Locator { - return this.page.locator('[data-qa="current-chats-options-customFields"]'); + get modalConfirmRemove(): Locator { + return this.page.locator('[data-qa-id="current-chats-modal-remove"]'); + } + + get modalConfirmRemoveAllClosed(): Locator { + return this.page.locator('[data-qa-id="current-chats-modal-remove-all-closed"]'); } - get table(): Locator { - return this.page.locator('.rcx-table'); + get btnConfirmRemove(): Locator { + return this.modalConfirmRemove.locator('role=button[name="Delete"]'); } - get tableHeaderName(): Locator { - return this.page.locator('[data-qa="current-chats-header-name"]'); + get btnConfirmRemoveAllClosed(): Locator { + return this.modalConfirmRemoveAllClosed.locator('role=button[name="Delete"]'); } - get tableHeaderDepartment(): Locator { - return this.page.locator('[data-qa="current-chats-header-department"]'); + get optionCustomFields(): Locator { + return this.page.locator('[data-qa="current-chats-options-customFields"]'); } - get tableHeaderServedBy(): Locator { - return this.page.locator('[data-qa="current-chats-header-servedBy"]'); + async selectServedBy(option: string) { + await this.inputServedBy.click(); + await this.inputServedBy.fill(option); + await this.page.locator(`[role='option'][value='${option}']`).click(); } - get tableHeaderStartedAt(): Locator { - return this.page.locator('[data-qa="current-chats-header-startedAt"]'); + async addTag(option: string) { + await this.inputTags.click(); + await this.page.locator(`[role='option'][value='${option}']`).click(); + await this.inputTags.click(); } - get tableHeaderLastMessage(): Locator { - return this.page.locator('[data-qa="current-chats-header-lastMessage"]'); + async removeTag(option: string) { + await this.page.locator(`role=option[name='${option}']`).click(); } - get tableHeaderStatus(): Locator { - return this.page.locator('[data-qa="current-chats-header-status"]'); + async selectDepartment(option: string) { + await this.inputDepartment.click(); + await this.inputDepartment.fill(option); + await this.page.locator(`role=option[name='${option}']`).click(); } - get tableHeaderRemove(): Locator { - return this.page.locator('[data-qa="current-chats-header-remove"]'); + async selectStatus(option: string) { + await this.inputStatus.click(); + await this.page.locator(`[role='option'][data-key='${option}']`).click(); } - get tableHeader(): Locator { - return this.page.locator('[data-qa=""]'); + btnRemoveByName(name: string): Locator { + return this.findRowByName(name).locator('role=button[name="Remove"]'); } - async openChat(name: string): Promise { - return this.page.locator(`table >> text="${name}"`).click(); + findRowByName(name: string) { + return this.page.locator(`tr[data-qa-id="${name}"]`); } - async doOpenOptions(): Promise { - await this.formOptions.click(); + findRowByServer(name: string) { + return this.page.locator('tr', { has: this.page.locator(`[data-qa="current-chats-cell-servedBy"] >> text=${name}`) }); } } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-custom-fields.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-custom-fields.ts index 17430223ca73..9768139fe09d 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-custom-fields.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-custom-fields.ts @@ -17,31 +17,31 @@ export class OmnichannelCustomFields { } get inputField(): Locator { - return this.page.locator('[placeholder="Field"]'); + return this.page.locator('input[name="field"]'); } get inputLabel(): Locator { - return this.page.locator('[placeholder="Label"]'); + return this.page.locator('input[name="label"]'); + } + + get visibleLabel(): Locator { + return this.page.locator('label >> text="Visible"'); } get btnSave(): Locator { - return this.page.locator('[data-qa-id="NewCustomFieldsPageButtonSave"]'); + return this.page.locator('button >> text=Save'); } get inputSearch(): Locator { return this.page.locator('[placeholder="Search"]'); } - get btnEditSave(): Locator { - return this.page.locator('[data-qa-id="BtnSaveEditCustomFieldsPage"]'); - } - firstRowInTable(filedName: string) { return this.page.locator(`[qa-user-id="${filedName}"]`); } - get btnDeletefirstRowInTable() { - return this.page.locator('button[title="Remove"]'); + get btnDeleteCustomField() { + return this.page.locator('button >> text=Delete'); } get btnModalRemove(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts index 309776032fc9..c1012442f115 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts @@ -26,7 +26,7 @@ export class OmnichannelDepartments { } get btnEnabled() { - return this.page.locator('[data-qa="DepartmentEditToggle-Enabled"] span label'); + return this.page.locator('label >> text="Enabled"'); } get inputName() { @@ -38,7 +38,7 @@ export class OmnichannelDepartments { } get toggleRequestTags() { - return this.page.locator('[data-qa="DiscussionToggle-RequestTagBeforeCLosingChat"] span label'); + return this.page.locator('label >> text="Request tag(s) before closing conversation"'); } get inputTags() { @@ -110,11 +110,19 @@ export class OmnichannelDepartments { } get inputModalConfirmDelete() { - return this.page.locator('#modal-root .rcx-modal input'); + return this.modalConfirmDelete.locator('input[name="confirmDepartmentName"]'); + } + + get modalConfirmDelete() { + return this.page.locator('[data-qa-id="delete-department-modal"]'); } get btnModalConfirmDelete() { - return this.page.locator('#modal-root .rcx-modal .rcx-modal__footer .rcx-button--danger'); + return this.modalConfirmDelete.locator('role=button[name="Delete"]'); + } + + get btnModalCancelDelete() { + return this.modalConfirmDelete.locator('role=button[name="Cancel"]'); } get upgradeDepartmentsModal() { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts new file mode 100644 index 000000000000..c5bc515a99e2 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts @@ -0,0 +1,110 @@ +import type { Page, Locator, APIResponse } from '@playwright/test'; + +export class OmnichannelLiveChatEmbedded { + readonly page: Page; + + constructor(page: Page, private readonly api: { get(url: string): Promise }) { + this.page = page; + } + + btnOpenLiveChat(label: string): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`role=button[name="${label}"]`); + } + + btnOpenOfflineLiveChat(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`button[aria-label="Leave a message"]`); + } + + btnFinishOfflineMessage(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`button[aria-label="OK"]`); + } + + get btnOptions(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`button >> text="Options"`); + } + + get btnCloseChat(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`button >> text="Finish this chat"`); + } + + get btnCloseChatConfirm(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`button >> text="Yes"`); + } + + get txtHeaderTitle(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('div >> text="Chat Finished"'); + } + + get btnChatNow(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[type="button"] >> text="Chat now"'); + } + + txtChatMessage(message: string): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`text="${message}"`); + } + + async closeChat(): Promise { + await this.btnOptions.click(); + await this.btnCloseChat.click(); + await this.btnCloseChatConfirm.click(); + } + + async openLiveChat(offline: boolean): Promise { + const { value: siteName } = await (await this.api.get('/settings/Site_Name')).json(); + if (offline) { + return this.btnOpenOfflineLiveChat().click(); + } + await this.btnOpenLiveChat(siteName).click(); + } + + unreadMessagesBadge(count: number): Locator { + const name = count === 1 ? `${count} unread message` : `${count} unread messages`; + + return this.page.frameLocator('#rocketchat-iframe').locator(`role=status[name="${name}"]`); + } + + get inputName(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[name="name"]'); + } + + get inputEmail(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[name="email"]'); + } + + get textAreaMessage(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[name="message"]'); + } + + btnSendMessage(btnText: string): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator(`role=button[name="${btnText}"]`); + } + + get btnOk(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('role=button[name="OK"]'); + } + + get onlineAgentMessage(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[contenteditable="true"]'); + } + + get btnSendMessageToOnlineAgent(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('footer div div div:nth-child(3) button'); + } + + get firstAutoMessage(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('div.message-text__WwYco p'); + } + + public async sendMessage(liveChatUser: { name: string; email: string }, isOffline = true): Promise { + const buttonLabel = isOffline ? 'Send' : 'Start chat'; + await this.inputName.type(liveChatUser.name); + await this.inputEmail.type(liveChatUser.email); + if (isOffline) { + await this.textAreaMessage.type('any_message'); + await this.btnSendMessage(buttonLabel).click(); + return this.btnFinishOfflineMessage().click(); + } + await this.btnSendMessage(buttonLabel).click(); + await this.page.frameLocator('#rocketchat-iframe').locator('[data-qa="livechat-composer"]').waitFor(); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts index 7eecca8de892..c2551e6e87df 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts @@ -12,6 +12,20 @@ export class OmnichannelManager { this.sidenav = new OmnichannelSidenav(page); } + get inputSearch() { + return this.page.locator('[placeholder="Search"]'); + } + + async search(text: string) { + await this.inputSearch.fill(text); + await this.page.waitForTimeout(500); + } + + async clearSearch() { + await this.inputSearch.fill(''); + await this.page.waitForTimeout(500); + } + get inputUsername(): Locator { return this.page.locator('input').first(); } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-monitors.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-monitors.ts new file mode 100644 index 000000000000..b72594024aaf --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-monitors.ts @@ -0,0 +1,38 @@ +import type { Locator } from '@playwright/test'; + +import { OmnichannelAdministration } from './omnichannel-administration'; + +export class OmnichannelMonitors extends OmnichannelAdministration { + get modalConfirmRemove(): Locator { + return this.page.locator('[data-qa-id="manage-monitors-confirm-remove"]'); + } + + get btnConfirmRemove(): Locator { + return this.modalConfirmRemove.locator('role=button[name="Delete"]'); + } + + get btnAddMonitor(): Locator { + return this.page.locator('role=button[name="Add monitor"]'); + } + + get inputMonitor(): Locator { + return this.page.locator('input[name="monitor"]'); + } + + get inputSearch(): Locator { + return this.page.locator('input[placeholder="Search"]'); + } + + findRowByName(name: string): Locator { + return this.page.locator(`tr[data-qa-id="${name}"]`); + } + + btnRemoveByName(name: string): Locator { + return this.findRowByName(name).locator('role=button[name="Remove"]'); + } + + async selectMonitor(name: string) { + await this.inputMonitor.fill(name); + await this.page.locator(`li[role="option"]`, { has: this.page.locator(`[data-username='${name}']`) }).click(); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-transfer-chat-modal.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-transfer-chat-modal.ts new file mode 100644 index 000000000000..8bb44c46638b --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-transfer-chat-modal.ts @@ -0,0 +1,44 @@ +import type { Locator, Page } from '@playwright/test'; + +export class OmnichannelTransferChatModal { + private readonly page: Page; + + private readonly dialog: Locator; + + constructor(page: Page) { + this.page = page; + this.dialog = page.locator('[data-qa-id="forward-chat-modal"]'); + } + + get inputComment(): Locator { + return this.dialog.locator('textarea[name="comment"]'); + } + + get inputFowardDepartment(): Locator { + return this.dialog.locator('[data-qa-id="forward-to-department"] input'); + } + + get inputFowardUser(): Locator { + return this.dialog.locator('[data-qa="autocomplete-agent"] input'); + } + + get btnForward(): Locator { + return this.dialog.locator('role=button[name="Forward"]'); + } + + get btnCancel(): Locator { + return this.dialog.locator('role=button[name="Cancel"]'); + } + + async selectDepartment(name: string) { + await this.inputFowardDepartment.click(); + await this.inputFowardDepartment.fill(name); + await this.page.locator(`li[role="option"][title="${name}"]`).click(); + } + + async selectUser(name: string, id?: string) { + await this.inputFowardUser.click(); + await this.inputFowardUser.fill(name); + await this.page.locator(`li[role="option"][value="${id || name}"]`).click(); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts index a90171f74422..2ac39a4b52fd 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts @@ -17,33 +17,17 @@ export class OmnichannelTriggers { } get inputName(): Locator { - return this.page.locator('[placeholder="Name"]'); + return this.page.locator('input[name="name"]'); } get inputDescription(): Locator { - return this.page.locator('[placeholder="Description"]'); - } - - get addTime(): Locator { - return this.page.locator('[placeholder="Time in seconds"]'); - } - - get impersonateAgentListBox(): Locator { - return this.page.locator('ol[role="listbox"] >> text=Impersonate next agent from queue'); - } - - get textArea(): Locator { - return this.page.locator('textarea'); + return this.page.locator('input[name="description"]'); } get btnSave(): Locator { return this.page.locator('button >> text="Save"'); } - get firstRowInTable() { - return this.page.locator('table tr:first-child td:first-child'); - } - firstRowInTriggerTable(triggersName1: string) { return this.page.locator(`text="${triggersName1}"`); } @@ -56,14 +40,6 @@ export class OmnichannelTriggers { return this.toastMessage.locator('role=button'); } - get inputSearch() { - return this.page.locator('[placeholder="Search"]'); - } - - get pageTitle() { - return this.page.locator('[data-qa-type="PageHeader-title"]'); - } - get btnDeletefirstRowInTable() { return this.page.locator('table tr:first-child td:last-child button'); } @@ -76,33 +52,33 @@ export class OmnichannelTriggers { return this.page.locator('text=Trigger removed'); } - get inputCondition(): Locator { - return this.page.locator('button', { has: this.page.locator('select[name="condition"]') }); + get conditionLabel(): Locator { + return this.page.locator('label >> text="Condition"') } get inputConditionValue(): Locator { - return this.page.locator('input[name="conditionValue"]'); + return this.page.locator('input[name="conditions.0.value"]'); } - get inputSender(): Locator { - return this.page.locator('button', { has: this.page.locator('select[name="sender"]') }); + get actionLabel(): Locator { + return this.page.locator('label >> text="Action"') } get inputAgentName(): Locator { - return this.page.locator('input[name="agentName"]'); + return this.page.locator('input[name="actions.0.params.name"]'); } get inputTriggerMessage(): Locator { - return this.page.locator('textarea[name="triggerMessage"]'); + return this.page.locator('textarea[name="actions.0.params.msg"]'); } async selectCondition(condition: string) { - await this.inputCondition.click(); + await this.conditionLabel.click(); await this.page.locator(`li.rcx-option[data-key="${condition}"]`).click(); } async selectSender(sender: 'queue' | 'custom') { - await this.inputSender.click(); + await this.actionLabel.click(); await this.page.locator(`li.rcx-option[data-key="${sender}"]`).click(); } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts new file mode 100644 index 000000000000..5aa41afe449a --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-units.ts @@ -0,0 +1,99 @@ +import type { Locator } from '@playwright/test'; + +import { OmnichannelAdministration } from './omnichannel-administration'; + +export class OmnichannelUnits extends OmnichannelAdministration { + get inputSearch() { + return this.page.locator('[placeholder="Search"]'); + } + + async search(text: string) { + await this.inputSearch.fill(text); + } + + findRowByName(name: string) { + return this.page.locator(`tr[data-qa-id="${name}"]`); + } + + btnRemoveByName(name: string) { + return this.findRowByName(name).locator('role=button[name="remove"]'); + } + + get inputName() { + return this.page.locator('[name="name"]'); + } + + get inputDepartments() { + return this.page.locator('[name="departments"]').locator('input[placeholder="Select an option"]'); + } + + get inputMonitors() { + return this.page.locator('[name="monitors"]'); + } + + get inputVisibility(): Locator { + return this.page.locator('button', { has: this.page.locator('select[name="visibility"]') }); + } + + private selectOption(name: string) { + return this.page.locator(`[role=option][value="${name}"]`); + } + + async selectDepartment({ name, _id }: { name: string; _id: string }) { + await this.inputDepartments.click(); + await this.inputDepartments.fill(name); + await this.selectOption(_id).click(); + await this.contextualBar.click({ position: { x: 0, y: 0 } }); + } + + async selectMonitor(option: string) { + await this.inputMonitors.click(); + await this.selectOption(option).click(); + await this.contextualBar.click({ position: { x: 0, y: 0 } }); + } + + async selectVisibility(option: string) { + await this.inputVisibility.click(); + await this.page.locator(`li.rcx-option[data-key="${option}"]`).click(); + } + + get btnCreateUnit() { + return this.page.locator('header').locator('role=button[name="Create unit"]'); + } + + get btnCreateUnitEmptyState() { + return this.page.locator('.rcx-states').locator('role=button[name="Create unit"]'); + } + + get contextualBar() { + return this.page.locator('div[data-qa-id="units-contextual-bar"]'); + } + + get btnSave() { + return this.contextualBar.locator('role=button[name="Save"]'); + } + + get btnCancel() { + return this.contextualBar.locator('role=button[name="Cancel"]'); + } + + get btnDelete() { + return this.contextualBar.locator('role=button[name="Delete"]'); + } + + btnDeleteByName(name: string) { + return this.page.locator(`button[data-qa-id="remove-unit-${name}"]`); + } + + get confirmDeleteModal() { + return this.page.locator('dialog[data-qa-id="units-confirm-delete-modal"]'); + } + + get btnCancelDeleteModal() { + return this.confirmDeleteModal.locator('role=button[name="Cancel"]'); + } + + get btnConfirmDeleteModal() { + return this.confirmDeleteModal.locator('role=button[name="Delete"]'); + } +} diff --git a/apps/meteor/tests/e2e/utils/omnichannel/agents.ts b/apps/meteor/tests/e2e/utils/omnichannel/agents.ts new file mode 100644 index 000000000000..43a4fb86f149 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/agents.ts @@ -0,0 +1,30 @@ +import { BaseTest } from '../test'; + +export const makeAgentAvailable = async (api: BaseTest['api'], agentId: string) => { + await api.post('/users.setStatus', { + userId: agentId, + message: '', + status: 'online', + }); + + return api.post('/livechat/agent.status', { + agentId, + status: 'available', + }); +}; + +export const createAgent = async (api: BaseTest['api'], username: string) => { + const response = await api.post('/livechat/users/agent', { username }); + + if (response.status() !== 200) { + throw new Error(`Failed to create agent [http status: ${response.status()}]`); + } + + const { user: agent } = await response.json(); + + return { + response, + data: agent, + delete: async () => api.delete(`/livechat/users/agent/${agent._id}`), + }; +}; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/departments.ts b/apps/meteor/tests/e2e/utils/omnichannel/departments.ts new file mode 100644 index 000000000000..2b4fefd666c6 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/departments.ts @@ -0,0 +1,57 @@ +import { faker } from '@faker-js/faker'; +import { ILivechatDepartment } from '@rocket.chat/core-typings'; + +import { BaseTest } from '../test'; + +type CreateDepartmentParams = { name?: string; maxNumberSimultaneousChat?: number }; + +export const createDepartment = async (api: BaseTest['api'], { name = '', maxNumberSimultaneousChat }: CreateDepartmentParams = {}) => { + const response = await api.post('/livechat/department', { + department: { + name: name || faker.string.uuid(), + enabled: true, + description: '', + showOnRegistration: false, + showOnOfflineForm: false, + requestTagBeforeClosingChat: false, + email: faker.internet.email(), + chatClosingTags: [], + offlineMessageChannelName: '', + abandonedRoomsCloseCustomMessage: '', + waitingQueueMessage: '', + departmentsAllowedToForward: [], + fallbackForwardDepartment: '', + maxNumberSimultaneousChat, + }, + }); + + if (response.status() !== 200) { + throw Error(`Unable to create department [http status: ${response.status()}]`); + } + + const { department } = await response.json(); + + return { + response, + data: department, + delete: async () => api.delete(`/livechat/department/${department._id}`), + }; +}; + +export const addAgentToDepartment = async ( + api: BaseTest['api'], + { department, agentId, username }: { department: ILivechatDepartment; agentId: string; username?: string }, +) => + api.post(`/livechat/department/${department._id}/agents`, { + remove: [], + upsert: [ + { + agentId, + username: username || agentId, + count: 0, + order: 0, + }, + ], + }); + +export const deleteDepartment = async (api: BaseTest['api'], { id }: { id: string }) => api.delete(`/livechat/department/${id}`); diff --git a/apps/meteor/tests/e2e/utils/omnichannel/managers.ts b/apps/meteor/tests/e2e/utils/omnichannel/managers.ts new file mode 100644 index 000000000000..3fb5f04dcc96 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/managers.ts @@ -0,0 +1,19 @@ +import { BaseTest } from '../test'; + +export const createManager = async (api: BaseTest['api'], username: string) => { + const response = await api.post('/livechat/users/manager', { + username, + }); + + if (response.status() !== 200) { + throw Error(`Unable to create manager [http status: ${response.status()}]`); + } + + const { user: manager } = await response.json(); + + return { + response, + data: manager, + delete: async () => api.delete(`/livechat/users/manager/${manager._id}`), + }; +}; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts b/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts new file mode 100644 index 000000000000..308e6f4460a4 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts @@ -0,0 +1,30 @@ +import { BaseTest } from '../test'; +import { parseMeteorResponse } from './utils'; + +const removeMonitor = async (api: BaseTest['api'], id: string) => + api.post('/method.call/livechat:removeMonitor', { + message: JSON.stringify({ msg: 'method', id: '33', method: 'livechat:removeMonitor', params: [id] }), + }); + +export const createMonitor = async (api: BaseTest['api'], id: string) => { + const response = await api.post('/method.call/livechat:addMonitor', { + message: JSON.stringify({ + msg: 'method', + id: '17', + method: 'livechat:addMonitor', + params: [id], + }), + }); + + if (response.status() !== 200) { + throw new Error(`Failed to create monitor [http status: ${response.status()}]`); + } + + const monitor = await parseMeteorResponse<{ _id: string; username: string }>(response); + + return { + response, + data: monitor, + delete: async () => removeMonitor(api, monitor._id), + }; +}; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts b/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts new file mode 100644 index 000000000000..c07c5376130f --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts @@ -0,0 +1,128 @@ +import { faker } from '@faker-js/faker'; + +import { BaseTest } from '../test'; + +type UpdateRoomParams = { roomId: string; visitorId: string; tags: string[] }; + +type CloseRoomParams = { roomId: string; visitorToken: string }; + +type CreateRoomParams = { tags?: string[]; visitorToken: string; agentId?: string }; + +type CreateVisitorParams = { token: string; departmentId?: string; name?: string; email?: string }; + +type CreateConversationParams = { visitorName?: string; visitorToken?: string; agentId?: string; departmentId?: string }; + +export const updateRoom = async (api: BaseTest['api'], { roomId, visitorId, tags }: UpdateRoomParams) => { + if (!roomId) { + throw Error('Unable to update room info, missing room id'); + } + + if (!visitorId) { + throw Error('Unable to update room info, missing visitor id'); + } + + const response = await api.post('/livechat/room.saveInfo', { + guestData: { _id: visitorId }, + roomData: { _id: roomId, tags }, + }); + + if (response.status() !== 200) { + throw Error(`Unable to update room info [http status: ${response.status()}]`); + } + + return response; +}; + +export const closeRoom = async (api: BaseTest['api'], { roomId, visitorToken }: CloseRoomParams) => + api.post('/livechat/room.close', { rid: roomId, token: visitorToken }); + +export const createRoom = async (api: BaseTest['api'], { visitorToken, agentId }: CreateRoomParams) => { + const response = await api.get('/livechat/room', { + token: visitorToken, + agentId, + }); + + if (response.status() !== 200) { + throw Error(`Unable to create room [http status: ${response.status()}]`, { cause: await response.json() }); + } + + const { room } = await response.json(); + + return { + response, + data: room, + async delete() { + await closeRoom(api, { roomId: room._id, visitorToken }); + return api.post('/method.call/livechat:removeRoom', { + message: JSON.stringify({ + msg: 'method', + id: '16', + method: 'livechat:removeRoom', + params: [room._id], + }), + }); + }, + }; +}; + +export const createVisitor = async (api: BaseTest['api'], { name, token, departmentId }: CreateVisitorParams) => { + const response = await api.post('/livechat/visitor', { + visitor: { + name: name || faker.person.fullName(), + email: faker.internet.email(), + token, + ...(departmentId && { department: departmentId }), + }, + }); + + if (response.status() !== 200) { + throw Error(`Unable to create visitor [http status: ${response.status()}]`); + } + + const { visitor } = await response.json(); + + return { + response, + data: visitor, + delete: async () => api.delete(`/livechat/visitor/${token}`), + }; +}; + +export const sendMessageToRoom = async ( + api: BaseTest['api'], + { visitorToken, roomId, message }: { visitorToken: string; roomId: string; message?: string }, +) => { + const response = await api.post(`/livechat/message`, { + token: visitorToken, + rid: roomId, + msg: message || faker.lorem.sentence(), + }); + + if (response.status() !== 200) { + throw Error(`Unable to send message to room [http status: ${response.status()}]`); + } + + return response; +}; + +export const createConversation = async ( + api: BaseTest['api'], + { visitorName, visitorToken, agentId, departmentId }: CreateConversationParams = {}, +) => { + const token = visitorToken || faker.string.uuid(); + + const { data: visitor, delete: deleteVisitor } = await createVisitor(api, { token, name: visitorName, departmentId }); + const { data: room, delete: deleteRoom } = await createRoom(api, { visitorToken: token, agentId }); + await sendMessageToRoom(api, { visitorToken: token, roomId: room._id }); + + return { + data: { + room, + visitor, + }, + delete: async () => { + await deleteRoom(); + await deleteVisitor(); + }, + }; +}; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/tags.ts b/apps/meteor/tests/e2e/utils/omnichannel/tags.ts new file mode 100644 index 000000000000..2df9e57e1c7a --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/tags.ts @@ -0,0 +1,6 @@ +import { BaseTest } from '../test'; + +export const createTag = async (api: BaseTest['api'], name: string) => + api.post('/method.call/livechat:saveTag', { + message: JSON.stringify({ msg: 'method', id: '33', method: 'livechat:saveTag', params: [null, { name, description: '' }, []] }), + }); diff --git a/apps/meteor/tests/e2e/utils/omnichannel/units.ts b/apps/meteor/tests/e2e/utils/omnichannel/units.ts new file mode 100644 index 000000000000..fa872a37eae6 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/units.ts @@ -0,0 +1,55 @@ +import { faker } from '@faker-js/faker'; +import { IOmnichannelBusinessUnit } from '@rocket.chat/core-typings'; + +import { BaseTest } from '../test'; +import { parseMeteorResponse } from './utils'; + +type CreateUnitParams = { + id?: string | null; + name?: string; + visibility?: 'public' | 'private'; + monitors?: { monitorId: string; username: string }[]; + departments?: { departmentId: string }[]; +}; + +const removeUnit = async (api: BaseTest['api'], id: string) => + api.post('/method.call/omnichannel:removeUnit', { + message: JSON.stringify({ msg: 'method', id: '35', method: 'livechat:removeUnit', params: [id] }), + }); + +export const createOrUpdateUnit = async ( + api: BaseTest['api'], + { id = null, name, visibility, monitors, departments }: CreateUnitParams = {}, +) => { + const response = await api.post('/method.call/livechat:saveUnit', { + message: JSON.stringify({ + msg: 'method', + id: '34', + method: 'livechat:saveUnit', + params: [id, { name: name || faker.commerce.department(), visibility: visibility || 'public' }, monitors, departments], + }), + }); + + const unit = await parseMeteorResponse(response); + + return { + response, + data: unit, + delete: async () => removeUnit(api, unit?._id), + }; +}; + +export const fetchUnitMonitors = async (api: BaseTest['api'], unitId: string) => { + const response = await api.get(`/livechat/units/${unitId}/monitors`); + + if (response.status() !== 200) { + throw new Error(`Failed to fetch unit monitors [http status: ${response.status()}]`); + } + + const { monitors } = await response.json(); + + return { + response, + data: monitors, + }; +}; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/utils.ts b/apps/meteor/tests/e2e/utils/omnichannel/utils.ts new file mode 100644 index 000000000000..edecd3ea4ce3 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/omnichannel/utils.ts @@ -0,0 +1,18 @@ +import { APIResponse } from '@playwright/test'; +import { Serialized } from '@rocket.chat/core-typings'; + +export const parseMeteorResponse = async (response: APIResponse): Promise> => { + const { message, success } = await response.json(); + + if (!success) { + throw new Error(message); + } + + const { result, error } = JSON.parse(message); + + if (error) { + throw new Error(JSON.stringify(error)); + } + + return result; +}; diff --git a/apps/meteor/tests/e2e/utils/setUserPreferences.ts b/apps/meteor/tests/e2e/utils/setUserPreferences.ts new file mode 100644 index 000000000000..7be26ce4a894 --- /dev/null +++ b/apps/meteor/tests/e2e/utils/setUserPreferences.ts @@ -0,0 +1,7 @@ +import type { APIResponse } from '@playwright/test'; +import { UsersSetPreferencesParamsPOST } from '@rocket.chat/rest-typings'; + +import type { BaseTest } from './test'; + +export const setUserPreferences = (api: BaseTest['api'], preferences: UsersSetPreferencesParamsPOST['data']): Promise => + api.post(`/v1/users.setPreferences`, { data: preferences }); diff --git a/apps/meteor/tests/end-to-end/api/02-channels.js b/apps/meteor/tests/end-to-end/api/02-channels.js index 7cb2e2234e4e..f0f61aa5661e 100644 --- a/apps/meteor/tests/end-to-end/api/02-channels.js +++ b/apps/meteor/tests/end-to-end/api/02-channels.js @@ -61,6 +61,21 @@ describe('[Channels]', function () { await deleteUser(guestUser); }); + it(`should fail when trying to use an existing room's name`, async () => { + await request + .post(api('channels.create')) + .set(credentials) + .send({ + name: 'general', + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('errorType', 'error-duplicate-channel-name'); + }); + }); + it('should not add guest users to more rooms than defined in the license', async function () { // TODO this is not the right way to do it. We're doing this way for now just because we have separate CI jobs for EE and CE, // ideally we should have a single CI job that adds a license and runs both CE and EE tests. @@ -476,88 +491,117 @@ describe('[Channels]', function () { .end(done); }); - it('should succeed when joining code-free channel without join code', (done) => { - request - .post(api('channels.join')) - .set(credentials) - .send({ - roomId: testChannelNoCode._id, - }) - .expect('Content-Type', 'application/json') - .expect(200) - .expect((res) => { - expect(res.body).to.have.property('success', true); - expect(res.body).to.have.nested.property('channel._id', testChannelNoCode._id); - }) - .end(done); - }); - - it('should fail when joining code-needed channel without join code and no join-without-join-code permission', (done) => { - updatePermission('join-without-join-code', []).then(() => { - request - .post(api('channels.join')) - .set(credentials) - .send({ - roomId: testChannelWithCode._id, - }) - .expect('Content-Type', 'application/json') - .expect(400) - .expect((res) => { - expect(res.body).to.have.property('success', false); - expect(res.body).to.have.nested.property('errorType', 'error-code-invalid'); - }) - .end(done); - }); - }); - - it('should succeed when joining code-needed channel without join code and with join-without-join-code permission', (done) => { - updatePermission('join-without-join-code', ['admin']).then(() => { + describe('code-free channel', () => { + it('should succeed when joining code-free channel without join code', (done) => { request .post(api('channels.join')) .set(credentials) .send({ - roomId: testChannelWithCode._id, + roomId: testChannelNoCode._id, }) .expect('Content-Type', 'application/json') .expect(200) .expect((res) => { expect(res.body).to.have.property('success', true); - expect(res.body).to.have.nested.property('channel._id', testChannelWithCode._id); + expect(res.body).to.have.nested.property('channel._id', testChannelNoCode._id); }) .end(done); }); }); - it('leave channel', (done) => { - request - .post(api('channels.leave')) - .set(credentials) - .send({ - roomId: testChannelWithCode._id, - }) - .expect('Content-Type', 'application/json') - .expect(200) - .expect((res) => { - expect(res.body).to.have.property('success', true); - }) - .end(done); - }); + describe('code-needed channel', () => { + describe('without join-without-join-code permission', () => { + before('set join-without-join-code permission to false', async () => { + await updatePermission('join-without-join-code', []); + }); - it('should succeed when joining code-needed channel with join code', (done) => { - request - .post(api('channels.join')) - .set(credentials) - .send({ - roomId: testChannelWithCode._id, - joinCode: '123', - }) - .expect('Content-Type', 'application/json') - .expect(200) - .expect((res) => { - expect(res.body).to.have.property('success', true); - expect(res.body).to.have.nested.property('channel._id', testChannelWithCode._id); - }) - .end(done); + it('should fail when joining code-needed channel without join code and no join-without-join-code permission', (done) => { + request + .post(api('channels.join')) + .set(credentials) + .send({ + roomId: testChannelWithCode._id, + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('errorType', 'error-code-required'); + }) + .end(done); + }); + + it('should fail when joining code-needed channel with incorrect join code and no join-without-join-code permission', (done) => { + request + .post(api('channels.join')) + .set(credentials) + .send({ + roomId: testChannelWithCode._id, + joinCode: 'WRONG_CODE', + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('errorType', 'error-code-invalid'); + }) + .end(done); + }); + + it('should succeed when joining code-needed channel with join code', (done) => { + request + .post(api('channels.join')) + .set(credentials) + .send({ + roomId: testChannelWithCode._id, + joinCode: '123', + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('channel._id', testChannelWithCode._id); + }) + .end(done); + }); + }); + + describe('with join-without-join-code permission', () => { + before('set join-without-join-code permission to true', async () => { + await updatePermission('join-without-join-code', ['admin']); + }); + + before('leave channel', (done) => { + request + .post(api('channels.leave')) + .set(credentials) + .send({ + roomId: testChannelWithCode._id, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + }) + .end(done); + }); + + it('should succeed when joining code-needed channel without join code and with join-without-join-code permission', (done) => { + request + .post(api('channels.join')) + .set(credentials) + .send({ + roomId: testChannelWithCode._id, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('channel._id', testChannelWithCode._id); + }) + .end(done); + }); + }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/03-groups.js b/apps/meteor/tests/end-to-end/api/03-groups.js index 3941df1366eb..df736ecbeb86 100644 --- a/apps/meteor/tests/end-to-end/api/03-groups.js +++ b/apps/meteor/tests/end-to-end/api/03-groups.js @@ -171,6 +171,21 @@ describe('[Groups]', function () { }); }); }); + + it(`should fail when trying to use an existing room's name`, async () => { + await request + .post(api('groups.create')) + .set(credentials) + .send({ + name: 'general', + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.nested.property('errorType', 'error-duplicate-channel-name'); + }); + }); }); describe('/groups.info', () => { diff --git a/apps/meteor/tests/end-to-end/api/08-settings.js b/apps/meteor/tests/end-to-end/api/08-settings.js index de8a21ffac41..d517b60eea9d 100644 --- a/apps/meteor/tests/end-to-end/api/08-settings.js +++ b/apps/meteor/tests/end-to-end/api/08-settings.js @@ -2,6 +2,7 @@ import { expect } from 'chai'; import { before, describe, it } from 'mocha'; import { getCredentials, api, request, credentials } from '../../data/api-data.js'; +import { updateSetting } from '../../data/permissions.helper'; describe('[Settings]', function () { this.retries(0); @@ -84,6 +85,54 @@ describe('[Settings]', function () { }) .end(done); }); + + describe('With OAuth enabled', () => { + before((done) => { + updateSetting('Accounts_OAuth_Google', true).then(done); + }); + + it('should include the OAuth service in the response', (done) => { + // wait 3 seconds before getting the service list so the server has had time to update it + setTimeout(() => { + request + .get(api('service.configurations')) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('configurations'); + + expect(res.body.configurations.find(({ service }) => service === 'google')).to.exist; + }) + .end(done); + }, 3000); + }); + }); + + describe('With OAuth disabled', () => { + before((done) => { + updateSetting('Accounts_OAuth_Google', false).then(done); + }); + + it('should not include the OAuth service in the response', (done) => { + // wait 3 seconds before getting the service list so the server has had time to update it + setTimeout(() => { + request + .get(api('service.configurations')) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('configurations'); + + expect(res.body.configurations.find(({ service }) => service === 'google')).to.not.exist; + }) + .end(done); + }, 3000); + }); + }); }); describe('/settings.oauth', () => { diff --git a/apps/meteor/tests/end-to-end/api/09-rooms.js b/apps/meteor/tests/end-to-end/api/09-rooms.js index 533c0b63da44..c717e526d20c 100644 --- a/apps/meteor/tests/end-to-end/api/09-rooms.js +++ b/apps/meteor/tests/end-to-end/api/09-rooms.js @@ -174,7 +174,8 @@ describe('[Rooms]', function () { await request.get(fileOldUrl).set(credentials).expect('Content-Type', 'image/png').expect(200); }); - it('should be able to get the file when no access to the room', async () => { + it('should be able to get the file when no access to the room if setting allows it', async () => { + await updateSetting('FileUpload_Restrict_to_room_members', false); await request.get(fileNewUrl).set(userCredentials).expect('Content-Type', 'image/png').expect(200); await request.get(fileOldUrl).set(userCredentials).expect('Content-Type', 'image/png').expect(200); }); diff --git a/apps/meteor/tests/end-to-end/api/18-oauthapps.js b/apps/meteor/tests/end-to-end/api/18-oauthapps.js index e2100e0c1f75..83017a811047 100644 --- a/apps/meteor/tests/end-to-end/api/18-oauthapps.js +++ b/apps/meteor/tests/end-to-end/api/18-oauthapps.js @@ -63,6 +63,32 @@ describe('[OAuthApps]', function () { }) .end(done); }); + it('should return a 403 Forbidden error when the user does not have the necessary permission by client id', (done) => { + updatePermission('manage-oauth-apps', []).then(() => { + request + .get(api('oauth-apps.get?clientId=zapier')) + .set(credentials) + .expect(403) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('unauthorized'); + }) + .end(done); + }); + }); + it('should return a 403 Forbidden error when the user does not have the necessary permission by app id', (done) => { + updatePermission('manage-oauth-apps', []).then(() => { + request + .get(api('oauth-apps.get?appId=zapier')) + .set(credentials) + .expect(403) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('unauthorized'); + }) + .end(done); + }); + }); }); describe('[/oauth-apps.create]', () => { diff --git a/apps/meteor/tests/end-to-end/api/24-methods.js b/apps/meteor/tests/end-to-end/api/24-methods.js index 899eb0db7d5f..121a9a76dd7e 100644 --- a/apps/meteor/tests/end-to-end/api/24-methods.js +++ b/apps/meteor/tests/end-to-end/api/24-methods.js @@ -1,11 +1,14 @@ import { expect } from 'chai'; import { after, before, beforeEach, describe, it } from 'mocha'; -import { getCredentials, request, methodCall, api, credentials } from '../../data/api-data.js'; +import { api, credentials, getCredentials, methodCall, request } from '../../data/api-data.js'; +import { sendSimpleMessage } from '../../data/chat.helper.js'; import { CI_MAX_ROOMS_PER_GUEST as maxRoomsPerGuest } from '../../data/constants'; import { updatePermission, updateSetting } from '../../data/permissions.helper'; -import { createRoom } from '../../data/rooms.helper'; +import { createRoom, deleteRoom } from '../../data/rooms.helper'; +import { password } from '../../data/user'; import { createUser, deleteUser, login } from '../../data/users.helper.js'; +import { IS_EE } from '../../e2e/config/constants'; describe('Meteor.methods', function () { this.retries(0); @@ -123,6 +126,322 @@ describe('Meteor.methods', function () { }); }); + describe('[@getReadReceipts]', () => { + it('should fail if not logged in', async () => { + await request + .post(methodCall('getReadReceipts')) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: 'test' }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(401) + .expect((res) => { + expect(res.body).to.have.property('status', 'error'); + expect(res.body).to.have.property('message', 'You must be logged in to do this.'); + }); + }); + + (!IS_EE ? describe : describe.skip)('[@getReadReceipts] CE', () => { + it('should fail if there is no enterprise license', async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: 'test' }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const data = JSON.parse(res.body.message); + expect(data).to.have.property('error').that.is.an('object'); + expect(data.error).to.have.property('error', 'error-action-not-allowed'); + expect(data.error).to.have.property('message', 'This is an enterprise feature [error-action-not-allowed]'); + }); + }); + }); + + (IS_EE ? describe : describe.skip)('[@getReadReceipts] EE', () => { + let user = null; + let userCredentials = null; + let room = null; + let firstMessage = null; + let firstThreadMessage = null; + + const roomName = `methods-test-channel-${Date.now()}`; + before(async () => { + await updateSetting('Message_Read_Receipt_Enabled', true); + await updateSetting('Message_Read_Receipt_Store_Users', true); + + user = await createUser(); + userCredentials = await login(user.username, password); + room = (await createRoom({ type: 'p', name: roomName, members: [user.username] })).body.group; + firstMessage = (await sendSimpleMessage({ roomId: room._id })).body.message; + firstThreadMessage = (await sendSimpleMessage({ roomId: room._id, tmid: firstMessage._id })).body.message; + }); + + after(async () => { + await deleteRoom({ type: 'p', roomId: room._id }); + await deleteUser(user); + }); + + describe('simple message and thread that nobody has read yet', () => { + it("should return only the sender's read receipt for a message sent in the main room", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: firstMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(1); + expect(data.result[0]).to.have.property('userId', credentials['X-User-Id']); + }); + }); + + it("should return only the sender's read receipt for a message sent in a thread", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: firstThreadMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(1); + expect(data.result[0]).to.have.property('userId', credentials['X-User-Id']); + }); + }); + }); + + describe('simple message and thread where the room message was read by the invited user but the thread message was not', () => { + before("should read all main room's messages with the invited user", async () => { + await request + .post(methodCall('readMessages')) + .set(userCredentials) + .send({ + message: JSON.stringify({ + id: 'id', + msg: 'method', + method: 'readMessages', + params: [room._id, true], + }), + }); + }); + + it("should return both the sender's and the invited user's read receipt for a message sent in the main room", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: firstMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(2); + + const receiptsUserIds = [data.result[0].userId, data.result[1].userId]; + expect(receiptsUserIds).to.have.members([credentials['X-User-Id'], user._id]); + }); + }); + + it("should return only the sender's read receipt for a message sent in a thread", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: firstThreadMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(1); + expect(data.result[0]).to.have.property('userId', credentials['X-User-Id']); + }); + }); + }); + + describe('simple message and thread where both was read by the invited user', () => { + before('should read thread messages with the invited user', async () => { + await request + .post(methodCall('getThreadMessages')) + .set(userCredentials) + .send({ + message: JSON.stringify({ + id: 'id', + msg: 'method', + method: 'getThreadMessages', + params: [ + { + tmid: firstMessage._id, + }, + ], + }), + }); + }); + + it("should return both the sender's and invited user's read receipt for a message sent in a thread", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: firstThreadMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(2); + + const receiptsUserIds = [data.result[0].userId, data.result[1].userId]; + expect(receiptsUserIds).to.have.members([credentials['X-User-Id'], user._id]); + }); + }); + }); + + describe('simple message and thread marked as read by the invited user', () => { + let otherMessage = null; + let otherThreadMessage = null; + + before('should send another message and create a thread', async () => { + otherMessage = (await sendSimpleMessage({ roomId: room._id })).body.message; + otherThreadMessage = (await sendSimpleMessage({ roomId: room._id, tmid: otherMessage._id })).body.message; + }); + + before('should mark the thread as read by the invited user', async () => { + await request + .post(methodCall('readThreads')) + .set(userCredentials) + .send({ + message: JSON.stringify({ + method: 'readThreads', + params: [otherMessage._id], + id: 'id', + msg: 'method', + }), + }); + }); + + it("should return both the sender's and invited user's read receipt for a message sent in the main room", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: otherThreadMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(2); + + const receiptsUserIds = [data.result[0].userId, data.result[1].userId]; + expect(receiptsUserIds).to.have.members([credentials['X-User-Id'], user._id]); + }); + }); + + it("should return both the sender's and invited user's read receipt for a message sent in a thread", async () => { + await request + .post(methodCall('getReadReceipts')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'getReadReceipts', + params: [{ messageId: otherThreadMessage._id }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('result').that.is.an('array'); + expect(data.result.length).to.equal(2); + + const receiptsUserIds = [data.result[0].userId, data.result[1].userId]; + expect(receiptsUserIds).to.have.members([credentials['X-User-Id'], user._id]); + }); + }); + }); + }); + }); + describe('[@getMessages]', () => { let rid = false; let firstMessage = false; diff --git a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts index 8dcbad118217..0d9e5fff0a65 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts @@ -30,10 +30,12 @@ import { startANewLivechatRoomAndTakeIt, createManager, closeOmnichannelRoom, + createDepartment, + fetchMessages, } from '../../../data/livechat/rooms'; import { saveTags } from '../../../data/livechat/tags'; import type { DummyResponse } from '../../../data/livechat/utils'; -import { sleep } from '../../../data/livechat/utils'; +import { parseMethodResponse, sleep } from '../../../data/livechat/utils'; import { restorePermissionToRoles, addPermissions, @@ -732,6 +734,65 @@ describe('LIVECHAT - rooms', function () { expect((latestRoom.lastMessage as any)?.transferData?.scope).to.be.equal('department'); expect((latestRoom.lastMessage as any)?.transferData?.nextDepartment?._id).to.be.equal(forwardToDepartment._id); }); + let roomId: string; + let visitorToken: string; + (IS_EE ? it : it.skip)('should return a success message when transferring to a fallback department', async () => { + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + const { department: initialDepartment } = await createDepartmentWithAnOnlineAgent(); + const { department: forwardToDepartment } = await createDepartmentWithAnOnlineAgent(); + const forwardToDepartment1 = await createDepartment(undefined, undefined, true, { + fallbackForwardDepartment: forwardToDepartment._id, + }); + + const newVisitor = await createVisitor(initialDepartment._id); + const newRoom = await createLivechatRoom(newVisitor.token); + + await request + .post(api('livechat/room.forward')) + .set(credentials) + .send({ + roomId: newRoom._id, + departmentId: forwardToDepartment1._id, + clientAction: true, + comment: 'test comment', + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + console.log({ res: res.body }); + expect(res.body).to.have.property('success', true); + }); + + const latestRoom = await getLivechatRoomInfo(newRoom._id); + + expect(latestRoom).to.have.property('departmentId'); + expect(latestRoom.departmentId).to.be.equal(forwardToDepartment._id); + + expect(latestRoom).to.have.property('lastMessage'); + expect(latestRoom.lastMessage?.t).to.be.equal('livechat_transfer_history'); + expect(latestRoom.lastMessage?.u?.username).to.be.equal(adminUsername); + expect((latestRoom.lastMessage as any)?.transferData?.comment).to.be.equal('test comment'); + expect((latestRoom.lastMessage as any)?.transferData?.scope).to.be.equal('department'); + expect((latestRoom.lastMessage as any)?.transferData?.nextDepartment?._id).to.be.equal(forwardToDepartment._id); + + roomId = newRoom._id; + visitorToken = newVisitor.token; + }); + (IS_EE ? it : it.skip)('system messages sent on transfer should be properly generated', async () => { + const messagesList = await fetchMessages(roomId, visitorToken); + + const fallbackMessages = messagesList.filter((m) => m.t === 'livechat_transfer_history_fallback'); + expect(fallbackMessages.length).to.be.equal(1); + + const userJoinedMessages = messagesList.filter((m) => m.t === 'uj'); + expect(userJoinedMessages.length).to.be.equal(2); + + const transferMessages = messagesList.filter((m) => m.t === 'livechat_transfer_history'); + expect(transferMessages.length).to.be.equal(1); + + const userLeavingMessages = messagesList.filter((m) => m.t === 'ul'); + expect(userLeavingMessages.length).to.be.equal(1); + }); }); describe('livechat/room.survey', () => { @@ -1122,100 +1183,6 @@ describe('LIVECHAT - rooms', function () { }); }); - describe('livechat/messages.history/rid', () => { - it('should fail if token is not sent as query param', async () => { - await request.get(api('livechat/messages.history/test')).set(credentials).expect('Content-Type', 'application/json').expect(400); - }); - it('should fail if token is not a valid guest token', async () => { - await request - .get(api('livechat/messages.history/test')) - .set(credentials) - .query({ token: 'test' }) - .expect('Content-Type', 'application/json') - .expect(400); - }); - it('should fail if token is good, but rid is not valid', async () => { - const visitor = await createVisitor(); - await request - .get(api('livechat/messages.history/fadsfdsafads')) - .set(credentials) - .query({ token: visitor.token }) - .expect('Content-Type', 'application/json') - .expect(400); - }); - it('should return message history for a valid room', async () => { - const visitor = await createVisitor(); - const room = await createLivechatRoom(visitor.token); - await sendMessage(room._id, 'Hello', visitor.token); - - const { body } = await request - .get(api(`livechat/messages.history/${room._id}`)) - .set(credentials) - .query({ token: visitor.token }) - .expect('Content-Type', 'application/json') - .expect(200); - - expect(body).to.have.property('success', true); - expect(body).to.have.property('messages'); - expect(body.messages).to.be.an('array'); - expect(body.messages.length <= 4).to.be.true; - expect(body.messages[0]).to.have.property('msg', 'Hello'); - expect(body.messages[1]).to.have.property('t'); - }); - it('should return message history for a valid room with pagination', async () => { - const visitor = await createVisitor(); - const room = await createLivechatRoom(visitor.token); - await sendMessage(room._id, 'Hello', visitor.token); - - const { body } = await request - .get(api(`livechat/messages.history/${room._id}`)) - .set(credentials) - .query({ token: visitor.token, limit: 1 }) - .expect('Content-Type', 'application/json') - .expect(200); - - expect(body).to.have.property('success', true); - expect(body).to.have.property('messages').of.length(1); - expect(body.messages[0]).to.have.property('msg', 'Hello'); - }); - it('should return message history for a valid room with pagination and offset', async () => { - const visitor = await createVisitor(); - const room = await createLivechatRoom(visitor.token); - await sendMessage(room._id, 'Hello', visitor.token); - - const { body } = await request - .get(api(`livechat/messages.history/${room._id}`)) - .set(credentials) - .query({ token: visitor.token, limit: 1, offset: 1 }) - .expect('Content-Type', 'application/json') - .expect(200); - - expect(body).to.have.property('success', true); - expect(body).to.have.property('messages').of.length(1); - expect(body.messages[0]).to.have.property('t'); - }); - it('should return message history for a valid date filtering (max date)', async () => { - const visitor = await createVisitor(); - const room = await createLivechatRoom(visitor.token); - await sendMessage(room._id, 'Hello', visitor.token); - const sendMessageTs = new Date(); - await sendMessage(room._id, 'Hello2', visitor.token); - - const { body } = await request - .get(api(`livechat/messages.history/${room._id}`)) - .set(credentials) - .query({ token: visitor.token, end: sendMessageTs.toISOString() }) - .expect('Content-Type', 'application/json') - .expect(200); - - expect(body).to.have.property('success', true); - expect(body).to.have.property('messages').that.is.an('array'); - expect(body.messages.length <= 4).to.be.true; - expect(body.messages[0]).to.have.property('msg', 'Hello'); - expect(body.messages[1]).to.have.property('t'); - }); - }); - describe('livechat/messages', () => { it('should fail if visitor is not sent as body param', async () => { await request.post(api('livechat/messages')).set(credentials).expect('Content-Type', 'application/json').expect(400); @@ -2097,4 +2064,143 @@ describe('LIVECHAT - rooms', function () { .expect(200); }); }); + + describe('livechat:sendTranscript', () => { + it('should fail if user doesnt have send-omnichannel-chat-transcript permission', async () => { + await updatePermission('send-omnichannel-chat-transcript', []); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: ['test', 'test', 'test', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object').that.has.property('error', 'error-not-allowed'); + }); + it('should fail if not all params are provided', async () => { + await updatePermission('send-omnichannel-chat-transcript', ['admin']); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: [], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object').that.has.property('errorType', 'Match.Error'); + }); + it('should fail if token is invalid', async () => { + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: ['invalid-token', 'test', 'test', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object'); + }); + it('should fail if roomId is invalid', async () => { + const visitor = await createVisitor(); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: [visitor.token, 'invalid-room-id', 'test', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object'); + }); + it('should fail if token is from another conversation', async () => { + const visitor = await createVisitor(); + const visitor2 = await createVisitor(); + const { _id } = await createLivechatRoom(visitor.token); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: [visitor2.token, _id, 'test', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object'); + }); + it('should fail if email provided is invalid', async () => { + const visitor = await createVisitor(); + const { _id } = await createLivechatRoom(visitor.token); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: [visitor.token, _id, 'invalid-email', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('error').that.is.an('object'); + }); + it('should work if all params are good', async () => { + const visitor = await createVisitor(); + const { _id } = await createLivechatRoom(visitor.token); + const { body } = await request + .post(methodCall('livechat:sendTranscript')) + .set(credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: '1091', + method: 'livechat:sendTranscript', + params: [visitor.token, _id, 'test@test', 'test'], + }), + }) + .expect(200); + + const result = parseMethodResponse(body); + expect(body.success).to.be.true; + expect(result).to.have.property('result', true); + }); + }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts b/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts index 6f9120ea9094..141cfec1f73d 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts @@ -1,4 +1,4 @@ -import type { ILivechatAgent, ILivechatDepartment, IUser } from '@rocket.chat/core-typings'; +import { UserStatus, type ILivechatAgent, type ILivechatDepartment, type IRoom, type IUser } from '@rocket.chat/core-typings'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; import type { Response } from 'supertest'; @@ -13,10 +13,14 @@ import { takeInquiry, fetchInquiry, makeAgentAvailable, + startANewLivechatRoomAndTakeIt, + moveBackToQueue, + closeOmnichannelRoom, } from '../../../data/livechat/rooms'; import { updatePermission, updateSetting } from '../../../data/permissions.helper'; +import type { IUserCredentialsHeader } from '../../../data/user'; import { password } from '../../../data/user'; -import { createUser, deleteUser, getMe, login } from '../../../data/users.helper'; +import { createUser, deleteUser, getMe, login, setUserStatus } from '../../../data/users.helper'; describe('LIVECHAT - Agents', function () { this.retries(0); @@ -114,6 +118,68 @@ describe('LIVECHAT - Agents', function () { expect(res.body.users.every((u: { statusLivechat: string }) => u.statusLivechat === 'available')).to.be.true; }); }); + it('should return an array of available/unavailable agents when onlyAvailable is false', async () => { + await request + .get(api('livechat/users/agent')) + .set(credentials) + .expect('Content-Type', 'application/json') + .query({ onlyAvailable: false }) + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body.users).to.be.an('array'); + expect(res.body).to.have.property('offset'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('count'); + expect( + res.body.users.every( + (u: { statusLivechat: string }) => !u.statusLivechat || ['available', 'not-available'].includes(u.statusLivechat), + ), + ).to.be.true; + }); + }); + + it('should return offline agents when showIdleAgents is true', async () => { + await setUserStatus(agent2.credentials, UserStatus.OFFLINE); + await request + .get(api('livechat/users/agent')) + .set(credentials) + .expect('Content-Type', 'application/json') + .query({ showIdleAgents: true }) + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body.users).to.be.an('array'); + expect(res.body).to.have.property('offset'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('count'); + expect( + res.body.users.every( + (u: { status: UserStatus }) => + !u.status || [UserStatus.ONLINE, UserStatus.OFFLINE, UserStatus.AWAY, UserStatus.BUSY].includes(u.status), + ), + ).to.be.true; + }); + }); + + it('should return only online agents when showIdleAgents is false', async () => { + await setUserStatus(agent2.credentials, UserStatus.ONLINE); + await request + .get(api('livechat/users/agent')) + .set(credentials) + .expect('Content-Type', 'application/json') + .query({ showIdleAgents: false }) + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body.users).to.be.an('array'); + expect(res.body).to.have.property('offset'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('count'); + expect(res.body.users.every((u: { status: UserStatus }) => u.status !== UserStatus.OFFLINE)).to.be.true; + }); + }); + it('should return an array of managers', async () => { await updatePermission('view-livechat-manager', ['admin']); await updatePermission('manage-livechat-agents', ['admin']); @@ -196,6 +262,27 @@ describe('LIVECHAT - Agents', function () { // cleanup await deleteUser(user); }); + + it('should properly create a manager', async () => { + const user: IUser = await createUser(); + await request + .post(api('livechat/users/manager')) + .set(credentials) + .send({ + username: user.username, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('user'); + expect(res.body.user).to.have.property('_id'); + expect(res.body.user).to.have.property('username'); + }); + + // cleanup + await deleteUser(user); + }); }); describe('GET livechat/users/:type/:_id', () => { @@ -501,4 +588,66 @@ describe('LIVECHAT - Agents', function () { await disableDefaultBusinessHour(); }); }); + + describe('Agent sidebar', () => { + let testUser: { user: IUser; credentials: IUserCredentialsHeader }; + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + after(async () => { + await deleteUser(testUser.user._id); + }); + + it('should return an empty list of rooms for a newly created agent', async () => { + const { body } = await request.get(api('rooms.get')).set(testUser.credentials).send({}).expect(200); + + expect(body).to.have.property('success', true); + expect(body.update.filter((r: IRoom) => r.t === 'l')).to.have.lengthOf(0); + }); + + it('should have a new room in his sidebar after taking a conversation from the queue', async () => { + const { room } = await startANewLivechatRoomAndTakeIt({ agent: testUser.credentials }); + + const { body } = await request.get(api('rooms.get')).set(testUser.credentials).send({}).expect(200); + + expect(body).to.have.property('success', true); + const livechatRooms = body.update.filter((r: IRoom) => r.t === 'l'); + expect(livechatRooms).to.have.lengthOf(1); + expect(body.update.find((r: { _id: string }) => r._id === room._id)).to.be.an('object'); + expect(body.update.find((r: { _id: string }) => r._id === 'GENERAL')).to.be.an('object'); + }); + + it('should not have the room if user moves room back to queue', async () => { + const { room } = await startANewLivechatRoomAndTakeIt({ agent: testUser.credentials }); + + await moveBackToQueue(room._id, testUser.credentials); + + const { body } = await request + .get(api('rooms.get')) + .set(testUser.credentials) + .query({ updatedSince: new Date(new Date().getTime() - 2000) }) + .expect(200); + + expect(body).to.have.property('success', true); + expect(body.update.find((r: { _id: string }) => r._id === room._id)).to.be.undefined; + }); + + it('should not have the room if the user closes the room', async () => { + const { room } = await startANewLivechatRoomAndTakeIt({ agent: testUser.credentials }); + + await closeOmnichannelRoom(room._id); + + const { body } = await request.get(api('rooms.get')).set(testUser.credentials).expect(200); + + expect(body.update.find((r: { _id: string }) => r._id === room._id)).to.be.undefined; + }); + }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts b/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts index 6df7919bea0b..e949ef706319 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/02-appearance.ts @@ -80,5 +80,41 @@ describe('LIVECHAT - appearance', function () { .send([{ _id: 'Livechat_title', value: 'test' }]) .expect(200); }); + // Test for: https://github.com/ajv-validator/ajv/issues/1140 + it('should update a boolean setting and keep it as boolean', async () => { + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_registration_form', value: true }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.registrationForm).to.be.true; + }); + it('should update a boolean setting and keep it as boolean', async () => { + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_registration_form', value: false }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.registrationForm).to.be.false; + }); + it('should update a number setting and keep it as number', async () => { + await updateSetting('Livechat_enable_message_character_limit', true); + await request + .post(api('livechat/appearance')) + .set(credentials) + .send([{ _id: 'Livechat_message_character_limit', value: 100 }]) + .expect(200); + + // Get data from livechat/config + const { body } = await request.get(api('livechat/config')).set(credentials).expect(200); + expect(body.config.settings.limitTextLength).to.be.equal(100); + await updateSetting('Livechat_enable_message_character_limit', false); + }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/04-dashboards.ts b/apps/meteor/tests/end-to-end/api/livechat/04-dashboards.ts index c12b875783ab..b7ddd493acab 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/04-dashboards.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/04-dashboards.ts @@ -93,8 +93,6 @@ describe('LIVECHAT - dashboards', function () { const { department: createdDept, agent: agent1 } = await createDepartmentWithAnOnlineAgent(); department = createdDept; - console.log('department', department.name); - const agent2 = await createAnOnlineAgent(); await addOrRemoveAgentFromDepartment(department._id, { agentId: agent2.user._id, username: agent2.user.username }, true); agents.push(agent1); @@ -196,13 +194,11 @@ describe('LIVECHAT - dashboards', function () { }); const minMessages = TOTAL_MESSAGES.min * TOTAL_ROOMS; - const maxMessages = TOTAL_MESSAGES.max * TOTAL_ROOMS; const totalMessages = result.body.totalizers.find((item: any) => item.title === 'Total_messages'); expect(totalMessages).to.not.be.undefined; const totalMessagesValue = parseInt(totalMessages.value); expect(totalMessagesValue).to.be.greaterThanOrEqual(minMessages); - expect(totalMessagesValue).to.be.lessThanOrEqual(maxMessages); }); }); @@ -784,9 +780,9 @@ describe('LIVECHAT - dashboards', function () { { title: 'Open_conversations', value: 4 }, { title: 'On_Hold_conversations', value: 1 }, // { title: 'Total_messages', value: 6 }, - // { title: 'Busiest_day', value: moment().format('dddd') }, // TODO: need to check y this return a day before + // { title: 'Busiest_day', value: moment().format('dddd') }, { title: 'Conversations_per_day', value: '3.50' }, - { title: 'Busiest_time', value: '- -' }, + // { title: 'Busiest_time', value: '' }, ]; expectedResult.forEach((expected) => { @@ -796,13 +792,11 @@ describe('LIVECHAT - dashboards', function () { }); const minMessages = TOTAL_MESSAGES.min * TOTAL_ROOMS; - const maxMessages = TOTAL_MESSAGES.max * TOTAL_ROOMS; const totalMessages = result.body.find((item: any) => item.title === 'Total_messages'); expect(totalMessages).to.not.be.undefined; const totalMessagesValue = parseInt(totalMessages.value); expect(totalMessagesValue).to.be.greaterThanOrEqual(minMessages); - expect(totalMessagesValue).to.be.lessThanOrEqual(maxMessages); }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/05-inquiries.ts b/apps/meteor/tests/end-to-end/api/livechat/05-inquiries.ts index 1900c55f2393..06b54a4bf10c 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/05-inquiries.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/05-inquiries.ts @@ -1,11 +1,26 @@ -import type { ILivechatInquiryRecord } from '@rocket.chat/core-typings'; +import type { ILivechatInquiryRecord, IUser } from '@rocket.chat/core-typings'; import { expect } from 'chai'; -import { before, describe, it } from 'mocha'; +import { before, describe, it, after } from 'mocha'; import type { Response } from 'supertest'; -import { getCredentials, api, request, credentials } from '../../../data/api-data'; -import { createAgent, createLivechatRoom, createVisitor, fetchInquiry, makeAgentAvailable } from '../../../data/livechat/rooms'; -import { updatePermission, updateSetting } from '../../../data/permissions.helper'; +import { getCredentials, api, request, credentials, methodCall } from '../../../data/api-data'; +import { + closeOmnichannelRoom, + createAgent, + createDepartment, + createLivechatRoom, + createVisitor, + fetchInquiry, + getLivechatRoomInfo, + makeAgentAvailable, + takeInquiry, +} from '../../../data/livechat/rooms'; +import { parseMethodResponse } from '../../../data/livechat/utils'; +import { removePermissionFromAllRoles, restorePermissionToRoles, updatePermission, updateSetting } from '../../../data/permissions.helper'; +import type { IUserCredentialsHeader } from '../../../data/user'; +import { password } from '../../../data/user'; +import { createUser, login, deleteUser } from '../../../data/users.helper'; +import { IS_EE } from '../../../e2e/config/constants'; describe('LIVECHAT - inquiries', function () { this.retries(0); @@ -124,7 +139,7 @@ describe('LIVECHAT - inquiries', function () { .send({ inquiryId: 'room-id' }) .expect('Content-Type', 'application/json') .expect(403); - }).timeout(5000); + }); it('should throw an error when userId is provided but is invalid', async () => { await updatePermission('view-l-room', ['admin', 'livechat-agent']); await request @@ -137,7 +152,6 @@ describe('LIVECHAT - inquiries', function () { expect(res.body).to.have.property('success', false); }); }); - it('should throw an error if inquiryId is not an string', async () => { await updatePermission('view-l-room', ['admin', 'livechat-agent']); await request @@ -150,7 +164,6 @@ describe('LIVECHAT - inquiries', function () { expect(res.body).to.have.property('success', false); }); }); - it('should take an inquiry if all params are good', async () => { await updatePermission('view-l-room', ['admin', 'livechat-agent']); const agent = await createAgent(); @@ -174,16 +187,58 @@ describe('LIVECHAT - inquiries', function () { const inquiry2 = (await fetchInquiry(room._id)) as ILivechatInquiryRecord; expect(inquiry2.source?.type).to.equal('api'); expect(inquiry2.status).to.equal('taken'); - }).timeout(5000); + }); + it('should mark a taken room as servedBy me', async () => { + const agent = await createAgent(); + const visitor = await createVisitor(); + await makeAgentAvailable(); + const room = await createLivechatRoom(visitor.token); + const inquiry = await fetchInquiry(room._id); + + await request + .post(api('livechat/inquiries.take')) + .set(credentials) + .send({ + inquiryId: inquiry._id, + userId: agent._id, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + }); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo).to.have.property('servedBy').that.is.an('object'); + expect(roomInfo.servedBy).to.have.property('_id', 'rocketchat.internal.admin.test'); + }); }); describe('livechat/inquiries.queuedForUser', () => { + let testUser: { user: IUser; credentials: { [key: string]: string } }; + before(async () => { + await updateSetting('Livechat_accept_chats_with_no_agents', true); + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + after(async () => { + await updateSetting('Livechat_accept_chats_with_no_agents', false); + await deleteUser(testUser.user._id); + }); it('should return an "unauthorized error" when the user does not have the necessary permission', async () => { await updatePermission('view-l-room', []); await request.get(api('livechat/inquiries.queued')).set(credentials).expect('Content-Type', 'application/json').expect(403); }); it('should return an array of inquiries', async () => { - await updatePermission('view-l-room', ['admin']); + await restorePermissionToRoles('view-l-room'); await request .get(api('livechat/inquiries.queuedForUser')) .set(credentials) @@ -211,5 +266,209 @@ describe('LIVECHAT - inquiries', function () { } }); }); + it('should return only public inquiries for a user with no departments', async () => { + const { body } = await request + .get(api('livechat/inquiries.queuedForUser')) + .set(testUser.credentials) + .expect('Content-Type', 'application/json') + .expect(200); + expect(body).to.have.property('success', true); + expect(body.inquiries).to.be.an('array'); + for (const inq of body.inquiries) { + expect(inq).to.not.have.property('department'); + expect(inq).to.have.property('status', 'queued'); + } + }); + (IS_EE ? it : it.skip)('should return inquiries of the same department as the user', async () => { + const dep = await createDepartment([{ agentId: testUser.user._id }]); + const visitor = await createVisitor(dep._id); + await createLivechatRoom(visitor.token); + + const { body } = await request + .get(api('livechat/inquiries.queuedForUser')) + .set(testUser.credentials) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body).to.have.property('success', true); + expect(body.inquiries).to.be.an('array'); + const depInq = body.inquiries.filter((inq: { department: string }) => inq.department === dep._id); + + expect(depInq.length).to.be.equal(1); + }); + (IS_EE ? it : it.skip)('should not return an inquiry of a department the user is not part of', async () => { + const dep = await createDepartment(); + const visitor = await createVisitor(dep._id); + await createLivechatRoom(visitor.token); + + const { body } = await request + .get(api('livechat/inquiries.queuedForUser')) + .set(testUser.credentials) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body).to.have.property('success', true); + expect(body.inquiries).to.be.an('array'); + const depInq = body.inquiries.filter((inq: { department: string }) => inq.department === dep._id); + + expect(depInq.length).to.be.equal(0); + }); + }); + + describe('livechat:returnAsInquiry', () => { + let testUser: { user: IUser; credentials: IUserCredentialsHeader }; + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + after(async () => { + await deleteUser(testUser.user._id); + }); + + it('should throw an error if user doesnt have view-l-room permission', async () => { + await removePermissionFromAllRoles('view-l-room'); + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: ['test'], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + + expect(response.error.error).to.be.equal('error-not-allowed'); + }); + it('should fail if provided room doesnt exists', async () => { + await restorePermissionToRoles('view-l-room'); + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: ['test'], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + expect(response.error.error).to.be.equal('error-invalid-room'); + }); + it('should fail if room is not a livechat room', async () => { + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: ['GENERAL'], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + expect(response.error.error).to.be.equal('error-invalid-room'); + }); + it('should fail if room is closed', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await closeOmnichannelRoom(room._id); + + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: [room._id], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + expect(response.error.error).to.be.equal('room-closed'); + }); + it('should fail if no one is serving the room', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: [room._id], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + expect(response.result).to.be.false; + }); + + let inquiry: ILivechatInquiryRecord; + (IS_EE ? it : it.skip)('should move a room back to queue', async () => { + const dep = await createDepartment([{ agentId: testUser.user._id }]); + const visitor = await createVisitor(dep._id); + const room = await createLivechatRoom(visitor.token); + const inq = await fetchInquiry(room._id); + inquiry = inq; + await takeInquiry(inq._id, testUser.credentials); + + const { body } = await request + .post(methodCall('livechat:returnAsInquiry')) + .set(testUser.credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:returnAsInquiry', + params: [room._id], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const response = parseMethodResponse(body); + expect(response.result).to.be.true; + }); + (IS_EE ? it : it.skip)('should appear on users queued elements', async () => { + const { body } = await request + .get(api('livechat/inquiries.queuedForUser')) + .set(testUser.credentials) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body.inquiries).to.be.an('array'); + const depInq = body.inquiries.filter((inq: { _id: string }) => inq._id === inquiry._id); + + expect(depInq.length).to.be.equal(1); + }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts b/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts index 55ef4402da39..372f7ddf5d7b 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts @@ -6,6 +6,7 @@ import moment from 'moment'; import { type Response } from 'supertest'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; +import { getLicenseInfo } from '../../../data/licenses.helper'; import { createCustomField, deleteCustomField } from '../../../data/livechat/custom-fields'; import { makeAgentAvailable, @@ -43,6 +44,10 @@ describe('LIVECHAT - visitors', function () { const { body } = await request.post(api('livechat/visitor')).send({ visitor: {} }); expect(body).to.have.property('success', false); }); + it('should fail when token is an empty string', async () => { + const { body } = await request.post(api('livechat/visitor')).send({ visitor: { token: '' } }); + expect(body).to.have.property('success', false); + }); it('should create a visitor', async () => { const { body } = await request.post(api('livechat/visitor')).send({ visitor: { token: 'test' } }); expect(body).to.have.property('success', true); @@ -305,6 +310,7 @@ describe('LIVECHAT - visitors', function () { }); it("should return a 'visitor-has-open-rooms' error when there are open rooms", async () => { + await updateSetting('Livechat_Allow_collect_and_store_HTTP_header_informations', false); const createdVisitor = await createVisitor(); await createLivechatRoom(createdVisitor.token); @@ -319,6 +325,18 @@ describe('LIVECHAT - visitors', function () { }); }); + it("should not return a 'visitor-has-open-rooms' when visitor has open rooms but GDPR is enabled", async () => { + await updateSetting('Livechat_Allow_collect_and_store_HTTP_header_informations', true); + const createdVisitor = await createVisitor(); + await createLivechatRoom(createdVisitor.token); + + await request + .delete(api(`livechat/visitor/${createdVisitor.token}`)) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200); + }); + it('should return a visitor when the query params is all valid', async () => { const createdVisitor = await createVisitor(); await request @@ -356,6 +374,41 @@ describe('LIVECHAT - visitors', function () { expect(activeVisitor.activity).to.include(period); }); + it('should not affect MAC count when a visitor is removed via GDPR', async () => { + const { visitor, room } = await startANewLivechatRoomAndTakeIt(); + // agent should send a message on the room + await request + .post(api('chat.sendMessage')) + .set(credentials) + .send({ + message: { + rid: room._id, + msg: 'test', + }, + }); + const { body: currentLicense } = await getLicenseInfo(true); + + await request + .delete(api(`livechat/visitor/${visitor.token}`)) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200); + + const { body: licenseAfterGdpr } = await getLicenseInfo(true); + + expect(currentLicense.license).to.have.property('limits'); + expect(currentLicense.license.limits).to.have.property('monthlyActiveContacts'); + expect(currentLicense.license.limits.monthlyActiveContacts).to.have.property('value'); + const currentLimit = currentLicense.license.limits.monthlyActiveContacts.value; + + expect(licenseAfterGdpr.license).to.have.property('limits'); + expect(licenseAfterGdpr.license.limits).to.have.property('monthlyActiveContacts'); + expect(licenseAfterGdpr.license.limits.monthlyActiveContacts).to.have.property('value'); + const limitAfterGdpr = licenseAfterGdpr.license.limits.monthlyActiveContacts.value; + + expect(limitAfterGdpr).to.be.equal(currentLimit); + }); + it("should return a 'error-removing-visitor' error when removeGuest's result is false", async () => { await request .delete(api('livechat/visitor/123')) diff --git a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts index be750010dfb9..538ae040fde6 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/10-departments.ts @@ -1,6 +1,7 @@ +import { faker } from '@faker-js/faker'; import type { ILivechatDepartment } from '@rocket.chat/core-typings'; import { expect } from 'chai'; -import { before, describe, it } from 'mocha'; +import { before, describe, it, after } from 'mocha'; import type { Response } from 'supertest'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; @@ -14,10 +15,71 @@ import { getLivechatRoomInfo, } from '../../../data/livechat/rooms'; import { createMonitor, createUnit } from '../../../data/livechat/units'; -import { updatePermission, updateSetting } from '../../../data/permissions.helper'; +import { restorePermissionToRoles, updatePermission, updateSetting } from '../../../data/permissions.helper'; import { createUser, deleteUser } from '../../../data/users.helper'; import { IS_EE } from '../../../e2e/config/constants'; +(IS_EE ? describe.skip : describe)('LIVECHAT - Departments[CE]', () => { + before((done) => getCredentials(done)); + + before(async () => { + await updateSetting('Livechat_enabled', true); + await restorePermissionToRoles('view-livechat-manager'); + await createAgent(); + await makeAgentAvailable(); + await updateSetting('Omnichannel_enable_department_removal', true); + }); + + // Remove departments that may have been created before + before(async () => { + const { body } = await request.get(api('livechat/department')).set(credentials).expect('Content-Type', 'application/json').expect(200); + + for await (const department of body.departments) { + await deleteDepartment(department._id); + } + }); + + let departmentId: string; + + after(async () => { + await deleteDepartment(departmentId); + }); + + it('should create a new department', async () => { + const { body } = await request + .post(api('livechat/department')) + .set(credentials) + .send({ department: { name: 'Test', enabled: true, showOnOfflineForm: true, showOnRegistration: true, email: 'bla@bla' } }) + .expect('Content-Type', 'application/json') + .expect(200); + expect(body).to.have.property('success', true); + expect(body).to.have.property('department'); + expect(body.department).to.have.property('_id'); + expect(body.department).to.have.property('name', 'Test'); + expect(body.department).to.have.property('enabled', true); + expect(body.department).to.have.property('showOnOfflineForm', true); + expect(body.department).to.have.property('showOnRegistration', true); + departmentId = body.department._id; + }); + + it('should not create a 2nd department', () => { + return request + .post(api('livechat/department')) + .set(credentials) + .send({ department: { name: 'Test', enabled: true, showOnOfflineForm: true, showOnRegistration: true, email: 'bla@bla' } }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + + it('should return a list of 1 department', async () => { + const { body } = await request.get(api('livechat/department')).set(credentials).expect('Content-Type', 'application/json').expect(200); + expect(body).to.have.property('success', true); + expect(body).to.have.property('departments'); + expect(body.departments).to.be.an('array'); + expect(body.departments).to.have.lengthOf(1); + }); +}); + (IS_EE ? describe : describe.skip)('LIVECHAT - Departments', () => { before((done) => getCredentials(done)); @@ -51,6 +113,72 @@ import { IS_EE } from '../../../e2e/config/constants'; expect(res.body.departments).to.have.length.of.at.least(0); }); }); + + it('should reject invalid pagination params', async () => { + await request + .get(api('livechat/department')) + .set(credentials) + .query({ count: 'invalid' }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + + it('should return a list of paginated departments', async () => { + await request + .get(api('livechat/department')) + .set(credentials) + .query({ count: 1, offset: 0 }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('departments'); + expect(res.body.departments).to.be.an('array'); + expect(res.body.departments).to.have.lengthOf(1); + }); + }); + + it('should sort list alphabetically following mongodb default sort (no collation)', async () => { + const department1 = await createDepartment(undefined, 'A test'); + const department2 = await createDepartment(undefined, 'a test'); + await request + .get(api('livechat/department')) + .set(credentials) + .query({ count: 2, offset: 0, text: 'test' }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('departments'); + expect(res.body.departments).to.be.an('array'); + expect(res.body.departments).to.have.lengthOf(2); + expect(res.body.departments[0]).to.have.property('_id', department1._id); + expect(res.body.departments[1]).to.have.property('_id', department2._id); + }); + await deleteDepartment(department1._id); + await deleteDepartment(department2._id); + }); + + it('should return a list of departments matching name', async () => { + const department1 = await createDepartment(undefined, 'A test 123'); + const department2 = await createDepartment(undefined, 'a test 456'); + await request + .get(api('livechat/department')) + .set(credentials) + .query({ count: 2, offset: 0, text: 'A test 123' }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('departments'); + expect(res.body.departments).to.be.an('array'); + expect(res.body.departments).to.have.lengthOf(1); + expect(res.body.departments[0]).to.have.property('_id', department1._id); + expect(res.body.departments.find((dept: ILivechatDepartment) => dept._id === department2._id)).to.be.undefined; + }); + await deleteDepartment(department1._id); + await deleteDepartment(department2._id); + }); }); describe('POST livechat/departments', () => { @@ -76,8 +204,62 @@ import { IS_EE } from '../../../e2e/config/constants'; .expect(400); }); + it('should return an error if requestTagsBeforeClosing is true but no tags are provided', async () => { + await request + .post(api('livechat/department')) + .set(credentials) + .send({ + department: { + name: 'Test', + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: 'bla@bla', + requestTagBeforeClosingChat: true, + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + + it('should return an error if requestTagsBeforeClosing is true but tags are not an array', async () => { + await request + .post(api('livechat/department')) + .set(credentials) + .send({ + department: { + name: 'Test', + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: 'bla@bla', + requestTagBeforeClosingChat: true, + chatClosingTags: 'not an array', + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + + it('should return an error if fallbackForwardDepartment is present but is not a department id', async () => { + await request + .post(api('livechat/department')) + .set(credentials) + .send({ + department: { + name: 'Test', + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: 'bla@bla', + fallbackForwardDepartment: 'not a department id', + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should create a new department', async () => { - await updatePermission('manage-livechat-departments', ['admin']); const { body } = await request .post(api('livechat/department')) .set(credentials) @@ -93,6 +275,28 @@ import { IS_EE } from '../../../e2e/config/constants'; expect(body.department).to.have.property('showOnRegistration', true); await deleteDepartment(body.department._id); }); + + it('should create a new disabled department', async () => { + const { body } = await request + .post(api('livechat/department')) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: false, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + }) + .expect('Content-Type', 'application/json') + .expect(200); + expect(body).to.have.property('success', true); + expect(body).to.have.property('department'); + expect(body.department).to.have.property('_id'); + expect(body.department).to.have.property('enabled', false); + await deleteDepartment(body.department._id); + }); }); describe('GET livechat/department/:_id', () => { @@ -139,6 +343,86 @@ import { IS_EE } from '../../../e2e/config/constants'; }); }); + describe('PUT livechat/departments/:_id', () => { + let department: ILivechatDepartment; + before(async () => { + department = await createDepartment(); + }); + after(async () => { + await deleteDepartment(department._id); + }); + + it('should return an error if fallbackForwardDepartment points to same department', async () => { + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + fallbackForwardDepartment: department._id, + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should fail if `agents` param is not an array', async () => { + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: 'not an array', + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should throw an error if user has permission to add agents and agents array has invalid format', async () => { + await updatePermission('add-livechat-department-agents', ['admin']); + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: [{ notAValidKey: 'string' }], + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should throw an error if user has permission to add agents and agents array has invalid internal format', async () => { + await request + .put(api(`livechat/department/${department._id}`)) + .set(credentials) + .send({ + department: { + name: faker.hacker.adjective(), + enabled: true, + showOnOfflineForm: true, + showOnRegistration: true, + email: faker.internet.email(), + }, + agents: [{ upsert: [{ notAValidKey: 'string' }] }], + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + }); + describe('DELETE livechat/department/:_id', () => { it('should return unauthorized error when the user does not have the necessary permission', async () => { await updatePermission('manage-livechat-departments', []); diff --git a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts index 694c8117fbbe..5a334d9ecdbd 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts @@ -1,10 +1,11 @@ import { expect } from 'chai'; import { before, describe, it } from 'mocha'; +import { sleep } from '../../../../lib/utils/sleep'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; import { createCustomField, deleteCustomField } from '../../../data/livechat/custom-fields'; import { addOrRemoveAgentFromDepartment, createDepartmentWithAnOnlineAgent } from '../../../data/livechat/department'; -import { createVisitor, createLivechatRoom, makeAgentUnavailable, closeOmnichannelRoom } from '../../../data/livechat/rooms'; +import { createVisitor, createLivechatRoom, makeAgentUnavailable, closeOmnichannelRoom, sendMessage } from '../../../data/livechat/rooms'; import { createBotAgent, getRandomVisitorToken } from '../../../data/livechat/users'; import { removePermissionFromAllRoles, restorePermissionToRoles, updatePermission, updateSetting } from '../../../data/permissions.helper'; import { IS_EE } from '../../../e2e/config/constants'; @@ -219,6 +220,7 @@ describe('LIVECHAT - Utils', function () { expect(body.page).to.have.property('msg'); }); }); + describe('livechat/transcript', () => { it('should fail if token is not in body params', async () => { const { body } = await request.post(api('livechat/transcript')).set(credentials).send({}); @@ -276,6 +278,7 @@ describe('LIVECHAT - Utils', function () { expect(body).to.have.property('success', true); }); }); + describe('livechat/transcript/:rid', () => { it('should fail if user is not authenticated', async () => { await request.delete(api('livechat/transcript/rid')).send({}).expect(401); @@ -450,4 +453,254 @@ describe('LIVECHAT - Utils', function () { expect(body).to.have.property('token', visitor.token); }); }); + + describe('livechat/message', () => { + it('should fail if no token', async () => { + await request.post(api('livechat/message')).set(credentials).send({}).expect(400); + }); + it('should fail if no rid', async () => { + await request.post(api('livechat/message')).set(credentials).send({ token: 'test' }).expect(400); + }); + it('should fail if no msg', async () => { + await request.post(api('livechat/message')).set(credentials).send({ token: 'test', rid: 'test' }).expect(400); + }); + it('should fail if token is invalid', async () => { + await request.post(api('livechat/message')).set(credentials).send({ token: 'test', rid: 'test', msg: 'test' }).expect(400); + }); + it('should fail if rid is invalid', async () => { + const visitor = await createVisitor(); + await request.post(api('livechat/message')).set(credentials).send({ token: visitor.token, rid: 'test', msg: 'test' }).expect(400); + }); + it('should fail if rid belongs to another visitor', async () => { + const visitor = await createVisitor(); + const visitor2 = await createVisitor(); + const room = await createLivechatRoom(visitor2.token); + await request.post(api('livechat/message')).set(credentials).send({ token: visitor.token, rid: room._id, msg: 'test' }).expect(400); + }); + it('should fail if room is closed', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await closeOmnichannelRoom(room._id); + await request.post(api('livechat/message')).set(credentials).send({ token: visitor.token, rid: room._id, msg: 'test' }).expect(400); + }); + it('should fail if message is greater than Livechat_enable_message_character_limit setting', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await updateSetting('Livechat_enable_message_character_limit', true); + await updateSetting('Livechat_message_character_limit', 1); + await request.post(api('livechat/message')).set(credentials).send({ token: visitor.token, rid: room._id, msg: 'test' }).expect(400); + + await updateSetting('Livechat_enable_message_character_limit', false); + }); + it('should send a message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await request.post(api('livechat/message')).set(credentials).send({ token: visitor.token, rid: room._id, msg: 'test' }).expect(200); + }); + }); + + describe('[GET] livechat/message/:_id', () => { + it('should fail if no token is provided', async () => { + await request.get(api('livechat/message/rid')).set(credentials).expect(400); + }); + it('should fail if no rid is provided', async () => { + await request.get(api('livechat/message/mid')).query({ token: 'test' }).expect(400); + }); + it('should fail if token points to an invalid visitor', async () => { + await request.get(api('livechat/message/mid')).query({ token: 'test', rid: 'test' }).expect(400); + }); + it('should fail if room points to an invalid room', async () => { + const visitor = await createVisitor(); + await request.get(api('livechat/message/mid')).query({ token: visitor.token, rid: 'test' }).expect(400); + }); + it('should fail if _id points to an invalid message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await request.get(api('livechat/message/mid')).query({ token: visitor.token, rid: room._id }).expect(400); + }); + it('should return a message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + const message = await sendMessage(room._id, 'test', visitor.token); + await request + .get(api(`livechat/message/${message._id}`)) + .query({ token: visitor.token, rid: room._id }) + .expect(200); + }); + }); + + describe('[PUT] livechat/message/:_id', () => { + it('should fail if no token is provided', async () => { + await request.put(api('livechat/message/rid')).set(credentials).expect(400); + }); + it('should fail if no rid is provided', async () => { + await request.put(api('livechat/message/mid')).query({ token: 'test' }).expect(400); + }); + it('should fail if token points to an invalid visitor', async () => { + await request.put(api('livechat/message/mid')).query({ token: 'test', rid: 'test' }).expect(400); + }); + it('should fail if room points to an invalid room', async () => { + const visitor = await createVisitor(); + await request.put(api('livechat/message/mid')).query({ token: visitor.token, rid: 'test' }).expect(400); + }); + it('should fail if _id points to an invalid message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await request.put(api('livechat/message/mid')).query({ token: visitor.token, rid: room._id }).expect(400); + }); + it('should update a message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + const message = await sendMessage(room._id, 'test', visitor.token); + const { body } = await request + .put(api(`livechat/message/${message._id}`)) + .set(credentials) + .send({ msg: 'test2', token: visitor.token, rid: room._id }) + .expect(200); + expect(body).to.have.property('message'); + expect(body.message).to.have.property('_id', message._id); + expect(body.message).to.have.property('msg', 'test2'); + }); + }); + + describe('[DELETE] livechat/message/:_id', () => { + it('should fail if no token is provided', async () => { + await request.delete(api('livechat/message/rid')).set(credentials).expect(400); + }); + it('should fail if no rid is provided', async () => { + await request.delete(api('livechat/message/mid')).query({ token: 'test' }).expect(400); + }); + it('should fail if token points to an invalid visitor', async () => { + await request.delete(api('livechat/message/mid')).query({ token: 'test', rid: 'test' }).expect(400); + }); + it('should fail if room points to an invalid room', async () => { + const visitor = await createVisitor(); + await request.delete(api('livechat/message/mid')).query({ token: visitor.token, rid: 'test' }).expect(400); + }); + it('should fail if _id points to an invalid message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await request.delete(api('livechat/message/mid')).query({ token: visitor.token, rid: room._id }).expect(400); + }); + it('should delete a message', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + const message = await sendMessage(room._id, 'test', visitor.token); + + const { body } = await request + .delete(api(`livechat/message/${message._id}`)) + .send({ token: visitor.token, rid: room._id }) + .expect(200); + + expect(body).to.have.property('message'); + expect(body.message).to.have.property('_id', message._id); + }); + }); + + describe('livechat/messages.history/:rid', () => { + it('should fail if no token is provided', async () => { + await request.get(api('livechat/messages.history/rid')).set(credentials).expect(400); + }); + it('should fail if token points to an invalid visitor', async () => { + await request.get(api('livechat/messages.history/rid')).query({ token: 'test' }).expect(400); + }); + it('should fail if room points to an invalid room', async () => { + const visitor = await createVisitor(); + await request.get(api('livechat/messages.history/rid')).query({ token: visitor.token }).expect(400); + }); + it('should fail if room points to a room of another visitor', async () => { + const visitor = await createVisitor(); + const visitor2 = await createVisitor(); + const room = await createLivechatRoom(visitor2.token); + await request + .get(api(`livechat/messages.history/${room._id}`)) + .query({ token: visitor.token }) + .expect(400); + }); + it('should return a list of messages', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await sendMessage(room._id, 'test', visitor.token); + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .query({ token: visitor.token }) + .expect(200); + expect(body).to.have.property('messages').that.is.an('array'); + expect(body.messages).to.have.lengthOf(2); + expect(body.messages[0]).to.have.property('msg', 'test'); + }); + it('should return a list of messages with offset and count', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await sendMessage(room._id, 'test', visitor.token); + await sendMessage(room._id, 'test2', visitor.token); + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .query({ token: visitor.token, offset: 1, limit: 1 }) + .expect(200); + expect(body).to.have.property('messages').that.is.an('array'); + expect(body.messages).to.have.lengthOf(1); + expect(body.messages[0]).to.have.property('msg', 'test'); + }); + it('should return a list of unseen messages', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await sendMessage(room._id, 'test', visitor.token); + await sendMessage(room._id, 'test2', visitor.token); + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .query({ token: visitor.token, ls: new Date() }) + .expect(200); + expect(body).to.have.property('messages').that.is.an('array'); + expect(body.messages).to.have.lengthOf(3); + expect(body.messages[0]).to.have.property('msg', 'test2'); + }); + it('should return a list of messages up to a specific date', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + const msg = await sendMessage(room._id, 'test', visitor.token); + const tsPlusSomeMillis = new Date(new Date(msg.ts).getTime() + 500); + await sleep(1000); + await sendMessage(room._id, 'test2', visitor.token); + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .query({ token: visitor.token, end: tsPlusSomeMillis }) + .expect(200); + expect(body).to.have.property('messages').that.is.an('array'); + expect(body.messages).to.have.lengthOf(2); + expect(body.messages[0]).to.have.property('msg', 'test'); + }); + it('should return message history for a valid room with pagination', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await sendMessage(room._id, 'Hello', visitor.token); + + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .set(credentials) + .query({ token: visitor.token, limit: 1 }) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body).to.have.property('success', true); + expect(body).to.have.property('messages').of.length(1); + expect(body.messages[0]).to.have.property('msg', 'Hello'); + }); + it('should return message history for a valid room with pagination and offset', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await sendMessage(room._id, 'Hello', visitor.token); + + const { body } = await request + .get(api(`livechat/messages.history/${room._id}`)) + .set(credentials) + .query({ token: visitor.token, limit: 1, offset: 1 }) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body).to.have.property('success', true); + expect(body).to.have.property('messages').of.length(1); + expect(body.messages[0]).to.have.property('t'); + }); + }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/14-units.ts b/apps/meteor/tests/end-to-end/api/livechat/14-units.ts index 207e8234cb56..3a03d9e93e2c 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/14-units.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/14-units.ts @@ -53,6 +53,57 @@ import { IS_EE } from '../../../e2e/config/constants'; // cleanup await deleteUser(user); }); + + it('should return a list of units matching the provided filter', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); + const unit = await createUnit(user._id, user.username, [department._id]); + + const { body } = await request.get(api('livechat/units')).query({ text: unit.name }).set(credentials).expect(200); + expect(body.units).to.be.an('array').with.lengthOf(1); + const unitFound = body.units.find((u: IOmnichannelBusinessUnit) => u._id === unit._id); + expect(unitFound).to.have.property('_id', unit._id); + expect(unitFound).to.have.property('name', unit.name); + expect(unitFound).to.have.property('numMonitors', 1); + expect(unitFound).to.have.property('numDepartments', 1); + expect(unitFound).to.have.property('type', 'u'); + + // cleanup + await deleteUser(user); + }); + + it('should properly paginate the result set', async () => { + const { body } = await request.get(api('livechat/units')).query({ count: 1 }).set(credentials).expect(200); + expect(body).to.have.property('units').and.to.be.an('array').with.lengthOf(1); + expect(body).to.have.property('count').and.to.be.equal(1); + const unit = body.units[0]; + + const { body: body2 } = await request.get(api('livechat/units')).query({ count: 1, offset: 1 }).set(credentials).expect(200); + expect(body2).to.have.property('units').and.to.be.an('array').with.lengthOf(1); + const unit2 = body2.units[0]; + + expect(unit._id).to.not.be.equal(unit2._id); + }); + + it('should sort the result set based on provided fields', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); + const unit = await createUnit(user._id, user.username, [department._id], 'A test 1234'); + const unit2 = await createUnit(user._id, user.username, [department._id], 'a test 1234'); + + const { body } = await request + .get(api('livechat/units')) + .query({ sort: JSON.stringify({ name: 1 }), text: 'test', count: 2 }) + .set(credentials) + .expect(200); + expect(body).to.have.property('units').and.to.be.an('array').with.lengthOf(2); + expect(body.units[0]._id).to.be.equal(unit._id); + expect(body.units[1]._id).to.be.equal(unit2._id); + + await deleteUser(user); + }); }); describe('[POST] livechat/units', () => { @@ -97,6 +148,28 @@ import { IS_EE } from '../../../e2e/config/constants'; // cleanup await deleteUser(user); }); + + it('should return a unit with no monitors if a user who is not a monitor is passed', async () => { + await updatePermission('manage-livechat-units', ['admin']); + const user = await createUser(); + const department = await createDepartment(); + + const { body } = await request + .post(api('livechat/units')) + .set(credentials) + .send({ + unitData: { name: 'test', visibility: 'public', enabled: true, description: 'test' }, + unitMonitors: [{ monitorId: user._id, username: user.username }], + unitDepartments: [{ departmentId: department._id }], + }) + .expect(200); + + expect(body).to.have.property('numMonitors', 0); + expect(body).to.have.property('name', 'test'); + + // cleanup + await deleteUser(user); + }); }); describe('[GET] livechat/units/:id', () => { @@ -131,11 +204,30 @@ import { IS_EE } from '../../../e2e/config/constants'; await updatePermission('manage-livechat-units', []); return request.post(api('livechat/units/123')).set(credentials).expect(403); }); - it('should return a updated unit', async () => { + it('should fail if unit does not exist', async () => { await updatePermission('manage-livechat-units', ['admin']); const user = await createUser(); await createMonitor(user.username); const department = await createDepartment(); + + const { body } = await request + .post(api('livechat/units/123')) + .set(credentials) + .send({ + unitData: { name: 'test', visibility: 'public', enabled: true, description: 'test' }, + unitMonitors: [{ monitorId: user._id, username: user.username }], + unitDepartments: [{ departmentId: department._id }], + }) + .expect(400); + + expect(body).to.have.property('success', false); + // cleanup + await deleteUser(user); + }); + it('should return a updated unit', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); const unit = await createUnit(user._id, user.username, [department._id]); const { body } = await request @@ -158,6 +250,60 @@ import { IS_EE } from '../../../e2e/config/constants'; // cleanup await deleteUser(user); }); + it('should move the department to the latest unit that attempted to assign it', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); + const unit1 = await createUnit(user._id, user.username, [department._id]); + const unit2 = await createUnit(user._id, user.username, [department._id]); + + const { body } = await request + .get(api(`livechat/units/${unit1._id}/departments`)) + .set(credentials) + .expect(200); + + expect(body).to.have.property('departments'); + expect(body.departments).to.have.lengthOf(0); + expect(unit2.numDepartments).to.be.equal(1); + }); + it('should remove the department from the unit if it is not passed in the request', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); + const unit1 = await createUnit(user._id, user.username, [department._id]); + + const { body } = await request + .post(api(`livechat/units/${unit1._id}`)) + .set(credentials) + .send({ + unitData: { name: unit1.name, visibility: unit1.visibility }, + unitMonitors: [{ monitorId: user._id, username: user.username }], + unitDepartments: [], + }) + .expect(200); + + expect(body).to.have.property('_id', unit1._id); + expect(body).to.have.property('numDepartments', 0); + }); + it('should remove the monitor from the unit if it is not passed in the request', async () => { + const user = await createUser(); + await createMonitor(user.username); + const department = await createDepartment(); + const unit1 = await createUnit(user._id, user.username, [department._id]); + + const { body } = await request + .post(api(`livechat/units/${unit1._id}`)) + .set(credentials) + .send({ + unitData: { name: unit1.name, visibility: unit1.visibility }, + unitMonitors: [], + unitDepartments: [{ departmentId: department._id }], + }) + .expect(200); + + expect(body).to.have.property('_id', unit1._id); + expect(body).to.have.property('numMonitors', 0); + }); }); describe('[DELETE] livechat/units/:id', () => { @@ -265,45 +411,4 @@ import { IS_EE } from '../../../e2e/config/constants'; await deleteUser(user); }); }); - - describe('livechat/monitors', () => { - it('should fail if manage-livechat-monitors permission is missing', async () => { - await updatePermission('manage-livechat-monitors', []); - return request.get(api('livechat/monitors')).set(credentials).expect(403); - }); - it('should return all monitors', async () => { - await updatePermission('manage-livechat-monitors', ['admin']); - const user = await createUser(); - await createMonitor(user.username); - - const { body } = await request.get(api('livechat/monitors')).set(credentials).query({ text: user.username }).expect(200); - expect(body).to.have.property('monitors'); - expect(body.monitors).to.have.lengthOf(1); - expect(body.monitors[0]).to.have.property('username', user.username); - - // cleanup - await deleteUser(user); - }); - }); - - describe('livechat/monitors/:username', () => { - it('should fail if manage-livechat-monitors permission is missing', async () => { - await updatePermission('manage-livechat-monitors', []); - return request.get(api('livechat/monitors/123')).set(credentials).expect(403); - }); - it('should return a monitor', async () => { - await updatePermission('manage-livechat-monitors', ['admin']); - const user = await createUser(); - await createMonitor(user.username); - - const { body } = await request - .get(api(`livechat/monitors/${user.username}`)) - .set(credentials) - .expect(200); - expect(body).to.have.property('username', user.username); - - // cleanup - await deleteUser(user); - }); - }); }); diff --git a/apps/meteor/tests/end-to-end/api/livechat/18-rooms-ee.ts b/apps/meteor/tests/end-to-end/api/livechat/18-rooms-ee.ts index 040997133040..e3117c3088a7 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/18-rooms-ee.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/18-rooms-ee.ts @@ -14,6 +14,7 @@ import { makeAgentAvailable, createAgent, closeOmnichannelRoom, + fetchMessages, } from '../../../data/livechat/rooms'; import { sleep } from '../../../data/livechat/utils'; import { updatePermission, updateSetting } from '../../../data/permissions.helper'; @@ -39,6 +40,7 @@ import { IS_EE } from '../../../e2e/config/constants'; const user: IUser = await createUser(); const userCredentials = await login(user.username, password); await createAgent(user.username); + await updateSetting('Livechat_allow_manual_on_hold', true); agent2 = { user, @@ -48,8 +50,9 @@ import { IS_EE } from '../../../e2e/config/constants'; after(async () => { await deleteUser(agent2.user); + await updateSetting('Livechat_allow_manual_on_hold', false); + await updateSetting('Livechat_allow_manual_on_hold_upon_agent_engagement_only', true); }); - describe('livechat/room.onHold', () => { it('should fail if user doesnt have on-hold-livechat-room permission', async () => { await updatePermission('on-hold-livechat-room', []); @@ -115,7 +118,7 @@ import { IS_EE } from '../../../e2e/config/constants'; .expect(400); expect(response.body.success).to.be.false; - expect(response.body.error).to.be.equal('error-contact-sent-last-message-so-cannot-place-on-hold'); + expect(response.body.error).to.be.equal('error-cannot-place-chat-on-hold'); }); it('should fail if room is closed', async () => { const visitor = await createVisitor(); @@ -151,7 +154,6 @@ import { IS_EE } from '../../../e2e/config/constants'; it('should put room on hold', async () => { const { room } = await startANewLivechatRoomAndTakeIt(); await sendAgentMessage(room._id); - const response = await request .post(api('livechat/room.onHold')) .set(credentials) @@ -165,6 +167,35 @@ import { IS_EE } from '../../../e2e/config/constants'; const updatedRoom = await getLivechatRoomInfo(room._id); expect(updatedRoom.onHold).to.be.true; }); + it('Should put room on hold, even in the visitor sent the last message', async () => { + const { room, visitor } = await startANewLivechatRoomAndTakeIt(); + await updateSetting('Livechat_allow_manual_on_hold_upon_agent_engagement_only', false); + await sendMessage(room._id, '-', visitor.token); + const response = await request + .post(api('livechat/room.onHold')) + .set(credentials) + .send({ + roomId: room._id, + }) + .expect(200); + expect(response.body.success).to.be.true; + const updatedRoom = await getLivechatRoomInfo(room._id); + expect(updatedRoom.onHold).to.be.true; + }); + it('should not put room on hold when visitor sent the last message', async () => { + const { room, visitor } = await startANewLivechatRoomAndTakeIt(); + await updateSetting('Livechat_allow_manual_on_hold_upon_agent_engagement_only', true); + await sendMessage(room._id, '-', visitor.token); + const response = await request + .post(api('livechat/room.onHold')) + .set(credentials) + .send({ + roomId: room._id, + }) + .expect(400); + expect(response.body.success).to.be.false; + expect(response.body.error).to.be.equal('error-cannot-place-chat-on-hold'); + }); }); describe('livechat/room.resumeOnHold', () => { @@ -240,6 +271,28 @@ import { IS_EE } from '../../../e2e/config/constants'; const updatedRoom = await getLivechatRoomInfo(room._id); expect(updatedRoom).to.not.have.property('onHold'); }); + it('should resume room on hold and send proper system message', async () => { + const { room, visitor } = await startANewLivechatRoomAndTakeIt(); + + await sendAgentMessage(room._id); + await placeRoomOnHold(room._id); + + const response = await request + .post(api('livechat/room.resumeOnHold')) + .set(credentials) + .send({ + roomId: room._id, + }) + .expect(200); + + expect(response.body.success).to.be.true; + + const messages = await fetchMessages(room._id, visitor.token); + expect(messages).to.be.an('array'); + expect(messages[0]).to.not.be.undefined; + expect(messages[0]).to.have.property('t', 'omnichannel_on_hold_chat_resumed'); + expect(messages[0]).to.have.property('comment', 'The chat was manually resumed from On Hold by RocketChat Internal Admin Test'); + }); it('should resume chat automatically if visitor sent a message', async () => { const { room, visitor } = await startANewLivechatRoomAndTakeIt(); diff --git a/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts b/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts index 0585c20bf127..b6527fbc2bb2 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/19-business-hours.ts @@ -43,6 +43,17 @@ describe('LIVECHAT - business hours', function () { let defaultBhId: any; describe('[CE] livechat/business-hour', () => { + after(async () => { + await saveBusinessHour({ + ...defaultBhId, + timezone: { + name: 'America/Sao_Paulo', + utc: '-03:00', + }, + workHours: getWorkHours(true), + }); + }); + it('should fail when user doesnt have view-livechat-business-hours permission', async () => { await removePermissionFromAllRoles('view-livechat-business-hours'); const response = await request.get(api('livechat/business-hour')).set(credentials).expect(403); @@ -100,6 +111,39 @@ describe('LIVECHAT - business hours', function () { expect(body).to.have.property('success', true); }); + it('should save a default business hour with proper timezone settings', async () => { + await saveBusinessHour({ + ...defaultBhId, + timezone: { + name: 'Asia/Kolkata', + utc: '+05:30', + }, + workHours: getWorkHours(true), + timezoneName: 'Asia/Kolkata', + }); + + const { body } = await request + .get(api('livechat/business-hour')) + .set(credentials) + .query({ type: LivechatBusinessHourTypes.DEFAULT }) + .expect(200); + + expect(body.success).to.be.true; + expect(body.businessHour).to.be.an('object'); + expect(body.businessHour.timezone).to.be.an('object').that.has.property('name').that.is.equal('Asia/Kolkata'); + expect(body.businessHour.workHours).to.be.an('array').with.lengthOf(7); + + const { workHours } = body.businessHour; + + expect(workHours[0].day).to.be.equal('Sunday'); + expect(workHours[0].start.utc.dayOfWeek).to.be.equal('Saturday'); + expect(workHours[0].finish.utc.dayOfWeek).to.be.equal('Sunday'); + }); + + it('should allow agents to be available', async () => { + const { body } = await makeAgentAvailable(credentials); + expect(body).to.have.property('success', true); + }); }); (IS_EE ? describe : describe.skip)('[EE] livechat/business-hour', () => { @@ -806,6 +850,7 @@ describe('LIVECHAT - business hours', function () { }); it('should verify if agent becomes unavailable to take chats when user is deactivated', async () => { + await makeAgentAvailable(await login(agent.username, password)); await setUserActiveStatus(agent._id, false); const latestAgent = await getUserByUsername(agent.username); diff --git a/apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts b/apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts index d4c2fd59211c..31d5e04c4162 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/22-monitors.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import type { ILivechatDepartment, IUser } from '@rocket.chat/core-typings'; import { expect } from 'chai'; -import { before, it, describe } from 'mocha'; +import { before, it, describe, after } from 'mocha'; -import { getCredentials, api, request } from '../../../data/api-data'; +import { getCredentials, api, request, methodCall, credentials } from '../../../data/api-data'; import { addOrRemoveAgentFromDepartment, createDepartment } from '../../../data/livechat/department'; import { createAgent, @@ -14,9 +14,9 @@ import { makeAgentAvailable, } from '../../../data/livechat/rooms'; import { createMonitor, createUnit } from '../../../data/livechat/units'; -import { updateSetting, updatePermission } from '../../../data/permissions.helper'; +import { updateSetting, updatePermission, restorePermissionToRoles, removePermissionFromAllRoles } from '../../../data/permissions.helper'; import { password } from '../../../data/user'; -import { createUser, login, setUserActiveStatus } from '../../../data/users.helper'; +import { createUser, deleteUser, login, setUserActiveStatus } from '../../../data/users.helper'; import { IS_EE } from '../../../e2e/config/constants'; type TestUser = { user: IUser; credentials: { 'X-Auth-Token': string; 'X-User-Id': string } }; @@ -70,6 +70,165 @@ type TestUser = { user: IUser; credentials: { 'X-Auth-Token': string; 'X-User-Id await updatePermission('transfer-livechat-guest', ['admin', 'livechat-manager', 'livechat-agent', 'livechat-monitor']); }); + describe('Monitors', () => { + let user: IUser; + before(async () => { + user = await createUser(); + }); + after(async () => { + await deleteUser(user); + }); + + it('should properly create a new monitor', async () => { + const { body } = await request + .post(methodCall(`livechat:addMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:addMonitor', + params: [user.username], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + }); + + it('should not fail when trying to create a monitor that already exists', async () => { + const { body } = await request + .post(methodCall(`livechat:addMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:addMonitor', + params: [user.username], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + }); + + it('should fail when trying to create a monitor with an invalid username', async () => { + const { body } = await request + .post(methodCall(`livechat:addMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:addMonitor', + params: ['invalid-username'], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + const parsedBody = JSON.parse(body.message); + + expect(parsedBody.error).to.have.property('error').to.be.equal('error-invalid-user'); + }); + + it('should fail when trying to create a monitor with an empty username', async () => { + const { body } = await request + .post(methodCall(`livechat:addMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:addMonitor', + params: [''], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + const parsedBody = JSON.parse(body.message); + + expect(parsedBody.error).to.have.property('error').to.be.equal('error-invalid-user'); + }); + + it('should remove a monitor', async () => { + const { body } = await request + .post(methodCall(`livechat:removeMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:removeMonitor', + params: [user.username], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + }); + + it('should not fail when trying to remove a monitor that does not exist', async () => { + const { body } = await request + .post(methodCall(`livechat:removeMonitor`)) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'livechat:removeMonitor', + params: [user.username], + id: '101', + msg: 'method', + }), + }) + .expect(200); + + expect(body.success).to.be.true; + }); + }); + + describe('[GET] livechat/monitors', () => { + it('should fail if manage-livechat-monitors permission is missing', async () => { + await removePermissionFromAllRoles('manage-livechat-monitors'); + return request.get(api('livechat/monitors')).set(credentials).expect(403); + }); + it('should return all monitors', async () => { + await restorePermissionToRoles('manage-livechat-monitors'); + const user = await createUser(); + await createMonitor(user.username); + + const { body } = await request.get(api('livechat/monitors')).set(credentials).query({ text: user.username }).expect(200); + expect(body).to.have.property('monitors'); + expect(body.monitors).to.have.lengthOf(1); + expect(body.monitors[0]).to.have.property('username', user.username); + + // cleanup + await deleteUser(user); + }); + }); + + describe('livechat/monitors/:username', () => { + it('should fail if manage-livechat-monitors permission is missing', async () => { + await removePermissionFromAllRoles('manage-livechat-monitors'); + return request.get(api('livechat/monitors/123')).set(credentials).expect(403); + }); + it('should return a monitor', async () => { + await restorePermissionToRoles('manage-livechat-monitors'); + const user = await createUser(); + await createMonitor(user.username); + + const { body } = await request + .get(api(`livechat/monitors/${user.username}`)) + .set(credentials) + .expect(200); + expect(body).to.have.property('username', user.username); + + // cleanup + await deleteUser(user); + }); + }); + describe('Monitors & Rooms', () => { it('should not return a room of a department that the monitor is not assigned to', async () => { const visitor = await createVisitor(noUnitDepartment._id); diff --git a/apps/meteor/tests/end-to-end/api/livechat/23-mac.ts b/apps/meteor/tests/end-to-end/api/livechat/23-mac.ts new file mode 100644 index 000000000000..f8f23ca8fb30 --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/livechat/23-mac.ts @@ -0,0 +1,92 @@ +import type { ILivechatVisitor } from '@rocket.chat/core-typings'; +import { expect } from 'chai'; +import { before, describe, it } from 'mocha'; +import moment from 'moment'; + +import { api, getCredentials, request, credentials } from '../../../data/api-data'; +import { + createVisitor, + createLivechatRoom, + createAgent, + makeAgentAvailable, + sendAgentMessage, + getLivechatRoomInfo, + fetchInquiry, + closeOmnichannelRoom, +} from '../../../data/livechat/rooms'; + +describe('MAC', () => { + before((done) => getCredentials(done)); + + before(async () => { + await createAgent(); + await makeAgentAvailable(); + }); + + describe('MAC rooms', () => { + let visitor: ILivechatVisitor; + it('Should create an innactive room by default', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + + expect(room).to.be.an('object'); + expect(room.v.activity).to.be.undefined; + }); + + it('should mark room as active when agent sends a message', async () => { + visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + + await sendAgentMessage(room._id); + + const updatedRoom = await getLivechatRoomInfo(room._id); + + expect(updatedRoom).to.have.nested.property('v.activity').and.to.be.an('array'); + }); + + it('should mark multiple rooms as active when they come from same visitor after an agent sends a message', async () => { + const room = await createLivechatRoom(visitor.token); + + await sendAgentMessage(room._id); + + const updatedRoom = await getLivechatRoomInfo(room._id); + + expect(updatedRoom).to.have.nested.property('v.activity').and.to.be.an('array'); + + await closeOmnichannelRoom(room._id); + }); + + it('should mark room as active when it comes from same visitor on same period, even without agent interaction', async () => { + const room = await createLivechatRoom(visitor.token); + + expect(room).to.have.nested.property('v.activity').and.to.be.an('array'); + expect(room.v.activity?.includes(moment.utc().format('YYYY-MM'))).to.be.true; + + await closeOmnichannelRoom(room._id); + }); + + it('should mark an inquiry as active when it comes from same visitor on same period, even without agent interaction', async () => { + const room = await createLivechatRoom(visitor.token); + const inquiry = await fetchInquiry(room._id); + + expect(inquiry).to.have.nested.property('v.activity').and.to.be.an('array'); + expect(inquiry.v.activity?.includes(moment.utc().format('YYYY-MM'))).to.be.true; + expect(room.v.activity?.includes(moment.utc().format('YYYY-MM'))).to.be.true; + + await closeOmnichannelRoom(room._id); + }); + + it('visitor should be marked as active for period', async () => { + const { body } = await request + .get(api(`livechat/visitors.info?visitorId=${visitor._id}`)) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(body).to.have.nested.property('visitor').and.to.be.an('object'); + expect(body.visitor).to.have.nested.property('activity').and.to.be.an('array'); + expect(body.visitor.activity).to.have.lengthOf(1); + expect(body.visitor.activity[0]).to.equal(moment.utc().format('YYYY-MM')); + }); + }); +}); diff --git a/apps/meteor/tests/end-to-end/api/livechat/24-routing.ts b/apps/meteor/tests/end-to-end/api/livechat/24-routing.ts new file mode 100644 index 000000000000..48d447b9923d --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/livechat/24-routing.ts @@ -0,0 +1,329 @@ +import { UserStatus, type ILivechatDepartment, type IUser } from '@rocket.chat/core-typings'; +import { expect } from 'chai'; +import { after, before, describe, it } from 'mocha'; + +import { getCredentials, request, api } from '../../../data/api-data'; +import { + createAgent, + makeAgentAvailable, + createDepartment, + createVisitor, + createLivechatRoom, + getLivechatRoomInfo, + makeAgentUnavailable, +} from '../../../data/livechat/rooms'; +import { sleep } from '../../../data/livechat/utils'; +import { updateSetting } from '../../../data/permissions.helper'; +import type { IUserCredentialsHeader } from '../../../data/user'; +import { password } from '../../../data/user'; +import { createUser, deleteUser, login, setUserActiveStatus, setUserStatus } from '../../../data/users.helper'; +import { IS_EE } from '../../../e2e/config/constants'; + +(IS_EE ? describe : describe.skip)('Omnichannel - Routing', () => { + before((done) => getCredentials(done)); + + after(async () => { + await updateSetting('Livechat_Routing_Method', 'Manual_Selection'); + }); + + describe('Auto-Selection', () => { + before(async () => { + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + }); + + let testUser: { user: IUser; credentials: IUserCredentialsHeader }; + let testUser2: { user: IUser; credentials: IUserCredentialsHeader }; + let testDepartment: ILivechatDepartment; + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentUnavailable(credentials2); + + testUser2 = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + testDepartment = await createDepartment([{ agentId: testUser.user._id }]); + }); + + after(async () => { + await deleteUser(testUser.user); + await deleteUser(testUser2.user); + }); + + it('should route a room to an available agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser.user._id); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should not route to a not-available agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should fail to start a conversation if there is noone available and Livechat_accept_chats_with_no_agents is false', async () => { + await updateSetting('Livechat_accept_chats_with_no_agents', false); + await makeAgentUnavailable(testUser.credentials); + + const visitor = await createVisitor(testDepartment._id); + const { body } = await request.get(api(`livechat/room?token=${visitor.token}`)).expect(400); + expect(body.error).to.be.equal('Sorry, no online agents [no-agent-online]'); + }); + it('should accept a conversation but not route to anyone when Livechat_accept_chats_with_no_agents is true', async () => { + await updateSetting('Livechat_accept_chats_with_no_agents', true); + + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.undefined; + }); + it('should not allow users to take more than Livechat_maximum_chats_per_agent chats', async () => { + await updateSetting('Livechat_maximum_chats_per_agent', 2); + + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.undefined; + }); + it('should ignore disabled users', async () => { + await updateSetting('Livechat_maximum_chats_per_agent', 0); + await setUserActiveStatus(testUser2.user._id, false); + + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + expect(roomInfo.servedBy).to.be.undefined; + }); + it('should ignore offline users when Livechat_enabled_when_agent_idle is false', async () => { + await updateSetting('Livechat_enabled_when_agent_idle', false); + await setUserStatus(testUser.credentials, UserStatus.OFFLINE); + + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + expect(roomInfo.servedBy).to.be.undefined; + }); + }); + describe('Load Balancing', () => { + before(async () => { + await updateSetting('Livechat_Routing_Method', 'Load_Balancing'); + }); + + let testUser: { user: IUser; credentials: IUserCredentialsHeader }; + let testUser2: { user: IUser; credentials: IUserCredentialsHeader }; + let testDepartment: ILivechatDepartment; + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentUnavailable(credentials2); + + testUser2 = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + testDepartment = await createDepartment([{ agentId: testUser.user._id }, { agentId: testUser2.user._id }]); + }); + + after(async () => { + await deleteUser(testUser.user); + await deleteUser(testUser2.user); + }); + + it('should route a room to an available agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser.user._id); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should not route to a not-available agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should route the chat to the less busy agent when both are available', async () => { + await makeAgentAvailable(testUser2.credentials); + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser2.user._id); + }); + it('should route again to the less busy agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser2.user._id); + }); + }); + describe('Load Rotation', () => { + before(async () => { + await updateSetting('Livechat_Routing_Method', 'Load_Rotation'); + }); + + let testUser: { user: IUser; credentials: IUserCredentialsHeader }; + let testUser2: { user: IUser; credentials: IUserCredentialsHeader }; + let testDepartment: ILivechatDepartment; + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentAvailable(credentials2); + + testUser = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + const user = await createUser(); + await createAgent(user.username); + const credentials2 = await login(user.username, password); + await makeAgentUnavailable(credentials2); + + testUser2 = { + user, + credentials: credentials2, + }; + }); + + before(async () => { + testDepartment = await createDepartment([{ agentId: testUser.user._id }, { agentId: testUser2.user._id }]); + }); + + after(async () => { + await deleteUser(testUser.user); + await deleteUser(testUser2.user); + }); + + it('should route a room to an available agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser.user._id); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should not route chat to an unavailable agent', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.not.be.equal(testUser2.user._id); + }); + it('should route the chat to the agent with the oldest routing time when both are available', async () => { + await makeAgentAvailable(testUser2.credentials); + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser2.user._id); + }); + it('should route again to the agent with the oldest routing time', async () => { + const visitor = await createVisitor(testDepartment._id); + const room = await createLivechatRoom(visitor.token); + + await sleep(5000); + + const roomInfo = await getLivechatRoomInfo(room._id); + + expect(roomInfo.servedBy).to.be.an('object'); + expect(roomInfo.servedBy?._id).to.be.equal(testUser.user._id); + }); + }); +}); diff --git a/apps/meteor/tests/mocks/client/RouterContextMock.tsx b/apps/meteor/tests/mocks/client/RouterContextMock.tsx index 9a79f2e2078b..61cbf5f10909 100644 --- a/apps/meteor/tests/mocks/client/RouterContextMock.tsx +++ b/apps/meteor/tests/mocks/client/RouterContextMock.tsx @@ -4,8 +4,6 @@ import { compile } from 'path-to-regexp'; import React, { useRef, useMemo } from 'react'; import type { MutableRefObject, ReactElement, ReactNode } from 'react'; -import type { UpgradeTabVariant } from '../../../lib/upgradeTab'; - const encodeSearchParameters = (searchParameters: SearchParameters) => { const search = new URLSearchParams(); @@ -47,9 +45,6 @@ const buildRoutePath = (to: To): LocationPathname | `${LocationPathname}?${Locat case 'marketplace': return `/marketplace/${params.context}/${params.page}${encodeSearchParameters(search)}`; - - case 'upgrade': - return `/admin/upgrade/${params.type as UpgradeTabVariant}${encodeSearchParameters(search)}`; } return (compile(name, { encode: encodeURIComponent })(params) + encodeSearchParameters(search)) as diff --git a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx index 42f0e34a52fa..3c2dbc26c1be 100644 --- a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx +++ b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx @@ -56,7 +56,6 @@ const uploadToEndpoint = async () => { throw new Error('not implemented'); }; // to be implemented const getStream = () => () => () => undefined; // to be implemented -const getSingleStream = () => () => () => undefined; // to be implemented const callEndpoint = () => { throw new Error('not implemented'); }; // to be implemented @@ -67,7 +66,6 @@ const contextValue = { // callMethod, callEndpoint, uploadToEndpoint, - getSingleStream, getStream, }; diff --git a/apps/meteor/tests/mocks/server/BrokerMocked.ts b/apps/meteor/tests/mocks/server/BrokerMocked.ts new file mode 100644 index 000000000000..dbab825acfad --- /dev/null +++ b/apps/meteor/tests/mocks/server/BrokerMocked.ts @@ -0,0 +1,43 @@ +export class BrokerMocked { + actions: Record Promise> = {}; + + destroyService(): void { + // no op + } + + createService(): void { + // no op + } + + async call(method: string, data: any): Promise { + return this.actions[method](data); + } + + async waitAndCall(method: string, data: any): Promise { + return this.actions[method](data); + } + + async broadcastToServices(): Promise { + // no op + } + + async broadcast(): Promise { + // no op + } + + async broadcastLocal(): Promise { + // no op + } + + async nodeList(): Promise { + // no op + } + + async start(): Promise { + // no op + } + + mockServices(actions: Record Promise>) { + this.actions = actions; + } +} diff --git a/apps/meteor/tests/unit/app/mentions/client.tests.js b/apps/meteor/tests/unit/app/mentions/client.tests.js index 9981eee4aab9..70ac7b943201 100644 --- a/apps/meteor/tests/unit/app/mentions/client.tests.js +++ b/apps/meteor/tests/unit/app/mentions/client.tests.js @@ -5,73 +5,12 @@ import { MentionsParser } from '../../../../app/mentions/lib/MentionsParser'; let mentionsParser; beforeEach(() => { mentionsParser = new MentionsParser({ - pattern: '[0-9a-zA-Z-_.]+', + pattern: () => '[0-9a-zA-Z-_.]+', me: () => 'me', }); }); describe('Mention', () => { - describe('get pattern', () => { - const regexp = '[0-9a-zA-Z-_.]+'; - beforeEach(() => { - mentionsParser.pattern = () => regexp; - }); - - describe('by function', () => { - it(`should be equal to ${regexp}`, () => { - expect(regexp).to.be.equal(mentionsParser.pattern); - }); - }); - - describe('by const', () => { - it(`should be equal to ${regexp}`, () => { - expect(regexp).to.be.equal(mentionsParser.pattern); - }); - }); - }); - - describe('get useRealName', () => { - beforeEach(() => { - mentionsParser.useRealName = () => true; - }); - - describe('by function', () => { - it('should be true', () => { - expect(true).to.be.equal(mentionsParser.useRealName); - }); - }); - - describe('by const', () => { - it('should be true', () => { - expect(true).to.be.equal(mentionsParser.useRealName); - }); - }); - }); - - describe('get me', () => { - const me = 'me'; - - describe('by function', () => { - beforeEach(() => { - mentionsParser.me = () => me; - }); - - it(`should be equal to ${me}`, () => { - expect(me).to.be.equal(mentionsParser.me); - }); - }); - - describe('by const', () => { - beforeEach(() => { - mentionsParser.me = me; - }); - - it(`should be equal to ${me}`, () => { - expect(me).to.be.equal(mentionsParser.me); - }); - }); - }); - describe('getUserMentions', () => { describe('for simple text, no mentions', () => { const result = []; diff --git a/apps/meteor/tests/unit/app/mentions/server.tests.js b/apps/meteor/tests/unit/app/mentions/server.tests.js index b0d82f02195a..335f72af491d 100644 --- a/apps/meteor/tests/unit/app/mentions/server.tests.js +++ b/apps/meteor/tests/unit/app/mentions/server.tests.js @@ -1,12 +1,12 @@ import { expect } from 'chai'; -import MentionsServer from '../../../../app/mentions/server/Mentions'; +import { MentionsServer } from '../../../../app/mentions/server/Mentions'; let mention; beforeEach(() => { mention = new MentionsServer({ - pattern: '[0-9a-zA-Z-_.]+', + pattern: () => '[0-9a-zA-Z-_.]+', messageMaxAll: () => 4, // || RocketChat.settings.get('Message_MaxAll') getUsers: async (usernames) => [ @@ -224,67 +224,4 @@ describe('Mention Server', () => { expect(result).to.be.deep.equal(expected); }); }); - - describe('getters and setters', () => { - describe('messageMaxAll', () => { - const mention = new MentionsServer({}); - describe('constant', () => { - it('should return the informed value', () => { - mention.messageMaxAll = 4; - expect(mention.messageMaxAll).to.be.deep.equal(4); - }); - }); - describe('function', () => { - it('should return the informed value', () => { - mention.messageMaxAll = () => 4; - expect(mention.messageMaxAll).to.be.deep.equal(4); - }); - }); - }); - describe('getUsers', () => { - const mention = new MentionsServer({}); - describe('constant', () => { - it('should return the informed value', async () => { - mention.getUsers = 4; - expect(await mention.getUsers()).to.be.deep.equal(4); - }); - }); - describe('function', () => { - it('should return the informed value', async () => { - mention.getUsers = () => 4; - expect(await mention.getUsers()).to.be.deep.equal(4); - }); - }); - }); - describe('getChannels', () => { - const mention = new MentionsServer({}); - describe('constant', () => { - it('should return the informed value', () => { - mention.getChannels = 4; - expect(mention.getChannels()).to.be.deep.equal(4); - }); - }); - describe('function', () => { - it('should return the informed value', () => { - mention.getChannels = () => 4; - expect(mention.getChannels()).to.be.deep.equal(4); - }); - }); - }); - describe('getChannel', () => { - const mention = new MentionsServer({}); - describe('constant', () => { - it('should return the informed value', () => { - mention.getChannel = true; - expect(mention.getChannel()).to.be.deep.equal(true); - }); - }); - describe('function', () => { - it('should return the informed value', () => { - mention.getChannel = () => true; - expect(mention.getChannel()).to.be.deep.equal(true); - }); - }); - }); - }); }); diff --git a/apps/meteor/tests/unit/lib/upgradeTab.spec.ts b/apps/meteor/tests/unit/lib/upgradeTab.spec.ts deleted file mode 100644 index 42e2ec7b3850..000000000000 --- a/apps/meteor/tests/unit/lib/upgradeTab.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -import { getUpgradeTabLabel, getUpgradeTabType, isFullyFeature } from '../../../lib/upgradeTab'; - -describe('getUpgradeTabType()', () => { - it("should return 'go-fully-featured'", () => { - expect( - getUpgradeTabType({ - registered: false, - hasValidLicense: false, - isTrial: false, - hadExpiredTrials: false, - }), - ).to.be.equal('go-fully-featured'); - }); - - it("should return 'go-fully-featured-registered'", () => { - expect( - getUpgradeTabType({ - registered: true, - hasValidLicense: false, - isTrial: false, - hadExpiredTrials: false, - }), - ).to.be.equal('go-fully-featured-registered'); - }); - - it("should return 'upgrade-your-plan'", () => { - expect( - getUpgradeTabType({ - registered: true, - hasValidLicense: false, - isTrial: false, - hadExpiredTrials: true, - }), - ).to.be.equal('upgrade-your-plan'); - }); - - it("should return 'trial-enterprise'", () => { - expect( - getUpgradeTabType({ - registered: true, - hasValidLicense: true, - isTrial: true, - hadExpiredTrials: false, - }), - ).to.be.equal('trial-enterprise'); - }); - - it('should return false', () => { - expect( - getUpgradeTabType({ - registered: true, - hasValidLicense: true, - isTrial: false, - hadExpiredTrials: false, - }), - ).to.be.equal(false); - }); -}); - -describe('getUpgradeTabLabel()', () => { - it("should return 'Upgrade_tab_go_fully_featured'", () => { - expect(getUpgradeTabLabel('go-fully-featured')).to.be.equal('Upgrade_tab_go_fully_featured'); - expect(getUpgradeTabLabel('go-fully-featured-registered')).to.be.equal('Upgrade_tab_go_fully_featured'); - }); - - it("should return 'Upgrade_tab_trial_guide'", () => { - expect(getUpgradeTabLabel('trial-enterprise')).to.be.equal('Upgrade_tab_trial_guide'); - }); - - it("should return 'Upgrade_tab_upgrade_your_plan'", () => { - expect(getUpgradeTabLabel('upgrade-your-plan')).to.be.equal('Upgrade_tab_upgrade_your_plan'); - expect(getUpgradeTabLabel(false)).to.be.equal('Upgrade_tab_upgrade_your_plan'); - }); -}); - -describe('isFullyFeature()', () => { - it("should return 'true", () => { - expect(isFullyFeature('go-fully-featured')).to.be.equal(true); - }); - - it("should return 'false", () => { - expect(isFullyFeature('upgrade-your-plan')).to.be.equal(false); - expect(isFullyFeature(false)).to.be.equal(false); - }); -}); diff --git a/apps/meteor/tests/unit/server/federation/application/room/sender/RoomInternalValidator.spec.ts b/apps/meteor/tests/unit/server/federation/application/room/sender/RoomInternalValidator.spec.ts index 1876f9c05f78..c18d5d25e7d4 100644 --- a/apps/meteor/tests/unit/server/federation/application/room/sender/RoomInternalValidator.spec.ts +++ b/apps/meteor/tests/unit/server/federation/application/room/sender/RoomInternalValidator.spec.ts @@ -78,7 +78,7 @@ describe('Federation - Application - FederationRoomInternalHooksValidator', () = it('should throw an error if the user is trying to add a new external user AND the room is not a DM', async () => { await expect( service.canAddFederatedUserToFederatedRoom('external user', {} as any, { federated: true, t: RoomType.CHANNEL } as any), - ).to.be.rejectedWith('error-this-is-an-ee-feature'); + ).to.be.rejectedWith('error-this-is-a-premium-feature'); }); it('should NOT throw an error if the user is trying to add a new external user but the room is a DM', async () => { @@ -145,7 +145,7 @@ describe('Federation - Application - FederationRoomInternalHooksValidator', () = bridge.extractHomeserverOrigin.returns('localDomain'); await expect( service.canAddFederatedUserToFederatedRoom({} as any, {} as any, { federated: true, t: RoomType.CHANNEL } as any), - ).to.be.rejectedWith('error-this-is-an-ee-feature'); + ).to.be.rejectedWith('error-this-is-a-premium-feature'); }); }); @@ -154,7 +154,7 @@ describe('Federation - Application - FederationRoomInternalHooksValidator', () = try { await service.canCreateDirectMessageFromUI([{ federated: true } as any, {} as any]); } catch (e: any) { - expect(e.message).to.be.equal('error-this-is-an-ee-feature'); + expect(e.message).to.be.equal('error-this-is-a-premium-feature'); } }); @@ -163,7 +163,7 @@ describe('Federation - Application - FederationRoomInternalHooksValidator', () = try { await service.canCreateDirectMessageFromUI(['@myexternal:external.com', {} as any]); } catch (e: any) { - expect(e.message).to.be.equal('error-this-is-an-ee-feature'); + expect(e.message).to.be.equal('error-this-is-a-premium-feature'); } }); }); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts new file mode 100644 index 000000000000..adaecc6cd2e1 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveBadWords.tests.ts @@ -0,0 +1,83 @@ +import { expect } from 'chai'; + +import { BeforeSaveBadWords } from '../../../../../../server/services/messages/hooks/BeforeSaveBadWords'; + +const createMessage = (msg?: string) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, +}); + +describe('Filter bad words before saving message', () => { + it('should return same message if bad words not configured', async () => { + const badWords = new BeforeSaveBadWords(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); + + it("should return same message if no 'msg' property provided", async () => { + const badWords = new BeforeSaveBadWords(); + + const message = createMessage(); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal(undefined); + }); + + it('should return filter bad words from message when configured', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.equal('****'); + }); + + it('should return same message if bad words disabled after configured', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(); + + badWords.disable(); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); + + it('should filter custom bad words', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure('good'); + + const message = createMessage('good'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('****'); + }); + + it('should allow custom good words', async () => { + const badWords = new BeforeSaveBadWords(); + await badWords.configure(undefined, 'hell'); + + const message = createMessage('hell'); + + const result = await badWords.filterBadWords({ message }); + + return expect(result.msg).to.be.equal('hell'); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts new file mode 100644 index 000000000000..2ee0604d6f81 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveCheckMAC.tests.ts @@ -0,0 +1,104 @@ +import { api, MeteorError } from '@rocket.chat/core-services'; +import { expect } from 'chai'; +import { before, describe } from 'mocha'; + +import { BeforeSaveCheckMAC } from '../../../../../../server/services/messages/hooks/BeforeSaveCheckMAC'; +import { BrokerMocked } from '../../../../../mocks/server/BrokerMocked'; + +const createMessage = (msg?: string, extra: any = {}) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, + ...extra, +}); + +const createRoom = (extra: any = {}): any => ({ + _id: 'GENERAL', + t: 'c', + u: { + _id: 'userId', + username: 'username', + name: 'name', + }, + msgs: 1, + usersCount: 1, + _updatedAt: new Date(), + ...extra, +}); + +const broker = new BrokerMocked(); + +describe('Check MAC', () => { + before(() => { + api.setBroker(broker); + }); + + it('should do nothing if not omnichannel room', async () => { + const checkMAC = new BeforeSaveCheckMAC(); + + const empty = await checkMAC.isWithinLimits({ + message: createMessage('hey'), + room: createRoom(), + }); + + expect(empty).to.not.have.value; + }); + + it('should do nothing if message from visitor', async () => { + const checkMAC = new BeforeSaveCheckMAC(); + + const empty = await checkMAC.isWithinLimits({ + message: createMessage('hey', { token: 'hash' }), + room: createRoom({ t: 'l' }), + }); + + expect(empty).to.not.have.value; + }); + + it('should do nothing if it is a system message', async () => { + const checkMAC = new BeforeSaveCheckMAC(); + + const empty = await checkMAC.isWithinLimits({ + message: createMessage('hey', { t: 'uj' }), + room: createRoom({ t: 'l' }), + }); + + expect(empty).to.not.have.value; + }); + + it('should throw an error if not within limits', () => { + const checkMAC = new BeforeSaveCheckMAC(); + + broker.mockServices({ + 'omnichannel.isWithinMACLimit': async () => false, + }); + + void expect( + checkMAC.isWithinLimits({ + message: createMessage('hey'), + room: createRoom({ t: 'l' }), + }), + ).to.be.rejectedWith(MeteorError, 'error-mac-limit-reached'); + }); + + it('should work if MAC within limits', async () => { + const checkMAC = new BeforeSaveCheckMAC(); + + broker.mockServices({ + 'omnichannel.isWithinMACLimit': async () => true, + }); + + const empty = await checkMAC.isWithinLimits({ + message: createMessage('hey'), + room: createRoom({ t: 'l' }), + }); + + expect(empty).to.not.have.value; + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveJumpToMessage.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveJumpToMessage.tests.ts new file mode 100644 index 000000000000..5e5a26b6b268 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveJumpToMessage.tests.ts @@ -0,0 +1,500 @@ +import { expect } from 'chai'; + +import { BeforeSaveJumpToMessage } from '../../../../../../server/services/messages/hooks/BeforeSaveJumpToMessage'; + +const createMessage = (msg?: string, extra: any = {}) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, + ...extra, +}); + +const createUser = (username?: string) => ({ + _id: 'userId', + username, + name: 'name', + language: 'en', +}); + +const createRoom = (extra: any = {}): any => ({ + _id: 'GENERAL', + t: 'c', + u: { + _id: 'userId', + username: 'username', + name: 'name', + }, + msgs: 1, + usersCount: 1, + _updatedAt: new Date(), + ...extra, +}); + +const countDeep = (msg: any, deep = 1): number => { + if (!msg) { + return deep - 1; + } + + if (Array.isArray(msg?.attachments) && msg.attachments.length > 0) { + return msg.attachments.reduce((count: number, att: any) => Math.max(countDeep(att, deep + 1), count), 0); + } + + return deep - 1; +}; + +describe('Create attachments for message URLs', () => { + it('should return message without attatchment and URLs if no URL provided', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey'), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should do nothing if URL is not from SiteUrl', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://google.com' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should do nothing if URL is from SiteUrl but not have a query string', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should do nothing if URL is from SiteUrl but not have a msgId query string', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat/?token=value' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should do nothing if it do not find a msg from the URL', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat/?msg=value' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should do nothing if it cannot find the room of the message from the URL', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat/?msg=value' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should do nothing if user dont have access to the room of the message from the URL', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => false, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat/?msg=value' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').of.length(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should remove other attachments from the message if message_link is the same as the URL', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=linked' }], + attachments: [ + { + text: 'old attachment', + author_name: 'username', + author_icon: 'url', + message_link: 'https://open.rocket.chat/linked?msg=linked', + ts: new Date(), + }, + ], + }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + + const [url] = message.urls ?? []; + + expect(url).to.include({ + url: 'https://open.rocket.chat/linked?msg=linked', + ignoreParse: true, + }); + + expect(message).to.have.property('attachments').and.to.have.lengthOf(1); + + const [attachment] = message.attachments ?? []; + + expect(attachment).to.have.property('text', 'linked message'); + }); + + it('should return an attachment with the message content if a message URL is provided', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { urls: [{ url: 'https://open.rocket.chat/linked?msg=linked' }] }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + + const [url] = message.urls ?? []; + + expect(url).to.include({ + url: 'https://open.rocket.chat/linked?msg=linked', + ignoreParse: true, + }); + + expect(message).to.have.property('attachments').and.to.have.lengthOf(1); + + const [attachment] = message.attachments ?? []; + + expect(attachment).to.have.property('text', 'linked message'); + }); + + it('should respect chain limit config', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [ + createMessage('linked message', { + _id: 'linked', + attachments: [ + { + text: 'chained 1', + author_name: 'username', + author_icon: 'url', + ts: new Date(), + message_link: 'https://open.rocket.chat/linked?msg=linkedMsgId', + attachments: [ + { + text: 'chained 2', + author_name: 'username', + author_icon: 'url', + message_link: 'https://open.rocket.chat/linked?msg=linkedMsgId', + ts: new Date(), + attachments: [ + { + text: 'chained 3', + author_name: 'username', + author_icon: 'url', + message_link: 'https://open.rocket.chat/linked?msg=linkedMsgId', + ts: new Date(), + }, + ], + }, + ], + }, + ], + }), + ], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=linked' }], + }), + user: createUser(), + config: { + chainLimit: 3, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + expect(message).to.have.property('attachments').and.to.have.lengthOf(1); + + const deep = countDeep(message); + expect(deep).to.be.eq(3); + }); + + it('should create the attachment if cannot access room but message has a livechat token', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom({ t: 'l', v: { token: 'livechatToken' } })], + canAccessRoom: async () => false, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=linked' }], + token: 'livechatToken', + }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + + const [url] = message.urls ?? []; + + expect(url).to.include({ + url: 'https://open.rocket.chat/linked?msg=linked', + ignoreParse: true, + }); + + expect(message).to.have.property('attachments').and.to.have.lengthOf(1); + + const [attachment] = message.attachments ?? []; + + expect(attachment).to.have.property('text', 'linked message'); + }); + + it('should do nothing if cannot access room but message has a livechat token but is not from the room does not have a token', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [createMessage('linked message', { _id: 'linked' })], + getRooms: async () => [createRoom({ t: 'l' })], + canAccessRoom: async () => false, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=linked' }], + token: 'another-token', + }), + user: createUser(), + config: { + chainLimit: 10, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + expect(message).to.not.have.property('attachments'); + }); + + it('should remove the clean up the attachments of the quoted message property if chain limit < 2', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => [ + createMessage('linked message', { + _id: 'linkedMsgId', + attachments: [ + { + text: 'chained 1', + author_name: 'username', + author_icon: 'url', + ts: new Date(), + }, + ], + }), + ], + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=linkedMsgId' }], + }), + user: createUser(), + config: { + chainLimit: 1, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + expect(message).to.have.property('attachments').and.to.have.lengthOf(1); + + const deep = countDeep(message); + expect(deep).to.be.eq(1); + + const [attachment] = message.attachments ?? []; + + expect(attachment).to.have.property('attachments').and.to.have.lengthOf(0); + expect(attachment).to.include({ + text: 'linked message', + author_name: 'username', + author_icon: 'url', + message_link: 'https://open.rocket.chat/linked?msg=linkedMsgId', + }); + }); + + it('should work for multiple URLs', async () => { + const jumpToMessage = new BeforeSaveJumpToMessage({ + getMessages: async () => { + return [ + createMessage('first message', { + _id: 'msg1', + }), + createMessage('second message', { + _id: 'msg2', + }), + ]; + }, + getRooms: async () => [createRoom()], + canAccessRoom: async () => true, + getUserAvatarURL: () => 'url', + }); + + const message = await jumpToMessage.createAttachmentForMessageURLs({ + message: createMessage('hey', { + urls: [{ url: 'https://open.rocket.chat/linked?msg=msg1' }, { url: 'https://open.rocket.chat/linked?msg=msg2' }], + }), + user: createUser(), + config: { + chainLimit: 1, + siteUrl: 'https://open.rocket.chat', + useRealName: true, + }, + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(2); + expect(message).to.have.property('attachments').and.to.have.lengthOf(2); + + const deep = countDeep(message); + expect(deep).to.be.eq(1); + + const [att1, att2] = message.attachments ?? []; + + expect(att1).to.include({ + text: 'first message', + message_link: 'https://open.rocket.chat/linked?msg=msg1', + }); + + expect(att2).to.include({ + text: 'second message', + message_link: 'https://open.rocket.chat/linked?msg=msg2', + }); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveMarkdownParser.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveMarkdownParser.tests.ts new file mode 100644 index 000000000000..86cc3103f074 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveMarkdownParser.tests.ts @@ -0,0 +1,93 @@ +import { expect } from 'chai'; + +import { BeforeSaveMarkdownParser } from '../../../../../../server/services/messages/hooks/BeforeSaveMarkdownParser'; + +const createMessage = (msg?: string, extra: any = {}) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, + ...extra, +}); + +describe('Markdown parser', () => { + it('should do nothing if markdown parser is disabled', async () => { + const markdownParser = new BeforeSaveMarkdownParser(false); + + const message = await markdownParser.parseMarkdown({ + message: createMessage('hey'), + config: {}, + }); + + expect(message).to.not.have.property('md'); + }); + + it('should do nothing for OTR messages', async () => { + const markdownParser = new BeforeSaveMarkdownParser(true); + + const message = await markdownParser.parseMarkdown({ + message: createMessage('hey', { t: 'otr' }), + config: {}, + }); + + const messageAck = await markdownParser.parseMarkdown({ + message: createMessage('hey', { t: 'otr-ack' }), + config: {}, + }); + + expect(message).to.not.have.property('md'); + expect(messageAck).to.not.have.property('md'); + }); + + it('should do nothing for E2E messages', async () => { + const markdownParser = new BeforeSaveMarkdownParser(true); + + const message = await markdownParser.parseMarkdown({ + message: createMessage('hey', { t: 'e2e' }), + config: {}, + }); + + expect(message).to.not.have.property('md'); + }); + + it('should parse markdown', async () => { + const markdownParser = new BeforeSaveMarkdownParser(true); + + const message = await markdownParser.parseMarkdown({ + message: createMessage('hey'), + config: {}, + }); + + expect(message).to.have.property('md'); + }); + + it('should parse markdown on the first attachment only', async () => { + const markdownParser = new BeforeSaveMarkdownParser(true); + + const message = await markdownParser.parseMarkdown({ + message: createMessage('hey', { + attachments: [ + { + description: 'hey ho', + }, + { + description: 'lets go', + }, + ], + }), + config: {}, + }); + + expect(message).to.have.property('md'); + + const [attachment1, attachment2] = message.attachments || []; + + expect(attachment1).to.have.property('descriptionMd'); + expect(attachment2).to.not.have.property('descriptionMd'); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts new file mode 100644 index 000000000000..6dc6d472cae5 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSavePreventMention.tests.ts @@ -0,0 +1,114 @@ +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; + +const Authorization = { + hasPermission: async (_uid: string, _permission: string, _room?: string): Promise => true, +}; + +class MeteorError extends Error {} + +const { BeforeSavePreventMention } = proxyquire + .noCallThru() + .load('../../../../../../server/services/messages/hooks/BeforeSavePreventMention', { + '@rocket.chat/core-services': { + Authorization, + MeteorError, + }, + '../../../lib/i18n': { + i18n: { + t: (s: any) => s, + }, + }, + }); + +describe('Prevent mention on messages', () => { + it('should return void if message has no mentions', async () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should return void if message doesnt't have @all mention", () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'here' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should return void if message doesnt't have @here mention", () => { + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-here', + }), + ).to.eventually.be.true; + }); + + it('should return true if user has required permission', () => { + const preventMention = new BeforeSavePreventMention(); + + Authorization.hasPermission = async () => true; + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it('should return void if user has required permission on room scope', () => { + const preventMention = new BeforeSavePreventMention(); + + Authorization.hasPermission = async (_uid, _permission, room) => { + if (room) { + return true; + } + + return false; + }; + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.eventually.be.true; + }); + + it("should throw if user doesn't have required permissions", () => { + Authorization.hasPermission = async (_uid, _permission, _room) => false; + + const preventMention = new BeforeSavePreventMention(); + + return expect( + preventMention.preventMention({ + message: { rid: 'GENERAL', msg: 'hey', mentions: [{ _id: 'all' }], u: { _id: 'random' } }, + user: { _id: 'userId', language: 'en' }, + mention: 'all', + permission: 'mention-all', + }), + ).to.be.rejectedWith(MeteorError); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts new file mode 100644 index 000000000000..03c23502d38b --- /dev/null +++ b/apps/meteor/tests/unit/server/services/messages/hooks/BeforeSaveSpotify.tests.ts @@ -0,0 +1,92 @@ +import { expect } from 'chai'; + +import { BeforeSaveSpotify } from '../../../../../../server/services/messages/hooks/BeforeSaveSpotify'; + +const createMessage = (msg?: string, extra: any = {}) => ({ + _id: 'random', + rid: 'GENERAL', + ts: new Date(), + u: { + _id: 'userId', + username: 'username', + }, + _updatedAt: new Date(), + msg: msg as string, + ...extra, +}); + +describe('Convert Spotify syntax to URLs', () => { + it('should return no URLs if no Spotify syntax provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('hey'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should return no URLs if an undefined message is provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage(), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should not return a Spotify URL if some Spotify syntax is provided within a code block', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('test\n```\nspotify:track:1q6IK1l4qpYykOaWaLJkWG\n```'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should not return a Spotify URL if some Spotify syntax is provided within a inline code', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('test `spotify:track:1q6IK1l4qpYykOaWaLJkWG` ok'), + }); + + return expect(message).to.not.have.property('urls'); + }); + + it('should return a Spotify URL if some Spotify syntax is provided', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('spotify:track:1q6IK1l4qpYykOaWaLJkWG'), + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(1); + + const [url] = message.urls ?? []; + + expect(url).to.have.property('url', 'https://open.spotify.com/track/1q6IK1l4qpYykOaWaLJkWG'); + expect(url).to.have.property('source', 'spotify:track:1q6IK1l4qpYykOaWaLJkWG'); + }); + + it('should append a Spotify URL when Spotify syntax is provided with already existing URLs', async () => { + const spotify = new BeforeSaveSpotify(); + + const message = await spotify.convertSpotifyLinks({ + message: createMessage('spotify:track:1q6IK1l4qpYykOaWaLJkWG', { + urls: [{ url: 'https://rocket.chat' }], + }), + }); + + expect(message).to.have.property('urls').and.to.have.lengthOf(2); + + const [url1, url2] = message.urls ?? []; + + expect(url1).to.have.property('url', 'https://rocket.chat'); + + expect(url2).to.have.property('url', 'https://open.spotify.com/track/1q6IK1l4qpYykOaWaLJkWG'); + expect(url2).to.have.property('source', 'spotify:track:1q6IK1l4qpYykOaWaLJkWG'); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/omnichannel-analytics/AgentData.tests.ts b/apps/meteor/tests/unit/server/services/omnichannel-analytics/AgentData.tests.ts new file mode 100644 index 000000000000..0894c1f8d894 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/omnichannel-analytics/AgentData.tests.ts @@ -0,0 +1,1573 @@ +/* eslint-disable new-cap */ +import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import { expect } from 'chai'; +import moment from 'moment'; +import sinon from 'sinon'; + +import { AgentOverviewData } from '../../../../../server/services/omnichannel-analytics/AgentData'; + +describe('AgentData Analytics', () => { + describe('updateMap', () => { + it('should update an empty map', () => { + const map = new Map(); + const agentOverview = new AgentOverviewData({} as any); + + agentOverview.updateMap(map, 'test', 1); + + expect(map.get('test')).to.be.equal(1); + }); + it('should update an existing key on a map', () => { + const map = new Map(); + map.set('test', 1); + const agentOverview = new AgentOverviewData({} as any); + + agentOverview.updateMap(map, 'test', 2); + + expect(map.get('test')).to.be.equal(3); + }); + }); + + describe('sortByValue', () => { + it('should sort an array of objects by value key', () => { + const agentOverview = new AgentOverviewData({} as any); + const array = [{ value: '1' }, { value: '3' }, { value: '2' }]; + + agentOverview.sortByValue(array); + + expect(array).to.be.deep.equal([{ value: '1' }, { value: '2' }, { value: '3' }]); + }); + it('should sort an array of objects by value key in inverse order when `inv` is true', () => { + const agentOverview = new AgentOverviewData({} as any); + const array = [{ value: '1' }, { value: '3' }, { value: '2' }]; + + agentOverview.sortByValue(array, true); + + expect(array).to.be.deep.equal([{ value: '3' }, { value: '2' }, { value: '1' }]); + }); + }); + + describe('isActionAllowed', () => { + it('should return true when action is valid', () => { + const agentOverview = new AgentOverviewData({} as any); + + expect(agentOverview.isActionAllowed('Total_conversations')).to.be.true; + }); + it('should return false when action is invalid', () => { + const agentOverview = new AgentOverviewData({} as any); + + expect(agentOverview.isActionAllowed('invalid')).to.be.false; + }); + it('should return false when action is undefined', () => { + const agentOverview = new AgentOverviewData({} as any); + + expect(agentOverview.isActionAllowed(undefined)).to.be.false; + }); + }); + + describe('callAction', () => { + it('should throw an error when action is invalid', async () => { + const agentOverview = new AgentOverviewData({} as any); + + try { + // @ts-expect-error - test + // eslint-disable-next-line prettier/prettier, no-return-await + await agentOverview.callAction('invalid', moment(), moment()); + } catch (e) { + expect(e).to.be.instanceOf(Error); + } + }); + it('should call a valid action', async () => { + const mockModel = { + getAnalyticsMetricsBetweenDateWithMessages: () => [], + getAnalyticsMetricsBetweenDate: () => [], + }; + + const agentOverview = new AgentOverviewData(mockModel as any); + + const spy = sinon.spy(agentOverview, 'Total_conversations'); + const spy2 = sinon.spy(agentOverview, 'Total_messages'); + const spy3 = sinon.spy(agentOverview, 'Avg_chat_duration'); + const spy4 = sinon.spy(agentOverview, 'Avg_first_response_time'); + const spy5 = sinon.spy(agentOverview, 'Best_first_response_time'); + const spy6 = sinon.spy(agentOverview, 'Avg_reaction_time'); + const spy7 = sinon.spy(agentOverview, 'Avg_response_time'); + + await agentOverview.callAction('Total_conversations', moment(), moment()); + + expect(spy.calledOnce).to.be.true; + + await agentOverview.callAction('Total_messages', moment(), moment()); + + expect(spy2.calledOnce).to.be.true; + + await agentOverview.callAction('Avg_chat_duration', moment(), moment()); + + expect(spy3.calledOnce).to.be.true; + + await agentOverview.callAction('Avg_first_response_time', moment(), moment()); + + expect(spy4.calledOnce).to.be.true; + + await agentOverview.callAction('Best_first_response_time', moment(), moment()); + + expect(spy5.calledOnce).to.be.true; + + await agentOverview.callAction('Avg_reaction_time', moment(), moment()); + + expect(spy6.calledOnce).to.be.true; + + await agentOverview.callAction('Avg_response_time', moment(), moment()); + + expect(spy7.calledOnce).to.be.true; + }); + }); + + describe('Total_Conversations', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_conversations(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: '%_of_conversations' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_conversations(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '100.00%', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: '%_of_conversations' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + }, + { + servedBy: { + username: 'agent 2', + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_conversations(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '50.00%', + }, + { + name: 'agent 2', + value: '50.00%', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: '%_of_conversations' }, + ], + }); + }); + it('should properly calculate when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + }, + { + servedBy: { + username: 'agent 2', + }, + }, + { + servedBy: { + username: 'agent 1', + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_conversations(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '66.67%', + }, + { + name: 'agent 2', + value: '33.33%', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: '%_of_conversations' }, + ], + }); + }); + it('should ignore conversations that are not served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: undefined, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_conversations(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: '%_of_conversations' }, + ], + }); + }); + }); + + describe('Avg_chat_duration', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + chatDuration: 100, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:01:40', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + chatDuration: 100, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + chatDuration: 200, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:01:40', + }, + { + name: 'agent 2', + value: '00:03:20', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + it('should properly calculate when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + chatDuration: 100, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + chatDuration: 200, + }, + }, + { + servedBy: { + username: 'agent 1', + }, + metrics: { + chatDuration: 200, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:02:30', + }, + { + name: 'agent 2', + value: '00:03:20', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + it('should ignore conversations not being served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + metrics: { + chatDuration: 100, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + it('should ignore conversations with no metrics', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: undefined, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: {}, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_chat_duration(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_chat_duration' }, + ], + }); + }); + }); + + describe('Total_messages', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDateWithMessages']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_messages(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Total_messages' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDateWithMessages']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + msgs: 10, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_messages(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: 10, + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Total_messages' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDateWithMessages']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + msgs: 10, + }, + { + servedBy: { + username: 'agent 2', + }, + msgs: 20, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_messages(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 2', + value: 20, + }, + { + name: 'agent 1', + value: 10, + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Total_messages' }, + ], + }); + }); + it('should properly calculate when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDateWithMessages']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + msgs: 10, + }, + { + servedBy: { + username: 'agent 2', + }, + msgs: 20, + }, + { + servedBy: { + username: 'agent 1', + }, + msgs: 20, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_messages(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: 30, + }, + { + name: 'agent 2', + value: 20, + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Total_messages' }, + ], + }); + }); + it('should ignore conversations that are not served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDateWithMessages(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDateWithMessages']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + msgs: 10, + }, + { + servedBy: { + username: 'agent 2', + }, + msgs: 20, + }, + { + servedBy: undefined, + msgs: 20, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Total_messages(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 2', + value: 20, + }, + { + name: 'agent 1', + value: 10, + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Total_messages' }, + ], + }); + }); + }); + + describe('Avg_first_response_time', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 100, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:01:40', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:01:40', + }, + { + name: 'agent 2', + value: '00:03:20', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + it('should calculate correctly when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { + name: 'agent 1', + value: '00:02:30', + }, + { + name: 'agent 2', + value: '00:03:20', + }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + it('should ignore conversations not being served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: undefined, + metrics: { + response: { + ft: 100, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + it('should ignore conversations with no metrics', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: undefined, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Avg_first_response_time' }, + ], + }); + }); + }); + + describe('Best_first_response_time', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Best_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Best_first_response_time' }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + { + servedBy: { + username: 'agent 3', + }, + metrics: { + response: { + ft: 50, + }, + }, + }, + { + servedBy: { + username: 'agent 4', + }, + metrics: { + response: { + ft: 150, + }, + }, + }, + { + servedBy: { + username: 'agent 5', + }, + metrics: { + response: { + ft: 250, + }, + }, + }, + { + servedBy: { + username: 'agent 6', + }, + metrics: { + response: { + ft: 300, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Best_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:01:40' }, + { name: 'agent 2', value: '00:03:20' }, + { name: 'agent 3', value: '00:00:50' }, + { name: 'agent 4', value: '00:02:30' }, + { name: 'agent 5', value: '00:04:10' }, + { name: 'agent 6', value: '00:05:00' }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Best_first_response_time' }, + ], + }); + }); + it('should properly calculate when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + { + servedBy: { + username: 'agent 3', + }, + metrics: { + response: { + ft: 50, + }, + }, + }, + { + servedBy: { + username: 'agent 4', + }, + metrics: { + response: { + ft: 150, + }, + }, + }, + { + servedBy: { + username: 'agent 5', + }, + metrics: { + response: { + ft: 250, + }, + }, + }, + { + servedBy: { + username: 'agent 6', + }, + metrics: { + response: { + ft: 300, + }, + }, + }, + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + ft: 200, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Best_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:01:40' }, + { name: 'agent 2', value: '00:03:20' }, + { name: 'agent 3', value: '00:00:50' }, + { name: 'agent 4', value: '00:02:30' }, + { name: 'agent 5', value: '00:04:10' }, + { name: 'agent 6', value: '00:05:00' }, + ], + head: [ + { + name: 'Agent', + }, + { name: 'Best_first_response_time' }, + ], + }); + }); + it('should ignore conversations not being served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [{ servedBy: undefined, metrics: { response: { ft: 100 } } }]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Best_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Best_first_response_time' }, + ], + }); + }); + it('should ignore conversations with no metrics', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [{ servedBy: { username: 'agent 1' }, metrics: undefined }]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Best_first_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { name: 'Best_first_response_time' }, + ], + }); + }); + }); + + describe('Avg_response_time', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + avg: 100, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [{ name: 'agent 1', value: '00:01:40' }], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + avg: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + avg: 200, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:01:40' }, + { name: 'agent 2', value: '00:03:20' }, + ], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + it('should calculate correctly when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + avg: 100, + }, + }, + }, + { + servedBy: { + username: 'agent 2', + }, + metrics: { + response: { + avg: 200, + }, + }, + }, + { + servedBy: { + username: 'agent 1', + }, + metrics: { + response: { + avg: 200, + }, + }, + }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:02:30' }, + { name: 'agent 2', value: '00:03:20' }, + ], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + it('should ignore conversations not being served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [{ servedBy: undefined, metrics: { response: { avg: 100 } } }]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + it('should ignore conversations with no metrics', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [ + { servedBy: { username: 'agent 1' }, metrics: undefined }, + { servedBy: { username: 'agent 2' }, metrics: {} }, + ]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_response_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_response_time', + }, + ], + }); + }); + }); + + describe('Avg_reaction_time', () => { + it('should return an ConversationData object with empty data when model call returns empty array', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return []; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + return [{ servedBy: { username: 'agent 1' }, metrics: { reaction: { ft: 100 } } }]; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [{ name: 'agent 1', value: '00:01:40' }], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + it('should return an ConversationData object with data when model call returns data with multiple agents', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + const data = [ + { servedBy: { username: 'agent 1' }, metrics: { reaction: { ft: 100 } } }, + { servedBy: { username: 'agent 2' }, metrics: { reaction: { ft: 200 } } }, + ]; + + return data; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:01:40' }, + { name: 'agent 2', value: '00:03:20' }, + ], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + it('should calculate correctly when agents have multiple conversations', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + const data = [ + { servedBy: { username: 'agent 1' }, metrics: { reaction: { ft: 100 } } }, + { servedBy: { username: 'agent 2' }, metrics: { reaction: { ft: 200 } } }, + { servedBy: { username: 'agent 1' }, metrics: { reaction: { ft: 200 } } }, + ]; + + return data; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [ + { name: 'agent 1', value: '00:02:30' }, + { name: 'agent 2', value: '00:03:20' }, + ], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + it('should ignore conversations not being served by any agent', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + const data = [{ servedBy: undefined, metrics: { reaction: { ft: 100 } } }]; + + return data; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + it('should ignore conversations with no metrics', async () => { + const modelMock = { + getAnalyticsMetricsBetweenDate(_params: ILivechatRoomsModel['getAnalyticsMetricsBetweenDate']) { + const data = [ + { servedBy: { username: 'agent 1' }, metrics: undefined }, + { servedBy: { username: 'agent 2' }, metrics: {} }, + ]; + + return data; + }, + }; + + const agentOverview = new AgentOverviewData(modelMock as any); + + const result = await agentOverview.Avg_reaction_time(moment(), moment(), 'departmentId'); + + expect(result).to.be.deep.equal({ + data: [], + head: [ + { + name: 'Agent', + }, + { + name: 'Avg_reaction_time', + }, + ], + }); + }); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/omnichannel-analytics/ChartData.tests.ts b/apps/meteor/tests/unit/server/services/omnichannel-analytics/ChartData.tests.ts new file mode 100644 index 000000000000..9acce81721c1 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/omnichannel-analytics/ChartData.tests.ts @@ -0,0 +1,243 @@ +/* eslint-disable new-cap */ +import { expect } from 'chai'; +import sinon from 'sinon'; + +import { ChartData } from '../../../../../server/services/omnichannel-analytics/ChartData'; + +describe('ChartData Analytics', () => { + describe('isActionAllowed', () => { + it('should return false if no action is provided', () => { + const chart = new ChartData({} as any); + expect(chart.isActionAllowed(undefined)).to.be.false; + }); + + it('should return false if an invalid action is provided', () => { + const chart = new ChartData({} as any); + expect(chart.isActionAllowed('invalid_action')).to.be.false; + }); + + it('should return true if a valid action is provided', () => { + const chart = new ChartData({} as any); + expect(chart.isActionAllowed('Total_conversations')).to.be.true; + }); + }); + + describe('callAction', () => { + it('should call the correct action', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [], + getAnalyticsMetricsBetweenDate: () => [], + getTotalConversationsBetweenDate: () => 0, + } as any); + expect(await chart.callAction('Total_conversations', {} as any)).to.be.equal(0); + }); + it('should throw an error if the action is invalid', async () => { + const chart = new ChartData({} as any); + try { + // @ts-expect-error - Invalid action + await chart.callAction('invalid_action', {} as any); + } catch (e: any) { + expect(e.message).to.be.equal('Invalid action'); + } + }); + it('should call the correct action with the correct parameters', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [], + getAnalyticsMetricsBetweenDate: () => [], + getTotalConversationsBetweenDate: () => 0, + } as any); + + const spy = sinon.spy(chart, 'Total_conversations'); + const spy2 = sinon.spy(chart, 'Avg_chat_duration'); + const spy3 = sinon.spy(chart, 'Total_messages'); + const spy4 = sinon.spy(chart, 'Avg_first_response_time'); + const spy5 = sinon.spy(chart, 'Avg_reaction_time'); + + await chart.callAction('Total_conversations', {} as any); + expect(spy.calledOnce).to.be.true; + + await chart.callAction('Avg_chat_duration', {} as any); + expect(spy2.calledOnce).to.be.true; + + await chart.callAction('Total_messages', {} as any); + expect(spy3.calledOnce).to.be.true; + + await chart.callAction('Avg_first_response_time', {} as any); + expect(spy4.calledOnce).to.be.true; + + await chart.callAction('Avg_reaction_time', {} as any); + expect(spy5.calledOnce).to.be.true; + }); + }); + + describe('Total_conversations', () => { + it('should return the total number of conversations', async () => { + const chart = new ChartData({ + getTotalConversationsBetweenDate: async () => 10, + } as any); + expect(await chart.Total_conversations({} as any)).to.be.equal(10); + }); + }); + + describe('Avg_chat_duration', () => { + it('should return the average chat duration', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { chatDuration: 10 } }], + } as any); + expect(await chart.Avg_chat_duration({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { chatDuration: 10 } }, { metrics: { chatDuration: 20 } }], + } as any); + expect(await chart.Avg_chat_duration({} as any)).to.be.equal(15); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [], + } as any); + expect(await chart.Avg_chat_duration({} as any)).to.be.equal(0); + }); + it('should ignore conversations without chatDuration', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { chatDuration: 10 } }, { metrics: {} }], + } as any); + expect(await chart.Avg_chat_duration({} as any)).to.be.equal(10); + }); + }); + + describe('Total_messages', () => { + it('should return the total number of messages', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [{ msgs: 10 }], + } as any); + expect(await chart.Total_messages({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [{ msgs: 10 }, { msgs: 20 }], + } as any); + expect(await chart.Total_messages({} as any)).to.be.equal(30); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [], + } as any); + expect(await chart.Total_messages({} as any)).to.be.equal(0); + }); + it('should ignore conversations without msgs', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDateWithMessages: () => [{ msgs: 10 }, {}], + } as any); + expect(await chart.Total_messages({} as any)).to.be.equal(10); + }); + }); + + describe('Avg_first_response_time', () => { + it('should return the average first response time', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }], + } as any); + expect(await chart.Avg_first_response_time({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }, { metrics: { response: { ft: 20 } } }], + } as any); + expect(await chart.Avg_first_response_time({} as any)).to.be.equal(15); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [], + } as any); + expect(await chart.Avg_first_response_time({} as any)).to.be.equal(0); + }); + it('should ignore conversations without response', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }, { metrics: {} }], + } as any); + expect(await chart.Avg_first_response_time({} as any)).to.be.equal(10); + }); + }); + + describe('Best_first_response_time', () => { + it('should return the best first response time', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }], + } as any); + expect(await chart.Best_first_response_time({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }, { metrics: { response: { ft: 20 } } }], + } as any); + expect(await chart.Best_first_response_time({} as any)).to.be.equal(10); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [], + } as any); + expect(await chart.Best_first_response_time({} as any)).to.be.equal(0); + }); + it('should ignore conversations without response', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { ft: 10 } } }, { metrics: {} }], + } as any); + expect(await chart.Best_first_response_time({} as any)).to.be.equal(10); + }); + }); + + describe('Avg_response_time', () => { + it('should return the average response time', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { avg: 10 } } }], + } as any); + expect(await chart.Avg_response_time({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { avg: 10 } } }, { metrics: { response: { avg: 20 } } }], + } as any); + expect(await chart.Avg_response_time({} as any)).to.be.equal(15); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [], + } as any); + expect(await chart.Avg_response_time({} as any)).to.be.equal(0); + }); + it('should ignore conversations without response', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { response: { avg: 10 } } }, { metrics: {} }], + } as any); + expect(await chart.Avg_response_time({} as any)).to.be.equal(10); + }); + }); + + describe('Avg_reaction_time', () => { + it('should return the average reaction time', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { reaction: { ft: 10 } } }], + } as any); + expect(await chart.Avg_reaction_time({} as any)).to.be.equal(10); + }); + it('should properly calculate with more conversations', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { reaction: { ft: 10 } } }, { metrics: { reaction: { ft: 20 } } }], + } as any); + expect(await chart.Avg_reaction_time({} as any)).to.be.equal(15); + }); + it('should return 0 if no conversations are found', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [], + } as any); + expect(await chart.Avg_reaction_time({} as any)).to.be.equal(0); + }); + it('should ignore conversations without reaction', async () => { + const chart = new ChartData({ + getAnalyticsMetricsBetweenDate: () => [{ metrics: { reaction: { ft: 10 } } }, { metrics: {} }], + } as any); + expect(await chart.Avg_reaction_time({} as any)).to.be.equal(10); + }); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/omnichannel-analytics/OverviewData.tests.ts b/apps/meteor/tests/unit/server/services/omnichannel-analytics/OverviewData.tests.ts new file mode 100644 index 000000000000..cd2031d387d8 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/omnichannel-analytics/OverviewData.tests.ts @@ -0,0 +1,278 @@ +/* eslint-disable new-cap */ +import { expect } from 'chai'; +import moment from 'moment'; +import sinon from 'sinon'; + +import { OverviewData } from '../../../../../server/services/omnichannel-analytics/OverviewData'; +import { conversations } from './mockData'; + +const analytics = (date: { gte: Date; lt: Date }) => { + // filter the mockData array with the date param with moment + return conversations.filter((c) => moment(c.ts).isBetween(date.gte, date.lt)); +}; + +describe('OverviewData Analytics', () => { + describe('isActionAllowed', () => { + it('should return false if no action is provided', () => { + const overview = new OverviewData({} as any); + expect(overview.isActionAllowed(undefined)).to.be.false; + }); + + it('should return false if an invalid action is provided', () => { + const overview = new OverviewData({} as any); + expect(overview.isActionAllowed('invalid_action')).to.be.false; + }); + + it('should return true if a valid action is provided', () => { + const overview = new OverviewData({} as any); + expect(overview.isActionAllowed('Conversations')).to.be.true; + }); + }); + + describe('callAction', () => { + it('should fail if the action is invalid', async () => { + const overview = new OverviewData({} as any); + try { + // @ts-expect-error - Invalid action + await overview.callAction('invalid_action', {} as any); + } catch (e: any) { + expect(e.message).to.be.equal('Invalid action'); + } + }); + it('should call the correct action with the correct parameters', async () => { + const overview = new OverviewData({ + getAnalyticsBetweenDate: () => [], + getOnHoldConversationsBetweenDate: () => 0, + getAnalyticsMetricsBetweenDate: () => [], + } as any); + + const spy = sinon.spy(overview, 'Conversations'); + const spy2 = sinon.spy(overview, 'Productivity'); + + await overview.callAction('Conversations', moment(), moment(), '', 'UTC'); + expect(spy.calledOnce).to.be.true; + + await overview.callAction('Productivity', moment(), moment(), '', 'UTC', (v: string): string => v); + expect(spy2.calledOnce).to.be.true; + }); + }); + + describe('getKeyHavingMaxValue', () => { + it('should return the key with the max value', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + map.set('a', 1); + map.set('b', 2); + map.set('c', 3); + expect(overview.getKeyHavingMaxValue(map, 'd')).to.be.equal('c'); + }); + it('should return the default key if the map is empty', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + expect(overview.getKeyHavingMaxValue(map, 'd')).to.be.equal('d'); + }); + }); + + describe('getAllMapKeysSize', () => { + it('should return the sum of all map keys', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + map.set('a', 1); + map.set('b', 2); + map.set('c', 3); + expect(overview.sumAllMapKeys(map)).to.be.equal(6); + }); + it('should return 0 if the map is empty', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + expect(overview.sumAllMapKeys(map)).to.be.equal(0); + }); + }); + + describe('getBusiestDay', () => { + it('should return the day with the most messages', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + map.set( + 'Monday', + new Map([ + ['1', 1], + ['2', 2], + ]), + ); + map.set( + 'Tuesday', + new Map([ + ['13', 1], + ['15', 2], + ]), + ); + map.set( + 'Sunday', + new Map([ + ['12', 2], + ['23', 2], + ]), + ); + expect(overview.getBusiestDay(map)).to.be.equal('Sunday'); + }); + it('should return the first day with the most messages if theres a tie', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + map.set( + 'Monday', + new Map([ + ['1', 1], + ['2', 2], + ]), + ); + map.set( + 'Tuesday', + new Map([ + ['13', 1], + ['15', 2], + ]), + ); + map.set( + 'Sunday', + new Map([ + ['12', 1], + ['23', 2], + ]), + ); + expect(overview.getBusiestDay(map)).to.be.equal('Monday'); + }); + it('should return the default key if the map is empty', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + expect(overview.getBusiestDay(map)).to.be.equal('-'); + }); + }); + + describe('sumAllMapKeys', () => { + it('should return the sum of all map keys', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + map.set('a', 1); + map.set('b', 2); + map.set('c', 3); + expect(overview.sumAllMapKeys(map)).to.be.equal(6); + }); + it('should return 0 if the map is empty', () => { + const overview = new OverviewData({} as any); + const map = new Map(); + expect(overview.sumAllMapKeys(map)).to.be.equal(0); + }); + }); + + describe('Conversations', () => { + it('should return all values as 0 when theres no data', async () => { + const overview = new OverviewData({ + getAnalyticsBetweenDate: () => [], + getOnHoldConversationsBetweenDate: () => 0, + } as any); + const result = await overview.Conversations(moment(), moment(), '', 'UTC', (v: string): string => v, {}); + expect(result).to.be.deep.equal([ + { title: 'Total_conversations', value: 0 }, + { title: 'Open_conversations', value: 0 }, + { title: 'On_Hold_conversations', value: 0 }, + { title: 'Total_messages', value: 0 }, + { title: 'Busiest_day', value: '-' }, + { title: 'Conversations_per_day', value: '0.00' }, + { title: 'Busiest_time', value: '-' }, + ]); + }); + it('should return all values as 0 when theres data but not on the period we pass', async () => { + const overview = new OverviewData({ + getAnalyticsBetweenDate: () => analytics({ gte: moment().set('month', 9).toDate(), lt: moment().set('month', 9).toDate() }), + getOnHoldConversationsBetweenDate: () => 0, + } as any); + const result = await overview.Conversations(moment(), moment(), '', 'UTC', (v: string): string => v, {}); + expect(result).to.be.deep.equal([ + { title: 'Total_conversations', value: 0 }, + { title: 'Open_conversations', value: 0 }, + { title: 'On_Hold_conversations', value: 0 }, + { title: 'Total_messages', value: 0 }, + { title: 'Busiest_day', value: '-' }, + { title: 'Conversations_per_day', value: '0.00' }, + { title: 'Busiest_time', value: '-' }, + ]); + }); + it('should return the correct values when theres data on the period we pass', async () => { + const overview = new OverviewData({ + getAnalyticsBetweenDate: (date: { gte: Date; lt: Date }) => analytics(date), + getOnHoldConversationsBetweenDate: () => 1, + } as any); + + // Fixed date to assure we get the same data + const result = await overview.Conversations( + moment.utc().set('month', 10).set('year', 2023).set('date', 12).startOf('day'), + moment.utc().set('month', 10).set('year', 2023).set('date', 12).endOf('day'), + '', + 'UTC', + (v: string): string => v, + {}, + ); + expect(result).to.be.deep.equal([ + { title: 'Total_conversations', value: 1 }, + { title: 'Open_conversations', value: 0 }, + { title: 'On_Hold_conversations', value: 1 }, + { title: 'Total_messages', value: 93 }, + { title: 'Busiest_day', value: 'Sunday' }, + { title: 'Conversations_per_day', value: '1.00' }, + { title: 'Busiest_time', value: '11AM - 12PM' }, + ]); + }); + }); + + describe('Productivity', () => { + it('should return all values as 0 when theres no data', async () => { + const overview = new OverviewData({ + getAnalyticsMetricsBetweenDate: () => ({ + forEach: () => [], + }), + } as any); + const result = await overview.Productivity(moment(), moment(), '', 'UTC', (v: string): string => v, {}); + expect(result).to.be.deep.equal([ + { title: 'Avg_response_time', value: '00:00:00' }, + { title: 'Avg_first_response_time', value: '00:00:00' }, + { title: 'Avg_reaction_time', value: '00:00:00' }, + ]); + }); + it('should return all values as 0 when theres data but not on the period we pass', async () => { + const overview = new OverviewData({ + getAnalyticsMetricsBetweenDate: (_: any, date: { gte: Date; lt: Date }) => analytics(date), + } as any); + const result = await overview.Productivity( + moment().set('month', 9), + moment().set('month', 9), + '', + 'UTC', + (v: string): string => v, + {}, + ); + expect(result).to.be.deep.equal([ + { title: 'Avg_response_time', value: '00:00:00' }, + { title: 'Avg_first_response_time', value: '00:00:00' }, + { title: 'Avg_reaction_time', value: '00:00:00' }, + ]); + }); + it('should return the correct values when theres data on the period we pass', async () => { + const overview = new OverviewData({ + getAnalyticsMetricsBetweenDate: (_: any, date: { gte: Date; lt: Date }) => analytics(date), + } as any); + const result = await overview.Productivity( + moment().set('month', 10).set('year', 2023).startOf('month'), + moment().set('month', 10).set('year', 2023).endOf('month'), + '', + 'UTC', + ); + + expect(result).to.be.deep.equal([ + { title: 'Avg_response_time', value: '00:00:07' }, + { title: 'Avg_first_response_time', value: '00:00:10' }, + { title: 'Avg_reaction_time', value: '00:00:49' }, + ]); + }); + }); +}); diff --git a/apps/meteor/tests/unit/server/services/omnichannel-analytics/mockData.ts b/apps/meteor/tests/unit/server/services/omnichannel-analytics/mockData.ts new file mode 100644 index 000000000000..f2328fe3bc14 --- /dev/null +++ b/apps/meteor/tests/unit/server/services/omnichannel-analytics/mockData.ts @@ -0,0 +1,38 @@ +export const conversations = [ + { ts: new Date('2023-11-07T14:37:40.081Z'), msgs: 21 }, + { + ts: new Date('2023-11-14T02:10:38.971Z'), + msgs: 48, + metrics: { + response: { avg: 10, ft: 4 }, + reaction: { ft: 10 }, + }, + }, + { ts: new Date('2023-11-04T20:33:27.172Z'), msgs: 82 }, + { ts: new Date('2023-11-12T11:37:17.716Z'), msgs: 93 }, + { ts: new Date('2023-11-30T17:27:00.057Z'), msgs: 65 }, + { + ts: new Date('2023-11-28T01:13:44.980Z'), + msgs: 45, + metrics: { + response: { avg: 10.233, ft: 23.1 }, + reaction: { ft: 13.2343333 }, + }, + }, + { ts: new Date('2023-11-19T04:05:23.717Z'), msgs: 11 }, + { ts: new Date('2023-11-15T09:16:21.890Z'), msgs: 17 }, + { ts: new Date('2023-11-26T03:53:19.443Z'), msgs: 37 }, + { ts: new Date('2023-11-24T13:45:01.650Z'), msgs: 96 }, + { + ts: new Date('2023-11-25T07:46:38.990Z'), + msgs: 38, + metrics: { + response: { avg: 1.34344417, ft: 4.19383484 }, + reaction: { ft: 123.040949 }, + }, + }, + { ts: new Date('2023-11-21T07:27:38.990Z'), msgs: 38 }, + { ts: new Date('2023-11-29T07:37:38.990Z'), msgs: 38 }, + { ts: new Date('2023-11-22T07:47:38.990Z'), msgs: 34 }, + { ts: new Date('2023-11-23T07:57:38.990Z'), msgs: 14 }, +]; diff --git a/codecov.yml b/codecov.yml index 2fe2eaf32b42..f9bbd51211c7 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,17 +12,15 @@ coverage: flags: - client flags: - unit: - carryforward: true e2e: paths: - apps/meteor/ - carryforward: true client: paths: - apps/meteor/client - carryforward: true comment: layout: 'reach, diff, flags' +fixes: + - '/home/runner/work/Rocket.Chat/Rocket.Chat/::' diff --git a/docker-compose-ci.yml b/docker-compose-ci.yml index e859772f007b..f3ce12026d49 100644 --- a/docker-compose-ci.yml +++ b/docker-compose-ci.yml @@ -2,6 +2,8 @@ version: '3.8' services: rocketchat: + volumes: + - /tmp/coverage:/tmp/coverage platform: linux/amd64 build: dockerfile: ${RC_DOCKERFILE} @@ -15,6 +17,8 @@ services: - 'TRANSPORTER=${TRANSPORTER}' - MOLECULER_LOG_LEVEL=info - 'ROCKETCHAT_LICENSE=${ENTERPRISE_LICENSE}' + - 'COVERAGE_DIR=${COVERAGE_DIR}' + - 'COVERAGE_REPORTER=${COVERAGE_REPORTER}' extra_hosts: - 'host.docker.internal:host-gateway' depends_on: diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 81958cf94cc6..d8ba4f0ed840 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,347 @@ # @rocket.chat/account-service +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/account-service/Dockerfile b/ee/apps/account-service/Dockerfile index d3dff1f3d805..a4b34c465100 100644 --- a/ee/apps/account-service/Dockerfile +++ b/ee/apps/account-service/Dockerfile @@ -33,6 +33,9 @@ COPY ./packages/server-cloud-communication/ packages/server-cloud-communication/ COPY ./ee/packages/license/package.json packages/license/package.json COPY ./ee/packages/license/dist packages/license/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 9038b8cf2ef0..08001a89061b 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", @@ -17,12 +17,12 @@ "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@rocket.chat/string-helpers": "~0.31.25", + "@types/node": "^14.18.63", "bcrypt": "^5.0.1", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", @@ -30,21 +30,21 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", "polka": "^0.5.2", - "uuid": "^9.0.0" + "uuid": "^9.0.1" }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/bcrypt": "^5.0.0", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/bcrypt": "^5.0.1", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/account-service/src/service.js", "files": [ diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index e1f254d06053..232fff7f9b30 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,347 @@ # @rocket.chat/authorization-service +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/authorization-service/Dockerfile b/ee/apps/authorization-service/Dockerfile index d3dff1f3d805..a4b34c465100 100644 --- a/ee/apps/authorization-service/Dockerfile +++ b/ee/apps/authorization-service/Dockerfile @@ -33,6 +33,9 @@ COPY ./packages/server-cloud-communication/ packages/server-cloud-communication/ COPY ./ee/packages/license/package.json packages/license/package.json COPY ./ee/packages/license/dist packages/license/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 8aff178aeecd..2aae1ebbc0b1 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", @@ -17,19 +17,19 @@ "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@rocket.chat/string-helpers": "~0.31.25", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -37,11 +37,11 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/authorization-service/src/service.js", "files": [ diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index 1bafaf49ea7e..afb1f595b128 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,411 @@ # @rocket.chat/ddp-streamer +## 0.2.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/ui-contexts@3.0.2 +- @rocket.chat/models@0.0.26 +- @rocket.chat/instance-status@0.0.26 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/ui-contexts@3.0.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + - @rocket.chat/instance-status@0.0.25 + +## 0.2.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [7da1edf866] +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/ui-contexts@3.0.0 + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/models@0.0.24 + - @rocket.chat/instance-status@0.0.24 + +## 0.2.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/ui-contexts@3.0.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 +- @rocket.chat/instance-status@0.0.24-rc.12 + +## 0.2.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/ui-contexts@3.0.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 +- @rocket.chat/instance-status@0.0.24-rc.11 + +## 0.2.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/ui-contexts@3.0.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 +- @rocket.chat/instance-status@0.0.24-rc.10 + +## 0.2.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/ui-contexts@3.0.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 +- @rocket.chat/instance-status@0.0.24-rc.9 + +## 0.2.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/ui-contexts@3.0.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 +- @rocket.chat/instance-status@0.0.24-rc.8 + +## 0.2.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/ui-contexts@3.0.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 +- @rocket.chat/instance-status@0.0.24-rc.7 + +## 0.2.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/ui-contexts@3.0.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 +- @rocket.chat/instance-status@0.0.24-rc.6 + +## 0.2.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/ui-contexts@3.0.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 +- @rocket.chat/instance-status@0.0.24-rc.5 + +## 0.2.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/ui-contexts@3.0.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 +- @rocket.chat/instance-status@0.0.24-rc.4 + +## 0.2.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/ui-contexts@3.0.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 +- @rocket.chat/instance-status@0.0.24-rc.3 + +## 0.2.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/ui-contexts@3.0.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 +- @rocket.chat/instance-status@0.0.24-rc.2 + +## 0.2.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/ui-contexts@3.0.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 +- @rocket.chat/instance-status@0.0.24-rc.1 + +## 0.2.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 +- @rocket.chat/instance-status@0.0.21-rc.7 + +## 0.2.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 +- @rocket.chat/instance-status@0.0.21-rc.6 + +## 0.2.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 +- @rocket.chat/instance-status@0.0.21-rc.5 + +## 0.2.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 +- @rocket.chat/instance-status@0.0.21-rc.4 + +## 0.2.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 +- @rocket.chat/instance-status@0.0.21-rc.3 + +## 0.2.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/ui-contexts@3.0.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 +- @rocket.chat/instance-status@0.0.21-rc.2 + +## 0.2.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/ui-contexts@3.0.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 +- @rocket.chat/instance-status@0.0.21-rc.1 + +## 0.2.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [7da1edf866] +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + - @rocket.chat/instance-status@0.0.21-rc.0 + +## 0.1.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/models@0.0.23 +- @rocket.chat/instance-status@0.0.23 + +## 0.1.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/models@0.0.22 +- @rocket.chat/instance-status@0.0.22 + +## 0.1.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/models@0.0.21 +- @rocket.chat/instance-status@0.0.21 + +## 0.1.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/ui-contexts@2.0.5 +- @rocket.chat/models@0.0.20 +- @rocket.chat/instance-status@0.0.20 + +## 0.1.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/ui-contexts@2.0.4 +- @rocket.chat/models@0.0.19 +- @rocket.chat/instance-status@0.0.19 + +## 0.1.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/ui-contexts@2.0.3 +- @rocket.chat/models@0.0.18 +- @rocket.chat/instance-status@0.0.18 + +## 0.1.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/ui-contexts@2.0.2 +- @rocket.chat/models@0.0.17 +- @rocket.chat/instance-status@0.0.17 + +## 0.1.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/ui-contexts@2.0.1 +- @rocket.chat/models@0.0.16 +- @rocket.chat/instance-status@0.0.16 + ## 0.1.9 ### Patch Changes diff --git a/ee/apps/ddp-streamer/Dockerfile b/ee/apps/ddp-streamer/Dockerfile index 19fef1639db5..686a6c4183a9 100644 --- a/ee/apps/ddp-streamer/Dockerfile +++ b/ee/apps/ddp-streamer/Dockerfile @@ -42,6 +42,9 @@ COPY ./ee/packages/license/dist packages/license/dist COPY ./packages/instance-status/package.json packages/instance-status/package.json COPY ./packages/instance-status/dist packages/instance-status/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index aed89a2d1c45..9841fda10990 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.1.9", + "version": "0.2.2", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,16 +15,16 @@ ], "author": "Rocket.Chat", "dependencies": { - "@rocket.chat/apps-engine": "1.41.0-alpha.290", + "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/instance-status": "workspace:^", "@rocket.chat/logger": "workspace:^", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/string-helpers": "next", + "@rocket.chat/string-helpers": "~0.31.25", "@rocket.chat/ui-contexts": "workspace:^", "colorette": "^1.4.0", "ejson": "^2.2.3", @@ -34,30 +34,30 @@ "gc-stats": "^1.4.0", "jaeger-client": "^3.19.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", "polka": "^0.5.2", - "sharp": "^0.30.7", + "sharp": "^0.32.6", "underscore": "^1.13.6", "uuid": "^7.0.3", "ws": "^8.8.1" }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/ejson": "^2.2.0", - "@types/gc-stats": "^1", - "@types/meteor": "^2.9.2", - "@types/node": "^14.18.51", - "@types/polka": "^0.5.4", + "@types/ejson": "^2.2.1", + "@types/gc-stats": "^1.4.2", + "@types/meteor": "^2.9.5", + "@types/node": "^14.18.63", + "@types/polka": "^0.5.6", "@types/sharp": "^0.30.5", "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.5", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", "pino-pretty": "^7.6.1", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/service.js", "files": [ diff --git a/ee/apps/ddp-streamer/src/DDPStreamer.ts b/ee/apps/ddp-streamer/src/DDPStreamer.ts index bccb35d2b326..79905fc8206d 100644 --- a/ee/apps/ddp-streamer/src/DDPStreamer.ts +++ b/ee/apps/ddp-streamer/src/DDPStreamer.ts @@ -44,7 +44,9 @@ export class DDPStreamer extends ServiceClass { return; } - events.emit('meteor.loginServiceConfiguration', clientAction === 'inserted' ? 'added' : 'changed', data); + if (data) { + events.emit('meteor.loginServiceConfiguration', clientAction === 'inserted' ? 'added' : 'changed', data); + } }); this.onEvent('meteor.clientVersionUpdated', (versions): void => { @@ -154,44 +156,50 @@ export class DDPStreamer extends ServiceClass { async started(): Promise { // TODO this call creates a dependency to MeteorService, should it be a hard dependency? or can this call fail and be ignored? - const versions = await MeteorService.getAutoUpdateClientVersions(); - - Object.keys(versions).forEach((key) => { - Autoupdate.updateVersion(versions[key]); - }); - - this.app = polka() - .use(proxy()) - .get('/health', async (_req, res) => { - try { - if (!this.api) { - throw new Error('API not available'); + try { + const versions = await MeteorService.getAutoUpdateClientVersions(); + + Object.keys(versions || {}).forEach((key) => { + Autoupdate.updateVersion(versions[key]); + }); + + this.app = polka() + .use(proxy()) + .get('/health', async (_req, res) => { + try { + if (!this.api) { + throw new Error('API not available'); + } + + await this.api.nodeList(); + res.end('ok'); + } catch (err) { + console.error('Service not healthy', err); + + res.writeHead(500); + res.end('not healthy'); } + }) + .get('*', function (_req, res) { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Content-Type', 'application/json'); - await this.api.nodeList(); - res.end('ok'); - } catch (err) { - console.error('Service not healthy', err); + res.writeHead(200); - res.writeHead(500); - res.end('not healthy'); - } - }) - .get('*', function (_req, res) { - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('Content-Type', 'application/json'); + res.end( + `{"websocket":true,"origins":["*:*"],"cookie_needed":false,"entropy":${crypto.randomBytes(4).readUInt32LE(0)},"ms":true}`, + ); + }) + .listen(PORT); - res.writeHead(200); + this.wss = new WebSocket.Server({ server: this.app.server }); - res.end(`{"websocket":true,"origins":["*:*"],"cookie_needed":false,"entropy":${crypto.randomBytes(4).readUInt32LE(0)},"ms":true}`); - }) - .listen(PORT); + this.wss.on('connection', (ws, req) => new Client(ws, req.url !== '/websocket', req)); - this.wss = new WebSocket.Server({ server: this.app.server }); - - this.wss.on('connection', (ws, req) => new Client(ws, req.url !== '/websocket', req)); - - InstanceStatus.registerInstance('ddp-streamer', {}); + InstanceStatus.registerInstance('ddp-streamer', {}); + } catch (err) { + console.error('DDPStreamer did not start correctly', err); + } } async stopped(): Promise { diff --git a/ee/apps/ddp-streamer/src/configureServer.ts b/ee/apps/ddp-streamer/src/configureServer.ts index bad70254f3b8..ed187db498cc 100644 --- a/ee/apps/ddp-streamer/src/configureServer.ts +++ b/ee/apps/ddp-streamer/src/configureServer.ts @@ -15,7 +15,9 @@ const loginServiceConfigurationCollection = 'meteor_accounts_loginServiceConfigu const loginServiceConfigurationPublication = 'meteor.loginServiceConfiguration'; const loginServices = new Map(); -MeteorService.getLoginServiceConfiguration().then((records = []) => records.forEach((record) => loginServices.set(record._id, record))); +MeteorService.getLoginServiceConfiguration() + .then((records = []) => records.forEach((record) => loginServices.set(record._id, record))) + .catch((err) => console.error('DDPStreamer not able to retrieve login services configuration', err)); server.publish(loginServiceConfigurationPublication, async function () { loginServices.forEach((record) => this.added(loginServiceConfigurationCollection, record._id, record)); diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index cb28d7d7a3ee..c19a77dd775b 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,377 @@ # @rocket.chat/omnichannel-transcript +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/omnichannel-services@0.1.2 +- @rocket.chat/pdf-worker@0.0.26 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/omnichannel-services@0.1.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/pdf-worker@0.0.25 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/tools@0.2.0 + - @rocket.chat/omnichannel-services@0.1.0 + - @rocket.chat/pdf-worker@0.0.24 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/omnichannel-services@0.1.0-rc.19 +- @rocket.chat/pdf-worker@0.0.24-rc.12 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/omnichannel-services@0.1.0-rc.18 +- @rocket.chat/pdf-worker@0.0.24-rc.11 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/omnichannel-services@0.1.0-rc.17 +- @rocket.chat/pdf-worker@0.0.24-rc.10 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/omnichannel-services@0.1.0-rc.16 +- @rocket.chat/pdf-worker@0.0.24-rc.9 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/omnichannel-services@0.1.0-rc.15 +- @rocket.chat/pdf-worker@0.0.24-rc.8 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/omnichannel-services@0.1.0-rc.14 +- @rocket.chat/pdf-worker@0.0.24-rc.7 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/omnichannel-services@0.1.0-rc.13 +- @rocket.chat/pdf-worker@0.0.24-rc.6 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/omnichannel-services@0.1.0-rc.12 +- @rocket.chat/pdf-worker@0.0.24-rc.5 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/omnichannel-services@0.1.0-rc.11 +- @rocket.chat/pdf-worker@0.0.24-rc.4 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/omnichannel-services@0.1.0-rc.10 +- @rocket.chat/pdf-worker@0.0.24-rc.3 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/omnichannel-services@0.1.0-rc.9 +- @rocket.chat/pdf-worker@0.0.24-rc.2 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/omnichannel-services@0.1.0-rc.8 +- @rocket.chat/pdf-worker@0.0.24-rc.1 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/omnichannel-services@0.1.0-rc.7 +- @rocket.chat/pdf-worker@0.0.21-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/omnichannel-services@0.1.0-rc.6 +- @rocket.chat/pdf-worker@0.0.21-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/omnichannel-services@0.1.0-rc.5 +- @rocket.chat/pdf-worker@0.0.21-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/omnichannel-services@0.1.0-rc.4 +- @rocket.chat/pdf-worker@0.0.21-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/omnichannel-services@0.1.0-rc.3 +- @rocket.chat/pdf-worker@0.0.21-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/omnichannel-services@0.1.0-rc.2 +- @rocket.chat/pdf-worker@0.0.21-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/omnichannel-services@0.1.0-rc.1 +- @rocket.chat/pdf-worker@0.0.21-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/tools@0.2.0-rc.0 + - @rocket.chat/omnichannel-services@0.1.0-rc.0 + - @rocket.chat/pdf-worker@0.0.21-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/omnichannel-services@0.0.23 +- @rocket.chat/pdf-worker@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/omnichannel-services@0.0.22 +- @rocket.chat/pdf-worker@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/omnichannel-services@0.0.21 +- @rocket.chat/pdf-worker@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/omnichannel-services@0.0.20 +- @rocket.chat/pdf-worker@0.0.20 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/omnichannel-services@0.0.19 +- @rocket.chat/pdf-worker@0.0.19 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/omnichannel-services@0.0.18 +- @rocket.chat/pdf-worker@0.0.18 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/omnichannel-services@0.0.17 +- @rocket.chat/pdf-worker@0.0.17 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/omnichannel-services@0.0.16 +- @rocket.chat/pdf-worker@0.0.16 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/Dockerfile b/ee/apps/omnichannel-transcript/Dockerfile index 2c3c22a998c3..c2c33aa5017c 100644 --- a/ee/apps/omnichannel-transcript/Dockerfile +++ b/ee/apps/omnichannel-transcript/Dockerfile @@ -42,6 +42,9 @@ COPY ./ee/packages/pdf-worker/dist ee/packages/pdf-worker/dist COPY ./packages/tools/package.json packages/tools/package.json COPY ./packages/tools/dist packages/tools/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 038055b4fb73..fb9f40ff1ed8 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,17 +15,17 @@ ], "author": "Rocket.Chat", "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/logger": "workspace:^", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/omnichannel-services": "workspace:^", "@rocket.chat/pdf-worker": "workspace:^", "@rocket.chat/tools": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "event-loop-stats": "^1.4.1", @@ -33,7 +33,7 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "moment-timezone": "^0.5.43", "mongo-message-queue": "^1.0.0", "mongodb": "^4.17.1", @@ -44,11 +44,11 @@ "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/omnichannel-transcript/src/service.js", "files": [ diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index f000298cbd18..00f7155544e3 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,346 @@ # @rocket.chat/presence-service +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/presence@0.1.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/presence@0.1.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [c38711b346] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/presence@0.1.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/presence@0.1.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/presence@0.1.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/presence@0.1.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/presence@0.1.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/presence@0.1.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/presence@0.1.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/presence@0.1.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/presence@0.1.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/presence@0.1.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/presence@0.1.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/presence@0.1.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/presence@0.1.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/presence@0.1.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/presence@0.1.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/presence@0.1.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/presence@0.1.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/presence@0.1.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/presence@0.1.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/presence@0.1.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [c38711b346] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/presence@0.1.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/presence@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/presence@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/presence@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/presence@0.0.20 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/presence@0.0.19 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/presence@0.0.18 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/presence@0.0.17 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/presence@0.0.16 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/presence-service/Dockerfile b/ee/apps/presence-service/Dockerfile index 9a056c4fde3d..19a5cb570766 100644 --- a/ee/apps/presence-service/Dockerfile +++ b/ee/apps/presence-service/Dockerfile @@ -39,6 +39,9 @@ COPY ./ee/packages/license/dist packages/license/dist COPY ./packages/ui-contexts/package.json packages/ui-contexts/package.json COPY ./packages/ui-contexts/dist packages/ui-contexts/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 87c76b4ff5c8..a6a236ccd8f4 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", @@ -17,19 +17,19 @@ "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/presence": "workspace:^", - "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@rocket.chat/string-helpers": "~0.31.25", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -37,11 +37,11 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/presence-service/src/service.js", "files": [ diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index a0abfb00c5c8..e4d3d2b7036d 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,344 @@ # @rocket.chat/queue-worker +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/omnichannel-services@0.1.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/omnichannel-services@0.1.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/omnichannel-services@0.1.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/omnichannel-services@0.1.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/omnichannel-services@0.1.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/omnichannel-services@0.1.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/omnichannel-services@0.1.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/omnichannel-services@0.1.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/omnichannel-services@0.1.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/omnichannel-services@0.1.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/omnichannel-services@0.1.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/omnichannel-services@0.1.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/omnichannel-services@0.1.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/omnichannel-services@0.1.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/omnichannel-services@0.1.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/omnichannel-services@0.1.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/omnichannel-services@0.1.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/omnichannel-services@0.1.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/omnichannel-services@0.1.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/omnichannel-services@0.1.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/omnichannel-services@0.1.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/omnichannel-services@0.1.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/omnichannel-services@0.1.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/omnichannel-services@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/omnichannel-services@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/omnichannel-services@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/omnichannel-services@0.0.20 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/omnichannel-services@0.0.19 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/omnichannel-services@0.0.18 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/omnichannel-services@0.0.17 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/omnichannel-services@0.0.16 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/queue-worker/Dockerfile b/ee/apps/queue-worker/Dockerfile index 2c3c22a998c3..c2c33aa5017c 100644 --- a/ee/apps/queue-worker/Dockerfile +++ b/ee/apps/queue-worker/Dockerfile @@ -42,6 +42,9 @@ COPY ./ee/packages/pdf-worker/dist ee/packages/pdf-worker/dist COPY ./packages/tools/package.json packages/tools/package.json COPY ./packages/tools/dist packages/tools/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index 156af4fdc0e6..21064d5f2cd2 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,15 +15,15 @@ ], "author": "Rocket.Chat", "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/logger": "workspace:^", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/omnichannel-services": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "event-loop-stats": "^1.4.1", @@ -31,7 +31,7 @@ "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "moment-timezone": "^0.5.43", "mongo-message-queue": "^1.0.0", "mongodb": "^4.17.1", @@ -41,11 +41,11 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/queue-worker/src/service.js", "files": [ diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index d76068538d9c..e541ff27dff4 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,313 @@ # @rocket.chat/stream-hub-service +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.2.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.2.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.2.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.2.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.2.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.2.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.2.9 ### Patch Changes diff --git a/ee/apps/stream-hub-service/Dockerfile b/ee/apps/stream-hub-service/Dockerfile index d3dff1f3d805..a4b34c465100 100644 --- a/ee/apps/stream-hub-service/Dockerfile +++ b/ee/apps/stream-hub-service/Dockerfile @@ -33,6 +33,9 @@ COPY ./packages/server-cloud-communication/ packages/server-cloud-communication/ COPY ./ee/packages/license/package.json packages/license/package.json COPY ./ee/packages/license/dist packages/license/dist +COPY ./packages/ui-kit/package.json packages/ui-kit/package.json +COPY ./packages/ui-kit/dist packages/ui-kit/dist + COPY ./ee/apps/${SERVICE}/dist . COPY ./package.json . diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index cc29f058e9c9..9e3cd4eb907d 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.2.9", + "version": "0.3.2", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", @@ -17,19 +17,19 @@ "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/logger": "workspace:^", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", - "@rocket.chat/string-helpers": "next", - "@types/node": "^14.18.51", + "@rocket.chat/string-helpers": "~0.31.25", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", "eventemitter3": "^4.0.7", "fibers": "^5.0.3", "gc-stats": "^1.4.0", "mem": "^8.1.1", - "moleculer": "^0.14.29", + "moleculer": "^0.14.31", "mongodb": "^4.17.1", "nats": "^2.4.0", "pino": "^8.15.0", @@ -38,12 +38,12 @@ "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@types/bcrypt": "^5.0.0", - "@types/gc-stats": "^1", - "@types/polka": "^0.5.4", + "@types/bcrypt": "^5.0.1", + "@types/gc-stats": "^1.4.2", + "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "main": "./dist/ee/apps/stream-hub-service/src/service.js", "files": [ diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index cc600456d258..40d608800fe4 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,240 @@ # @rocket.chat/api-client +## 0.1.20 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + +## 0.1.18 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/rest-typings@6.5.0 + +## 0.1.18-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 + +## 0.1.18-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 + +## 0.1.18-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 + +## 0.1.18-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 + +## 0.1.18-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 + +## 0.1.18-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 + +## 0.1.18-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 + +## 0.1.18-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 + +## 0.1.18-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 + +## 0.1.18-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 + +## 0.1.18-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 + +## 0.1.18-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 + +## 0.1.15-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 + +## 0.1.15-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 + +## 0.1.15-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 + +## 0.1.15-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 + +## 0.1.15-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 + +## 0.1.15-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 + +## 0.1.15-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 + +## 0.1.15-rc.0 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + +## 0.1.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 + +## 0.1.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 + +## 0.1.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 + +## 0.1.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 + +## 0.1.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 + +## 0.1.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 + +## 0.1.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 + +## 0.1.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 + ## 0.1.9 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 4827eddb734a..78ffefb6de6d 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,16 +1,16 @@ { "name": "@rocket.chat/api-client", - "version": "0.1.9", + "version": "0.1.20", "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/jest": "~29.5.3", - "@types/strict-uri-encode": "^2.0.0", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/jest": "~29.5.7", + "@types/strict-uri-encode": "^2.0.1", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "jest-fetch-mock": "^3.0.3", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index f623b9a729e6..f02cc13f7d03 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,243 @@ # @rocket.chat/ddp-client +## 0.2.11 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/api-client@0.1.20 + +## 0.2.10 + +### Patch Changes + +- c2b224fd82: Exceeding API calls when sending OTR messages +- c2b224fd82: SDK login methods not saving token +- c2b224fd82: removed @rocket.chat/license as a dependency of ddp client +- c2b224fd82: fixed an issue with the ddp client reconnection not resuming the login +- c2b224fd82: fixed an issue with the ddp client account not saving credentials correctly +- c2b224fd82: Fixed a problem where chained callbacks' return value was being overrided by some callbacks returning something different, causing callbacks with lower priority to operate on invalid values +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/api-client@0.1.19 + +## 0.2.9 + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/api-client@0.1.18 + +## 0.2.9-rc.12 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/api-client@0.1.18-rc.12 + +## 0.2.9-rc.11 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/api-client@0.1.18-rc.11 + +## 0.2.9-rc.10 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/api-client@0.1.18-rc.10 + +## 0.2.9-rc.9 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/api-client@0.1.18-rc.9 + +## 0.2.9-rc.8 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/api-client@0.1.18-rc.8 + +## 0.2.9-rc.7 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/api-client@0.1.18-rc.7 + +## 0.2.9-rc.6 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/api-client@0.1.18-rc.6 + +## 0.2.9-rc.5 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/api-client@0.1.18-rc.5 + +## 0.2.9-rc.4 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/api-client@0.1.18-rc.4 + +## 0.2.9-rc.3 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/api-client@0.1.18-rc.3 + +## 0.2.9-rc.2 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/api-client@0.1.18-rc.2 + +## 0.2.9-rc.1 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/api-client@0.1.18-rc.1 + +## 0.2.6-rc.7 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/api-client@0.1.15-rc.7 + +## 0.2.6-rc.6 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/api-client@0.1.15-rc.6 + +## 0.2.6-rc.5 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/api-client@0.1.15-rc.5 + +## 0.2.6-rc.4 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/api-client@0.1.15-rc.4 + +## 0.2.6-rc.3 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/api-client@0.1.15-rc.3 + +## 0.2.6-rc.2 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/api-client@0.1.15-rc.2 + +## 0.2.6-rc.1 + +### Patch Changes + +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/api-client@0.1.15-rc.1 + +## 0.2.6-rc.0 + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/api-client@0.1.15-rc.0 + +## 0.2.8 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/api-client@0.1.17 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/api-client@0.1.16 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/api-client@0.1.15 + +## 0.2.5 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/api-client@0.1.14 + +## 0.2.4 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/api-client@0.1.13 + +## 0.2.3 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/api-client@0.1.12 + +## 0.2.2 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/api-client@0.1.11 + +## 0.2.1 + +### Patch Changes + +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/api-client@0.1.10 + ## 0.2.0 ### Minor Changes diff --git a/ee/packages/ddp-client/__tests__/Account.spec.ts b/ee/packages/ddp-client/__tests__/Account.spec.ts new file mode 100644 index 000000000000..948d041ebf2d --- /dev/null +++ b/ee/packages/ddp-client/__tests__/Account.spec.ts @@ -0,0 +1,83 @@ +import WS from 'jest-websocket-mock'; + +import { DDPSDK } from '../src/DDPSDK'; +import { handleConnection, handleMethod } from './helpers'; + +let server: WS; + +beforeEach(async () => { + server = new WS('ws://localhost:1234/websocket'); +}); + +afterEach(() => { + server.close(); + WS.clean(); +}); + +describe('login', () => { + it('should save credentials to user object - loginWithToken', async () => { + const sdk = DDPSDK.create('ws://localhost:1234'); + + await handleConnection(server, sdk.connection.connect()); + + const messageResult = { + id: 123, + token: 'token', + tokenExpires: { $date: 99999999 }, + }; + + await handleMethod(server, 'login', [{ resume: 'token' }], JSON.stringify(messageResult), sdk.account.loginWithToken('token')); + + const { user } = sdk.account; + expect(user?.token).toBe(messageResult.token); + expect((user?.tokenExpires as Date)?.toISOString()).toBe(new Date(messageResult.tokenExpires.$date).toISOString()); + expect(user?.id).toBe(messageResult.id); + }); + + it('should save credentials to user object - loginWithPassword', async () => { + const sdk = DDPSDK.create('ws://localhost:1234'); + + await handleConnection(server, sdk.connection.connect()); + + const messageResult = { + id: 123, + token: 'token', + tokenExpires: { $date: 99999999 }, + }; + + await handleMethod( + server, + 'login', + [{ user: { username: 'username' }, password: { digest: 'password', algorithm: 'sha-256' } }], + JSON.stringify(messageResult), + sdk.account.loginWithPassword('username', 'password'), + ); + + const { user } = sdk.account; + expect(user?.token).toBe(messageResult.token); + expect((user?.tokenExpires as Date)?.toISOString()).toBe(new Date(messageResult.tokenExpires.$date).toISOString()); + expect(user?.id).toBe(messageResult.id); + }); + + it('should logout', async () => { + const sdk = DDPSDK.create('ws://localhost:1234'); + + await handleConnection(server, sdk.connection.connect()); + + const messageResult = { + id: 123, + token: 'token', + tokenExpires: { $date: 99999999 }, + }; + + const cb = jest.fn(); + sdk.account.once('uid', cb); + + await handleMethod(server, 'logout', [], JSON.stringify(messageResult), sdk.account.logout()); + + expect(cb).toHaveBeenCalledTimes(1); + + const { user } = sdk.account; + expect(user).toBeUndefined(); + }); +}); diff --git a/ee/packages/ddp-client/__tests__/Connection.spec.ts b/ee/packages/ddp-client/__tests__/Connection.spec.ts index 78ac9a2d3954..c535a6c58cc5 100644 --- a/ee/packages/ddp-client/__tests__/Connection.spec.ts +++ b/ee/packages/ddp-client/__tests__/Connection.spec.ts @@ -136,7 +136,7 @@ it('should queue messages if the connection is not ready', async () => { expect(connection.queue.size).toBe(0); - await handleMethod(server, 'method', ['arg1', 'arg2']); + await handleMethod(server, 'method', ['arg1', 'arg2'], '1'); }); it('should throw an error if a reconnect is called while a connection is in progress', async () => { diff --git a/ee/packages/ddp-client/__tests__/DDPSDK.spec.ts b/ee/packages/ddp-client/__tests__/DDPSDK.spec.ts index f24a4500b667..cd5b30113de9 100644 --- a/ee/packages/ddp-client/__tests__/DDPSDK.spec.ts +++ b/ee/packages/ddp-client/__tests__/DDPSDK.spec.ts @@ -205,13 +205,52 @@ it('should create and connect to a stream', async () => { sdk.connection.close(); }); +it.skip('should try to loginWithToken after reconnection', async () => { + const sdk = DDPSDK.create('ws://localhost:1234'); + + await handleConnection(server, sdk.connection.connect()); + + const messageResult = { + id: 123, + token: 'token1234', + tokenExpires: { $date: 99999999 }, + }; + + const { loginWithToken } = sdk.account; + const loginFn = jest.fn((token: string) => loginWithToken.apply(sdk.account, [token])); + sdk.account.loginWithToken = loginFn; + + await handleMethod(server, 'login', [{ resume: 'token' }], JSON.stringify(messageResult), sdk.account.loginWithToken('token')); + + expect(sdk.account.user?.token).toBe(messageResult.token); + expect(loginFn).toHaveBeenCalledTimes(1); + + // Fake timers are used to avoid waiting for the reconnect timeout + jest.useFakeTimers(); + + server.close(); + WS.clean(); + server = new WS('ws://localhost:1234/websocket'); + + const reconnect = new Promise((resolve) => sdk.connection.once('reconnecting', () => resolve(undefined))); + const connecting = new Promise((resolve) => sdk.connection.once('connecting', () => resolve(undefined))); + const connected = new Promise((resolve) => sdk.connection.once('connected', () => resolve(undefined))); + await handleConnection(server, jest.advanceTimersByTimeAsync(1000), reconnect, connecting, connected); + + jest.advanceTimersByTimeAsync(1000); + expect(loginFn).toHaveBeenCalledTimes(2); + + jest.useRealTimers(); + sdk.connection.close(); +}); + describe('Method call and Disconnection cases', () => { it('should handle properly if the message was sent after disconnection', async () => { const sdk = DDPSDK.create('ws://localhost:1234'); await handleConnection(server, sdk.connection.connect()); - const [result] = await handleMethod(server, 'method', ['args1'], sdk.client.callAsync('method', 'args1')); + const [result] = await handleMethod(server, 'method', ['args1'], '1', sdk.client.callAsync('method', 'args1')); expect(result).toBe(1); // Fake timers are used to avoid waiting for the reconnect timeout @@ -231,7 +270,7 @@ describe('Method call and Disconnection cases', () => { await handleConnection(server, jest.advanceTimersByTimeAsync(1000), reconnect, connecting, connected); - const [result2] = await handleMethod(server, 'method', ['args2'], callResult); + const [result2] = await handleMethod(server, 'method', ['args2'], '1', callResult); expect(util.inspect(callResult).includes('pending')).toBe(false); expect(result2).toBe(1); @@ -263,7 +302,7 @@ describe('Method call and Disconnection cases', () => { expect(util.inspect(callResult).includes('pending')).toBe(true); - const [result] = await handleMethod(server, 'method', ['args2'], callResult); + const [result] = await handleMethod(server, 'method', ['args2'], '1', callResult); expect(result).toBe(1); diff --git a/ee/packages/ddp-client/__tests__/helpers/index.ts b/ee/packages/ddp-client/__tests__/helpers/index.ts index f13545c7aeeb..dc5da3cd60ca 100644 --- a/ee/packages/ddp-client/__tests__/helpers/index.ts +++ b/ee/packages/ddp-client/__tests__/helpers/index.ts @@ -35,9 +35,9 @@ const handleConnectionButNoResponse = async (server: WS, method: string, params: }); }; -export const handleMethod = async (server: WS, method: string, params: string[], ...client: Promise[]) => { +export const handleMethod = async (server: WS, method: string, params: any[], responseResult: string, ...client: Promise[]) => { const result = await handleConnectionButNoResponse(server, method, params); - return Promise.all([server.send(`{"msg":"result","id":"${result.id}","result":1}`), ...client]).then((result) => { + return Promise.all([server.send(`{"msg":"result","id":"${result.id}","result":${responseResult}}`), ...client]).then((result) => { result.shift(); return result; }); diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index 5f62047c2429..3011e8b691b0 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,16 +1,16 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.2.0", + "version": "0.2.11", "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/jest": "~29.5.3", - "@types/ws": "^8.5.5", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/jest": "~29.5.7", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", - "typescript": "~5.2.2", + "typescript": "~5.3.2", "ws": "^8.13.0" }, "peerDependencies": { diff --git a/ee/packages/ddp-client/src/ClientStream.ts b/ee/packages/ddp-client/src/ClientStream.ts index 032496c256b6..166e59a61f6f 100644 --- a/ee/packages/ddp-client/src/ClientStream.ts +++ b/ee/packages/ddp-client/src/ClientStream.ts @@ -12,6 +12,11 @@ export class ClientStreamImpl extends Emitter implements ClientStream { subscriptions = new Map(); constructor(private ddp: DDPClient, readonly dispatcher: DDPDispatcher = new DDPDispatcher()) { + ddp.onConnection(({ msg }) => { + if (msg === 'connected') { + this.emit('connected'); + } + }); super(); } diff --git a/ee/packages/ddp-client/src/DDPSDK.ts b/ee/packages/ddp-client/src/DDPSDK.ts index bfd80980bb8d..445ce90d7c78 100644 --- a/ee/packages/ddp-client/src/DDPSDK.ts +++ b/ee/packages/ddp-client/src/DDPSDK.ts @@ -105,7 +105,7 @@ export class DDPSDK implements SDK { } return { 'X-User-Id': account.uid, - 'X-Auth-Token': account.user?.token, + 'X-Auth-Token': account.user.token, }; } })({ baseUrl: url }); @@ -113,6 +113,9 @@ export class DDPSDK implements SDK { const sdk = new DDPSDK(connection, stream, account, timeoutControl, rest); connection.on('connected', () => { + if (account.user?.token) { + account.loginWithToken(account.user.token); + } [...stream.subscriptions.entries()].forEach(([, sub]) => { ddp.subscribeWithId(sub.id, sub.name, sub.params); }); diff --git a/ee/packages/ddp-client/src/types/Account.ts b/ee/packages/ddp-client/src/types/Account.ts index b5dde5e5ac3a..c8a51e402786 100644 --- a/ee/packages/ddp-client/src/types/Account.ts +++ b/ee/packages/ddp-client/src/types/Account.ts @@ -2,13 +2,20 @@ import { Emitter } from '@rocket.chat/emitter'; import type { ClientStream } from './ClientStream'; +type User = { + id: string; + username?: string; + token?: string; + tokenExpires?: Date; +} & Record; + export interface Account extends Emitter<{ uid: string | undefined; - user: Record | undefined; + user?: User; }> { uid?: string; - user?: Record; + user?: User; loginWithPassword(username: string, password: string): Promise; loginWithToken(token: string): Promise<{ id: string; @@ -21,26 +28,16 @@ export interface Account export class AccountImpl extends Emitter<{ uid: string | undefined; - user: { - id: string; - username: string; - token?: string; - tokenExpires?: Date; - }; + user: User; }> implements Account { uid?: string; - user?: { id: string; username: string; token?: string; tokenExpires?: Date }; + user?: { id: string; username?: string; token?: string; tokenExpires?: Date }; constructor(private readonly client: ClientStream) { super(); - this.client.on('connected', () => { - if (this.user?.token) { - this.loginWithToken(this.user.token); - } - }); client.onCollection('users', (data) => { if (data.collection !== 'users') { @@ -60,8 +57,24 @@ export class AccountImpl }); } + private saveCredentials(id: string, token: string, tokenExpires: string) { + this.user = { + ...this.user, + token, + tokenExpires: new Date(tokenExpires), + id, + }; + this.uid = id; + this.emit('uid', this.uid); + this.emit('user', this.user); + } + async loginWithPassword(username: string, password: string): Promise { - const { uid } = await this.client.callAsyncWithOptions( + const { + id, + token: resultToken, + tokenExpires: { $date }, + } = await this.client.callAsyncWithOptions( 'login', { wait: true, @@ -71,8 +84,8 @@ export class AccountImpl password: { digest: password, algorithm: 'sha-256' }, }, ); - this.uid = uid; - this.emit('uid', this.uid); + + this.saveCredentials(id, resultToken, $date); } async loginWithToken(token: string) { @@ -86,8 +99,12 @@ export class AccountImpl }, ); - this.uid = result.id; - this.emit('uid', this.uid); + const { + id, + token: resultToken, + tokenExpires: { $date }, + } = result; + this.saveCredentials(id, resultToken, $date); return result; } @@ -97,6 +114,7 @@ export class AccountImpl wait: true, }); this.uid = undefined; + this.user = undefined; this.emit('uid', this.uid); } } diff --git a/ee/packages/ddp-client/src/types/streams.ts b/ee/packages/ddp-client/src/types/streams.ts index abadd53c1851..da9b913fc6dd 100644 --- a/ee/packages/ddp-client/src/types/streams.ts +++ b/ee/packages/ddp-client/src/types/streams.ts @@ -23,9 +23,9 @@ import type { ILivechatAgent, IImportProgress, IBanner, - UiKit, + LicenseLimitKind, } from '@rocket.chat/core-typings'; -import type { LicenseLimitKind } from '@rocket.chat/license'; +import type * as UiKit from '@rocket.chat/ui-kit'; type ClientAction = 'inserted' | 'updated' | 'removed' | 'changed'; @@ -47,16 +47,28 @@ export interface StreamerEvents { { key: `${string}/typing`; args: [username: string, typing: boolean] }, { key: `${string}/deleteMessageBulk`; - args: [args: { rid: IMessage['rid']; excludePinned: boolean; ignoreDiscussion: boolean; ts: Record; users: string[] }]; + args: [ + args: { + rid: IMessage['rid']; + excludePinned: boolean; + ignoreDiscussion: boolean; + ts: Record; + users: string[]; + ids?: string[]; // message ids have priority over ts + showDeletedStatus?: boolean; + }, + ]; }, { key: `${string}/deleteMessage`; args: [{ _id: IMessage['_id'] }] }, { key: `${string}/e2e.keyRequest`; args: [unknown] }, { key: `${string}/videoconf`; args: [id: string] }, + { key: `${string}/messagesRead`; args: [{ until: Date; tmid?: string }] }, + { key: `${string}/messagesImported`; args: [null] }, /* @deprecated over videoconf*/ // { key: `${string}/${string}`; args: [id: string] }, ]; - 'room-messages': [{ key: '__my_messages__'; args: [IMessage] }, { key: string; args: [IMessage] }]; + 'room-messages': [{ key: '__my_messages__'; args: [IMessage] }, { key: string; args: [message: IMessage, user?: IUser, room?: IRoom] }]; 'notify-all': [ { @@ -226,9 +238,16 @@ export interface StreamerEvents { { key: 'Users:Deleted'; args: [ - { - userId: IUser['_id']; - }, + | { + userId: IUser['_id']; + messageErasureType: 'Delete'; + replaceByUser?: never; + } + | { + userId: IUser['_id']; + messageErasureType: 'Unlink'; + replaceByUser?: { _id: IUser['_id']; username: IUser['username']; alias: string }; + }, ]; }, { diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md new file mode 100644 index 000000000000..5206d34e6014 --- /dev/null +++ b/ee/packages/license/CHANGELOG.md @@ -0,0 +1,170 @@ +# @rocket.chat/license + +## 0.1.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + +## 0.1.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- a98f3ff303: feat: added `licenses.info` endpoint +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/jwt@0.1.0 + +## 0.1.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 + +## 0.1.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 + +## 0.1.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 + +## 0.1.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 + +## 0.1.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 + +## 0.1.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 + +## 0.1.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 + +## 0.1.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 + +## 0.1.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 + +## 0.1.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 + +## 0.1.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 + +## 0.1.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 + +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + +## 0.1.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 + +## 0.1.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 + +## 0.1.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- a98f3ff303: feat: added `licenses.info` endpoint +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/jwt@0.1.0-rc.0 diff --git a/ee/packages/license/__tests__/DefaultRestrictions.spec.ts b/ee/packages/license/__tests__/DefaultRestrictions.spec.ts new file mode 100644 index 000000000000..e085aa165605 --- /dev/null +++ b/ee/packages/license/__tests__/DefaultRestrictions.spec.ts @@ -0,0 +1,49 @@ +import { LicenseImp } from '../src'; + +describe('Community Restrictions', () => { + describe('Apps from marketplace', () => { + it('should respect the default if there is no license applied', async () => { + const license = new LicenseImp(); + + license.setLicenseLimitCounter('marketplaceApps', () => 1); + + await expect(await license.shouldPreventAction('marketplaceApps')).toBe(false); + + license.setLicenseLimitCounter('marketplaceApps', () => 10); + + await expect(await license.shouldPreventAction('marketplaceApps')).toBe(true); + }); + }); + + describe('Private Apps', () => { + it('should respect the default if there is no license applied', async () => { + const license = new LicenseImp(); + + license.setLicenseLimitCounter('privateApps', () => 1); + + await expect(await license.shouldPreventAction('privateApps')).toBe(false); + + license.setLicenseLimitCounter('privateApps', () => 10); + + await expect(await license.shouldPreventAction('privateApps')).toBe(true); + }); + }); + + describe('Active Users', () => { + it('should respect the default if there is no license applied', async () => { + const license = new LicenseImp(); + + license.setLicenseLimitCounter('activeUsers', () => 1); + + await expect(await license.shouldPreventAction('activeUsers')).toBe(false); + + license.setLicenseLimitCounter('activeUsers', () => 10); + + await expect(await license.shouldPreventAction('activeUsers')).toBe(false); + + license.setLicenseLimitCounter('activeUsers', () => 100000); + + await expect(await license.shouldPreventAction('activeUsers')).toBe(false); + }); + }); +}); diff --git a/ee/packages/license/__tests__/MockedLicenseBuilder.ts b/ee/packages/license/__tests__/MockedLicenseBuilder.ts index 4f2b49596be3..0689b8410114 100644 --- a/ee/packages/license/__tests__/MockedLicenseBuilder.ts +++ b/ee/packages/license/__tests__/MockedLicenseBuilder.ts @@ -1,198 +1,6 @@ import { LicenseImp } from '../src'; -import type { ILicenseTag } from '../src/definition/ILicenseTag'; -import type { ILicenseV3 } from '../src/definition/ILicenseV3'; -import type { LicenseLimit } from '../src/definition/LicenseLimit'; -import type { LicenseModule } from '../src/definition/LicenseModule'; -import type { LicensePeriod, Timestamp } from '../src/definition/LicensePeriod'; -import { encrypt } from '../src/token'; -export class MockedLicenseBuilder { - information: { - id?: string; - autoRenew: boolean; - visualExpiration: Timestamp; - notifyAdminsAt?: Timestamp; - notifyUsersAt?: Timestamp; - trial: boolean; - offline: boolean; - createdAt: Timestamp; - grantedBy: { - method: 'manual' | 'self-service' | 'sales' | 'support' | 'reseller'; - seller?: string; - }; - grantedTo?: { - name?: string; - company?: string; - email?: string; - }; - legalText?: string; - notes?: string; - tags?: ILicenseTag[]; - }; - - validation: { - serverUrls: { - value: string; - type: 'url' | 'regex' | 'hash'; - }[]; - - serverVersions?: { - value: string; - }[]; - - serverUniqueId?: string; - cloudWorkspaceId?: string; - validPeriods: LicensePeriod[]; - legalTextAgreement?: { - type: 'required' | 'not-required' | 'accepted'; - acceptedVia?: 'cloud'; - }; - - statisticsReport: { - required: boolean; - allowedStaleInDays?: number; - }; - }; - - constructor() { - this.information = { - autoRenew: true, - // expires in 1 year - visualExpiration: new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toISOString(), - // 15 days before expiration - notifyAdminsAt: new Date(new Date().setDate(new Date().getDate() + 15)).toISOString(), - // 30 days before expiration - notifyUsersAt: new Date(new Date().setDate(new Date().getDate() + 30)).toISOString(), - trial: false, - offline: false, - createdAt: new Date().toISOString(), - grantedBy: { - method: 'manual', - seller: 'Rocket.Cat', - }, - tags: [ - { - name: 'Test', - color: 'blue', - }, - ], - }; - - this.validation = { - serverUrls: [ - { - value: 'localhost:3000', - type: 'url', - }, - ], - serverVersions: [ - { - value: '3.0.0', - }, - ], - - serverUniqueId: '1234567890', - cloudWorkspaceId: '1234567890', - - validPeriods: [ - { - invalidBehavior: 'disable_modules', - modules: ['livechat-enterprise'], - validFrom: new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString(), - validUntil: new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toISOString(), - }, - ], - - statisticsReport: { - required: true, - allowedStaleInDays: 30, - }, - }; - } - - public resetValidPeriods(): this { - this.validation.validPeriods = []; - return this; - } - - public withValidPeriod(period: LicensePeriod): this { - this.validation.validPeriods.push(period); - return this; - } - - public withGrantedTo(grantedTo: { name?: string; company?: string; email?: string }): this { - this.information.grantedTo = grantedTo; - return this; - } - - grantedModules: { - module: LicenseModule; - }[]; - - limits: { - activeUsers?: LicenseLimit[]; - guestUsers?: LicenseLimit[]; - roomsPerGuest?: LicenseLimit<'prevent_action'>[]; - privateApps?: LicenseLimit[]; - marketplaceApps?: LicenseLimit[]; - monthlyActiveContacts?: LicenseLimit[]; - }; - - cloudMeta?: Record; - - public withServerUrls(urls: { value: string; type: 'url' | 'regex' | 'hash' }): this { - this.validation.serverUrls = this.validation.serverUrls ?? []; - this.validation.serverUrls.push(urls); - return this; - } - - public withServerVersions(versions: { value: string }): this { - this.validation.serverVersions = this.validation.serverVersions ?? []; - this.validation.serverVersions.push(versions); - return this; - } - - public withGratedModules(modules: LicenseModule[]): this { - this.grantedModules = this.grantedModules ?? []; - this.grantedModules.push(...modules.map((module) => ({ module }))); - return this; - } - - withNoGratedModules(modules: LicenseModule[]): this { - this.grantedModules = this.grantedModules ?? []; - this.grantedModules = this.grantedModules.filter(({ module }) => !modules.includes(module)); - return this; - } - - public withLimits(key: K, value: ILicenseV3['limits'][K]): this { - this.limits = this.limits ?? {}; - this.limits[key] = value; - return this; - } - - public build(): ILicenseV3 { - return { - version: '3.0', - information: this.information, - validation: this.validation, - grantedModules: [...new Set(this.grantedModules)], - limits: { - activeUsers: [], - guestUsers: [], - roomsPerGuest: [], - privateApps: [], - marketplaceApps: [], - monthlyActiveContacts: [], - ...this.limits, - }, - cloudMeta: this.cloudMeta, - }; - } - - public sign(): Promise { - return encrypt(this.build()); - } -} +export { MockedLicenseBuilder } from '../src/MockedLicenseBuilder'; export const getReadyLicenseManager = async () => { const license = new LicenseImp(); diff --git a/ee/packages/license/__tests__/emitter.spec.ts b/ee/packages/license/__tests__/emitter.spec.ts index ce949365e8a6..bf5406ef8501 100644 --- a/ee/packages/license/__tests__/emitter.spec.ts +++ b/ee/packages/license/__tests__/emitter.spec.ts @@ -242,7 +242,7 @@ describe('Event License behaviors', () => { await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(false); await expect(fn).toBeCalledTimes(2); - await expect(toggleFn).toBeCalledTimes(1); + await expect(toggleFn).toBeCalledTimes(0); await expect(fn).toBeCalledWith({ reason: 'limit', @@ -277,7 +277,7 @@ describe('Event License behaviors', () => { expect(preventFn).toBeCalledTimes(0); expect(preventToggleFn).toBeCalledTimes(0); expect(allowFn).toBeCalledTimes(1); - expect(allowToggleFn).toBeCalledTimes(1); + expect(allowToggleFn).toBeCalledTimes(0); preventFn.mockClear(); preventToggleFn.mockClear(); diff --git a/ee/packages/license/__tests__/setLicense.spec.ts b/ee/packages/license/__tests__/setLicense.spec.ts index 35a7a495edc0..f077a4fd0e0b 100644 --- a/ee/packages/license/__tests__/setLicense.spec.ts +++ b/ee/packages/license/__tests__/setLicense.spec.ts @@ -32,6 +32,57 @@ describe('License set license procedures', () => { }); }); + describe('Invalid periods', () => { + it('should throw an error if the license is expired', async () => { + const license = await getReadyLicenseManager(); + + const mocked = await new MockedLicenseBuilder(); + const token = await mocked.withExpiredDate().sign(); + + await license.setLicense(token); + await expect(license.hasValidLicense()).toBe(false); + }); + + describe('license that is not not started yet is applied', () => { + it('should throw an error if the license is not started yet', async () => { + const license = await getReadyLicenseManager(); + + const mocked = new MockedLicenseBuilder(); + const token = await mocked.withNotStartedDate().sign(); + + await license.setLicense(token); + await expect(license.hasValidLicense()).toBe(false); + }); + + it('should be allowed to set the same license again if the license is not started yet', async () => { + const license = await getReadyLicenseManager(); + + const mocked = await new MockedLicenseBuilder(); + const as = await mocked.resetValidPeriods().withNotStartedDate(); + const token = await as.sign(); + + await license.setLicense(token); + + await expect(license.hasValidLicense()).toBe(false); + + // 5 minutes in the future + + const mockedData = new Date(); + + mockedData.setMinutes(mockedData.getMinutes() + 5); + + jest.useFakeTimers(); + jest.setSystemTime(mockedData); + + await license.setLicense(token); + + jest.useRealTimers(); + + await expect(license.hasValidLicense()).toBe(true); + }); + }); + }); + it('should throw an error if the license is duplicated', async () => { const license = await getReadyLicenseManager(); diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index ec79532a9680..525cc7ce0c06 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,19 +1,19 @@ { "name": "@rocket.chat/license", - "version": "0.0.1", + "version": "0.1.2", "private": true, "devDependencies": { - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", - "@types/bcrypt": "^5.0.0", - "@types/jest": "~29.5.3", - "@types/ws": "^8.5.5", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", + "@types/bcrypt": "^5.0.1", + "@types/jest": "~29.5.7", + "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", - "ts-jest": "~29.0.5", - "typescript": "^5.2.2" + "ts-jest": "~29.1.1", + "typescript": "^5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/license/src/MockedLicenseBuilder.ts b/ee/packages/license/src/MockedLicenseBuilder.ts new file mode 100644 index 000000000000..4c3cab7b660f --- /dev/null +++ b/ee/packages/license/src/MockedLicenseBuilder.ts @@ -0,0 +1,233 @@ +import type { ILicenseTag, ILicenseV3, LicenseLimit, LicenseModule, LicensePeriod, Timestamp } from '@rocket.chat/core-typings'; + +import { encrypt } from './token'; + +export class MockedLicenseBuilder { + information: { + id?: string; + autoRenew: boolean; + visualExpiration?: Timestamp; + notifyAdminsAt?: Timestamp; + notifyUsersAt?: Timestamp; + trial: boolean; + offline: boolean; + createdAt: Timestamp; + grantedBy: { + method: 'manual' | 'self-service' | 'sales' | 'support' | 'reseller'; + seller?: string; + }; + grantedTo?: { + name?: string; + company?: string; + email?: string; + }; + legalText?: string; + notes?: string; + tags?: ILicenseTag[]; + }; + + validation: { + serverUrls: { + value: string; + type: 'url' | 'regex' | 'hash'; + }[]; + + serverVersions?: { + value: string; + }[]; + + serverUniqueId?: string; + cloudWorkspaceId?: string; + validPeriods: LicensePeriod[]; + legalTextAgreement?: { + type: 'required' | 'not-required' | 'accepted'; + acceptedVia?: 'cloud'; + }; + + statisticsReport: { + required: boolean; + allowedStaleInDays?: number; + }; + }; + + constructor() { + this.information = { + autoRenew: true, + // expires in 1 year + visualExpiration: new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toISOString(), + // 15 days before expiration + notifyAdminsAt: new Date(new Date().setDate(new Date().getDate() + 15)).toISOString(), + // 30 days before expiration + notifyUsersAt: new Date(new Date().setDate(new Date().getDate() + 30)).toISOString(), + trial: false, + offline: false, + createdAt: new Date().toISOString(), + grantedBy: { + method: 'manual', + seller: 'Rocket.Cat', + }, + tags: [ + { + name: 'Test', + color: 'blue', + }, + ], + }; + + this.validation = { + serverUrls: [ + { + value: 'localhost:3000', + type: 'url', + }, + ], + serverVersions: [ + { + value: '3.0.0', + }, + ], + + serverUniqueId: '1234567890', + cloudWorkspaceId: '1234567890', + + validPeriods: [ + { + invalidBehavior: 'disable_modules', + modules: ['livechat-enterprise'], + validFrom: new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString(), + validUntil: new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toISOString(), + }, + ], + + statisticsReport: { + required: true, + allowedStaleInDays: 30, + }, + }; + } + + public withExpiredDate(): this { + // expired 1 minute ago + const date = new Date(); + date.setMinutes(date.getMinutes() - 1); + const expired = date.toISOString(); + + const rule = this.validation.validPeriods.find((period) => period.invalidBehavior === 'invalidate_license'); + + if (rule) { + rule.validUntil = expired; + } else { + this.validation.validPeriods.push({ + invalidBehavior: 'invalidate_license', + validFrom: new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString(), + validUntil: expired, + }); + } + + return this; + } + + public withNotStartedDate(): this { + // starts in 1 minute + const date = new Date(); + date.setMinutes(date.getMinutes() + 1); + const starts = date.toISOString(); + + const rule = this.validation.validPeriods.find((period) => period.invalidBehavior === 'invalidate_license'); + + if (rule) { + rule.validFrom = starts; + } else { + this.validation.validPeriods.push({ + invalidBehavior: 'invalidate_license', + validUntil: new Date(new Date().setFullYear(new Date().getFullYear() + 1)).toISOString(), + validFrom: starts, + }); + } + + return this; + } + + public resetValidPeriods(): this { + this.validation.validPeriods = []; + return this; + } + + public withValidPeriod(period: LicensePeriod): this { + this.validation.validPeriods.push(period); + return this; + } + + public withGrantedTo(grantedTo: { name?: string; company?: string; email?: string }): this { + this.information.grantedTo = grantedTo; + return this; + } + + grantedModules: { + module: LicenseModule; + }[] = []; + + limits: { + activeUsers?: LicenseLimit[]; + guestUsers?: LicenseLimit[]; + roomsPerGuest?: LicenseLimit<'prevent_action'>[]; + privateApps?: LicenseLimit[]; + marketplaceApps?: LicenseLimit[]; + monthlyActiveContacts?: LicenseLimit[]; + } = {}; + + cloudMeta?: Record; + + public withServerUrls(urls: { value: string; type: 'url' | 'regex' | 'hash' }): this { + this.validation.serverUrls = this.validation.serverUrls ?? []; + this.validation.serverUrls.push(urls); + return this; + } + + public withServerVersions(versions: { value: string }): this { + this.validation.serverVersions = this.validation.serverVersions ?? []; + this.validation.serverVersions.push(versions); + return this; + } + + public withGratedModules(modules: LicenseModule[]): this { + this.grantedModules = this.grantedModules ?? []; + this.grantedModules.push(...modules.map((module) => ({ module }))); + return this; + } + + withNoGratedModules(modules: LicenseModule[]): this { + this.grantedModules = this.grantedModules ?? []; + this.grantedModules = this.grantedModules.filter(({ module }) => !modules.includes(module)); + return this; + } + + public withLimits(key: K, value: ILicenseV3['limits'][K]): this { + this.limits = this.limits ?? {}; + this.limits[key] = value; + return this; + } + + public build(): ILicenseV3 { + return { + version: '3.0', + information: this.information, + validation: this.validation, + grantedModules: [...new Set(this.grantedModules)], + limits: { + activeUsers: [], + guestUsers: [], + roomsPerGuest: [], + privateApps: [], + marketplaceApps: [], + monthlyActiveContacts: [], + ...this.limits, + }, + cloudMeta: this.cloudMeta, + }; + } + + public sign(): Promise { + return encrypt(this.build()); + } +} diff --git a/ee/packages/license/src/deprecated.ts b/ee/packages/license/src/deprecated.ts index 0a4a6b0f1bb3..e4d7bd22293a 100644 --- a/ee/packages/license/src/deprecated.ts +++ b/ee/packages/license/src/deprecated.ts @@ -1,15 +1,14 @@ -import type { ILicenseV3, LicenseLimitKind } from './definition/ILicenseV3'; +import type { ILicenseV3, LicenseLimitKind } from '@rocket.chat/core-typings'; + import type { LicenseManager } from './license'; import { getModules } from './modules'; +import { defaultLimits } from './validation/validateDefaultLimits'; -const getLicenseLimit = (license: ILicenseV3 | undefined, kind: LicenseLimitKind) => { - if (!license) { - return; - } +export const getLicenseLimit = (license: ILicenseV3 | undefined, kind: LicenseLimitKind) => { + const limitList = license ? license.limits[kind] : defaultLimits[kind as keyof typeof defaultLimits]; - const limitList = license.limits[kind]; if (!limitList?.length) { - return; + return -1; } return Math.min(...limitList.map(({ max }) => max)); @@ -23,8 +22,8 @@ export function getMaxActiveUsers(this: LicenseManager) { export function getAppsConfig(this: LicenseManager) { return { - maxPrivateApps: getLicenseLimit(this.getLicense(), 'privateApps') ?? 3, - maxMarketplaceApps: getLicenseLimit(this.getLicense(), 'marketplaceApps') ?? 5, + maxPrivateApps: getLicenseLimit(this.getLicense(), 'privateApps'), + maxMarketplaceApps: getLicenseLimit(this.getLicense(), 'marketplaceApps'), }; } diff --git a/ee/packages/license/src/events/deprecated.ts b/ee/packages/license/src/events/deprecated.ts index 8ebfe4729292..b120815c0aae 100644 --- a/ee/packages/license/src/events/deprecated.ts +++ b/ee/packages/license/src/events/deprecated.ts @@ -1,4 +1,5 @@ -import type { LicenseModule } from '../definition/LicenseModule'; +import type { LicenseModule } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { hasModule } from '../modules'; diff --git a/ee/packages/license/src/events/emitter.ts b/ee/packages/license/src/events/emitter.ts index 51f3282a9742..b4406abaa81b 100644 --- a/ee/packages/license/src/events/emitter.ts +++ b/ee/packages/license/src/events/emitter.ts @@ -1,23 +1,31 @@ -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { LicenseModule } from '../definition/LicenseModule'; +import type { BehaviorWithContext, LicenseModule } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { logger } from '../logger'; export function moduleValidated(this: LicenseManager, module: LicenseModule) { try { this.emit('module', { module, valid: true }); + } catch (error) { + logger.error({ msg: `Error running module (valid: true) event: ${module}`, error }); + } + try { this.emit(`valid:${module}`); } catch (error) { - logger.error({ msg: 'Error running module added event', error }); + logger.error({ msg: `Error running module added event: ${module}`, error }); } } export function moduleRemoved(this: LicenseManager, module: LicenseModule) { try { this.emit('module', { module, valid: false }); + } catch (error) { + logger.error({ msg: `Error running module (valid: false) event: ${module}`, error }); + } + try { this.emit(`invalid:${module}`); } catch (error) { - logger.error({ msg: 'Error running module removed event', error }); + logger.error({ msg: `Error running module removed event: ${module}`, error }); } } diff --git a/ee/packages/license/src/events/listeners.ts b/ee/packages/license/src/events/listeners.ts index f8c291edc4be..7b7eaf0baed9 100644 --- a/ee/packages/license/src/events/listeners.ts +++ b/ee/packages/license/src/events/listeners.ts @@ -1,6 +1,5 @@ -import type { LicenseLimitKind } from '../definition/ILicenseV3'; -import type { BehaviorWithContext, LicenseBehavior } from '../definition/LicenseBehavior'; -import type { LicenseModule } from '../definition/LicenseModule'; +import type { LicenseLimitKind, LicenseModule, BehaviorWithContext, LicenseBehavior } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { hasModule } from '../modules'; @@ -11,6 +10,24 @@ export function onChange(this: LicenseManager, cb: () => void) { this.on('sync', cb); } +export function onInstall(this: LicenseManager, cb: () => void) { + if (this.hasValidLicense()) { + cb(); + } + this.on('installed', cb); +} + +export function onRemoveLicense(this: LicenseManager, cb: () => void) { + this.on('removed', cb); +} + +export function onInvalidate(this: LicenseManager, cb: () => void) { + if (!this.hasValidLicense()) { + cb(); + } + this.on('invalidate', cb); +} + export function onValidFeature(this: LicenseManager, feature: LicenseModule, cb: () => void) { this.on(`valid:${feature}`, cb); diff --git a/ee/packages/license/src/events/overwriteClassOnLicense.ts b/ee/packages/license/src/events/overwriteClassOnLicense.ts index 00a690d8f413..7ca686b58a50 100644 --- a/ee/packages/license/src/events/overwriteClassOnLicense.ts +++ b/ee/packages/license/src/events/overwriteClassOnLicense.ts @@ -1,4 +1,5 @@ -import type { LicenseModule } from '../definition/LicenseModule'; +import type { LicenseModule } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { onLicense } from './deprecated'; diff --git a/ee/packages/license/src/getLicenseLimit.spec.ts b/ee/packages/license/src/getLicenseLimit.spec.ts new file mode 100644 index 000000000000..0a95519d6083 --- /dev/null +++ b/ee/packages/license/src/getLicenseLimit.spec.ts @@ -0,0 +1,27 @@ +import { LicenseImp } from '.'; +import { MockedLicenseBuilder, getReadyLicenseManager } from '../__tests__/MockedLicenseBuilder'; +import { getAppsConfig } from './deprecated'; + +describe('Marketplace Restrictions', () => { + it('should respect the default if there is no license applied', async () => { + const LicenseManager = new LicenseImp(); + + expect(getAppsConfig.call(LicenseManager)).toEqual({ + maxPrivateApps: 3, + maxMarketplaceApps: 5, + }); + }); + + it('should return unlimited if there is license but no limits', async () => { + const licenseManager = await getReadyLicenseManager(); + + const license = await new MockedLicenseBuilder(); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + await expect(getAppsConfig.call(licenseManager)).toEqual({ + maxPrivateApps: -1, + maxMarketplaceApps: -1, + }); + }); +}); diff --git a/ee/packages/license/src/index.ts b/ee/packages/license/src/index.ts index e590ce7722b2..cb07323d4678 100644 --- a/ee/packages/license/src/index.ts +++ b/ee/packages/license/src/index.ts @@ -1,6 +1,5 @@ -import type { LicenseLimitKind } from './definition/ILicenseV3'; -import type { LicenseInfo } from './definition/LicenseInfo'; -import type { LimitContext } from './definition/LimitContext'; +import type { LicenseLimitKind, LicenseInfo, LimitContext } from '@rocket.chat/core-typings'; + import { getAppsConfig, getMaxActiveUsers, getUnmodifiedLicenseAndModules } from './deprecated'; import { onLicense } from './events/deprecated'; import { @@ -14,23 +13,21 @@ import { onToggledFeature, onValidFeature, onValidateLicense, + onInstall, + onInvalidate, + onRemoveLicense, } from './events/listeners'; import { overwriteClassOnLicense } from './events/overwriteClassOnLicense'; import { LicenseManager } from './license'; +import { logger } from './logger'; import { getModules, hasModule } from './modules'; +import { showLicense } from './showLicense'; import { getTags } from './tags'; import { getCurrentValueForLicenseLimit, setLicenseLimitCounter } from './validation/getCurrentValueForLicenseLimit'; import { validateFormat } from './validation/validateFormat'; -export * from './definition/ILicenseTag'; -export * from './definition/ILicenseV2'; -export * from './definition/ILicenseV3'; -export * from './definition/LicenseBehavior'; -export * from './definition/LicenseInfo'; -export * from './definition/LicenseLimit'; -export * from './definition/LicenseModule'; -export * from './definition/LicensePeriod'; -export * from './definition/LimitContext'; +export { DuplicatedLicenseError } from './errors/DuplicatedLicenseError'; +export * from './MockedLicenseBuilder'; // eslint-disable-next-line @typescript-eslint/naming-convention interface License { @@ -65,6 +62,31 @@ interface License { } export class LicenseImp extends LicenseManager implements License { + constructor() { + super(); + this.onValidateLicense(() => showLicense.call(this, this.getLicense(), this.hasValidLicense())); + + this.onValidateLicense(() => { + logger.startup({ + msg: 'License installed', + version: this.getLicense()?.version, + hash: this._lockedLicense?.slice(-8), + }); + }); + + this.onRemoveLicense(() => { + logger.startup({ + msg: 'License removed', + }); + }); + + this.onInvalidateLicense(() => { + logger.startup({ + msg: 'License invalidated', + }); + }); + } + validateFormat = validateFormat; hasModule = hasModule; @@ -85,6 +107,12 @@ export class LicenseImp extends LicenseManager implements License { onChange = onChange; + onInstall = onInstall; + + onRemoveLicense = onRemoveLicense; + + onInvalidate = onInvalidate; + onValidFeature = onValidFeature; onInvalidFeature = onInvalidFeature; diff --git a/ee/packages/license/src/isItemAllowed.ts b/ee/packages/license/src/isItemAllowed.ts index 16787cdf9c4d..3eb9651a8fc9 100644 --- a/ee/packages/license/src/isItemAllowed.ts +++ b/ee/packages/license/src/isItemAllowed.ts @@ -1,6 +1,4 @@ -import type { LicenseLimitKind } from './definition/ILicenseV3'; -import type { LicenseBehavior } from './definition/LicenseBehavior'; -import type { LicenseValidationOptions } from './definition/LicenseValidationOptions'; +import type { LicenseLimitKind, LicenseBehavior, LicenseValidationOptions } from '@rocket.chat/core-typings'; const isItemAllowed = (item: T, allowList?: T[]): boolean => { return !allowList || allowList.includes(item); diff --git a/ee/packages/license/src/license.spec.ts b/ee/packages/license/src/license.spec.ts index 73cf13d75035..406dfd696e2e 100644 --- a/ee/packages/license/src/license.spec.ts +++ b/ee/packages/license/src/license.spec.ts @@ -1,3 +1,4 @@ +import { LicenseImp } from '.'; import { MockedLicenseBuilder, getReadyLicenseManager } from '../__tests__/MockedLicenseBuilder'; it('should not prevent if there is no license', async () => { @@ -104,7 +105,7 @@ describe('Validate License Limits', () => { }); }); describe('fair usage behavior', () => { - it('should change the flag to true if the counter is equal or over the limit', async () => { + it('should change the `prevent_action` flag to true if the counter is equal or over the limit', async () => { const licenseManager = await getReadyLicenseManager(); const fairUsageCallback = jest.fn(); @@ -136,7 +137,7 @@ describe('Validate License Limits', () => { fairUsageCallback.mockClear(); licenseManager.setLicenseLimitCounter('activeUsers', () => 10); await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); - expect(fairUsageCallback).toHaveBeenCalledTimes(0); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); expect(preventActionCallback).toHaveBeenCalledTimes(1); licenseManager.setLicenseLimitCounter('activeUsers', () => 11); @@ -147,7 +148,48 @@ describe('Validate License Limits', () => { await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); expect(preventActionCallback).toHaveBeenCalledTimes(4); - expect(fairUsageCallback).toHaveBeenCalledTimes(4); + expect(fairUsageCallback).toHaveBeenCalledTimes(0); + }); + it('should trigger the toggle event if the counter is under the limit', async () => { + const licenseManager = await getReadyLicenseManager(); + + const fairUsageCallback = jest.fn(); + const preventActionCallback = jest.fn(); + + licenseManager.onBehaviorToggled('start_fair_policy', fairUsageCallback); + licenseManager.onBehaviorTriggered('prevent_action', preventActionCallback); + + const license = await new MockedLicenseBuilder().withLimits('activeUsers', [ + { + max: 12, + behavior: 'prevent_action', + }, + { + max: 10, + behavior: 'start_fair_policy', + }, + ]); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 12); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); + expect(preventActionCallback).toHaveBeenCalledTimes(1); + + preventActionCallback.mockClear(); + fairUsageCallback.mockClear(); + licenseManager.setLicenseLimitCounter('activeUsers', () => 12); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); + expect(fairUsageCallback).toHaveBeenCalledTimes(0); + expect(preventActionCallback).toHaveBeenCalledTimes(1); + + preventActionCallback.mockClear(); + fairUsageCallback.mockClear(); + licenseManager.setLicenseLimitCounter('activeUsers', () => 5); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(false); + expect(fairUsageCallback).toHaveBeenCalledTimes(1); + expect(preventActionCallback).toHaveBeenCalledTimes(0); }); }); @@ -231,3 +273,189 @@ describe('Validate License Limits', () => { }); }); }); + +describe('License.getInfo', () => { + describe('Marketplace Restrictions', () => { + it('should respect the default if there is no license applied', async () => { + const licenseManager = new LicenseImp(); + + licenseManager.setLicenseLimitCounter('privateApps', () => 0); + licenseManager.setLicenseLimitCounter('marketplaceApps', () => 0); + + expect( + ( + await licenseManager.getInfo({ + limits: true, + currentValues: false, + license: false, + }) + ).limits, + ).toMatchObject({ + privateApps: { max: 3 }, + marketplaceApps: { max: 5 }, + }); + }); + + it('should return unlimited if there is license but no limits', async () => { + const licenseManager = await getReadyLicenseManager(); + + const license = await new MockedLicenseBuilder(); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + await expect( + ( + await licenseManager.getInfo({ + limits: true, + currentValues: false, + license: false, + }) + ).limits, + ).toMatchObject({ + privateApps: { max: -1 }, + marketplaceApps: { max: -1 }, + }); + }); + }); +}); + +describe('License.setLicense', () => { + it('should trigger the validate event even if the module callback throws an error', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(() => { + throw new Error('Error'); + }); + + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + }); + + it('should trigger the sync event only from the sync method', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(); + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']).withLimits('activeUsers', [ + { + max: 10, + behavior: 'disable_modules', + modules: ['auditing'], + }, + ]); + + await expect(licenseManager.setLicense(await license.sign(), true)).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + + validateCallback.mockClear(); + moduleCallback.mockClear(); + syncCallback.mockClear(); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 11); + await licenseManager.revalidateLicense(); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(1); + }); + + it('should trigger the sync event even if the module callback throws an error', async () => { + const licenseManager = await getReadyLicenseManager(); + + const validateCallback = jest.fn(); + const moduleCallback = jest.fn(() => { + throw new Error('Error'); + }); + const syncCallback = jest.fn(); + + licenseManager.on('validate', validateCallback); + licenseManager.on('sync', syncCallback); + licenseManager.on('module', moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']).withLimits('activeUsers', [ + { + max: 10, + behavior: 'disable_modules', + modules: ['auditing'], + }, + ]); + + await expect(licenseManager.setLicense(await license.sign(), true)).resolves.toBe(true); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(0); + + validateCallback.mockClear(); + moduleCallback.mockClear(); + syncCallback.mockClear(); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 11); + await licenseManager.revalidateLicense(); + + expect(validateCallback).toHaveBeenCalledTimes(1); + expect(moduleCallback).toHaveBeenCalledTimes(1); + expect(syncCallback).toHaveBeenCalledTimes(1); + }); +}); + +describe('License.removeLicense', () => { + it('should trigger the sync event even if the module callback throws an error', async () => { + const licenseManager = await getReadyLicenseManager(); + + const removeLicense = jest.fn(); + const moduleCallback = jest.fn(); + + licenseManager.on('removed', removeLicense); + + licenseManager.onModule(moduleCallback); + + const license = await new MockedLicenseBuilder().withGratedModules(['auditing']).withLimits('activeUsers', [ + { + max: 10, + behavior: 'disable_modules', + modules: ['auditing'], + }, + ]); + + await expect(licenseManager.setLicense(await license.sign(), true)).resolves.toBe(true); + await expect(removeLicense).toHaveBeenCalledTimes(0); + await expect(moduleCallback).toHaveBeenNthCalledWith(1, { + module: 'auditing', + valid: true, + }); + + removeLicense.mockClear(); + moduleCallback.mockClear(); + await licenseManager.remove(); + + await expect(removeLicense).toHaveBeenCalledTimes(1); + await expect(moduleCallback).toHaveBeenNthCalledWith(1, { + module: 'auditing', + valid: false, + }); + + await expect(licenseManager.hasValidLicense()).toBe(false); + }); +}); diff --git a/ee/packages/license/src/license.ts b/ee/packages/license/src/license.ts index fb290d541cfb..a8d8f1bca510 100644 --- a/ee/packages/license/src/license.ts +++ b/ee/packages/license/src/license.ts @@ -1,14 +1,19 @@ +import type { + ILicenseTag, + LicenseEvents, + ILicenseV2, + ILicenseV3, + LicenseLimitKind, + BehaviorWithContext, + LicenseBehavior, + LicenseInfo, + LicenseModule, + LicenseValidationOptions, + LimitContext, +} from '@rocket.chat/core-typings'; import { Emitter } from '@rocket.chat/emitter'; -import { type ILicenseTag } from './definition/ILicenseTag'; -import type { ILicenseV2 } from './definition/ILicenseV2'; -import type { ILicenseV3, LicenseLimitKind } from './definition/ILicenseV3'; -import type { BehaviorWithContext } from './definition/LicenseBehavior'; -import type { LicenseInfo } from './definition/LicenseInfo'; -import type { LicenseModule } from './definition/LicenseModule'; -import type { LicenseValidationOptions } from './definition/LicenseValidationOptions'; -import type { LimitContext } from './definition/LimitContext'; -import type { LicenseEvents } from './definition/events'; +import { getLicenseLimit } from './deprecated'; import { DuplicatedLicenseError } from './errors/DuplicatedLicenseError'; import { InvalidLicenseError } from './errors/InvalidLicenseError'; import { NotReadyForValidation } from './errors/NotReadyForValidation'; @@ -16,7 +21,6 @@ import { behaviorTriggered, behaviorTriggeredToggled, licenseInvalidated, licens import { logger } from './logger'; import { getModules, invalidateAll, replaceModules } from './modules'; import { applyPendingLicense, clearPendingLicense, hasPendingLicense, isPendingLicense, setPendingLicense } from './pendingLicense'; -import { showLicense } from './showLicense'; import { replaceTags } from './tags'; import { decrypt } from './token'; import { convertToV3 } from './v2/convertToV3'; @@ -26,6 +30,7 @@ import { getModulesToDisable } from './validation/getModulesToDisable'; import { isBehaviorsInResult } from './validation/isBehaviorsInResult'; import { isReadyForValidation } from './validation/isReadyForValidation'; import { runValidation } from './validation/runValidation'; +import { validateDefaultLimits } from './validation/validateDefaultLimits'; import { validateFormat } from './validation/validateFormat'; import { validateLicenseLimits } from './validation/validateLicenseLimits'; @@ -42,20 +47,22 @@ export class LicenseManager extends Emitter { private workspaceUrl: string | undefined; - private _license: ILicenseV3 | undefined; + protected _license: ILicenseV3 | undefined; private _unmodifiedLicense: ILicenseV2 | ILicenseV3 | undefined; private _valid: boolean | undefined; - private _lockedLicense: string | undefined; + protected _lockedLicense: string | undefined; - public shouldPreventActionResults = new Map(); + private states = new Map>(); - constructor() { - super(); + public get shouldPreventActionResults() { + const state = this.states.get('prevent_action') ?? new Map(); - this.on('validate', () => showLicense.call(this, this._license, this._valid)); + this.states.set('prevent_action', state); + + return state; } public get license(): ILicenseV3 | undefined { @@ -130,14 +137,24 @@ export class LicenseManager extends Emitter { this._valid = false; this._lockedLicense = undefined; - this.shouldPreventActionResults.clear(); + this.states.clear(); clearPendingLicense.call(this); } private invalidateLicense(): void { this._valid = false; + this.states.clear(); + invalidateAll.call(this); licenseInvalidated.call(this); + } + + public remove(): void { + if (!this._license) { + return; + } + this.clearLicenseData(); invalidateAll.call(this); + this.emit('removed'); } private async setLicenseV3( @@ -154,7 +171,6 @@ export class LicenseManager extends Emitter { this._license = newLicense; this._lockedLicense = encryptedLicense; - await this.validateLicense({ isNewLicense }); } catch (e) { if (e instanceof InvalidLicenseError) { @@ -242,10 +258,16 @@ export class LicenseManager extends Emitter { if (hasPendingLicense.call(this) && !isPendingLicense.call(this, encryptedLicense)) { // simply remove the pending license clearPendingLicense.call(this); - throw new Error('Invalid license 1'); + throw new Error('Invalid license'); } - throw new DuplicatedLicenseError(); + /** + * The license can be set with future minimum date, failing during the first set, + * but if the user tries to set the same license again later it can be valid or not, so we need to check it again + */ + if (this.hasValidLicense()) { + throw new DuplicatedLicenseError(); + } } if (!isReadyForValidation.call(this)) { @@ -266,6 +288,8 @@ export class LicenseManager extends Emitter { } await this.setLicenseV3(decrypted, encryptedLicense, decrypted, isNewLicense); + this.emit('installed'); + return true; } catch (e) { logger.error('Invalid license'); @@ -316,6 +340,8 @@ export class LicenseManager extends Emitter { 'monthlyActiveContacts', ]; + const license = this.getLicense(); + const items = await Promise.all( keys.map(async (limit) => { const cached = this.shouldPreventActionResults.get(limit as LicenseLimitKind); @@ -324,15 +350,17 @@ export class LicenseManager extends Emitter { return [limit as LicenseLimitKind, cached]; } - const fresh = this._license + const fresh = license ? isBehaviorsInResult( - await validateLicenseLimits.call(this, this._license, { + await validateLicenseLimits.call(this, license, { behaviors: ['prevent_action'], limits: [limit], }), ['prevent_action'], ) - : false; + : isBehaviorsInResult(await validateDefaultLimits.call(this, { behaviors: ['prevent_action'], limits: [limit] }), [ + 'prevent_action', + ]); this.shouldPreventActionResults.set(limit as LicenseLimitKind, fresh); @@ -347,13 +375,10 @@ export class LicenseManager extends Emitter { action: T, extraCount = 0, context: Partial> = {}, - { suppressLog }: Pick = {}, + { suppressLog }: Pick = { + suppressLog: process.env.LICENSE_VALIDATION_SUPPRESS_LOG !== 'false', + }, ): Promise { - const license = this.getLicense(); - if (!license) { - return false; - } - const options: LicenseValidationOptions = { ...(extraCount && { behaviors: ['prevent_action'] }), isNewLicense: false, @@ -367,6 +392,11 @@ export class LicenseManager extends Emitter { }, }; + const license = this.getLicense(); + if (!license) { + return isBehaviorsInResult(await validateDefaultLimits.call(this, options), ['prevent_action']); + } + const validationResult = await runValidation.call(this, license, options); const shouldPreventAction = isBehaviorsInResult(validationResult, ['prevent_action']); @@ -376,7 +406,22 @@ export class LicenseManager extends Emitter { return shouldPreventAction; } - if (isBehaviorsInResult(validationResult, ['invalidate_license', 'disable_modules', 'start_fair_policy'])) { + // check if any of the behaviors that should trigger a sync changed + if ( + (['invalidate_license', 'disable_modules', 'start_fair_policy'] as const).some((behavior) => { + const hasChanged = this.consolidateBehaviorState(action, behavior, isBehaviorsInResult(validationResult, [behavior])); + if (hasChanged && behavior === 'start_fair_policy') { + this.triggerBehaviorEventsToggled([ + { + behavior: 'start_fair_policy', + reason: 'limit', + limit: action, + }, + ]); + } + return hasChanged; + }) + ) { await this.revalidateLicense(); } @@ -391,9 +436,7 @@ export class LicenseManager extends Emitter { } as BehaviorWithContext, ]; - if (this.shouldPreventActionResults.get(action) !== shouldPreventAction) { - this.shouldPreventActionResults.set(action, shouldPreventAction); - + if (this.consolidateBehaviorState(action, 'prevent_action', shouldPreventAction)) { this.triggerBehaviorEventsToggled(eventsToEmit); } @@ -402,6 +445,23 @@ export class LicenseManager extends Emitter { return shouldPreventAction; } + private consolidateBehaviorState(action: T, behavior: LicenseBehavior, triggered: boolean): boolean { + // check if the behavior changed + const state = this.states.get(behavior) ?? new Map(); + + const currentState = state.get(action) ?? false; + + if (currentState === triggered) { + return false; + } + + // if it changed, update the state + state.set(action, triggered); + + this.states.set(behavior, state); + return true; + } + public async getInfo({ limits: includeLimits, currentValues: loadCurrentValues, @@ -415,27 +475,23 @@ export class LicenseManager extends Emitter { const license = this.getLicense(); // Get all limits present in the license and their current value - const limits = ( - (license && - includeLimits && + const limits = Object.fromEntries( + (includeLimits && (await Promise.all( globalLimitKinds - .map((limitKey) => ({ - limitKey, - max: Math.max(-1, Math.min(...Array.from(license.limits[limitKey as LicenseLimitKind] || [])?.map(({ max }) => max))), - })) - .filter(({ max }) => max >= 0 && max < Infinity) - .map(async ({ max, limitKey }) => { - return { - [limitKey as LicenseLimitKind]: { - ...(loadCurrentValues ? { value: await getCurrentValueForLicenseLimit.call(this, limitKey as LicenseLimitKind) } : {}), + .map((limitKey) => [limitKey, getLicenseLimit(license, limitKey)] as const) + .map(async ([limitKey, max]) => { + return [ + limitKey, + { + ...(loadCurrentValues && { value: await getCurrentValueForLicenseLimit.call(this, limitKey) }), max, }, - }; + ]; }), ))) || - [] - ).reduce((prev, curr) => ({ ...prev, ...curr }), {}); + [], + ); return { license: (includeLicense && license) || undefined, diff --git a/ee/packages/license/src/modules.ts b/ee/packages/license/src/modules.ts index 6931fb7a6a5d..7a6f41c07ec1 100644 --- a/ee/packages/license/src/modules.ts +++ b/ee/packages/license/src/modules.ts @@ -1,4 +1,5 @@ -import type { LicenseModule } from './definition/LicenseModule'; +import type { LicenseModule } from '@rocket.chat/core-typings'; + import { moduleRemoved, moduleValidated } from './events/emitter'; import type { LicenseManager } from './license'; diff --git a/ee/packages/license/src/showLicense.ts b/ee/packages/license/src/showLicense.ts index 3dda60a43b76..cbf708019856 100644 --- a/ee/packages/license/src/showLicense.ts +++ b/ee/packages/license/src/showLicense.ts @@ -1,4 +1,5 @@ -import type { ILicenseV3 } from './definition/ILicenseV3'; +import type { ILicenseV3 } from '@rocket.chat/core-typings'; + import type { LicenseManager } from './license'; import { getModules } from './modules'; diff --git a/ee/packages/license/src/tags.ts b/ee/packages/license/src/tags.ts index 33434cae116d..d918c4cd0cfc 100644 --- a/ee/packages/license/src/tags.ts +++ b/ee/packages/license/src/tags.ts @@ -1,4 +1,5 @@ -import type { ILicenseTag } from './definition/ILicenseTag'; +import type { ILicenseTag } from '@rocket.chat/core-typings'; + import { type LicenseManager } from './license'; export function addTag(this: LicenseManager, tag: ILicenseTag) { diff --git a/ee/packages/license/src/token.ts b/ee/packages/license/src/token.ts index 46daaef83974..09ad5a940b58 100644 --- a/ee/packages/license/src/token.ts +++ b/ee/packages/license/src/token.ts @@ -1,13 +1,12 @@ import crypto from 'crypto'; +import type { ILicenseV3 } from '@rocket.chat/core-typings'; import { verify, sign, getPairs } from '@rocket.chat/jwt'; -import type { ILicenseV3 } from './definition/ILicenseV3'; - const PUBLIC_LICENSE_KEY_V2 = 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFxV1Nza2Q5LzZ6Ung4a3lQY2ljcwpiMzJ3Mnd4VnV3N3lCVDk2clEvOEQreU1lQ01POXdTU3BIYS85bkZ5d293RXRpZ3B0L3dyb1BOK1ZHU3didHdQCkZYQmVxRWxCbmRHRkFsODZlNStFbGlIOEt6L2hHbkNtSk5tWHB4RUsyUkUwM1g0SXhzWVg3RERCN010eC9pcXMKY2pCL091dlNCa2ppU2xlUzdibE5JVC9kQTdLNC9DSjNvaXUwMmJMNEV4Y2xDSGVwenFOTWVQM3dVWmdweE9uZgpOT3VkOElYWUs3M3pTY3VFOEUxNTdZd3B6Q0twVmFIWDdaSmY4UXVOc09PNVcvYUlqS2wzTDYyNjkrZUlPRXJHCndPTm1hSG56Zmc5RkxwSmh6Z3BPMzhhVm43NnZENUtLakJhaldza1krNGEyZ1NRbUtOZUZxYXFPb3p5RUZNMGUKY0ZXWlZWWjNMZWg0dkVNb1lWUHlJeng5Nng4ZjIveW1QbmhJdXZRdjV3TjRmeWVwYTdFWTVVQ2NwNzF6OGtmUAo0RmNVelBBMElEV3lNaWhYUi9HNlhnUVFaNEdiL3FCQmh2cnZpSkNGemZZRGNKZ0w3RmVnRllIUDNQR0wwN1FnCnZMZXZNSytpUVpQcnhyYnh5U3FkUE9rZ3VyS2pWclhUVXI0QTlUZ2lMeUlYNVVsSnEzRS9SVjdtZk9xWm5MVGEKU0NWWEhCaHVQbG5DR1pSMDFUb1RDZktoTUcxdTBDRm5MMisxNWhDOWZxT21XdjlRa2U0M3FsSjBQZ0YzVkovWAp1eC9tVHBuazlnbmJHOUpIK21mSDM5Um9GdlROaW5Zd1NNdll6dXRWT242OXNPemR3aERsYTkwbDNBQ2g0eENWCks3Sk9YK3VIa29OdTNnMmlWeGlaVU0wQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo='; -const PUBLIC_LICENSE_KEY_V3 = PUBLIC_LICENSE_KEY_V2; +const PUBLIC_LICENSE_KEY_V3 = Buffer.from(PUBLIC_LICENSE_KEY_V2, 'base64').toString('utf-8'); let TEST_KEYS: [string, string] | undefined = undefined; diff --git a/ee/packages/license/src/v2/bundles.ts b/ee/packages/license/src/v2/bundles.ts index 70f9d7b5a653..1e384fff0bdd 100644 --- a/ee/packages/license/src/v2/bundles.ts +++ b/ee/packages/license/src/v2/bundles.ts @@ -1,23 +1,7 @@ -export type BundleFeature = - | 'auditing' - | 'canned-responses' - | 'ldap-enterprise' - | 'livechat-enterprise' - | 'voip-enterprise' - | 'omnichannel-mobile-enterprise' - | 'engagement-dashboard' - | 'push-privacy' - | 'scalability' - | 'saml-enterprise' - | 'device-management' - | 'oauth-enterprise' - | 'federation' - | 'videoconference-enterprise' - | 'message-read-receipt' - | 'outlook-calendar'; +import type { LicenseModule } from '@rocket.chat/core-typings'; interface IBundle { - [key: string]: BundleFeature[]; + [key: string]: LicenseModule[]; } const bundles: IBundle = { @@ -38,6 +22,10 @@ const bundles: IBundle = { 'videoconference-enterprise', 'message-read-receipt', 'outlook-calendar', + 'teams-mention', + 'hide-watermark', + 'custom-roles', + 'accessibility-certification', ], pro: [], }; diff --git a/ee/packages/license/src/v2/convertToV3.ts b/ee/packages/license/src/v2/convertToV3.ts index 10681cf04b47..a7b67ada2c6e 100644 --- a/ee/packages/license/src/v2/convertToV3.ts +++ b/ee/packages/license/src/v2/convertToV3.ts @@ -3,9 +3,8 @@ * Transform a License V2 into a V3 representation. */ -import type { ILicenseV2 } from '../definition/ILicenseV2'; -import type { ILicenseV3 } from '../definition/ILicenseV3'; -import type { LicenseModule } from '../definition/LicenseModule'; +import type { ILicenseV2, ILicenseV3, LicenseModule } from '@rocket.chat/core-typings'; + import { isBundle, getBundleFromModule, getBundleModules } from './bundles'; import { getTagColor } from './getTagColor'; @@ -14,7 +13,7 @@ export const convertToV3 = (v2: ILicenseV2): ILicenseV3 => { version: '3.0', information: { autoRenew: false, - visualExpiration: new Date(Date.parse(v2.meta?.trialEnd || v2.expiry)).toISOString(), + ...((v2.meta?.trialEnd || v2.expiry) && { visualExpiration: new Date(Date.parse(v2.meta?.trialEnd || v2.expiry)).toISOString() }), trial: v2.meta?.trial || false, offline: false, createdAt: new Date().toISOString(), @@ -51,7 +50,7 @@ export const convertToV3 = (v2: ILicenseV2): ILicenseV3 => { }, grantedModules: [ ...new Set( - v2.modules + ['hide-watermark', ...v2.modules] .map((licenseModule) => (isBundle(licenseModule) ? getBundleModules(licenseModule) : [licenseModule])) .reduce((prev, curr) => [...prev, ...curr], []) .map((licenseModule) => ({ module: licenseModule as LicenseModule })), diff --git a/ee/packages/license/src/validation/filterBehaviorsResult.ts b/ee/packages/license/src/validation/filterBehaviorsResult.ts index e51dbac20a53..e0c80f6dcb87 100644 --- a/ee/packages/license/src/validation/filterBehaviorsResult.ts +++ b/ee/packages/license/src/validation/filterBehaviorsResult.ts @@ -1,4 +1,4 @@ -import type { BehaviorWithContext, LicenseBehavior } from '../definition/LicenseBehavior'; +import type { BehaviorWithContext, LicenseBehavior } from '@rocket.chat/core-typings'; export const filterBehaviorsResult = (result: BehaviorWithContext[], expectedBehaviors: LicenseBehavior[]) => result.filter(({ behavior }) => expectedBehaviors.includes(behavior)); diff --git a/ee/packages/license/src/validation/getCurrentValueForLicenseLimit.ts b/ee/packages/license/src/validation/getCurrentValueForLicenseLimit.ts index 8f9c6ed4034e..01d4b78b77f2 100644 --- a/ee/packages/license/src/validation/getCurrentValueForLicenseLimit.ts +++ b/ee/packages/license/src/validation/getCurrentValueForLicenseLimit.ts @@ -1,5 +1,5 @@ -import type { LicenseLimitKind } from '../definition/ILicenseV3'; -import type { LimitContext } from '../definition/LimitContext'; +import type { LicenseLimitKind, LimitContext } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { logger } from '../logger'; import { applyPendingLicense, hasPendingLicense } from '../pendingLicense'; @@ -24,7 +24,7 @@ export async function getCurrentValueForLicenseLimit const counterFn = this.dataCounters.get(limitKey); if (!counterFn) { logger.error({ msg: 'Unable to validate license limit due to missing data counter.', limitKey }); - throw new Error('Unable to validate license limit due to missing data counter.'); + throw new Error(`Unable to validate license limit due to missing ${limitKey} data counter`); } return counterFn(context as LimitContext | undefined); diff --git a/ee/packages/license/src/validation/getModulesToDisable.ts b/ee/packages/license/src/validation/getModulesToDisable.ts index d42426e8af26..cdab814db026 100644 --- a/ee/packages/license/src/validation/getModulesToDisable.ts +++ b/ee/packages/license/src/validation/getModulesToDisable.ts @@ -1,5 +1,4 @@ -import type { BehaviorWithContext, LicenseBehavior } from '../definition/LicenseBehavior'; -import type { LicenseModule } from '../definition/LicenseModule'; +import type { BehaviorWithContext, LicenseBehavior, LicenseModule } from '@rocket.chat/core-typings'; const filterValidationResult = (result: BehaviorWithContext[], expectedBehavior: LicenseBehavior) => result.filter(({ behavior }) => behavior === expectedBehavior) as BehaviorWithContext[]; diff --git a/ee/packages/license/src/validation/getResultingBehavior.ts b/ee/packages/license/src/validation/getResultingBehavior.ts index 22ca02bfd220..a860c0985aaa 100644 --- a/ee/packages/license/src/validation/getResultingBehavior.ts +++ b/ee/packages/license/src/validation/getResultingBehavior.ts @@ -1,7 +1,4 @@ -import type { LicenseLimitKind } from '../definition/ILicenseV3'; -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { LicenseLimit } from '../definition/LicenseLimit'; -import type { LicensePeriod } from '../definition/LicensePeriod'; +import type { LicenseLimitKind, BehaviorWithContext, LicenseLimit, LicensePeriod } from '@rocket.chat/core-typings'; export const getResultingBehavior = ( data: LicenseLimit | LicensePeriod | Partial>, diff --git a/ee/packages/license/src/validation/isBehaviorsInResult.ts b/ee/packages/license/src/validation/isBehaviorsInResult.ts index 7e6ed89db8ec..18a0251cb3cc 100644 --- a/ee/packages/license/src/validation/isBehaviorsInResult.ts +++ b/ee/packages/license/src/validation/isBehaviorsInResult.ts @@ -1,4 +1,4 @@ -import type { BehaviorWithContext, LicenseBehavior } from '../definition/LicenseBehavior'; +import type { BehaviorWithContext, LicenseBehavior } from '@rocket.chat/core-typings'; export const isBehaviorsInResult = (result: BehaviorWithContext[], expectedBehaviors: LicenseBehavior[]) => result.some(({ behavior }) => expectedBehaviors.includes(behavior)); diff --git a/ee/packages/license/src/validation/logKind.ts b/ee/packages/license/src/validation/logKind.ts new file mode 100644 index 000000000000..cd2968d9e4b7 --- /dev/null +++ b/ee/packages/license/src/validation/logKind.ts @@ -0,0 +1,11 @@ +import type { LicenseBehavior } from '@rocket.chat/core-typings'; + +export const logKind = (behavior: LicenseBehavior) => { + switch (behavior) { + case 'prevent_installation': + case 'invalidate_license': + return 'error'; + default: + return 'info'; + } +}; diff --git a/ee/packages/license/src/validation/runValidation.ts b/ee/packages/license/src/validation/runValidation.ts index 922b4c49162e..52704b535ab3 100644 --- a/ee/packages/license/src/validation/runValidation.ts +++ b/ee/packages/license/src/validation/runValidation.ts @@ -1,6 +1,5 @@ -import type { ILicenseV3 } from '../definition/ILicenseV3'; -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { LicenseValidationOptions } from '../definition/LicenseValidationOptions'; +import type { ILicenseV3, BehaviorWithContext, LicenseValidationOptions } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; import { validateLicenseLimits } from './validateLicenseLimits'; import { validateLicensePeriods } from './validateLicensePeriods'; diff --git a/ee/packages/license/src/validation/validateDefaultLimits.ts b/ee/packages/license/src/validation/validateDefaultLimits.ts new file mode 100644 index 000000000000..4f48d4e7ebe4 --- /dev/null +++ b/ee/packages/license/src/validation/validateDefaultLimits.ts @@ -0,0 +1,27 @@ +import type { BehaviorWithContext, LicenseLimit, LicenseValidationOptions } from '@rocket.chat/core-typings'; + +import type { LicenseManager } from '../license'; +import { validateLimits } from './validateLimits'; + +export const defaultLimits: { + privateApps: LicenseLimit[]; + marketplaceApps: LicenseLimit[]; + // monthlyActiveContacts?: LicenseLimit[]; +} = { + privateApps: [ + { + behavior: 'prevent_action', + max: 3, + }, + ], + marketplaceApps: [ + { + behavior: 'prevent_action', + max: 5, + }, + ], +}; + +export async function validateDefaultLimits(this: LicenseManager, options: LicenseValidationOptions): Promise { + return validateLimits.call(this, defaultLimits, options); +} diff --git a/ee/packages/license/src/validation/validateLicenseLimits.spec.ts b/ee/packages/license/src/validation/validateLicenseLimits.spec.ts new file mode 100644 index 000000000000..3e863517cc94 --- /dev/null +++ b/ee/packages/license/src/validation/validateLicenseLimits.spec.ts @@ -0,0 +1,38 @@ +import { MockedLicenseBuilder, getReadyLicenseManager } from '../../__tests__/MockedLicenseBuilder'; + +describe('validateLicenseLimits', () => { + describe('limit max: -1', () => { + it('should return prevent_action when the limit is reached', async () => { + const licenseManager = await getReadyLicenseManager(); + + const license = await new MockedLicenseBuilder().withLimits('activeUsers', [ + { + max: -1, + behavior: 'prevent_action', + }, + ]); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 99999999); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(false); + }); + }); + describe('limit max: 0', () => { + it('should return prevent_action when the limit is reached', async () => { + const licenseManager = await getReadyLicenseManager(); + + const license = await new MockedLicenseBuilder().withLimits('activeUsers', [ + { + max: 0, + behavior: 'prevent_action', + }, + ]); + + await expect(licenseManager.setLicense(await license.sign())).resolves.toBe(true); + + licenseManager.setLicenseLimitCounter('activeUsers', () => 99999999); + await expect(licenseManager.shouldPreventAction('activeUsers')).resolves.toBe(true); + }); + }); +}); diff --git a/ee/packages/license/src/validation/validateLicenseLimits.ts b/ee/packages/license/src/validation/validateLicenseLimits.ts index f321252ba573..4ac916d16e69 100644 --- a/ee/packages/license/src/validation/validateLicenseLimits.ts +++ b/ee/packages/license/src/validation/validateLicenseLimits.ts @@ -1,11 +1,7 @@ -import type { ILicenseV3, LicenseLimitKind } from '../definition/ILicenseV3'; -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { LicenseValidationOptions } from '../definition/LicenseValidationOptions'; -import { isLimitAllowed, isBehaviorAllowed } from '../isItemAllowed'; +import type { ILicenseV3, BehaviorWithContext, LicenseValidationOptions } from '@rocket.chat/core-typings'; + import type { LicenseManager } from '../license'; -import { logger } from '../logger'; -import { getCurrentValueForLicenseLimit } from './getCurrentValueForLicenseLimit'; -import { getResultingBehavior } from './getResultingBehavior'; +import { validateLimits } from './validateLimits'; export async function validateLicenseLimits( this: LicenseManager, @@ -14,47 +10,5 @@ export async function validateLicenseLimits( ): Promise { const { limits } = license; - const limitKeys = (Object.keys(limits) as LicenseLimitKind[]).filter((limit) => isLimitAllowed(limit, options)); - return ( - await Promise.all( - limitKeys.map(async (limitKey) => { - // Filter the limit list before running any query in the database so we don't end up loading some value we won't use. - const limitList = limits[limitKey]?.filter(({ behavior, max }) => max >= 0 && isBehaviorAllowed(behavior, options)); - if (!limitList?.length) { - return []; - } - - const extraCount = options.context?.[limitKey]?.extraCount ?? 0; - const currentValue = (await getCurrentValueForLicenseLimit.call(this, limitKey, options.context?.[limitKey])) + extraCount; - - return limitList - .filter(({ max, behavior }) => { - switch (behavior) { - case 'invalidate_license': - case 'prevent_installation': - case 'disable_modules': - case 'start_fair_policy': - default: - return currentValue > max; - case 'prevent_action': - /** - * if we are validating the current count the limit should be equal or over the max, if we are validating the future count the limit should be over the max - */ - - return extraCount ? currentValue > max : currentValue >= max; - } - }) - .map((limit) => { - if (!options.suppressLog) { - logger.error({ - msg: 'Limit validation failed', - kind: limitKey, - limit, - }); - } - return getResultingBehavior(limit, { reason: 'limit', limit: limitKey }); - }); - }), - ) - ).flat(); + return validateLimits.call(this, limits, options); } diff --git a/ee/packages/license/src/validation/validateLicensePeriods.ts b/ee/packages/license/src/validation/validateLicensePeriods.ts index fb27f72d0a8e..4229d2435645 100644 --- a/ee/packages/license/src/validation/validateLicensePeriods.ts +++ b/ee/packages/license/src/validation/validateLicensePeriods.ts @@ -1,7 +1,5 @@ -import type { ILicenseV3 } from '../definition/ILicenseV3'; -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { Timestamp } from '../definition/LicensePeriod'; -import type { LicenseValidationOptions } from '../definition/LicenseValidationOptions'; +import type { ILicenseV3, BehaviorWithContext, Timestamp, LicenseValidationOptions } from '@rocket.chat/core-typings'; + import { isBehaviorAllowed } from '../isItemAllowed'; import { logger } from '../logger'; import { getResultingBehavior } from './getResultingBehavior'; diff --git a/ee/packages/license/src/validation/validateLicenseUrl.ts b/ee/packages/license/src/validation/validateLicenseUrl.ts index 416b107511cb..aeba5634a262 100644 --- a/ee/packages/license/src/validation/validateLicenseUrl.ts +++ b/ee/packages/license/src/validation/validateLicenseUrl.ts @@ -1,8 +1,7 @@ import crypto from 'crypto'; -import type { ILicenseV3 } from '../definition/ILicenseV3'; -import type { BehaviorWithContext } from '../definition/LicenseBehavior'; -import type { LicenseValidationOptions } from '../definition/LicenseValidationOptions'; +import type { ILicenseV3, BehaviorWithContext, LicenseValidationOptions } from '@rocket.chat/core-typings'; + import { isBehaviorAllowed } from '../isItemAllowed'; import type { LicenseManager } from '../license'; import { logger } from '../logger'; diff --git a/ee/packages/license/src/validation/validateLimit.ts b/ee/packages/license/src/validation/validateLimit.ts new file mode 100644 index 000000000000..be0e2d040005 --- /dev/null +++ b/ee/packages/license/src/validation/validateLimit.ts @@ -0,0 +1,62 @@ +import type { LicenseBehavior } from '@rocket.chat/core-typings'; + +/** + * The difference between validateLimit and validateWarnLimit is that the first one + * is used to trigger the client so for start_fair_policy we trigger as soon the limit is reached + * for the visual warning we trigger when the limit is reached + 1 + +/** + * Validates if the current value is over the limit + * @param max The maximum value allowed + * @param currentValue The current value + * @param behavior The behavior to be applied if the limit is reached + * @param extraCount The extra count to be added to the current value + * @returns + * - true if the limit is reached + * - false if the limit is not reached + */ +export function validateLimit(max: number, currentValue: number, behavior: LicenseBehavior, extraCount = 0) { + switch (behavior) { + case 'invalidate_license': + case 'prevent_installation': + case 'disable_modules': + default: + return currentValue > max; + case 'start_fair_policy': + return currentValue >= max; + case 'prevent_action': + /** + * if we are validating the current count the limit should be equal or over the max, if we are validating the future count the limit should be over the max + */ + + return extraCount ? currentValue > max : currentValue >= max; + } +} + +/** + * Validates if the current value is over the limit + * @param max The maximum value allowed + * @param currentValue The current value + * @param behavior The behavior to be applied if the limit is reached + * @param extraCount The extra count to be added to the current value + * @returns + * - true if the limit is reached + * - false if the limit is not reached + */ + +export function validateWarnLimit(max: number, currentValue: number, behavior: LicenseBehavior, extraCount = 0) { + switch (behavior) { + case 'invalidate_license': + case 'prevent_installation': + case 'disable_modules': + case 'start_fair_policy': + default: + return currentValue > max; + case 'prevent_action': + /** + * if we are validating the current count the limit should be equal or over the max, if we are validating the future count the limit should be over the max + */ + + return extraCount ? currentValue > max : currentValue >= max; + } +} diff --git a/ee/packages/license/src/validation/validateLimits.ts b/ee/packages/license/src/validation/validateLimits.ts new file mode 100644 index 000000000000..b3b42a024e6f --- /dev/null +++ b/ee/packages/license/src/validation/validateLimits.ts @@ -0,0 +1,55 @@ +import type { ILicenseV3, LicenseLimitKind, BehaviorWithContext, LicenseValidationOptions } from '@rocket.chat/core-typings'; + +import { isLimitAllowed, isBehaviorAllowed } from '../isItemAllowed'; +import type { LicenseManager } from '../license'; +import { logger } from '../logger'; +import { getCurrentValueForLicenseLimit } from './getCurrentValueForLicenseLimit'; +import { getResultingBehavior } from './getResultingBehavior'; +import { logKind } from './logKind'; +import { validateLimit } from './validateLimit'; + +export async function validateLimits( + this: LicenseManager, + limits: ILicenseV3['limits'], + options: LicenseValidationOptions, +): Promise { + const limitKeys = (Object.keys(limits) as LicenseLimitKind[]).filter((limit) => isLimitAllowed(limit, options)); + return ( + await Promise.all( + limitKeys.map(async (limitKey) => { + // Filter the limit list before running any query in the database so we don't end up loading some value we won't use. + const limitList = limits[limitKey]?.filter(({ behavior, max }) => max >= 0 && isBehaviorAllowed(behavior, options)); + if (!limitList?.length) { + return []; + } + + const extraCount = options.context?.[limitKey]?.extraCount ?? 0; + const currentValue = (await getCurrentValueForLicenseLimit.call(this, limitKey, options.context?.[limitKey])) + extraCount; + + return limitList + .filter(({ max, behavior }) => validateLimit(max, currentValue, behavior, extraCount)) + .map((limit) => { + if (!options.suppressLog) { + switch (logKind(limit.behavior)) { + case 'error': + logger.error({ + msg: 'Limit validation failed', + kind: limitKey, + limit, + }); + break; + case 'info': + logger.info({ + msg: 'Limit validation failed', + kind: limitKey, + limit, + }); + break; + } + } + return getResultingBehavior(limit, { reason: 'limit', limit: limitKey }); + }); + }), + ) + ).flat(); +} diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index 6e4556b12ef0..c3eb265253bd 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,382 @@ # @rocket.chat/omnichannel-services +## 0.1.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/pdf-worker@0.0.26 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/model-typings@0.2.2 +- @rocket.chat/models@0.0.26 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/pdf-worker@0.0.25 + - @rocket.chat/model-typings@0.2.1 + - @rocket.chat/models@0.0.25 + +## 0.1.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: feat: Disable and annonimize visitors instead of removing +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/model-typings@0.2.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/tools@0.2.0 + - @rocket.chat/pdf-worker@0.0.24 + - @rocket.chat/models@0.0.24 + +## 0.1.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/pdf-worker@0.0.24-rc.12 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/model-typings@0.2.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.1.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/pdf-worker@0.0.24-rc.11 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/model-typings@0.2.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.1.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/pdf-worker@0.0.24-rc.10 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/model-typings@0.2.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.1.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/pdf-worker@0.0.24-rc.9 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/model-typings@0.2.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.1.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/pdf-worker@0.0.24-rc.8 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/model-typings@0.2.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.1.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/pdf-worker@0.0.24-rc.7 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/model-typings@0.2.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.1.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/pdf-worker@0.0.24-rc.6 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/model-typings@0.2.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.1.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/pdf-worker@0.0.24-rc.5 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/model-typings@0.2.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.1.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/pdf-worker@0.0.24-rc.4 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/model-typings@0.2.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.1.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/pdf-worker@0.0.24-rc.3 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/model-typings@0.2.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.1.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/pdf-worker@0.0.24-rc.2 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/model-typings@0.2.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.1.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/pdf-worker@0.0.24-rc.1 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/model-typings@0.2.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/pdf-worker@0.0.21-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/model-typings@0.2.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/pdf-worker@0.0.21-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/model-typings@0.2.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/pdf-worker@0.0.21-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/model-typings@0.2.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/pdf-worker@0.0.21-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/model-typings@0.2.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/pdf-worker@0.0.21-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/model-typings@0.2.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.1.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/pdf-worker@0.0.21-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/model-typings@0.2.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.1.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/pdf-worker@0.0.21-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/model-typings@0.2.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.1.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: feat: Disable and annonimize visitors instead of removing +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [223dce18a3] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/model-typings@0.2.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/tools@0.2.0-rc.0 + - @rocket.chat/pdf-worker@0.0.21-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/pdf-worker@0.0.23 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/model-typings@0.1.8 +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/pdf-worker@0.0.22 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/model-typings@0.1.7 +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/pdf-worker@0.0.21 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/model-typings@0.1.6 +- @rocket.chat/models@0.0.21 + +## 0.0.20 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/pdf-worker@0.0.20 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/model-typings@0.1.5 +- @rocket.chat/models@0.0.20 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/pdf-worker@0.0.19 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/model-typings@0.1.4 +- @rocket.chat/models@0.0.19 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/pdf-worker@0.0.18 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/model-typings@0.1.3 +- @rocket.chat/models@0.0.18 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/pdf-worker@0.0.17 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/model-typings@0.1.2 +- @rocket.chat/models@0.0.17 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/pdf-worker@0.0.16 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/model-typings@0.1.1 +- @rocket.chat/models@0.0.16 + ## 0.0.15 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index e5875c054eef..e36e71e6c3ff 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,27 +1,27 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.0.15", + "version": "0.1.2", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "dependencies": { "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/logger": "workspace:^", "@rocket.chat/model-typings": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/pdf-worker": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/string-helpers": "next", + "@rocket.chat/string-helpers": "~0.31.25", "@rocket.chat/tools": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "eventemitter3": "^4.0.7", diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts index 0e135d5ed263..7f27e70ac8a5 100644 --- a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts @@ -8,7 +8,6 @@ import { QueueWorker as queueService, Translation as translationService, Settings as settingsService, - License as licenseService, } from '@rocket.chat/core-services'; import type { IOmnichannelTranscriptService } from '@rocket.chat/core-services'; import type { IMessage, IUser, IRoom, IUpload, ILivechatVisitor, ILivechatAgent } from '@rocket.chat/core-typings'; @@ -61,27 +60,11 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT currentJobNumber = 0; - shouldWork = false; - constructor(loggerClass: typeof Logger) { super(); this.worker = new PdfWorker('chat-transcript'); // eslint-disable-next-line new-cap this.log = new loggerClass('OmnichannelTranscript'); - - this.onEvent('license.module', ({ module, valid }) => { - if (module === 'scalability') { - this.shouldWork = valid; - } - }); - } - - async started(): Promise { - try { - this.shouldWork = await licenseService.hasModule('scalability'); - } catch (e: unknown) { - // ignore - } } async getTimezone(user?: { utcOffset?: string | number }): Promise { @@ -109,10 +92,6 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } async requestTranscript({ details }: { details: WorkDetails }): Promise { - if (!this.shouldWork) { - this.log.info(`Not requesting transcript for room ${details.rid} because scalability module is not enabled`); - return; - } this.log.info(`Requesting transcript for room ${details.rid} by user ${details.userId}`); const room = await LivechatRooms.findOneById(details.rid); if (!room) { @@ -286,10 +265,6 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } async workOnPdf({ details }: { details: WorkDetailsWithSource }): Promise { - if (!this.shouldWork) { - this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - Stopped (no scalability license found)`); - return; - } this.log.info(`Processing transcript for room ${details.rid} by user ${details.userId} - Received from queue`); if (this.maxNumberOfConcurrentJobs <= this.currentJobNumber) { this.log.error(`Processing transcript for room ${details.rid} by user ${details.userId} - Too many concurrent jobs, queuing again`); diff --git a/ee/packages/omnichannel-services/src/QueueWorker.ts b/ee/packages/omnichannel-services/src/QueueWorker.ts index bfb69362fac6..b217586d3a83 100644 --- a/ee/packages/omnichannel-services/src/QueueWorker.ts +++ b/ee/packages/omnichannel-services/src/QueueWorker.ts @@ -1,4 +1,4 @@ -import { ServiceClass, api, License } from '@rocket.chat/core-services'; +import { ServiceClass, api } from '@rocket.chat/core-services'; import type { IQueueWorkerService, HealthAggResult } from '@rocket.chat/core-services'; import type { Logger } from '@rocket.chat/logger'; import type { Actions, ValidResult, Work } from 'mongo-message-queue'; @@ -17,28 +17,12 @@ export class QueueWorker extends ServiceClass implements IQueueWorkerService { private logger: Logger; - private shouldWork = true; - constructor(private readonly db: Db, loggerClass: typeof Logger) { super(); // eslint-disable-next-line new-cap this.logger = new loggerClass('QueueWorker'); this.queue = new MessageQueue(); - - this.onEvent('license.module', ({ module, valid }) => { - if (module === 'scalability') { - this.shouldWork = valid; - } - }); - } - - async started(): Promise { - try { - this.shouldWork = await License.hasModule('scalability'); - } catch (e: unknown) { - // ignore - } } isServiceNotFoundMessage(message: string): boolean { @@ -132,11 +116,6 @@ export class QueueWorker extends ServiceClass implements IQueueWorkerService { // `to` is a service name that will be called, including namespace + action // This is a "generic" job that allows you to call any service async queueWork>(queue: Actions, to: string, data: T): Promise { - if (!this.shouldWork) { - this.logger.info('Queue worker is disabled, not queueing work'); - return; - } - this.logger.info(`Queueing work for ${to}`); if (!this.matchServiceCall(to)) { // We don't want to queue calls to invalid service names diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index 1da194044df7..1769d5ef9145 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,206 @@ # @rocket.chat/pdf-worker +## 0.0.26 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 + +## 0.0.25 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + +## 0.0.24 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + +## 0.0.24-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 + +## 0.0.24-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 + +## 0.0.24-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 + +## 0.0.24-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 + +## 0.0.24-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 + +## 0.0.24-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 + +## 0.0.24-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 + +## 0.0.24-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 + +## 0.0.24-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 + +## 0.0.24-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 + +## 0.0.24-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 + +## 0.0.24-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 + +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + +## 0.0.21-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 + +## 0.0.21-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 + +## 0.0.21-rc.0 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + +## 0.0.20 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 + ## 0.0.15 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index f4bd7c5b44f6..26da26d4d04e 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,22 +1,22 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.15", + "version": "0.0.26", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", "@storybook/react": "~6.5.16", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "~13.4.0", - "@types/emojione": "^2.2.6", - "@types/jest": "~29.5.3", - "@types/react-dom": "~17.0.20", - "@types/testing-library__jest-dom": "~5.14.6", + "@types/emojione": "^2.2.8", + "@types/jest": "~29.5.7", + "@types/react-dom": "~17.0.22", + "@types/testing-library__jest-dom": "~5.14.9", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "react-dom": "^18.2.0", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -32,10 +32,10 @@ "/dist" ], "dependencies": { - "@react-pdf/renderer": "^3.1.12", + "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/fuselage-tokens": "^0.32.0", - "@types/react": "~17.0.62", + "@rocket.chat/fuselage-tokens": "~0.32.0", + "@types/react": "~17.0.69", "emoji-assets": "^7.0.1", "emoji-toolkit": "^7.0.1", "moment": "^2.29.4", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index 4ee4d1a7df52..4e58e342beb0 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,282 @@ # @rocket.chat/presence +## 0.1.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/core-services@0.3.2 +- @rocket.chat/models@0.0.26 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/core-services@0.3.1 + - @rocket.chat/models@0.0.25 + +## 0.1.0 + +### Minor Changes + +- c38711b346: Add peak connections monitoring and methods to get and reset the counter +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/core-services@0.3.0 + - @rocket.chat/models@0.0.24 + +## 0.1.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/core-services@0.3.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.1.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/core-services@0.3.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.1.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/core-services@0.3.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.1.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/core-services@0.3.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.1.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/core-services@0.3.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.1.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/core-services@0.3.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.1.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/core-services@0.3.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.1.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/core-services@0.3.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.1.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/core-services@0.3.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.1.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/core-services@0.3.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.1.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/core-services@0.3.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.1.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/core-services@0.3.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.1.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/core-services@0.3.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.1.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/core-services@0.3.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.1.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/core-services@0.3.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.1.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/core-services@0.3.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.1.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/core-services@0.3.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.1.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/core-services@0.3.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.1.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/core-services@0.3.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.1.0-rc.0 + +### Minor Changes + +- c38711b346: Add peak connections monitoring and methods to get and reset the counter +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/core-services@0.3.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.0.23 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/core-services@0.2.8 +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/core-services@0.2.7 +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/core-services@0.2.6 +- @rocket.chat/models@0.0.21 + +## 0.0.20 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/core-services@0.2.5 +- @rocket.chat/models@0.0.20 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/core-services@0.2.4 +- @rocket.chat/models@0.0.19 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/core-services@0.2.3 +- @rocket.chat/models@0.0.18 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/core-services@0.2.2 +- @rocket.chat/models@0.0.17 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/core-services@0.2.1 +- @rocket.chat/models@0.0.16 + ## 0.0.15 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index da77719abc88..c1757ed1ef5c 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,19 +1,19 @@ { "name": "@rocket.chat/presence", - "version": "0.0.15", + "version": "0.1.2", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", - "@rocket.chat/apps-engine": "1.41.0-alpha.290", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", + "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@types/node": "^14.18.51", + "@types/node": "^14.18.63", "babel-jest": "^29.0.3", "eslint": "~8.45.0", - "jest": "~29.6.1", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint src", diff --git a/ee/packages/ui-theming/CHANGELOG.md b/ee/packages/ui-theming/CHANGELOG.md index 134f170ce82a..6501554003db 100644 --- a/ee/packages/ui-theming/CHANGELOG.md +++ b/ee/packages/ui-theming/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/ui-theming +## 0.1.1 + +### Patch Changes + +- 8e89b5a3b0: fix: light-theme font-disabled color + +## 0.1.1-rc.0 + +### Patch Changes + +- 8e89b5a3b0: fix: light-theme font-disabled color + ## 0.1.0 ### Minor Changes diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index 52b8062f332d..3410c74958fc 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -1,12 +1,12 @@ { "name": "@rocket.chat/ui-theming", - "version": "0.1.0", + "version": "0.1.1", "private": true, "devDependencies": { - "@rocket.chat/css-in-js": "next", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-hooks": "^0.32.1", - "@rocket.chat/icons": "^0.32.0", + "@rocket.chat/css-in-js": "~0.31.25", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/icons": "~0.32.0", "@rocket.chat/ui-contexts": "workspace:~", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", @@ -18,18 +18,18 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", "eslint": "~8.45.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-testing-library": "^5.11.0", - "jest": "~29.6.1", + "eslint-plugin-testing-library": "^5.11.1", + "jest": "~29.6.4", "react": "~17.0.2", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/ui-theming/src/PaletteStyleTag.tsx b/ee/packages/ui-theming/src/PaletteStyleTag.tsx index ce911ce4a122..62e31ef3d947 100644 --- a/ee/packages/ui-theming/src/PaletteStyleTag.tsx +++ b/ee/packages/ui-theming/src/PaletteStyleTag.tsx @@ -1,4 +1,4 @@ -import { memo } from 'react'; +import React, { memo } from 'react'; import { createPortal } from 'react-dom'; import { codeBlock } from './codeBlockStyles'; @@ -23,5 +23,5 @@ export const PaletteStyleTag = memo(function PaletteStyleTag() { }; const palette = convertToCss(getPalette(), '.rcx-content--main, .rcx-tile'); - return createPortal(theme === 'dark' ? palette + codeBlock : palette, useCreateStyleContainer('main-palette')); + return <>{createPortal(theme === 'dark' ? palette + codeBlock : palette, useCreateStyleContainer('main-palette'))}; }); diff --git a/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx b/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx index fd8cdba5022d..3b1ab5500960 100644 --- a/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx +++ b/ee/packages/ui-theming/src/SidebarPaletteStyleTag.tsx @@ -1,22 +1,13 @@ import type { ReactElement } from 'react'; -import { memo } from 'react'; +import React, { memo } from 'react'; import { createPortal } from 'react-dom'; import { convertToCss } from './helpers/convertToCss'; import { useCreateStyleContainer } from './hooks/useCreateStyleContainer'; import { darkPalette } from './paletteDark'; -import { defaultSidebarPalette } from './sidebarPalette'; export const SidebarPaletteStyleTag = memo(function SidebarPaletteStyleTag(): ReactElement | null { - // Commented code below: sidebar palette currently the same in both themes. + const palette = convertToCss({ ...darkPalette }, '.rcx-sidebar--main'); - // const [, , theme] = useThemeMode(); - // const palette = convertToCss( - // theme === 'dark' ? filterOnlyChangedColors(darkPalette, sidebarPaletteDark) : { ...darkPalette, ...defaultSidebarPalette }, - // '.rcx-sidebar--main', - // ); - - const palette = convertToCss({ ...darkPalette, ...defaultSidebarPalette }, '.rcx-sidebar--main'); - - return createPortal(palette, useCreateStyleContainer('sidebar-palette')); + return <>{createPortal(palette, useCreateStyleContainer('sidebar-palette'))}; }); diff --git a/ee/packages/ui-theming/src/palette.ts b/ee/packages/ui-theming/src/palette.ts index 5d207d63bc21..b2d9e9955dbf 100644 --- a/ee/packages/ui-theming/src/palette.ts +++ b/ee/packages/ui-theming/src/palette.ts @@ -29,6 +29,7 @@ export const palette = [ { name: 'surface-featured', token: '', color: '#5F1477' }, { name: 'surface-featured-hover', token: '', color: '#4A105D' }, { name: 'surface-overlay', token: '', color: 'rgba(47, 52, 61, 0.5)' }, + { name: 'surface-sidebar', token: 'N400', color: '#E4E7EA' }, ], }, { diff --git a/ee/packages/ui-theming/src/paletteDark.ts b/ee/packages/ui-theming/src/paletteDark.ts index 89ac7817be42..e36133650a6c 100644 --- a/ee/packages/ui-theming/src/paletteDark.ts +++ b/ee/packages/ui-theming/src/paletteDark.ts @@ -24,11 +24,12 @@ export const palette = [ { name: 'surface-neutral', token: '', color: '#2D3039' }, { name: 'surface-disabled', token: 'N800', color: '#24272E' }, { name: 'surface-hover', token: '', color: '#1A1E23' }, - { name: 'surface-selected', token: 'N700', color: '#3C3F44' }, + { name: 'surface-selected', token: '', color: '#4C5362' }, { name: 'surface-dark', token: 'N400', color: '#E4E7EA' }, { name: 'surface-featured', token: '', color: '#5F1477' }, { name: 'surface-featured-hover', token: '', color: '#4A105D' }, { name: 'surface-overlay', token: '', color: 'rgba(0, 0, 0, 0.6)' }, + { name: 'surface-sidebar', token: '', color: '#2F343D' }, ], }, { @@ -48,7 +49,7 @@ export const palette = [ { name: 'font-annotation', token: 'N600', color: '#9EA2A8' }, { name: 'font-hint', token: 'N600', color: '#9EA2A8' }, { name: 'font-secondary-info', token: '', color: '#9EA2A8' }, - { name: 'font-default', token: 'N400', color: '#E4E7EA' }, + { name: 'font-default', token: 'N400', color: '#C1C7D0' }, { name: 'font-titles-labels', token: '', color: '#F2F3F5' }, { name: 'font-info', token: '', color: '#739EDE' }, { name: 'font-danger', token: '', color: '#D88892' }, @@ -89,7 +90,7 @@ export const palette = [ list: [ { name: 'badge-background-level-0', token: '', color: '#404754' }, { name: 'badge-background-level-1', token: '', color: '#484C51' }, - { name: 'badge-background-level-2', token: '', color: '#3070CF' }, + { name: 'badge-background-level-2', token: '', color: '#2C65BA' }, { name: 'badge-background-level-3', token: '', color: '#A9642D' }, { name: 'badge-background-level-4', token: '', color: '#BB3E4E' }, ], diff --git a/ee/packages/ui-theming/src/paletteHighContrast.ts b/ee/packages/ui-theming/src/paletteHighContrast.ts index 2cb876103a1d..1ec7bcf793de 100644 --- a/ee/packages/ui-theming/src/paletteHighContrast.ts +++ b/ee/packages/ui-theming/src/paletteHighContrast.ts @@ -29,6 +29,7 @@ export const palette = [ { name: 'surface-featured', token: '', color: '#5F1477' }, { name: 'surface-featured-hover', token: '', color: '#4A105D' }, { name: 'surface-overlay', token: '', color: 'rgba(47, 52, 61, 0.5)' }, + { name: 'surface-sidebar', token: 'N400', color: '#E4E7EA' }, ], }, { diff --git a/ee/packages/ui-theming/src/sidebarPalette.ts b/ee/packages/ui-theming/src/sidebarPalette.ts deleted file mode 100644 index 9512af1e467c..000000000000 --- a/ee/packages/ui-theming/src/sidebarPalette.ts +++ /dev/null @@ -1,86 +0,0 @@ -export const palette = [ - { - category: 'Surface', - description: 'Use as a container on top of the background', - list: [ - { name: 'surface-tint', token: '', color: '#262931' }, - { name: 'surface-hover', token: '', color: '#1B1D22' }, - { name: 'surface-selected', token: 'N900', color: '#31363F' }, - ], - }, - { - category: 'Font', - description: 'These should be applied according to surfaces', - list: [ - { name: 'font-titles-labels', token: '', color: '#E4E7EA' }, - { name: 'font-default', token: '', color: '#9EA2A8' }, - ], - }, - { - category: 'Status Bullet', - description: 'Used to show user status', - list: [ - { name: 'status-bullet-online', token: '', color: '#1CBF89' }, - { name: 'status-bullet-away', token: '', color: '#B08C30' }, - { name: 'status-bullet-busy', token: '', color: '#C75765' }, - { name: 'status-bullet-disabled', token: '', color: '#CC7F42' }, - { name: 'status-bullet-offline', token: '', color: '#8B9098' }, - { name: 'status-bullet-loading', token: '', color: '#8B9098' }, - ], - }, - { - category: 'Badge', - description: 'Badge Background', - list: [ - { name: 'badge-background-level-0', token: '', color: '#404754' }, - { name: 'badge-background-level-1', token: '', color: '#484C51' }, - { name: 'badge-background-level-2', token: '', color: '#2C65BA' }, - { name: 'badge-background-level-3', token: '', color: '#955828' }, - { name: 'badge-background-level-4', token: '', color: '#B43C4C' }, - ], - }, - { - category: 'Stroke', - description: "Use as component's outline, stroke, dividers", - list: [ - { name: 'stroke-light', token: '', color: '#333842' }, - { name: 'stroke-medium', token: '', color: '#324677' }, - ], - }, - { - category: 'Button', - description: 'Secondary Background', - list: [ - { name: 'button-background-secondary-default', token: '', color: '#0D0F11' }, - { name: 'button-background-secondary-hover', token: '', color: '#3A404B' }, - { name: 'button-background-secondary-press', token: '', color: '#4C5362' }, - { name: 'button-background-secondary-focus', token: '', color: '#0D0F11' }, - { name: 'button-background-secondary-keyfocus', token: '', color: '#2F343D' }, - { name: 'button-background-secondary-disabled', token: '', color: '#2F343D' }, - ], - }, - { - description: 'Font', - list: [ - { name: 'button-font-on-secondary', token: '', color: '#E4E7EA' }, - { name: 'button-font-on-secondary-disabled', token: '', color: '#6C727A' }, - { name: 'button-icon-disabled-color', token: '', color: '#6C727A' }, - ], - }, -]; - -export const defaultSidebarPalette = { - ...palette.reduce( - (rec, group) => ({ - ...rec, - ...group.list.reduce( - (rec, item) => ({ - ...rec, - [item.name]: item.color, - }), - {} as Record, - ), - }), - {} as Record, - ), -}; diff --git a/ee/packages/ui-theming/src/sidebarPaletteDark.ts b/ee/packages/ui-theming/src/sidebarPaletteDark.ts deleted file mode 100644 index 2b7801f118fb..000000000000 --- a/ee/packages/ui-theming/src/sidebarPaletteDark.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { darkPalette } from './paletteDark'; - -export const palette = [ - { - category: 'Surface', - description: 'Use as a container on top of the background', - list: [ - { name: 'surface-tint', token: '', color: '#262931' }, - { name: 'surface-hover', token: '', color: '#1B1D22' }, - { name: 'surface-selected', token: 'N900', color: '#31363F' }, - ], - }, - { - category: 'Font', - description: 'These should be applied according to surfaces', - list: [ - { name: 'font-titles-labels', token: '', color: '#E4E7EA' }, - { name: 'font-default', token: '', color: '#9EA2A8' }, - ], - }, - { - category: 'Status Bullet', - description: 'Used to show user status', - list: [ - { name: 'status-bullet-online', token: '', color: '#1CBF89' }, - { name: 'status-bullet-away', token: '', color: '#B08C30' }, - { name: 'status-bullet-busy', token: '', color: '#C75765' }, - { name: 'status-bullet-disabled', token: '', color: '#CC7F42' }, - { name: 'status-bullet-offline', token: '', color: '#8B9098' }, - { name: 'status-bullet-loading', token: '', color: '#8B9098' }, - ], - }, - { - category: 'Badge', - description: 'Badge Background', - list: [ - { name: 'badge-background-level-0', token: '', color: '#404754' }, - { name: 'badge-background-level-1', token: '', color: '#484C51' }, - { name: 'badge-background-level-2', token: '', color: '#2C65BA' }, - { name: 'badge-background-level-3', token: '', color: '#955828' }, - { name: 'badge-background-level-4', token: '', color: '#B43C4C' }, - ], - }, - { - category: 'Stroke', - description: "Use as component's outline, stroke, dividers", - list: [ - { name: 'stroke-light', token: '', color: '#333842' }, - { name: 'stroke-medium', token: '', color: '#324677' }, - ], - }, - { - category: 'Button', - description: 'Secondary Background', - list: [ - { name: 'button-background-secondary-default', token: '', color: '#0D0F11' }, - { name: 'button-background-secondary-hover', token: '', color: '#3A404B' }, - { name: 'button-background-secondary-press', token: '', color: '#4C5362' }, - { name: 'button-background-secondary-focus', token: '', color: '#0D0F11' }, - { name: 'button-background-secondary-keyfocus', token: '', color: '#2F343D' }, - { name: 'button-background-secondary-disabled', token: '', color: '#2F343D' }, - ], - }, - { - description: 'Font', - list: [ - { name: 'button-font-on-secondary', token: '', color: '#E4E7EA' }, - { name: 'button-font-on-secondary-disabled', token: '', color: '#6C727A' }, - { name: 'button-icon-disabled-color', token: '', color: '#6C727A' }, - ], - }, -]; - -export const sidebarPaletteDark = { - ...palette.reduce( - (rec, group) => ({ - ...rec, - ...group.list.reduce( - (rec, item) => ({ - ...rec, - [item.name]: item.color, - }), - {} as Record, - ), - }), - { ...darkPalette } as Record, - ), -}; diff --git a/package.json b/package.json index 236a551c5e5e..b6e3ba26cc0f 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,10 @@ { "name": "rocket.chat", - "version": "6.5.0-develop", + "version": "6.6.0-develop", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, "scripts": { - "postinstall": "husky install", "build": "turbo run build", "build:services": "turbo run build --filter=rocketchat-services...", "build:ci": "turbo run build:ci", @@ -17,11 +16,10 @@ "fuselage": "./fuselage.sh" }, "devDependencies": { - "@changesets/cli": "^2.26.1", - "@types/chart.js": "^2.9.37", - "@types/js-yaml": "^4.0.5", - "husky": "^7.0.4", - "turbo": "~1.10.15" + "@changesets/cli": "^2.26.2", + "@types/chart.js": "^2.9.39", + "@types/js-yaml": "^4.0.8", + "turbo": "~1.10.16" }, "workspaces": [ "apps/*", @@ -41,17 +39,16 @@ }, "homepage": "https://github.com/RocketChat/Rocket.Chat#readme", "engines": { - "yarn": "3.2.2", + "yarn": "3.5.0", "node": "14.21.3", "npm": "Use yarn instead" }, - "packageManager": "yarn@3.2.2", + "packageManager": "yarn@3.5.0", "houston": { "minTag": "0.55.0-rc.0", "updateFiles": [ "package.json", "apps/meteor/package.json", - "apps/meteor/.docker/Dockerfile.rhel", "apps/meteor/app/utils/rocketchat.info" ] }, @@ -64,6 +61,12 @@ "adm-zip": "0.5.9", "preact@10.15.1": "patch:preact@npm:10.15.1#.yarn/patches/preact-npm-10.15.1-bd458de913.patch", "@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0": "patch:@storybook/react-docgen-typescript-plugin@npm%3A1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0#./.yarn/patches/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40.patch", - "mongodb@^4.17.1": "patch:mongodb@npm:4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch" + "mongodb@^4.17.1": "patch:mongodb@npm:4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch", + "@rocket.chat/forked-matrix-sdk-crypto-nodejs": "0.1.0-beta.13", + "typia@5.3.3": "patch:typia@npm:5.3.3#.yarn/patches/typia-npm-5.3.3-21d3e18463.patch", + "typia@~5.3.3": "patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch" + }, + "dependencies": { + "node-gyp": "^9.4.1" } } diff --git a/packages/account-utils/package.json b/packages/account-utils/package.json index 23423d568acc..35a4f2f3e84c 100644 --- a/packages/account-utils/package.json +++ b/packages/account-utils/package.json @@ -3,11 +3,11 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/agenda/package.json b/packages/agenda/package.json index f533e05dba28..5c2c636bf805 100644 --- a/packages/agenda/package.json +++ b/packages/agenda/package.json @@ -12,12 +12,12 @@ "mongodb": "^4.17.1" }, "devDependencies": { - "@types/debug": "^4.1.8", - "@types/jest": "~29.5.3", + "@types/debug": "^4.1.10", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/base64/package.json b/packages/base64/package.json index 36e4d0da04af..9641abe483d5 100644 --- a/packages/base64/package.json +++ b/packages/base64/package.json @@ -13,15 +13,15 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "volta": { "extends": "../../package.json" diff --git a/packages/cas-validate/package.json b/packages/cas-validate/package.json index ea7e05a1ba16..7269b082c420 100644 --- a/packages/cas-validate/package.json +++ b/packages/cas-validate/package.json @@ -4,11 +4,11 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index 940c05513ec1..d5983c60ebf9 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,287 @@ # @rocket.chat/core-services +## 0.3.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/models@0.0.26 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/models@0.0.25 + +## 0.3.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/models@0.0.24 + +## 0.3.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.3.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.3.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.3.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.3.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.3.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.3.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.3.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.3.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.3.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.3.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.3.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.3.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.3.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.3.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.3.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.3.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.3.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.3.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.3.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.2.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/models@0.0.23 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/models@0.0.22 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/models@0.0.21 + +## 0.2.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/models@0.0.20 + +## 0.2.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/models@0.0.19 + +## 0.2.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/models@0.0.18 + +## 0.2.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/models@0.0.17 + +## 0.2.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/models@0.0.16 + ## 0.2.0 ### Minor Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 7f6a82642d47..1149443d2dc8 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,21 +1,21 @@ { "name": "@rocket.chat/core-services", - "version": "0.2.0", + "version": "0.3.2", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/eslint-config": "workspace:^", - "@types/babel__core": "^7", - "@types/babel__preset-env": "^7", - "@types/jest": "~29.5.3", + "@types/babel__core": "^7.20.3", + "@types/babel__preset-env": "^7.9.4", + "@types/jest": "~29.5.7", "babel-jest": "^29.5.0", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", "prettier": "~2.8.8", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -34,14 +34,14 @@ "extends": "../../package.json" }, "dependencies": { - "@rocket.chat/apps-engine": "1.41.0-alpha.290", + "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/icons": "^0.32.0", - "@rocket.chat/message-parser": "next", + "@rocket.chat/icons": "~0.32.0", + "@rocket.chat/message-parser": "~0.31.27", "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", - "@rocket.chat/ui-kit": "^0.32.1", - "@types/fibers": "^3.1.1", + "@rocket.chat/ui-kit": "workspace:~", + "@types/fibers": "^3.1.3", "fibers": "^5.0.3" } } diff --git a/packages/core-services/src/LocalBroker.ts b/packages/core-services/src/LocalBroker.ts index dc27e62a5acb..47f4aaba3c80 100644 --- a/packages/core-services/src/LocalBroker.ts +++ b/packages/core-services/src/LocalBroker.ts @@ -3,11 +3,13 @@ import { EventEmitter } from 'events'; import { InstanceStatus } from '@rocket.chat/models'; import { asyncLocalStorage } from '.'; -import type { EventSignatures } from './Events'; +import type { EventSignatures } from './events/Events'; import type { IBroker, IBrokerNode } from './types/IBroker'; import type { ServiceClass, IServiceClass } from './types/ServiceClass'; export class LocalBroker implements IBroker { + private started = false; + private methods = new Map any>(); private events = new EventEmitter(); @@ -73,6 +75,9 @@ export class LocalBroker implements IBroker { this.methods.set(`${namespace}.${method}`, i[method].bind(i)); } + if (this.started) { + void instance.started(); + } } onBroadcast(callback: (eventName: string, args: unknown[]) => void): void { @@ -106,5 +111,6 @@ export class LocalBroker implements IBroker { async start(): Promise { await Promise.all([...this.services].map((service) => service.started())); + this.started = true; } } diff --git a/packages/core-services/src/Events.ts b/packages/core-services/src/events/Events.ts similarity index 90% rename from packages/core-services/src/Events.ts rename to packages/core-services/src/events/Events.ts index c5f36d921655..6315bf43fa13 100644 --- a/packages/core-services/src/Events.ts +++ b/packages/core-services/src/events/Events.ts @@ -32,14 +32,27 @@ import type { ILivechatAgent, IBanner, ILivechatVisitor, - UiKit, + LicenseLimitKind, } from '@rocket.chat/core-typings'; -import type { LicenseLimitKind } from '@rocket.chat/license'; +import type * as UiKit from '@rocket.chat/ui-kit'; -import type { AutoUpdateRecord } from './types/IMeteor'; +import type { AutoUpdateRecord } from '../types/IMeteor'; type ClientAction = 'inserted' | 'updated' | 'removed' | 'changed'; +type LoginServiceConfigurationEvent = { + id: string; +} & ( + | { + clientAction: 'removed'; + data?: never; + } + | { + clientAction: Omit; + data: Partial; + } +); + export type EventSignatures = { 'room.video-conference': (params: { rid: string; callId: string }) => void; 'shutdown': (params: Record) => void; @@ -88,11 +101,15 @@ export type EventSignatures = { ignoreDiscussion: boolean; ts: Record; users: string[]; + ids?: string[]; // message ids have priority over ts + showDeletedStatus?: boolean; }, ): void; 'notify.deleteCustomSound'(data: { soundData: ICustomSound }): void; 'notify.updateCustomSound'(data: { soundData: ICustomSound }): void; 'notify.calendar'(uid: string, data: ICalendarNotification): void; + 'notify.messagesRead'(data: { rid: string; until: Date; tmid?: string }): void; + 'notify.importedMessages'(data: { roomIds: string[] }): void; 'permission.changed'(data: { clientAction: ClientAction; data: any }): void; 'room'(data: { action: string; room: Partial }): void; 'room.avatarUpdate'(room: Pick): void; @@ -100,7 +117,17 @@ export type EventSignatures = { 'stream'([streamer, eventName, payload]: [string, string, any[]]): void; 'subscription'(data: { action: string; subscription: Partial }): void; 'user.avatarUpdate'(user: Partial): void; - 'user.deleted'(user: Pick): void; + 'user.deleted'( + user: Pick, + data: + | { + messageErasureType: 'Delete'; + } + | { + messageErasureType: 'Unlink'; + replaceByUser: { _id: IUser['_id']; username: IUser['username']; alias: string }; + }, + ): void; 'user.deleteCustomStatus'(userStatus: IUserStatus): void; 'user.nameChanged'(user: Pick): void; 'user.realNameChanged'(user: Partial): void; @@ -221,7 +248,7 @@ export type EventSignatures = { } ), ): void; - 'watch.loginServiceConfiguration'(data: { clientAction: ClientAction; data: Partial; id: string }): void; + 'watch.loginServiceConfiguration'(data: LoginServiceConfigurationEvent): void; 'watch.instanceStatus'(data: { clientAction: ClientAction; data?: undefined | Partial; @@ -273,4 +300,5 @@ export type EventSignatures = { 'command.updated'(command: string): void; 'command.removed'(command: string): void; 'actions.changed'(): void; + 'message.sent'(message: IMessage): void; }; diff --git a/packages/core-services/src/events/listeners.ts b/packages/core-services/src/events/listeners.ts new file mode 100644 index 000000000000..ced986cb6f30 --- /dev/null +++ b/packages/core-services/src/events/listeners.ts @@ -0,0 +1,12 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +import type { IServiceClass } from '../types/ServiceClass'; + +export const dbWatchersDisabled = ['yes', 'true'].includes(String(process.env.DISABLE_DB_WATCHERS).toLowerCase()); + +export const listenToMessageSentEvent = (service: IServiceClass, action: (message: IMessage) => Promise): void => { + if (dbWatchersDisabled) { + return service.onEvent('message.sent', (message: IMessage) => action(message)); + } + return service.onEvent('watch.messages', ({ message }) => action(message)); +}; diff --git a/packages/core-services/src/index.ts b/packages/core-services/src/index.ts index d3cc778e5a22..e84ecb9da9e1 100644 --- a/packages/core-services/src/index.ts +++ b/packages/core-services/src/index.ts @@ -1,6 +1,7 @@ import { proxify, proxifyWithWait } from './lib/proxify'; import type { IAccount, ILoginResult } from './types/IAccount'; import type { IAnalyticsService } from './types/IAnalyticsService'; +import { IApiService } from './types/IApiService'; import type { IAppsEngineService } from './types/IAppsEngineService'; import type { IAuthorization, RoomAccessValidator } from './types/IAuthorization'; import type { IAuthorizationLivechat } from './types/IAuthorizationLivechat'; @@ -18,6 +19,7 @@ import type { IMessageReadsService } from './types/IMessageReadsService'; import type { IMessageService } from './types/IMessageService'; import type { IMeteor, AutoUpdateRecord } from './types/IMeteor'; import type { INPSService, NPSCreatePayload, NPSVotePayload } from './types/INPSService'; +import type { IOmnichannelAnalyticsService } from './types/IOmnichannelAnalyticsService'; import type { IOmnichannelEEService } from './types/IOmnichannelEEService'; import type { IOmnichannelIntegrationService } from './types/IOmnichannelIntegrationService'; import type { IOmnichannelService } from './types/IOmnichannelService'; @@ -49,7 +51,8 @@ import type { IVoipService } from './types/IVoipService'; export { asyncLocalStorage } from './lib/asyncLocalStorage'; export { MeteorError, isMeteorError } from './MeteorError'; export { api } from './api'; -export { EventSignatures } from './Events'; +export { EventSignatures } from './events/Events'; +export { listenToMessageSentEvent, dbWatchersDisabled } from './events/listeners'; export { LocalBroker } from './LocalBroker'; export { IBroker, IBrokerNode, BaseMetricOptions, IServiceMetrics } from './types/IBroker'; @@ -58,11 +61,21 @@ export { IServiceContext, ServiceClass, IServiceClass, ServiceClassInternal } fr export { IFederationService, IFederationServiceEE, IFederationJoinExternalPublicRoomInput } from './types/IFederationService'; +export { + ConversationData, + AgentOverviewDataOptions, + ChartDataOptions, + AnalyticsOverviewDataOptions, + ChartDataResult, + AnalyticsOverviewDataResult, +} from './types/IOmnichannelAnalyticsService'; + export { AutoUpdateRecord, FindVoipRoomsParams, IAccount, IAnalyticsService, + IApiService, IAppsEngineService, IAuthorization, IAuthorizationLivechat, @@ -121,6 +134,7 @@ export { IOmnichannelEEService, IOmnichannelIntegrationService, IImportService, + IOmnichannelAnalyticsService, }; // TODO think in a way to not have to pass the service name to proxify here as well @@ -157,6 +171,7 @@ export const FederationEE = proxifyWithWait('federation-en export const Omnichannel = proxifyWithWait('omnichannel'); export const OmnichannelEEService = proxifyWithWait('omnichannel-ee'); export const Import = proxifyWithWait('import'); +export const OmnichannelAnalytics = proxifyWithWait('omnichannel-analytics'); // Calls without wait. Means that the service is optional and the result may be an error // of service/method not available diff --git a/packages/core-services/src/lib/Api.ts b/packages/core-services/src/lib/Api.ts index f0b5e67594c2..61a58301a0cc 100644 --- a/packages/core-services/src/lib/Api.ts +++ b/packages/core-services/src/lib/Api.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IApiService } from '../types/IApiService'; import type { IBroker, IBrokerNode } from '../types/IBroker'; import type { IServiceClass } from '../types/ServiceClass'; diff --git a/packages/core-services/src/types/IApiService.ts b/packages/core-services/src/types/IApiService.ts index 9361eb6fce9d..ef88d57713bc 100644 --- a/packages/core-services/src/types/IApiService.ts +++ b/packages/core-services/src/types/IApiService.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IBroker, IBrokerNode } from './IBroker'; import type { IServiceClass } from './ServiceClass'; diff --git a/packages/core-services/src/types/IBroker.ts b/packages/core-services/src/types/IBroker.ts index 4bd48afef0ff..cd1e0a3ded19 100644 --- a/packages/core-services/src/types/IBroker.ts +++ b/packages/core-services/src/types/IBroker.ts @@ -1,4 +1,4 @@ -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import type { IServiceClass } from './ServiceClass'; export interface IBrokerNode { diff --git a/packages/core-services/src/types/IOmnichannelAnalyticsService.ts b/packages/core-services/src/types/IOmnichannelAnalyticsService.ts new file mode 100644 index 000000000000..a4c89792d6e6 --- /dev/null +++ b/packages/core-services/src/types/IOmnichannelAnalyticsService.ts @@ -0,0 +1,60 @@ +import type { IServiceClass } from './ServiceClass'; + +export type ConversationData = { + head: { name: string }[]; + data: { name: string; value: string }[]; +}; + +export type AgentOverviewDataOptions = { + departmentId?: string; + utcOffset?: number; + daterange?: { + from: string; + to: string; + }; + chartOptions: { + name: string; + }; +}; + +export type ChartDataOptions = { + departmentId?: string; + utcOffset?: number; + daterange?: { + from: string; + to: string; + }; + chartOptions: { + name: string; + }; +}; + +export type AnalyticsOverviewDataOptions = { + departmentId?: string; + utcOffset?: number; + language: string; + daterange?: { + from: string; + to: string; + }; + analyticsOptions: { + name: string; + }; +}; + +export type ChartDataResult = { + chartLabel: string; + dataLabels: string[]; + dataPoints: number[]; +}; + +export type AnalyticsOverviewDataResult = { + title: string; + value: any; +}; + +export interface IOmnichannelAnalyticsService extends IServiceClass { + getAgentOverviewData(options: AgentOverviewDataOptions): Promise; + getAnalyticsChartData(options: ChartDataOptions): Promise; + getAnalyticsOverviewData(options: AnalyticsOverviewDataOptions): Promise; +} diff --git a/packages/core-services/src/types/IOmnichannelEEService.ts b/packages/core-services/src/types/IOmnichannelEEService.ts index 8c8a4b75db1d..78d2666858fd 100644 --- a/packages/core-services/src/types/IOmnichannelEEService.ts +++ b/packages/core-services/src/types/IOmnichannelEEService.ts @@ -4,13 +4,13 @@ import type { IServiceClass } from './ServiceClass'; export interface IOmnichannelEEService extends IServiceClass { placeRoomOnHold( - room: Pick, + room: Pick, comment: string, onHoldBy: Pick, ): Promise; resumeRoomOnHold( - room: Pick, + room: Pick, comment: string, resumeBy: Pick, clientAction?: boolean, diff --git a/packages/core-services/src/types/IOmnichannelService.ts b/packages/core-services/src/types/IOmnichannelService.ts index fb3cc60d9243..73006641c8cd 100644 --- a/packages/core-services/src/types/IOmnichannelService.ts +++ b/packages/core-services/src/types/IOmnichannelService.ts @@ -1,7 +1,8 @@ -import type { IOmnichannelQueue } from '@rocket.chat/core-typings'; +import type { AtLeast, IOmnichannelQueue, IOmnichannelRoom } from '@rocket.chat/core-typings'; import type { IServiceClass } from './ServiceClass'; export interface IOmnichannelService extends IServiceClass { getQueueWorker(): IOmnichannelQueue; + isWithinMACLimit(_room: AtLeast): Promise; } diff --git a/packages/core-services/src/types/IUiKitCoreApp.ts b/packages/core-services/src/types/IUiKitCoreApp.ts index 98799918e594..5ba521b73642 100644 --- a/packages/core-services/src/types/IUiKitCoreApp.ts +++ b/packages/core-services/src/types/IUiKitCoreApp.ts @@ -2,6 +2,7 @@ import type { IUser } from '@rocket.chat/core-typings'; import type { IServiceClass } from './ServiceClass'; +// TODO: Fix this type to match `UiKit.UserInteraction` from `@rocket.chat/core-typings` export type UiKitCoreAppPayload = { appId: string; type: 'blockAction' | 'viewClosed' | 'viewSubmit'; diff --git a/packages/core-services/src/types/IVideoConfService.ts b/packages/core-services/src/types/IVideoConfService.ts index 09e336a51623..6491787c2b55 100644 --- a/packages/core-services/src/types/IVideoConfService.ts +++ b/packages/core-services/src/types/IVideoConfService.ts @@ -2,13 +2,13 @@ import type { IRoom, IStats, IUser, - UiKit, VideoConference, VideoConferenceCapabilities, VideoConferenceCreateData, VideoConferenceInstructions, } from '@rocket.chat/core-typings'; import type { PaginatedResult } from '@rocket.chat/rest-typings'; +import type * as UiKit from '@rocket.chat/ui-kit'; export type VideoConferenceJoinOptions = { mic?: boolean; diff --git a/packages/core-services/src/types/ServiceClass.ts b/packages/core-services/src/types/ServiceClass.ts index 47f23e757a1b..5e6b202a103d 100644 --- a/packages/core-services/src/types/ServiceClass.ts +++ b/packages/core-services/src/types/ServiceClass.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -import type { EventSignatures } from '../Events'; +import type { EventSignatures } from '../events/Events'; import { asyncLocalStorage } from '../lib/asyncLocalStorage'; import type { IApiService } from './IApiService'; import type { IBroker, IBrokerNode } from './IBroker'; diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index f6c174da450f..2d17f87863ec 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,123 @@ # @rocket.chat/core-typings +## 6.5.2 + +## 6.5.1 + +### Patch Changes + +- c2b224fd82: Exceeding API calls when sending OTR messages + +## 6.5.0 + +### Minor Changes + +- c0ef13a0bf: Added `push` statistic, containing three bits. Each bit represents a boolean: + ``` + 1 1 1 + | | | + | | +- push enabled = 0b1 = 1 + | +--- push gateway enabled = 0b10 = 2 + +----- push gateway changed = 0b100 = 4 + ``` +- 92613680b7: Added option to select between two script engine options for the integrations +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: chore: Calculate & Store MAC stats + Added new info to the stats: `omnichannelContactsBySource`, `uniqueContactsOfLastMonth`, `uniqueContactsOfLastWeek`, `uniqueContactsOfYesterday` +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- dea1fe9191: feat: Disable and annonimize visitors instead of removing + +## 6.5.0-rc.19 + +## 6.5.0-rc.18 + +## 6.5.0-rc.17 + +## 6.5.0-rc.16 + +## 6.5.0-rc.15 + +## 6.5.0-rc.14 + +## 6.5.0-rc.13 + +## 6.5.0-rc.12 + +## 6.5.0-rc.11 + +## 6.5.0-rc.10 + +## 6.5.0-rc.9 + +## 6.5.0-rc.8 + +## 6.5.0-rc.7 + +## 6.5.0-rc.6 + +## 6.5.0-rc.5 + +## 6.5.0-rc.4 + +## 6.5.0-rc.3 + +## 6.5.0-rc.2 + +## 6.5.0-rc.1 + +## 6.5.0-rc.0 + +### Minor Changes + +- c0ef13a0bf: Added `push` statistic, containing three bits. Each bit represents a boolean: + ``` + 1 1 1 + | | | + | | +- push enabled = 0b1 = 1 + | +--- push gateway enabled = 0b10 = 2 + +----- push gateway changed = 0b100 = 4 + ``` +- 92613680b7: Added option to select between two script engine options for the integrations +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: chore: Calculate & Store MAC stats + Added new info to the stats: `omnichannelContactsBySource`, `uniqueContactsOfLastMonth`, `uniqueContactsOfLastWeek`, `uniqueContactsOfYesterday` +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- dea1fe9191: feat: Disable and annonimize visitors instead of removing + +## 6.4.8 + +## 6.4.7 + +## 6.4.6 + +## 6.4.5 + +## 6.4.4 + +## 6.4.3 + +## 6.4.2 + +## 6.4.1 + ## 6.4.0 ### Minor Changes diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 60874e11c810..7df9d5e0eb69 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,13 +1,13 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.4.0", + "version": "6.6.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", "mongodb": "^4.17.1", "prettier": "~2.8.8", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -22,10 +22,10 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "1.41.0-alpha.290", - "@rocket.chat/icons": "^0.32.0", - "@rocket.chat/message-parser": "next", - "@rocket.chat/ui-kit": "^0.32.1" + "@rocket.chat/apps-engine": "1.41.0", + "@rocket.chat/icons": "~0.32.0", + "@rocket.chat/message-parser": "~0.31.27", + "@rocket.chat/ui-kit": "workspace:~" }, "volta": { "extends": "../../package.json" diff --git a/packages/core-typings/src/IBanner.ts b/packages/core-typings/src/IBanner.ts index 275c3353aa1f..052e34249243 100644 --- a/packages/core-typings/src/IBanner.ts +++ b/packages/core-typings/src/IBanner.ts @@ -1,15 +1,24 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + import type { IRocketChatRecord } from './IRocketChatRecord'; import type { IUser } from './IUser'; -import type * as UiKit from './uikit'; export enum BannerPlatform { Web = 'web', Mobile = 'mobile', } + +type Dictionary = { + [lng: string]: { + [key: string]: string; + }; +}; + export interface IBanner extends IRocketChatRecord { platform: BannerPlatform[]; // pĺatforms a banner could be shown expireAt: Date; // date when banner should not be shown anymore startAt: Date; // start date a banner should be presented + /** @deprecated a new `selector` field should be created for filtering instead */ roles?: string[]; // only show the banner to this roles createdBy: Pick; createdAt: Date; @@ -17,6 +26,9 @@ export interface IBanner extends IRocketChatRecord { active?: boolean; inactivedAt?: Date; snapshot?: string; + + dictionary?: Dictionary; + surface: 'banner' | 'modal'; } export type InactiveBanner = IBanner & { diff --git a/packages/core-typings/src/ICustomOAuthConfig.ts b/packages/core-typings/src/ICustomOAuthConfig.ts index dfbddc5ce2d5..ff695865cf9d 100644 --- a/packages/core-typings/src/ICustomOAuthConfig.ts +++ b/packages/core-typings/src/ICustomOAuthConfig.ts @@ -1,7 +1,7 @@ export type OauthConfig = { serverURL?: string; identityPath?: string; - addAutopublishFields: { + addAutopublishFields?: { forLoggedInUser: string[]; forOtherUsers: string[]; }; @@ -13,4 +13,5 @@ export type OauthConfig = { tokenSentVia?: string; usernameField?: string; mergeUsers?: boolean; + responseType?: string; }; diff --git a/packages/core-typings/src/IInquiry.ts b/packages/core-typings/src/IInquiry.ts index 3e8d53d0fdcc..5c9aa08e88d5 100644 --- a/packages/core-typings/src/IInquiry.ts +++ b/packages/core-typings/src/IInquiry.ts @@ -37,7 +37,7 @@ export interface ILivechatInquiryRecord extends IRocketChatRecord { ts: Date; message: string; status: LivechatInquiryStatus; - v: Pick & { lastMessageTs?: Date }; + v: Pick & { lastMessageTs?: Date }; t: 'l'; department?: string; diff --git a/packages/core-typings/src/IIntegrationHistory.ts b/packages/core-typings/src/IIntegrationHistory.ts index 6594d611fb49..0809a887b365 100644 --- a/packages/core-typings/src/IIntegrationHistory.ts +++ b/packages/core-typings/src/IIntegrationHistory.ts @@ -1,3 +1,4 @@ +import type { OutgoingIntegrationEvent } from './IIntegration'; import type { IMessage } from './IMessage'; import type { IRocketChatRecord } from './IRocketChatRecord'; @@ -7,7 +8,7 @@ export interface IIntegrationHistory extends IRocketChatRecord { integration: { _id: string; }; - event: string; + event: OutgoingIntegrationEvent; _createdAt: Date; _updatedAt: Date; data?: { diff --git a/packages/core-typings/src/ILivechatAgent.ts b/packages/core-typings/src/ILivechatAgent.ts index 68a99c2723d9..f106239400b1 100644 --- a/packages/core-typings/src/ILivechatAgent.ts +++ b/packages/core-typings/src/ILivechatAgent.ts @@ -7,12 +7,11 @@ export enum ILivechatAgentStatus { export interface ILivechatAgent extends IUser { statusLivechat: ILivechatAgentStatus; - livechat: { + livechat?: { maxNumberSimultaneousChat: number; }; livechatCount: number; lastRoutingTime: Date; livechatStatusSystemModified?: boolean; - openBusinessHours?: string[]; } diff --git a/packages/core-typings/src/IMessage/IMessage.ts b/packages/core-typings/src/IMessage/IMessage.ts index 3ed5e470585f..190446502f02 100644 --- a/packages/core-typings/src/IMessage/IMessage.ts +++ b/packages/core-typings/src/IMessage/IMessage.ts @@ -13,8 +13,6 @@ import type { IUser } from '../IUser'; import type { FileProp } from './MessageAttachment/Files/FileProp'; import type { MessageAttachment } from './MessageAttachment/MessageAttachment'; -type MentionType = 'user' | 'team'; - type MessageUrl = { url: string; source?: string; @@ -121,15 +119,20 @@ export type TokenExtra = { noHtml?: string; }; +export type MessageMention = { + type?: 'user' | 'team'; // mentions for 'all' and 'here' doesn't have type + _id: string; + name?: string; + username?: string; +}; + export interface IMessage extends IRocketChatRecord { rid: RoomID; msg: string; tmid?: string; tshow?: boolean; ts: Date; - mentions?: ({ - type: MentionType; - } & Pick)[]; + mentions?: MessageMention[]; groupable?: boolean; channels?: Pick[]; @@ -354,16 +357,22 @@ export type IE2EEMessage = IMessage & { e2e: 'pending' | 'done'; }; -export type IOTRMessage = IMessage & { - t: 'otr' | 'otr-ack'; -}; +export interface IOTRMessage extends IMessage { + t: 'otr'; + otrAck?: string; +} + +export interface IOTRAckMessage extends IMessage { + t: 'otr-ack'; +} export type IVideoConfMessage = IMessage & { t: 'videoconf'; }; export const isE2EEMessage = (message: IMessage): message is IE2EEMessage => message.t === 'e2e'; -export const isOTRMessage = (message: IMessage): message is IOTRMessage => message.t === 'otr' || message.t === 'otr-ack'; +export const isOTRMessage = (message: IMessage): message is IOTRMessage => message.t === 'otr'; +export const isOTRAckMessage = (message: IMessage): message is IOTRAckMessage => message.t === 'otr-ack'; export const isVideoConfMessage = (message: IMessage): message is IVideoConfMessage => message.t === 'videoconf'; export type IMessageWithPendingFileImport = IMessage & { diff --git a/packages/core-typings/src/INotification.ts b/packages/core-typings/src/INotification.ts index 46c3341eea23..11746e01ddd2 100644 --- a/packages/core-typings/src/INotification.ts +++ b/packages/core-typings/src/INotification.ts @@ -51,6 +51,7 @@ export interface INotification { export interface INotificationDesktop { title: string; text: string; + icon?: string; duration?: number; payload: { _id: IMessage['_id']; diff --git a/packages/core-typings/src/IRoom.ts b/packages/core-typings/src/IRoom.ts index 523450e9594d..38fe23bd3453 100644 --- a/packages/core-typings/src/IRoom.ts +++ b/packages/core-typings/src/IRoom.ts @@ -151,10 +151,9 @@ export enum OmnichannelSourceType { export interface IOmnichannelGenericRoom extends Omit { t: 'l' | 'v'; - v: Pick & { + v: Pick & { lastMessageTs?: Date; phone?: string; - activity?: string[]; }; email?: { // Data used when the room is created from an email, via email Integration. @@ -273,6 +272,11 @@ export interface IOmnichannelRoom extends IOmnichannelGenericRoom { response?: { tt: number; total: number; + avg: number; + ft: number; + }; + reaction?: { + ft: number; }; }; diff --git a/packages/core-typings/src/IStats.ts b/packages/core-typings/src/IStats.ts index 0df389f2dd86..6bfa761c24ce 100644 --- a/packages/core-typings/src/IStats.ts +++ b/packages/core-typings/src/IStats.ts @@ -51,6 +51,7 @@ export interface IStats { totalChannelMessages: number; totalPrivateGroupMessages: number; totalDirectMessages: number; + totalDiscussionsMessages: number; totalLivechatMessages: number; totalTriggers: number; totalMessages: number; diff --git a/packages/core-typings/src/IUpload.ts b/packages/core-typings/src/IUpload.ts index 5f7c77cef731..c40e9d949407 100644 --- a/packages/core-typings/src/IUpload.ts +++ b/packages/core-typings/src/IUpload.ts @@ -1,3 +1,5 @@ +import type { IUser } from './IUser'; + export interface IUpload { _id: string; typeGroup?: string; @@ -47,3 +49,5 @@ export interface IUpload { path: string; }; } + +export type IUploadWithUser = IUpload & { user?: Pick }; diff --git a/packages/core-typings/src/IUser.ts b/packages/core-typings/src/IUser.ts index ce14c4020d6f..98785805714c 100644 --- a/packages/core-typings/src/IUser.ts +++ b/packages/core-typings/src/IUser.ts @@ -29,6 +29,7 @@ export interface IUserEmailVerificationToken { export interface IUserEmailCode { code: string; expire: Date; + attempts: number; } type LoginToken = IMeteorLoginToken | IPersonalAccessToken; @@ -75,7 +76,7 @@ export interface IUserServices { enabled: boolean; changedAt: Date; }; - emailCode?: IUserEmailCode[]; + emailCode?: IUserEmailCode; saml?: { inResponseTo?: string; provider?: string; diff --git a/packages/core-typings/src/IWorkspaceInfo.ts b/packages/core-typings/src/IWorkspaceInfo.ts new file mode 100644 index 000000000000..eede7d1011ff --- /dev/null +++ b/packages/core-typings/src/IWorkspaceInfo.ts @@ -0,0 +1,8 @@ +import type { IServerInfo } from './IServerInfo'; + +export type IWorkspaceInfo = { + info?: IServerInfo; + supportedVersions?: { signed: string }; + minimumClientVersions: { desktop: string; mobile: string }; + version: string; +}; diff --git a/packages/core-typings/src/cloud/Announcement.ts b/packages/core-typings/src/cloud/Announcement.ts index 7c9541efe75a..8542af634a85 100644 --- a/packages/core-typings/src/cloud/Announcement.ts +++ b/packages/core-typings/src/cloud/Announcement.ts @@ -1,28 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import type { IBanner } from '../IBanner'; -import type { IRocketChatRecord } from '../IRocketChatRecord'; -import type * as UiKit from '../uikit'; - -type TargetPlatform = 'web' | 'mobile'; - -type Dictionary = { - [lng: string]: { - [key: string]: string; - }; -}; - -type Creator = 'cloud' | 'system'; - -export interface Announcement extends IRocketChatRecord { +export interface Announcement extends IBanner { selector?: { roles?: string[]; }; - platform: TargetPlatform[]; - expireAt: Date; - startAt: Date; - createdBy: Creator; - createdAt: Date; - dictionary?: Dictionary; - view: UiKit.View; - surface: 'banner' | 'modal'; } diff --git a/packages/core-typings/src/cloud/WorkspaceSyncPayload.ts b/packages/core-typings/src/cloud/WorkspaceSyncPayload.ts index fb95cfa4553c..1a3e6c12cf5e 100644 --- a/packages/core-typings/src/cloud/WorkspaceSyncPayload.ts +++ b/packages/core-typings/src/cloud/WorkspaceSyncPayload.ts @@ -1,5 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import type * as UiKit from '@rocket.chat/ui-kit'; + import type { IBanner } from '../IBanner'; import type { Announcement } from './Announcement'; import type { NpsSurveyAnnouncement } from './NpsSurveyAnnouncement'; @@ -46,6 +48,7 @@ export interface WorkspaceSyncResponse { workspaceId: string; publicKey: string; license: unknown; + removeLicense?: boolean; } export interface WorkspaceCommsRequestPayload { @@ -54,6 +57,7 @@ export interface WorkspaceCommsRequestPayload { deploymentPlatform: string; version: string; } + export interface WorkspaceCommsResponsePayload { nps?: NpsSurveyAnnouncement | null; // Potentially consolidate into announcements announcements?: { @@ -61,3 +65,8 @@ export interface WorkspaceCommsResponsePayload { delete: Announcement['_id'][]; }; } + +export interface WorkspaceInteractionResponsePayload { + serverInteraction: UiKit.ServerInteraction; + serverAction?: 'syncWorkspace'; +} diff --git a/packages/core-typings/src/cloud/index.ts b/packages/core-typings/src/cloud/index.ts index da0565a215ed..8232ffce267f 100644 --- a/packages/core-typings/src/cloud/index.ts +++ b/packages/core-typings/src/cloud/index.ts @@ -7,4 +7,5 @@ export { WorkspaceSyncResponse, WorkspaceCommsRequestPayload, WorkspaceCommsResponsePayload, + WorkspaceInteractionResponsePayload, } from './WorkspaceSyncPayload'; diff --git a/packages/core-typings/src/import/IImporterInfo.ts b/packages/core-typings/src/import/IImporterInfo.ts new file mode 100644 index 000000000000..cff4becc20df --- /dev/null +++ b/packages/core-typings/src/import/IImporterInfo.ts @@ -0,0 +1,4 @@ +export interface IImporterInfo { + key: string; + name: string; +} diff --git a/packages/core-typings/src/import/index.ts b/packages/core-typings/src/import/index.ts index 2f56f72575d4..00df59ff93b6 100644 --- a/packages/core-typings/src/import/index.ts +++ b/packages/core-typings/src/import/index.ts @@ -3,6 +3,7 @@ export * from './IImportUser'; export * from './IImportRecord'; export * from './IImportMessage'; export * from './IImportChannel'; +export * from './IImporterInfo'; export * from './IImportFileData'; export * from './IImportProgress'; export * from './IImporterSelection'; diff --git a/packages/core-typings/src/index.ts b/packages/core-typings/src/index.ts index 6411390f0fe9..5a7db5d952aa 100644 --- a/packages/core-typings/src/index.ts +++ b/packages/core-typings/src/index.ts @@ -18,6 +18,7 @@ export * from './IUserAction'; export * from './IBanner'; export * from './IStats'; export * from './IServerInfo'; +export * from './IWorkspaceInfo'; export * from './IInstanceStatus'; export * from './IWebdavAccount'; export * from './IPermission'; @@ -32,6 +33,7 @@ export * from './IRocketChatAssets'; export * from './IPushToken'; export * from './IPushNotificationConfig'; export * from './SlashCommands'; +export * from './license'; export * from './IUserDataFile'; export * from './IUserSession'; @@ -135,5 +137,3 @@ export * from './IModerationReport'; export * from './CustomFieldMetadata'; export * as Cloud from './cloud'; - -export * as UiKit from './uikit'; diff --git a/ee/packages/license/src/definition/ILicenseTag.ts b/packages/core-typings/src/license/ILicenseTag.ts similarity index 100% rename from ee/packages/license/src/definition/ILicenseTag.ts rename to packages/core-typings/src/license/ILicenseTag.ts diff --git a/ee/packages/license/src/definition/ILicenseV2.ts b/packages/core-typings/src/license/ILicenseV2.ts similarity index 100% rename from ee/packages/license/src/definition/ILicenseV2.ts rename to packages/core-typings/src/license/ILicenseV2.ts diff --git a/ee/packages/license/src/definition/ILicenseV3.ts b/packages/core-typings/src/license/ILicenseV3.ts similarity index 96% rename from ee/packages/license/src/definition/ILicenseV3.ts rename to packages/core-typings/src/license/ILicenseV3.ts index d3a2d7f572a3..d99f80c71bfc 100644 --- a/ee/packages/license/src/definition/ILicenseV3.ts +++ b/packages/core-typings/src/license/ILicenseV3.ts @@ -8,10 +8,11 @@ export interface ILicenseV3 { information: { id?: string; autoRenew: boolean; - visualExpiration: Timestamp; + visualExpiration?: Timestamp; notifyAdminsAt?: Timestamp; notifyUsersAt?: Timestamp; trial: boolean; + cancellable?: boolean; offline: boolean; createdAt: Timestamp; grantedBy: { diff --git a/ee/packages/license/src/definition/LicenseBehavior.ts b/packages/core-typings/src/license/LicenseBehavior.ts similarity index 100% rename from ee/packages/license/src/definition/LicenseBehavior.ts rename to packages/core-typings/src/license/LicenseBehavior.ts diff --git a/ee/packages/license/src/definition/LicenseInfo.ts b/packages/core-typings/src/license/LicenseInfo.ts similarity index 100% rename from ee/packages/license/src/definition/LicenseInfo.ts rename to packages/core-typings/src/license/LicenseInfo.ts diff --git a/ee/packages/license/src/definition/LicenseLimit.ts b/packages/core-typings/src/license/LicenseLimit.ts similarity index 100% rename from ee/packages/license/src/definition/LicenseLimit.ts rename to packages/core-typings/src/license/LicenseLimit.ts diff --git a/ee/packages/license/src/definition/LicenseModule.ts b/packages/core-typings/src/license/LicenseModule.ts similarity index 80% rename from ee/packages/license/src/definition/LicenseModule.ts rename to packages/core-typings/src/license/LicenseModule.ts index 8ecebba1983b..32c7097b4d2c 100644 --- a/ee/packages/license/src/definition/LicenseModule.ts +++ b/packages/core-typings/src/license/LicenseModule.ts @@ -15,4 +15,7 @@ export type LicenseModule = | 'federation' | 'videoconference-enterprise' | 'message-read-receipt' - | 'outlook-calendar'; + | 'outlook-calendar' + | 'hide-watermark' + | 'custom-roles' + | 'accessibility-certification'; diff --git a/ee/packages/license/src/definition/LicensePeriod.ts b/packages/core-typings/src/license/LicensePeriod.ts similarity index 100% rename from ee/packages/license/src/definition/LicensePeriod.ts rename to packages/core-typings/src/license/LicensePeriod.ts diff --git a/ee/packages/license/src/definition/LicenseValidationOptions.ts b/packages/core-typings/src/license/LicenseValidationOptions.ts similarity index 100% rename from ee/packages/license/src/definition/LicenseValidationOptions.ts rename to packages/core-typings/src/license/LicenseValidationOptions.ts diff --git a/ee/packages/license/src/definition/LimitContext.ts b/packages/core-typings/src/license/LimitContext.ts similarity index 79% rename from ee/packages/license/src/definition/LimitContext.ts rename to packages/core-typings/src/license/LimitContext.ts index 9dfc6d36be7f..65be71d3cf22 100644 --- a/ee/packages/license/src/definition/LimitContext.ts +++ b/packages/core-typings/src/license/LimitContext.ts @@ -1,5 +1,4 @@ -import type { IUser } from '@rocket.chat/core-typings'; - +import type { IUser } from '../IUser'; import type { LicenseLimitKind } from './ILicenseV3'; export type LimitContext = { extraCount?: number } & (T extends 'roomsPerGuest' diff --git a/ee/packages/license/src/definition/events.ts b/packages/core-typings/src/license/events.ts similarity index 94% rename from ee/packages/license/src/definition/events.ts rename to packages/core-typings/src/license/events.ts index b9d211da9b7a..2156c298849c 100644 --- a/ee/packages/license/src/definition/events.ts +++ b/packages/core-typings/src/license/events.ts @@ -15,6 +15,8 @@ export type LicenseEvents = ModuleValidation & BehaviorTriggeredToggled & BehaviorTriggered & LimitReached & { + installed: undefined; + removed: undefined; validate: undefined; invalidate: undefined; module: { module: LicenseModule; valid: boolean }; diff --git a/packages/core-typings/src/license/index.ts b/packages/core-typings/src/license/index.ts new file mode 100644 index 000000000000..55c252c1fb96 --- /dev/null +++ b/packages/core-typings/src/license/index.ts @@ -0,0 +1,11 @@ +export * from './events'; +export * from './ILicenseTag'; +export * from './ILicenseV2'; +export * from './ILicenseV3'; +export * from './LicenseBehavior'; +export * from './LicenseInfo'; +export * from './LicenseLimit'; +export * from './LicenseModule'; +export * from './LicensePeriod'; +export * from './LicenseValidationOptions'; +export * from './LimitContext'; diff --git a/packages/core-typings/src/omnichannel/queue.ts b/packages/core-typings/src/omnichannel/queue.ts index 46036622713f..1ae697c88a23 100644 --- a/packages/core-typings/src/omnichannel/queue.ts +++ b/packages/core-typings/src/omnichannel/queue.ts @@ -2,4 +2,5 @@ export interface IOmnichannelQueue { start(): Promise; shouldStart(): void; stop(): Promise; + isRunning(): boolean; } diff --git a/packages/core-typings/src/uikit/BannerView.ts b/packages/core-typings/src/uikit/BannerView.ts deleted file mode 100644 index f6914f75a6af..000000000000 --- a/packages/core-typings/src/uikit/BannerView.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Keys as IconName } from '@rocket.chat/icons'; -import type { BannerSurfaceLayout } from '@rocket.chat/ui-kit'; - -import type { View } from './View'; - -/** - * A view that is displayed as a banner. - */ -export type BannerView = View & { - viewId: string; - inline?: boolean; - variant?: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; - icon?: IconName; - title?: string; // TODO: change to plain_text block in the future - blocks: BannerSurfaceLayout; -}; diff --git a/packages/core-typings/src/uikit/ContextualBarView.ts b/packages/core-typings/src/uikit/ContextualBarView.ts deleted file mode 100644 index ab480be19b77..000000000000 --- a/packages/core-typings/src/uikit/ContextualBarView.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ButtonElement, ContextualBarSurfaceLayout, TextObject } from '@rocket.chat/ui-kit'; - -import type { View } from './View'; - -/** - * A view that is displayed as a contextual bar. - */ -export type ContextualBarView = View & { - id: string; - title: TextObject; - close?: ButtonElement; - submit?: ButtonElement; - blocks: ContextualBarSurfaceLayout; -}; diff --git a/packages/core-typings/src/uikit/ModalView.ts b/packages/core-typings/src/uikit/ModalView.ts deleted file mode 100644 index 2e2fc12befe8..000000000000 --- a/packages/core-typings/src/uikit/ModalView.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { ButtonElement, ModalSurfaceLayout, TextObject } from '@rocket.chat/ui-kit'; - -import type { View } from './View'; - -/** - * A view that is displayed as a modal dialog. - */ -export type ModalView = View & { - id: string; - showIcon?: boolean; - title: TextObject; - close?: ButtonElement; - submit?: ButtonElement; - blocks: ModalSurfaceLayout; -}; diff --git a/packages/core-typings/src/uikit/ServerInteraction.ts b/packages/core-typings/src/uikit/ServerInteraction.ts deleted file mode 100644 index a5b8aabca26e..000000000000 --- a/packages/core-typings/src/uikit/ServerInteraction.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { BannerView } from './BannerView'; -import type { ContextualBarView } from './ContextualBarView'; -import type { ModalView } from './ModalView'; - -type OpenModalServerInteraction = { - type: 'modal.open'; - triggerId: string; - appId: string; - view: ModalView; -}; - -type UpdateModalServerInteraction = { - type: 'modal.update'; - triggerId: string; - appId: string; - view: ModalView; -}; - -type CloseModalServerInteraction = { - type: 'modal.close'; - triggerId: string; - appId: string; -}; - -type OpenBannerServerInteraction = { - type: 'banner.open'; - triggerId: string; - appId: string; -} & BannerView; - -type UpdateBannerServerInteraction = { - type: 'banner.update'; - triggerId: string; - appId: string; - view: BannerView; -}; - -type CloseBannerServerInteraction = { - type: 'banner.close'; - triggerId: string; - appId: string; - viewId: BannerView['viewId']; -}; - -type OpenContextualBarServerInteraction = { - type: 'contextual_bar.open'; - triggerId: string; - appId: string; - view: ContextualBarView; -}; - -type UpdateContextualBarServerInteraction = { - type: 'contextual_bar.update'; - triggerId: string; - appId: string; - view: ContextualBarView; -}; - -type CloseContextualBarServerInteraction = { - type: 'contextual_bar.close'; - triggerId: string; - appId: string; - view: ContextualBarView; -}; - -type ReportErrorsServerInteraction = { - type: 'errors'; - triggerId: string; - appId: string; - viewId: ModalView['id'] | BannerView['viewId'] | ContextualBarView['id']; - errors: { [field: string]: string }[]; -}; - -export type ServerInteraction = - | OpenModalServerInteraction - | UpdateModalServerInteraction - | CloseModalServerInteraction - | OpenBannerServerInteraction - | UpdateBannerServerInteraction - | CloseBannerServerInteraction - | OpenContextualBarServerInteraction - | UpdateContextualBarServerInteraction - | CloseContextualBarServerInteraction - | ReportErrorsServerInteraction; diff --git a/packages/core-typings/src/uikit/UserInteraction.ts b/packages/core-typings/src/uikit/UserInteraction.ts deleted file mode 100644 index 3b65acb839f8..000000000000 --- a/packages/core-typings/src/uikit/UserInteraction.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { IMessage } from '../IMessage'; -import type { IRoom } from '../IRoom'; -import type { View } from './View'; - -export type MessageBlockActionUserInteraction = { - type: 'blockAction'; - actionId: string; - payload: { - blockId: string; - value: unknown; - }; - container: { - type: 'message'; - id: IMessage['_id']; - }; - mid: IMessage['_id']; - tmid?: IMessage['_id']; - rid: IRoom['_id']; - triggerId: string; -}; - -export type ViewBlockActionUserInteraction = { - type: 'blockAction'; - actionId: string; - payload: { - blockId: string; - value: unknown; - }; - container: { - type: 'view'; - id: string; - }; - triggerId: string; -}; - -export type ViewClosedUserInteraction = { - type: 'viewClosed'; - payload: { - viewId: string; - view: View & { - id: string; - state: { [blockId: string]: { [key: string]: unknown } }; - }; - isCleared?: boolean; - }; - triggerId: string; -}; - -export type ViewSubmitUserInteraction = { - type: 'viewSubmit'; - actionId?: undefined; - payload: { - view: View & { - id: string; - state: { [blockId: string]: { [key: string]: unknown } }; - }; - }; - triggerId: string; - viewId: string; -}; - -export type MessageBoxActionButtonUserInteraction = { - type: 'actionButton'; - actionId: string; - payload: { - context: 'messageBoxAction'; - message: string; - }; - mid?: undefined; - tmid?: IMessage['_id']; - rid: IRoom['_id']; - triggerId: string; -}; - -export type UserDropdownActionButtonUserInteraction = { - type: 'actionButton'; - actionId: string; - payload: { - context: 'userDropdownAction'; - message?: undefined; - }; - mid?: undefined; - tmid?: undefined; - rid?: undefined; - triggerId: string; -}; - -export type MesssageActionButtonUserInteraction = { - type: 'actionButton'; - actionId: string; - payload: { - context: 'messageAction'; - message?: undefined; - }; - mid: IMessage['_id']; - tmid?: IMessage['_id']; - rid: IRoom['_id']; - triggerId: string; -}; - -export type RoomActionButtonUserInteraction = { - type: 'actionButton'; - actionId: string; - payload: { - context: 'roomAction'; - message?: undefined; - }; - mid?: undefined; - tmid?: undefined; - rid: IRoom['_id']; - triggerId: string; -}; - -export type UserInteraction = - | MessageBlockActionUserInteraction - | ViewBlockActionUserInteraction - | ViewClosedUserInteraction - | ViewSubmitUserInteraction - | MessageBoxActionButtonUserInteraction - | UserDropdownActionButtonUserInteraction - | MesssageActionButtonUserInteraction - | RoomActionButtonUserInteraction; diff --git a/packages/core-typings/src/uikit/View.ts b/packages/core-typings/src/uikit/View.ts deleted file mode 100644 index fe3b3a366635..000000000000 --- a/packages/core-typings/src/uikit/View.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { LayoutBlock } from '@rocket.chat/ui-kit'; - -/** - * An instance of a UiKit surface and its metadata. - */ -export type View = { - appId: string; - blocks: LayoutBlock[]; -}; diff --git a/packages/core-typings/src/uikit/index.ts b/packages/core-typings/src/uikit/index.ts deleted file mode 100644 index 61ab79621d1a..000000000000 --- a/packages/core-typings/src/uikit/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -export * from '@rocket.chat/ui-kit'; -export type { - UserInteraction, - MessageBlockActionUserInteraction, - ViewBlockActionUserInteraction, - ViewClosedUserInteraction, - ViewSubmitUserInteraction, - MessageBoxActionButtonUserInteraction, - UserDropdownActionButtonUserInteraction, - MesssageActionButtonUserInteraction, - RoomActionButtonUserInteraction, -} from './UserInteraction'; -export type { View } from './View'; -export type { BannerView } from './BannerView'; -export type { ContextualBarView } from './ContextualBarView'; -export type { ModalView } from './ModalView'; -export type { ServerInteraction } from './ServerInteraction'; diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index b0cf975ee4d8..6d649476e341 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,237 @@ # @rocket.chat/cron +## 0.0.22 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/models@0.0.26 + +## 0.0.21 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/models@0.0.25 + +## 0.0.20 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/models@0.0.24 + +## 0.0.20-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/models@0.0.24-rc.12 + +## 0.0.20-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/models@0.0.24-rc.11 + +## 0.0.20-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/models@0.0.24-rc.10 + +## 0.0.20-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/models@0.0.24-rc.9 + +## 0.0.20-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/models@0.0.24-rc.8 + +## 0.0.20-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/models@0.0.24-rc.7 + +## 0.0.20-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/models@0.0.24-rc.6 + +## 0.0.20-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/models@0.0.24-rc.5 + +## 0.0.20-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/models@0.0.24-rc.4 + +## 0.0.20-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/models@0.0.24-rc.3 + +## 0.0.20-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/models@0.0.24-rc.2 + +## 0.0.20-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/models@0.0.24-rc.1 + +## 0.0.17-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/models@0.0.21-rc.7 + +## 0.0.17-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/models@0.0.21-rc.6 + +## 0.0.17-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/models@0.0.21-rc.5 + +## 0.0.17-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/models@0.0.21-rc.4 + +## 0.0.17-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/models@0.0.21-rc.3 + +## 0.0.17-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/models@0.0.21-rc.2 + +## 0.0.17-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/models@0.0.21-rc.1 + +## 0.0.17-rc.0 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/models@0.0.21-rc.0 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/models@0.0.23 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/models@0.0.22 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/models@0.0.21 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/models@0.0.20 + +## 0.0.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/models@0.0.19 + +## 0.0.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/models@0.0.18 + +## 0.0.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/models@0.0.17 + +## 0.0.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/models@0.0.16 + ## 0.0.11 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index 37e751fe03d5..c95457e3f9be 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/cron", - "version": "0.0.11", + "version": "0.0.22", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 9b0adef2d80e..43381ad4d188 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -4,8 +4,8 @@ "description": "Rocket.Chat's JS/TS ESLint config", "dependencies": { "@babel/core": "^7.20.7", - "@babel/eslint-parser": "~7.22.9", - "@types/eslint": "~8.44.0", + "@babel/eslint-parser": "~7.23.3", + "@types/eslint": "~8.44.6", "@types/prettier": "^2.6.3", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", @@ -13,7 +13,7 @@ "eslint-config-prettier": "~8.8.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-import": "~2.26.0", - "eslint-plugin-jest": "~27.2.2", + "eslint-plugin-jest": "~27.2.3", "eslint-plugin-prettier": "~4.2.1", "prettier": "~2.8.8" }, diff --git a/packages/favicon/package.json b/packages/favicon/package.json index ac0c5ac905b0..3a1fc38d09f8 100644 --- a/packages/favicon/package.json +++ b/packages/favicon/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "eslint": "~8.45.0", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/fuselage-ui-kit/.babelrc.json b/packages/fuselage-ui-kit/.babelrc.json index 1320b9a3272a..202d425a099e 100644 --- a/packages/fuselage-ui-kit/.babelrc.json +++ b/packages/fuselage-ui-kit/.babelrc.json @@ -1,3 +1,7 @@ { - "presets": ["@babel/preset-env"] + "presets": [ + "@babel/preset-env", + "@babel/preset-react", + "@babel/preset-typescript" + ] } diff --git a/packages/fuselage-ui-kit/.storybook/main.js b/packages/fuselage-ui-kit/.storybook/main.js deleted file mode 100644 index ce1510d2e2d5..000000000000 --- a/packages/fuselage-ui-kit/.storybook/main.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - addons: ['@storybook/addon-essentials'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], - features: { - postcss: false, - }, - typescript: { - reactDocgen: 'react-docgen-typescript-plugin', - }, -}; diff --git a/packages/fuselage-ui-kit/.storybook/main.ts b/packages/fuselage-ui-kit/.storybook/main.ts new file mode 100644 index 000000000000..87e20c3f103b --- /dev/null +++ b/packages/fuselage-ui-kit/.storybook/main.ts @@ -0,0 +1,12 @@ +import { type StorybookConfig } from '@storybook/core-common'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], + addons: ['@storybook/addon-essentials', 'storybook-dark-mode'], + features: { + postcss: false, + }, + framework: '@storybook/react', +}; + +module.exports = config; diff --git a/packages/fuselage-ui-kit/.storybook/preview.tsx b/packages/fuselage-ui-kit/.storybook/preview.tsx index 01f844685888..82ba8a060ef6 100644 --- a/packages/fuselage-ui-kit/.storybook/preview.tsx +++ b/packages/fuselage-ui-kit/.storybook/preview.tsx @@ -1,10 +1,26 @@ -import { DocsPage, DocsContainer } from '@storybook/addon-docs'; -import { addParameters } from '@storybook/react'; +import { codeBlock } from '@rocket.chat/ui-theming/src/codeBlockStyles'; +import { convertToCss } from '@rocket.chat/ui-theming/src/helpers/convertToCss'; +import { filterOnlyChangedColors } from '@rocket.chat/ui-theming/src/helpers/filterOnlyChangedColors'; +import { useCreateStyleContainer } from '@rocket.chat/ui-theming/src/hooks/useCreateStyleContainer'; +import { defaultPalette } from '@rocket.chat/ui-theming/src/palette'; +import { darkPalette } from '@rocket.chat/ui-theming/src/paletteDark'; +import { type Parameters } from '@storybook/addons'; +import { type DecoratorFn } from '@storybook/react'; +import { themes } from '@storybook/theming'; +import { createElement } from 'react'; +import { createPortal } from 'react-dom'; +import { useDarkMode } from 'storybook-dark-mode'; + +import manifest from '../package.json'; +import logo from './logo.svg'; + +import '@rocket.chat/fuselage/dist/fuselage.css'; import '@rocket.chat/icons/dist/rocketchat.css'; import '@rocket.chat/fuselage-polyfills'; import 'normalize.css/normalize.css'; -addParameters({ +export const parameters: Parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, backgrounds: { grid: { cellSize: 4, @@ -12,11 +28,44 @@ addParameters({ opacity: 0.5, }, }, - docs: { - container: DocsContainer, - page: DocsPage, - }, options: { storySort: ([, a], [, b]) => a.kind.localeCompare(b.kind), }, -}); + layout: 'fullscreen', + darkMode: { + dark: { + ...themes.dark, + brandTitle: manifest.name, + brandImage: logo, + brandUrl: manifest.homepage, + }, + light: { + ...themes.normal, + brandTitle: manifest.name, + brandImage: logo, + brandUrl: manifest.homepage, + }, + }, +}; + +export const decorators: DecoratorFn[] = [ + (fn) => + createElement(function RocketChatDarkMode() { + const dark = useDarkMode(); + + const palette = convertToCss( + filterOnlyChangedColors(defaultPalette, dark ? darkPalette : {}), + 'body' + ); + + return ( + <> + {createPortal( + dark ? palette + codeBlock : palette, + useCreateStyleContainer('main-palette') + )} + {fn()} + + ); + }), +]; diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index dd8a0fce9789..fe2030f98383 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,257 @@ # Change Log +## 3.0.2 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.2 +- @rocket.chat/ui-contexts@3.0.2 +- @rocket.chat/ui-video-conf@3.0.2 + +## 3.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.1 +- @rocket.chat/gazzodown@3.0.1 +- @rocket.chat/ui-video-conf@3.0.1 + +## 3.0.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] +- Updated dependencies [c2f337664e] + - @rocket.chat/ui-contexts@3.0.0 + - @rocket.chat/gazzodown@3.0.0 + - @rocket.chat/ui-video-conf@3.0.0 + +## 3.0.0-rc.19 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.19 +- @rocket.chat/ui-contexts@3.0.0-rc.19 +- @rocket.chat/ui-video-conf@3.0.0-rc.19 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.18 +- @rocket.chat/ui-contexts@3.0.0-rc.18 +- @rocket.chat/ui-video-conf@3.0.0-rc.18 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.17 +- @rocket.chat/ui-contexts@3.0.0-rc.17 +- @rocket.chat/ui-video-conf@3.0.0-rc.17 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.16 +- @rocket.chat/ui-contexts@3.0.0-rc.16 +- @rocket.chat/ui-video-conf@3.0.0-rc.16 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.15 +- @rocket.chat/ui-contexts@3.0.0-rc.15 +- @rocket.chat/ui-video-conf@3.0.0-rc.15 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.14 +- @rocket.chat/ui-contexts@3.0.0-rc.14 +- @rocket.chat/ui-video-conf@3.0.0-rc.14 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.13 +- @rocket.chat/ui-contexts@3.0.0-rc.13 +- @rocket.chat/ui-video-conf@3.0.0-rc.13 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.12 +- @rocket.chat/ui-contexts@3.0.0-rc.12 +- @rocket.chat/ui-video-conf@3.0.0-rc.12 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.11 +- @rocket.chat/ui-contexts@3.0.0-rc.11 +- @rocket.chat/ui-video-conf@3.0.0-rc.11 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.10 +- @rocket.chat/ui-contexts@3.0.0-rc.10 +- @rocket.chat/ui-video-conf@3.0.0-rc.10 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.9 +- @rocket.chat/ui-contexts@3.0.0-rc.9 +- @rocket.chat/ui-video-conf@3.0.0-rc.9 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.8 +- @rocket.chat/ui-contexts@3.0.0-rc.8 +- @rocket.chat/ui-video-conf@3.0.0-rc.8 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/ui-video-conf@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/ui-video-conf@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/ui-video-conf@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/ui-video-conf@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/ui-video-conf@3.0.0-rc.3 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.2 +- @rocket.chat/ui-contexts@3.0.0-rc.2 +- @rocket.chat/ui-video-conf@3.0.0-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.1 +- @rocket.chat/ui-contexts@3.0.0-rc.1 +- @rocket.chat/ui-video-conf@3.0.0-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] +- Updated dependencies [c2f337664e] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + - @rocket.chat/gazzodown@3.0.0-rc.0 + - @rocket.chat/ui-video-conf@3.0.0-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/ui-video-conf@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/ui-video-conf@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/ui-video-conf@2.0.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.5 +- @rocket.chat/ui-contexts@2.0.5 +- @rocket.chat/ui-video-conf@2.0.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.4 +- @rocket.chat/ui-contexts@2.0.4 +- @rocket.chat/ui-video-conf@2.0.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.3 +- @rocket.chat/ui-contexts@2.0.3 +- @rocket.chat/ui-video-conf@2.0.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.2 +- @rocket.chat/ui-contexts@2.0.2 +- @rocket.chat/ui-video-conf@2.0.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.1 +- @rocket.chat/ui-contexts@2.0.1 +- @rocket.chat/ui-video-conf@2.0.1 + ## 2.0.0 ### Minor Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index a32d2456752b..d4f9f051c0cc 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "2.0.0", + "version": "3.0.2", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -27,13 +27,15 @@ "access": "public" }, "scripts": { + "dev": "tsc --watch --preserveWatchOutput -p tsconfig-esm.json", "build": "run-s .:build:clean .:build:esm .:build:cjs", ".:build:clean": "rimraf dist", ".:build:esm": "tsc -p tsconfig-esm.json", ".:build:cjs": "tsc -p tsconfig-cjs.json", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "typecheck": "tsc --noEmit", "docs": "cross-env NODE_ENV=production build-storybook -o ../../static/fuselage-ui-kit", - "storybook": "start-storybook -p 6006", + "storybook": "start-storybook -p 6006 --no-version-updates", "build-storybook": "cross-env NODE_ENV=production build-storybook", "bump-next": "bump-next" }, @@ -46,24 +48,28 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-contexts": "2.0.0", + "@rocket.chat/ui-contexts": "3.0.2", "@rocket.chat/ui-kit": "*", - "@rocket.chat/ui-video-conf": "2.0.0", + "@rocket.chat/ui-video-conf": "3.0.2", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" }, "devDependencies": { - "@rocket.chat/apps-engine": "1.41.0-alpha.290", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-react": "~7.22.15", + "@babel/preset-typescript": "~7.22.15", + "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-hooks": "^0.32.1", - "@rocket.chat/fuselage-polyfills": "next", - "@rocket.chat/icons": "^0.32.0", - "@rocket.chat/prettier-config": "next", - "@rocket.chat/styled": "next", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/icons": "~0.32.0", + "@rocket.chat/prettier-config": "~0.31.25", + "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-contexts": "workspace:^", - "@rocket.chat/ui-kit": "^0.32.1", + "@rocket.chat/ui-kit": "workspace:~", "@rocket.chat/ui-video-conf": "workspace:^", "@storybook/addon-essentials": "~6.5.16", "@storybook/addons": "~6.5.16", @@ -73,8 +79,10 @@ "@storybook/source-loader": "~6.5.16", "@storybook/theming": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", + "@types/babel__core": "^7.20.3", + "@types/babel__preset-env": "^7.9.4", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", "babel-loader": "~8.2.5", "cross-env": "^7.0.3", "eslint": "~8.45.0", @@ -83,13 +91,15 @@ "prettier": "~2.8.8", "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "^17.0.2", + "react-i18next": "~13.2.2", "rimraf": "^3.0.2", + "storybook-dark-mode": "~3.0.1", "tslib": "^2.5.3", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "dependencies": { "@rocket.chat/gazzodown": "workspace:^", - "@rocket.chat/ui-kit": "^0.32.1", + "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" }, "volta": { diff --git a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx index 7cb125b3f9f8..58980848856d 100644 --- a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx +++ b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx @@ -34,7 +34,7 @@ const VideoConferenceBlock = ({ const surfaceType = useSurfaceType(); const userId = useUserId(); - const { action, viewId, rid } = useContext(UiKitContext); + const { action, viewId = undefined, rid } = useContext(UiKitContext); if (surfaceType !== 'message') { throw new Error('VideoConferenceBlock cannot be rendered outside message'); diff --git a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/hooks/useVideoConfDataStream.ts b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/hooks/useVideoConfDataStream.ts index bed07f955a9d..bcab7ee10db9 100644 --- a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/hooks/useVideoConfDataStream.ts +++ b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/hooks/useVideoConfDataStream.ts @@ -1,5 +1,5 @@ import type { IRoom } from '@rocket.chat/core-typings'; -import { useSingleStream } from '@rocket.chat/ui-contexts'; +import { useStream } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { useEffect } from 'react'; @@ -14,7 +14,7 @@ export const useVideoConfDataStream = ({ }) => { const queryClient = useQueryClient(); - const subscribeNotifyRoom = useSingleStream('notify-room'); + const subscribeNotifyRoom = useStream('notify-room'); useEffect(() => { return subscribeNotifyRoom( diff --git a/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx b/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx new file mode 100644 index 000000000000..717c5fa9a58a --- /dev/null +++ b/packages/fuselage-ui-kit/src/contexts/AppIdContext.tsx @@ -0,0 +1,30 @@ +import type { ReactNode } from 'react'; +import { createContext, useContext, useDebugValue } from 'react'; + +import { UiKitContext } from './UiKitContext'; + +const AppIdContext = createContext(undefined); + +type AppIdProviderProps = { + children: ReactNode; + appId?: string; +}; + +export const AppIdProvider = ({ children, appId }: AppIdProviderProps) => { + if (!appId) { + return <>{children}; + } + + return ( + {children} + ); +}; + +export const useAppId = () => { + const outerAppId = useContext(UiKitContext).appId ?? 'core'; + const appId = useContext(AppIdContext) ?? outerAppId; + + useDebugValue(appId); + + return appId; +}; diff --git a/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts b/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts index 9e5ca1a04e5f..11a7da574859 100644 --- a/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts +++ b/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts @@ -13,6 +13,7 @@ type ActionParams = { value: unknown; viewId?: string; dispatchActionConfig?: InputElementDispatchAction[]; + mid?: string; }; type UiKitContextValue = { @@ -20,11 +21,11 @@ type UiKitContextValue = { state: ActionParams, event: Parameters>[0] ) => Promise | void; - state: ( + updateState?: ( state: ActionParams, event: Parameters>[0] ) => Promise | void; - appId: string; + appId?: string; errors?: Record; values: Record; viewId?: string; @@ -33,8 +34,7 @@ type UiKitContextValue = { export const UiKitContext = createContext({ action: () => undefined, - state: () => undefined, + updateState: () => undefined, appId: 'core', - errors: {}, values: {}, }); diff --git a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx b/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx index a0357c303e1f..c2744ce47571 100644 --- a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx @@ -2,19 +2,19 @@ import { InputBox } from '@rocket.chat/fuselage'; import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type DatePickerElementProps = BlockProps; const DatePickerElement = ({ block, context, - surfaceRenderer, }: DatePickerElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); const { actionId, placeholder } = block; + const fromTextObjectToString = useStringFromTextObject(); return ( ); diff --git a/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx b/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx index 0ff2631d7a3a..3eb04576851a 100644 --- a/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/MarkdownTextElement.tsx @@ -1,31 +1,21 @@ import { Markup } from '@rocket.chat/gazzodown'; import { parse } from '@rocket.chat/message-parser'; -import { useTranslation } from '@rocket.chat/ui-contexts'; import type { TextObject } from '@rocket.chat/ui-kit'; -import { useContext } from 'react'; -import { UiKitContext } from '../contexts/UiKitContext'; +import { useAppTranslation } from '../hooks/useAppTranslation'; const MarkdownTextElement = ({ textObject }: { textObject: TextObject }) => { - const t = useTranslation() as ( - key: string, - args: { [key: string]: string | number } - ) => string; - const { appId } = useContext(UiKitContext); + const { t } = useAppTranslation(); - const { i18n } = textObject; + const text = textObject.i18n + ? t(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; - if (i18n) { - return ( - - ); + if (!text) { + return null; } - return ; + return ; }; export default MarkdownTextElement; diff --git a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx index 3649fd2cd172..a1948a921f49 100644 --- a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx @@ -4,26 +4,26 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type MultiStaticSelectElementProps = BlockProps; const MultiStaticSelectElement = ({ block, context, - surfaceRenderer, }: MultiStaticSelectElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const options = useMemo( () => - block.options.map(({ value, text }, i) => [ + block.options.map(({ value, text }) => [ value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', + fromTextObjectToString(text) ?? '', ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const handleChange = useCallback( @@ -39,11 +39,7 @@ const MultiStaticSelectElement = ({ disabled={loading} error={error} options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} + placeholder={fromTextObjectToString(block.placeholder)} onChange={handleChange} /> ); diff --git a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx b/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx index c239271f1c70..1af8fe18394c 100644 --- a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx @@ -9,18 +9,18 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { useRef, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type OverflowElementProps = BlockProps; const OverflowElement = ({ block, context, - surfaceRenderer, }: OverflowElementProps): ReactElement => { const [{ loading }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const fireChange = useCallback( ([value]: [UiKit.ActionOf, string]) => @@ -30,15 +30,15 @@ const OverflowElement = ({ const options = useMemo( () => - block.options.map(({ value, text, url }: UiKit.Option, i) => [ + block.options.map(({ value, text, url }) => [ value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', + fromTextObjectToString(text) ?? '', undefined, undefined, undefined, url, ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const [cursor, handleKeyDown, handleKeyUp, reset, [visible, hide, show]] = diff --git a/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx b/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx index 4e692caa0993..df3aabb356ff 100644 --- a/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/PlainTextElement.tsx @@ -1,23 +1,15 @@ -import { useTranslation } from '@rocket.chat/ui-contexts'; import type { TextObject } from '@rocket.chat/ui-kit'; -import { useContext } from 'react'; -import { UiKitContext } from '../contexts/UiKitContext'; +import { useAppTranslation } from '../hooks/useAppTranslation'; const PlainTextElement = ({ textObject }: { textObject: TextObject }) => { - const t = useTranslation() as ( - key: string, - args: { [key: string]: string | number } - ) => string; - const { appId } = useContext(UiKitContext); + const { t } = useAppTranslation(); - const { i18n } = textObject; + const text = textObject.i18n + ? t(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; - if (i18n) { - return <>{t(`apps-${appId}-${i18n.key}`, { ...i18n.args })}; - } - - return <>{textObject.text}; + return <>{text}; }; export default PlainTextElement; diff --git a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx b/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx index 698d4ded25f8..013c0985b832 100644 --- a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx @@ -3,18 +3,18 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type PlainTextInputElementProps = BlockProps; const PlainTextInputElement = ({ block, context, - surfaceRenderer, }: PlainTextInputElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); if (block.multiline) { return ( @@ -26,11 +26,7 @@ const PlainTextInputElement = ({ error={error} value={value} onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } + placeholder={fromTextObjectToString(block.placeholder)} /> ); } @@ -43,11 +39,7 @@ const PlainTextInputElement = ({ error={error} value={value} onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } + placeholder={fromTextObjectToString(block.placeholder)} /> ); }; diff --git a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx index 781e25ad831c..c68a7f067a8d 100644 --- a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx @@ -3,26 +3,26 @@ import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; import { memo, useCallback, useMemo } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type StaticSelectElementProps = BlockProps; const StaticSelectElement = ({ block, context, - surfaceRenderer, }: StaticSelectElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); + const fromTextObjectToString = useStringFromTextObject(); const options = useMemo<[string, string][]>( () => - block.options.map((option, i) => [ + block.options.map((option) => [ option.value, - fromTextObjectToString(surfaceRenderer, option.text, i) ?? '', + fromTextObjectToString(option.text) ?? '', ]), - [block.options, surfaceRenderer] + [block.options, fromTextObjectToString] ); const handleChange = useCallback( @@ -38,11 +38,7 @@ const StaticSelectElement = ({ disabled={loading} error={error} options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} + placeholder={fromTextObjectToString(block.placeholder)} onChange={handleChange} /> ); diff --git a/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx b/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx index 9814b412e6e3..b0bda777cd3e 100644 --- a/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/TimePickerElement.tsx @@ -2,19 +2,19 @@ import { InputBox } from '@rocket.chat/fuselage'; import type * as UiKit from '@rocket.chat/ui-kit'; import type { ReactElement } from 'react'; +import { useStringFromTextObject } from '../hooks/useStringFromTextObject'; import { useUiKitState } from '../hooks/useUiKitState'; import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; type TimePickerElementProps = BlockProps; const TimePickerElement = ({ block, context, - surfaceRenderer, }: TimePickerElementProps): ReactElement => { const [{ loading, value, error }, action] = useUiKitState(block, context); const { actionId, placeholder } = block; + const fromTextObjectToString = useStringFromTextObject(); return ( ); diff --git a/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts b/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts deleted file mode 100644 index 10b6790d976a..000000000000 --- a/packages/fuselage-ui-kit/src/extractInitialStateFromLayout.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -type Value = { value: unknown; blockId?: string }; - -type LayoutBlockWithElement = Extract< - UiKit.LayoutBlock, - { element: UiKit.BlockElement | UiKit.TextObject } ->; -type LayoutBlockWithElements = Extract< - UiKit.LayoutBlock, - { elements: readonly (UiKit.BlockElement | UiKit.TextObject)[] } ->; - -const hasElement = ( - block: UiKit.LayoutBlock -): block is LayoutBlockWithElement => 'element' in block; - -const hasElements = ( - block: UiKit.LayoutBlock -): block is LayoutBlockWithElements => - 'elements' in block && Array.isArray(block.elements); - -const isActionableElement = ( - element: UiKit.BlockElement | UiKit.TextObject -): element is UiKit.ActionableElement => - 'actionId' in element && typeof element.actionId === 'string'; - -const hasInitialValue = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialValue: number | string } => - 'initialValue' in element; - -const hasInitialTime = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialTime: string } => - 'initialTime' in element; - -const hasInitialDate = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialDate: string } => - 'initialDate' in element; - -const hasInitialOption = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialOption: UiKit.Option } => - 'initialOption' in element; - -const hasInitialOptions = ( - element: UiKit.ActionableElement -): element is UiKit.ActionableElement & { initialOptions: UiKit.Option[] } => - 'initialOptions' in element; - -const getInitialValue = (element: UiKit.ActionableElement) => - (hasInitialValue(element) && element.initialValue) || - (hasInitialTime(element) && element.initialTime) || - (hasInitialDate(element) && element.initialDate) || - (hasInitialOption(element) && element.initialOption.value) || - (hasInitialOptions(element) && - element.initialOptions.map((option) => option.value)) || - undefined; - -const reduceInitialValuesFromLayoutBlock = ( - state: { [actionId: string]: Value }, - block: UiKit.LayoutBlock -) => { - if (hasElement(block)) { - if (isActionableElement(block.element)) { - state[block.element.actionId] = { - value: getInitialValue(block.element), - blockId: block.blockId, - }; - } - } - - if (hasElements(block)) { - for (const element of block.elements) { - if (isActionableElement(element)) { - state[element.actionId] = { - value: getInitialValue(element), - blockId: block.blockId, - }; - } - } - } - - return state; -}; - -export const extractInitialStateFromLayout = (blocks: UiKit.LayoutBlock[]) => - blocks.reduce(reduceInitialValuesFromLayoutBlock, {}); diff --git a/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts new file mode 100644 index 000000000000..c29cf0953386 --- /dev/null +++ b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.ts @@ -0,0 +1,13 @@ +import { useDebugValue } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { useAppId } from '../contexts/AppIdContext'; + +export const useAppTranslation = () => { + const appId = useAppId(); + const appNs = `app-${appId}`; + + useDebugValue(appNs); + + return useTranslation(appNs); +}; diff --git a/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts b/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts new file mode 100644 index 000000000000..72908da48eca --- /dev/null +++ b/packages/fuselage-ui-kit/src/hooks/useStringFromTextObject.ts @@ -0,0 +1,21 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; +import { useCallback } from 'react'; + +import { useAppTranslation } from './useAppTranslation'; + +export const useStringFromTextObject = () => { + const { t } = useAppTranslation(); + + return useCallback( + (textObject: UiKit.TextObject | undefined): string | undefined => { + if (!textObject) { + return undefined; + } + + return textObject.i18n + ? t?.(textObject.i18n.key, { ...textObject.i18n.args }) + : textObject.text; + }, + [t] + ); +}; diff --git a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts index 56fc553b1996..4468f4fd86a7 100644 --- a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts +++ b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts @@ -3,40 +3,7 @@ import * as UiKit from '@rocket.chat/ui-kit'; import { useContext, useMemo, useState } from 'react'; import { UiKitContext } from '../contexts/UiKitContext'; - -const hasInitialValue = ( - element: TElement -): element is TElement & { initialValue: number | string } => - 'initialValue' in element; - -const hasInitialTime = ( - element: TElement -): element is TElement & { initialTime: string } => 'initialTime' in element; - -const hasInitialDate = ( - element: TElement -): element is TElement & { initialDate: string } => 'initialDate' in element; - -const hasInitialOption = ( - element: TElement -): element is TElement & { initialOption: UiKit.Option } => - 'initialOption' in element; - -const hasInitialOptions = ( - element: TElement -): element is TElement & { initialOptions: UiKit.Option[] } => - 'initialOptions' in element; - -const getInitialValue = ( - element: TElement -) => - (hasInitialValue(element) && element.initialValue) || - (hasInitialTime(element) && element.initialTime) || - (hasInitialDate(element) && element.initialDate) || - (hasInitialOption(element) && element.initialOption.value) || - (hasInitialOptions(element) && - element.initialOptions.map((option) => option.value)) || - undefined; +import { getInitialValue } from '../utils/getInitialValue'; const getElementValueFromState = ( actionId: string, @@ -80,9 +47,9 @@ export const useUiKitState = ( const { blockId, actionId, appId, dispatchActionConfig } = element; const { action, - appId: appIdFromContext, - viewId, - state, + appId: appIdFromContext = undefined, + viewId = undefined, + updateState, } = useContext(UiKitContext); const initialValue = getInitialValue(element); @@ -113,12 +80,14 @@ export const useUiKitState = ( setValue(elValue); } - state && - (await state({ blockId, appId, actionId, value: elValue, viewId }, e)); + await updateState?.( + { blockId, appId, actionId, value: elValue, viewId }, + e + ); await action( { blockId, - appId: appId || appIdFromContext, + appId: appId || appIdFromContext || 'core', actionId, value: elValue, viewId, @@ -135,11 +104,14 @@ export const useUiKitState = ( target: { value }, } = e; setValue(value); - state && (await state({ blockId, appId, actionId, value, viewId }, e)); + + updateState && + (await updateState({ blockId, appId, actionId, value, viewId }, e)); + await action( { blockId, - appId: appId || appIdFromContext, + appId: appId || appIdFromContext || 'core', actionId, value, viewId, @@ -153,11 +125,13 @@ export const useUiKitState = ( const { target: { value }, } = e; + setValue(value); - await state( + + await updateState?.( { blockId, - appId: appId || appIdFromContext, + appId: appId || appIdFromContext || 'core', actionId, value, viewId, diff --git a/packages/fuselage-ui-kit/src/index.ts b/packages/fuselage-ui-kit/src/index.ts index 9db1f2097835..d2d31f0d2ace 100644 --- a/packages/fuselage-ui-kit/src/index.ts +++ b/packages/fuselage-ui-kit/src/index.ts @@ -2,4 +2,4 @@ export * from './hooks/useUiKitState'; export * from './contexts/UiKitContext'; export * from './surfaces'; export { UiKitComponent } from './utils/UiKitComponent'; -export { extractInitialStateFromLayout } from './extractInitialStateFromLayout'; +export { extractInitialStateFromLayout } from './utils/extractInitialStateFromLayout'; diff --git a/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx b/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx index 334d16159db1..81fd72d4771e 100644 --- a/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx +++ b/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx @@ -34,9 +34,12 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[], errors = {}) => { diff --git a/packages/fuselage-ui-kit/src/stories/Message.stories.tsx b/packages/fuselage-ui-kit/src/stories/Message.stories.tsx index e86d766217d8..e98d64c8bcc6 100644 --- a/packages/fuselage-ui-kit/src/stories/Message.stories.tsx +++ b/packages/fuselage-ui-kit/src/stories/Message.stories.tsx @@ -53,9 +53,12 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[]) => { diff --git a/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx b/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx index 3f896c5fce42..52d7ea7eb4cd 100644 --- a/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx +++ b/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx @@ -76,9 +76,12 @@ const createStory = (blocks: readonly UiKit.LayoutBlock[], errors = {}) => { diff --git a/packages/fuselage-ui-kit/src/surfaces/BannerSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/BannerSurfaceRenderer.tsx new file mode 100644 index 000000000000..9749b9fd6600 --- /dev/null +++ b/packages/fuselage-ui-kit/src/surfaces/BannerSurfaceRenderer.tsx @@ -0,0 +1,10 @@ +import { + FuselageSurfaceRenderer, + renderTextObject, +} from './FuselageSurfaceRenderer'; + +export class BannerSurfaceRenderer extends FuselageSurfaceRenderer { + plain_text = renderTextObject; + + mrkdwn = renderTextObject; +} diff --git a/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx new file mode 100644 index 000000000000..48b678365a7f --- /dev/null +++ b/packages/fuselage-ui-kit/src/surfaces/ContextualBarSurfaceRenderer.tsx @@ -0,0 +1,50 @@ +import * as UiKit from '@rocket.chat/ui-kit'; +import type { ReactElement } from 'react'; + +import TabNavigationBlock from '../blocks/TabNavigationBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; +import { + FuselageSurfaceRenderer, + renderTextObject, +} from './FuselageSurfaceRenderer'; + +export class ContextualBarSurfaceRenderer extends FuselageSurfaceRenderer { + public constructor() { + super([ + 'actions', + 'context', + 'divider', + 'image', + 'input', + 'section', + 'preview', + 'callout', + 'tab_navigation', + ]); + } + + plain_text = renderTextObject; + + mrkdwn = renderTextObject; + + tab_navigation( + block: UiKit.ExperimentalTabNavigationBlock, + context: UiKit.BlockContext, + index: number + ): ReactElement | null { + if (context === UiKit.BlockContext.BLOCK) { + return ( + + + + ); + } + + return null; + } +} diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageContextualBarRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageContextualBarRenderer.tsx deleted file mode 100644 index 401308ce515c..000000000000 --- a/packages/fuselage-ui-kit/src/surfaces/FuselageContextualBarRenderer.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; - -import TabNavigationBlock from '../blocks/TabNavigationBlock'; -import { FuselageSurfaceRenderer } from './FuselageSurfaceRenderer'; - -export class FuselageContextualBarSurfaceRenderer extends FuselageSurfaceRenderer { - public constructor() { - super([ - 'actions', - 'context', - 'divider', - 'image', - 'input', - 'section', - 'preview', - 'callout', - 'tab_navigation', - ]); - } - - tab_navigation( - block: UiKit.ExperimentalTabNavigationBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - - ); - } - - return null; - } -} diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx new file mode 100644 index 000000000000..610dd1f408c5 --- /dev/null +++ b/packages/fuselage-ui-kit/src/surfaces/FuselageMessageSurfaceRenderer.tsx @@ -0,0 +1,49 @@ +import * as UiKit from '@rocket.chat/ui-kit'; +import type { ReactElement } from 'react'; + +import VideoConferenceBlock from '../blocks/VideoConferenceBlock/VideoConferenceBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; +import { + FuselageSurfaceRenderer, + renderTextObject, +} from './FuselageSurfaceRenderer'; + +export class FuselageMessageSurfaceRenderer extends FuselageSurfaceRenderer { + public constructor() { + super([ + 'actions', + 'context', + 'divider', + 'image', + 'input', + 'section', + 'preview', + 'video_conf', + ]); + } + + plain_text = renderTextObject; + + mrkdwn = renderTextObject; + + video_conf( + block: UiKit.VideoConferenceBlock, + context: UiKit.BlockContext, + index: number + ): ReactElement | null { + if (context === UiKit.BlockContext.BLOCK) { + return ( + + + + ); + } + + return null; + } +} diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageModalSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageModalSurfaceRenderer.tsx deleted file mode 100644 index 95ca84cdab23..000000000000 --- a/packages/fuselage-ui-kit/src/surfaces/FuselageModalSurfaceRenderer.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { FuselageSurfaceRenderer } from './FuselageSurfaceRenderer'; - -export class FuselageModalSurfaceRenderer extends FuselageSurfaceRenderer { - public constructor() { - super([ - 'actions', - 'context', - 'divider', - 'image', - 'input', - 'section', - 'preview', - 'callout', - ]); - } -} diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx index 1adaea6089ed..a2cbdb62d16c 100644 --- a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx +++ b/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx @@ -1,5 +1,5 @@ import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; +import { type ReactElement } from 'react'; import ActionsBlock from '../blocks/ActionsBlock'; import CalloutBlock from '../blocks/CalloutBlock'; @@ -9,6 +9,7 @@ import ImageBlock from '../blocks/ImageBlock'; import InputBlock from '../blocks/InputBlock'; import PreviewBlock from '../blocks/PreviewBlock'; import SectionBlock from '../blocks/SectionBlock'; +import { AppIdProvider } from '../contexts/AppIdContext'; import ButtonElement from '../elements/ButtonElement'; import CheckboxElement from '../elements/CheckboxElement'; import DatePickerElement from '../elements/DatePickerElement'; @@ -24,11 +25,52 @@ import StaticSelectElement from '../elements/StaticSelectElement'; import TimePickerElement from '../elements/TimePickerElement'; import ToggleSwitchElement from '../elements/ToggleSwitchElement'; -export type FuselageSurfaceRendererProps = ConstructorParameters< +type TextObjectRenderers = { + [TTextObject in UiKit.TextObject as TTextObject['type']]: ( + textObject: TTextObject, + index: number + ) => ReactElement | null; +}; + +const textObjectRenderers: TextObjectRenderers = { + plain_text: (textObject, index) => ( + + ), + mrkdwn: (textObject, index) => ( + + ), +}; + +export const renderTextObject = ( + textObject: UiKit.TextObject, + context: UiKit.BlockContext, + index: number +) => { + if (context === UiKit.BlockContext.BLOCK) { + return null; + } + + switch (textObject.type) { + case 'plain_text': + return textObjectRenderers.plain_text(textObject, index); + + case 'mrkdwn': + return textObjectRenderers.mrkdwn(textObject, index); + } +}; + +const isImageBlock = ( + _elementOrBlock: UiKit.ImageBlock | UiKit.ImageElement, + context: UiKit.BlockContext +): _elementOrBlock is UiKit.ImageBlock => { + return context === UiKit.BlockContext.BLOCK; +}; + +type FuselageSurfaceRendererProps = ConstructorParameters< typeof UiKit.SurfaceRenderer >[0]; -export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer { +export abstract class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer { public constructor(allowedBlocks?: FuselageSurfaceRendererProps) { super( allowedBlocks || [ @@ -44,7 +86,7 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } public plain_text( - textObject: UiKit.TextObject, + textObject: UiKit.PlainText, context: UiKit.BlockContext, index: number ): ReactElement | null { @@ -52,7 +94,7 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer return null; } - return ; + return textObjectRenderers.plain_text(textObject, index); } public mrkdwn( @@ -86,13 +128,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } @@ -125,13 +168,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } @@ -145,13 +189,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } @@ -163,15 +208,16 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer context: UiKit.BlockContext, index: number ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { + if (isImageBlock(block, context)) { return ( - + + + ); } @@ -193,13 +239,17 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + appId={block.appId} + > + + ); } @@ -213,13 +263,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } @@ -236,13 +287,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -256,13 +308,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -276,13 +329,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -296,13 +350,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -316,13 +371,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -336,13 +392,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -356,13 +413,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -376,13 +434,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -396,13 +455,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -416,13 +476,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } @@ -433,13 +494,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer ): ReactElement | null { if (context === UiKit.BlockContext.BLOCK) { return ( - + + + ); } @@ -456,13 +518,14 @@ export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer } return ( - + + + ); } } diff --git a/packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx deleted file mode 100644 index 2be769bd1f14..000000000000 --- a/packages/fuselage-ui-kit/src/surfaces/MessageSurfaceRenderer.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; - -import VideoConferenceBlock from '../blocks/VideoConferenceBlock/VideoConferenceBlock'; -import { FuselageSurfaceRenderer } from './FuselageSurfaceRenderer'; - -export class FuselageMessageSurfaceRenderer extends FuselageSurfaceRenderer { - public constructor() { - super([ - 'actions', - 'context', - 'divider', - 'image', - 'input', - 'section', - 'preview', - 'video_conf', - ]); - } - - video_conf( - block: UiKit.VideoConferenceBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - - ); - } - - return null; - } -} diff --git a/packages/fuselage-ui-kit/src/surfaces/ModalSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/ModalSurfaceRenderer.tsx new file mode 100644 index 000000000000..8e7e63d8d074 --- /dev/null +++ b/packages/fuselage-ui-kit/src/surfaces/ModalSurfaceRenderer.tsx @@ -0,0 +1,23 @@ +import { + FuselageSurfaceRenderer, + renderTextObject, +} from './FuselageSurfaceRenderer'; + +export class ModalSurfaceRenderer extends FuselageSurfaceRenderer { + public constructor() { + super([ + 'actions', + 'context', + 'divider', + 'image', + 'input', + 'section', + 'preview', + 'callout', + ]); + } + + plain_text = renderTextObject; + + mrkdwn = renderTextObject; +} diff --git a/packages/fuselage-ui-kit/src/surfaces/index.ts b/packages/fuselage-ui-kit/src/surfaces/index.ts index be873f6b464c..8b92a4d646a2 100644 --- a/packages/fuselage-ui-kit/src/surfaces/index.ts +++ b/packages/fuselage-ui-kit/src/surfaces/index.ts @@ -1,20 +1,18 @@ import BannerSurface from './BannerSurface'; +import { BannerSurfaceRenderer } from './BannerSurfaceRenderer'; import ContextualBarSurface from './ContextualBarSurface'; -import { FuselageContextualBarSurfaceRenderer } from './FuselageContextualBarRenderer'; -import { FuselageModalSurfaceRenderer } from './FuselageModalSurfaceRenderer'; -import { FuselageSurfaceRenderer } from './FuselageSurfaceRenderer'; +import { ContextualBarSurfaceRenderer } from './ContextualBarSurfaceRenderer'; +import { FuselageMessageSurfaceRenderer } from './FuselageMessageSurfaceRenderer'; import MessageSurface from './MessageSurface'; -import { FuselageMessageSurfaceRenderer } from './MessageSurfaceRenderer'; import ModalSurface from './ModalSurface'; +import { ModalSurfaceRenderer } from './ModalSurfaceRenderer'; import { createSurfaceRenderer } from './createSurfaceRenderer'; -// export const attachmentParser = new FuselageSurfaceRenderer(); -export const bannerParser = new FuselageSurfaceRenderer(); +export const bannerParser = new BannerSurfaceRenderer(); export const messageParser = new FuselageMessageSurfaceRenderer(); -export const modalParser = new FuselageModalSurfaceRenderer(); -export const contextualBarParser = new FuselageContextualBarSurfaceRenderer(); +export const modalParser = new ModalSurfaceRenderer(); +export const contextualBarParser = new ContextualBarSurfaceRenderer(); -// export const UiKitAttachment = createSurfaceRenderer(AttachmentSurface, attachmentParser); export const UiKitBanner = createSurfaceRenderer(BannerSurface, bannerParser); export const UiKitMessage = createSurfaceRenderer( MessageSurface, diff --git a/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts b/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts new file mode 100644 index 000000000000..0fc66c7f72ab --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/extractInitialStateFromLayout.ts @@ -0,0 +1,40 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +import { type Value, getInitialValue } from './getInitialValue'; +import { hasElement } from './hasElement'; +import { hasElements } from './hasElements'; + +const isActionableElement = ( + element: UiKit.BlockElement | UiKit.TextObject +): element is UiKit.ActionableElement => + 'actionId' in element && typeof element.actionId === 'string'; + +const reduceInitialValuesFromLayoutBlock = ( + state: { [actionId: string]: Value }, + block: UiKit.LayoutBlock +) => { + if (hasElement(block)) { + if (isActionableElement(block.element)) { + state[block.element.actionId] = { + value: getInitialValue(block.element), + blockId: block.blockId, + }; + } + } + + if (hasElements(block)) { + for (const element of block.elements) { + if (isActionableElement(element)) { + state[element.actionId] = { + value: getInitialValue(element), + blockId: block.blockId, + }; + } + } + } + + return state; +}; + +export const extractInitialStateFromLayout = (blocks: UiKit.LayoutBlock[]) => + blocks.reduce(reduceInitialValuesFromLayoutBlock, {}); diff --git a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts b/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts deleted file mode 100644 index adc624986c7e..000000000000 --- a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import { renderToStaticMarkup } from 'react-dom/server'; - -export const fromTextObjectToString = ( - surfaceRenderer: UiKit.SurfaceRenderer, - textObject: UiKit.TextObject, - index: number -): string | undefined => { - const element = surfaceRenderer.renderTextObject( - textObject, - index, - UiKit.BlockContext.NONE - ); - - if (!element) { - return undefined; - } - - return renderToStaticMarkup(element); -}; diff --git a/packages/fuselage-ui-kit/src/utils/getInitialValue.ts b/packages/fuselage-ui-kit/src/utils/getInitialValue.ts new file mode 100644 index 000000000000..7e75d4d5231c --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/getInitialValue.ts @@ -0,0 +1,37 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +export type Value = { value: unknown; blockId?: string }; + +const hasInitialValue = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialValue: number | string } => + 'initialValue' in element; + +const hasInitialTime = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialTime: string } => + 'initialTime' in element; + +const hasInitialDate = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialDate: string } => + 'initialDate' in element; + +const hasInitialOption = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialOption: UiKit.Option } => + 'initialOption' in element; + +const hasInitialOptions = ( + element: UiKit.ActionableElement +): element is UiKit.ActionableElement & { initialOptions: UiKit.Option[] } => + 'initialOptions' in element; + +export const getInitialValue = (element: UiKit.ActionableElement) => + (hasInitialValue(element) && element.initialValue) || + (hasInitialTime(element) && element.initialTime) || + (hasInitialDate(element) && element.initialDate) || + (hasInitialOption(element) && element.initialOption.value) || + (hasInitialOptions(element) && + element.initialOptions.map((option) => option.value)) || + undefined; diff --git a/packages/fuselage-ui-kit/src/utils/hasElement.ts b/packages/fuselage-ui-kit/src/utils/hasElement.ts new file mode 100644 index 000000000000..42484addf444 --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/hasElement.ts @@ -0,0 +1,10 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +type LayoutBlockWithElement = Extract< + UiKit.LayoutBlock, + { element: UiKit.BlockElement | UiKit.TextObject } +>; + +export const hasElement = ( + block: UiKit.LayoutBlock +): block is LayoutBlockWithElement => 'element' in block; diff --git a/packages/fuselage-ui-kit/src/utils/hasElements.ts b/packages/fuselage-ui-kit/src/utils/hasElements.ts new file mode 100644 index 000000000000..9df00cda1768 --- /dev/null +++ b/packages/fuselage-ui-kit/src/utils/hasElements.ts @@ -0,0 +1,11 @@ +import type * as UiKit from '@rocket.chat/ui-kit'; + +type LayoutBlockWithElements = Extract< + UiKit.LayoutBlock, + { elements: readonly (UiKit.BlockElement | UiKit.TextObject)[] } +>; + +export const hasElements = ( + block: UiKit.LayoutBlock +): block is LayoutBlockWithElements => + 'elements' in block && Array.isArray(block.elements); diff --git a/packages/fuselage-ui-kit/tsconfig-cjs.json b/packages/fuselage-ui-kit/tsconfig-cjs.json index 44b902831e41..d4ac04a4fbc0 100644 --- a/packages/fuselage-ui-kit/tsconfig-cjs.json +++ b/packages/fuselage-ui-kit/tsconfig-cjs.json @@ -1,7 +1,10 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "module": "commonjs", + "rootDir": "./src", + "module": "CommonJS", "outDir": "./dist/cjs" - } + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*"] } diff --git a/packages/fuselage-ui-kit/tsconfig-esm.json b/packages/fuselage-ui-kit/tsconfig-esm.json index 48e68b0620b4..e7628b7b0174 100644 --- a/packages/fuselage-ui-kit/tsconfig-esm.json +++ b/packages/fuselage-ui-kit/tsconfig-esm.json @@ -1,7 +1,10 @@ { "extends": "./tsconfig.json", "compilerOptions": { + "rootDir": "./src", "module": "ESNext", "outDir": "./dist/esm" - } + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*"] } diff --git a/packages/fuselage-ui-kit/tsconfig.json b/packages/fuselage-ui-kit/tsconfig.json index 5ab46c7245c9..59d360dca033 100644 --- a/packages/fuselage-ui-kit/tsconfig.json +++ b/packages/fuselage-ui-kit/tsconfig.json @@ -1,11 +1,14 @@ { "extends": "../../tsconfig.base.client.json", "compilerOptions": { - "rootDir": "./src", + "module": "CommonJS", + "rootDirs": ["./src", "./.storybook"], "outDir": "./dist", "allowJs": false, "noImplicitReturns": true, "noImplicitThis": true, + "jsx": "react-jsx" }, - "exclude": ["node_modules", "dist"] + "include": ["src", ".storybook/**/*"], + "exclude": ["node_modules", "dist", "src/**/*.stories.tsx"] } diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index 336e44b65402..9eb50f2eb05d 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,272 @@ # @rocket.chat/gazzodown +## 3.0.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/ui-contexts@3.0.2 +- @rocket.chat/ui-client@3.0.2 + +## 3.0.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + - @rocket.chat/ui-contexts@3.0.1 + - @rocket.chat/ui-client@3.0.1 + +## 3.0.0 + +### Patch Changes + +- c2f337664e: fixed an issue with mentions showing usernames instead of names on smaller screens +- Updated dependencies [7da1edf866] +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/ui-contexts@3.0.0 + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/ui-client@3.0.0 + +## 3.0.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/ui-contexts@3.0.0-rc.19 +- @rocket.chat/ui-client@3.0.0-rc.19 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/ui-contexts@3.0.0-rc.18 +- @rocket.chat/ui-client@3.0.0-rc.18 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/ui-contexts@3.0.0-rc.17 +- @rocket.chat/ui-client@3.0.0-rc.17 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/ui-contexts@3.0.0-rc.16 +- @rocket.chat/ui-client@3.0.0-rc.16 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/ui-contexts@3.0.0-rc.15 +- @rocket.chat/ui-client@3.0.0-rc.15 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/ui-contexts@3.0.0-rc.14 +- @rocket.chat/ui-client@3.0.0-rc.14 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/ui-contexts@3.0.0-rc.13 +- @rocket.chat/ui-client@3.0.0-rc.13 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/ui-contexts@3.0.0-rc.12 +- @rocket.chat/ui-client@3.0.0-rc.12 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/ui-contexts@3.0.0-rc.11 +- @rocket.chat/ui-client@3.0.0-rc.11 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/ui-contexts@3.0.0-rc.10 +- @rocket.chat/ui-client@3.0.0-rc.10 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/ui-contexts@3.0.0-rc.9 +- @rocket.chat/ui-client@3.0.0-rc.9 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/ui-contexts@3.0.0-rc.8 +- @rocket.chat/ui-client@3.0.0-rc.8 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/ui-client@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/ui-client@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/ui-client@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/ui-client@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/ui-client@3.0.0-rc.3 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/ui-contexts@3.0.0-rc.2 +- @rocket.chat/ui-client@3.0.0-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/ui-contexts@3.0.0-rc.1 +- @rocket.chat/ui-client@3.0.0-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- c2f337664e: fixed an issue with mentions showing usernames instead of names on smaller screens +- Updated dependencies [7da1edf866] +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/ui-client@3.0.0-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/ui-client@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/ui-client@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/ui-client@2.0.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/ui-contexts@2.0.5 +- @rocket.chat/ui-client@2.0.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/ui-contexts@2.0.4 +- @rocket.chat/ui-client@2.0.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/ui-contexts@2.0.3 +- @rocket.chat/ui-client@2.0.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/ui-contexts@2.0.2 +- @rocket.chat/ui-client@2.0.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/ui-contexts@2.0.1 +- @rocket.chat/ui-client@2.0.1 + ## 2.0.0 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 311950f2222d..ded010f61656 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,15 +1,15 @@ { "name": "@rocket.chat/gazzodown", - "version": "2.0.0", + "version": "3.0.2", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/css-in-js": "next", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-tokens": "^0.32.0", - "@rocket.chat/message-parser": "next", - "@rocket.chat/styled": "next", + "@rocket.chat/css-in-js": "~0.31.25", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-tokens": "~0.32.0", + "@rocket.chat/message-parser": "~0.31.27", + "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-client": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", "@storybook/addon-actions": "~6.5.16", @@ -21,15 +21,15 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/core": "^1.3.66", - "@swc/jest": "^0.2.26", + "@swc/core": "^1.3.95", + "@swc/jest": "^0.2.29", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "~12.1.5", - "@types/jest": "~29.5.3", - "@types/katex": "~0.16.0", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", - "@types/testing-library__jest-dom": "~5.14.6", + "@types/jest": "~29.5.7", + "@types/katex": "~0.16.5", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", + "@types/testing-library__jest-dom": "~5.14.9", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "babel-loader": "^8.3.0", @@ -37,16 +37,16 @@ "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", + "eslint-plugin-storybook": "~0.6.15", "identity-obj-proxy": "^3.0.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", - "katex": "~0.16.7", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", + "katex": "~0.16.9", "outdent": "^0.8.0", "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "~17.0.2", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -65,14 +65,14 @@ "/dist" ], "peerDependencies": { - "@rocket.chat/core-typings": "6.4.0", + "@rocket.chat/core-typings": "6.6.0-develop", "@rocket.chat/css-in-js": "*", "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "2.0.0", - "@rocket.chat/ui-contexts": "2.0.0", + "@rocket.chat/ui-client": "3.0.2", + "@rocket.chat/ui-contexts": "3.0.2", "katex": "*", "react": "*" }, diff --git a/packages/gazzodown/src/MarkupInteractionContext.ts b/packages/gazzodown/src/MarkupInteractionContext.ts index 40acaf634802..70fc32d33496 100644 --- a/packages/gazzodown/src/MarkupInteractionContext.ts +++ b/packages/gazzodown/src/MarkupInteractionContext.ts @@ -1,19 +1,19 @@ -import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { MessageMention } from '@rocket.chat/core-typings'; import type * as MessageParser from '@rocket.chat/message-parser'; import { createContext, FormEvent, UIEvent } from 'react'; -export type UserMention = Pick; -export type ChannelMention = Pick; +export type UserMention = MessageMention; +export type ChannelMention = MessageMention; type MarkupInteractionContextValue = { detectEmoji?: (text: string) => { name: string; className: string; image?: string; content: string }[]; highlightRegex?: () => RegExp; markRegex?: () => RegExp; onTaskChecked?: (task: MessageParser.Task) => ((e: FormEvent) => void) | undefined; - resolveUserMention?: (mention: string) => UserMention | undefined; - onUserMentionClick?: (mentionedUser: UserMention) => ((e: UIEvent) => void) | undefined; - resolveChannelMention?: (mention: string) => ChannelMention | undefined; - onChannelMentionClick?: (mentionedChannel: ChannelMention) => ((e: UIEvent) => void) | undefined; + resolveUserMention?: (mention: string) => MessageMention | undefined; + onUserMentionClick?: (mentionedUser: MessageMention) => ((e: UIEvent) => void) | undefined; + resolveChannelMention?: (mention: string) => MessageMention | undefined; + onChannelMentionClick?: (mentionedChannel: MessageMention) => ((e: UIEvent) => void) | undefined; convertAsciiToEmoji?: boolean; useEmoji?: boolean; useRealName?: boolean; diff --git a/packages/gazzodown/src/mentions/UserMentionElement.tsx b/packages/gazzodown/src/mentions/UserMentionElement.tsx index 308363309aa2..a25106918af8 100644 --- a/packages/gazzodown/src/mentions/UserMentionElement.tsx +++ b/packages/gazzodown/src/mentions/UserMentionElement.tsx @@ -13,14 +13,11 @@ const handleUserMention = (mention: string | undefined, withSymbol: boolean | un const UserMentionElement = ({ mention }: UserMentionElementProps): ReactElement => { const t = useTranslation(); - const { resolveUserMention, onUserMentionClick, isMobile, ownUserId, useRealName, showMentionSymbol } = - useContext(MarkupInteractionContext); + const { resolveUserMention, onUserMentionClick, ownUserId, useRealName, showMentionSymbol } = useContext(MarkupInteractionContext); const resolved = useMemo(() => resolveUserMention?.(mention), [mention, resolveUserMention]); const handleClick = useMemo(() => (resolved ? onUserMentionClick?.(resolved) : undefined), [resolved, onUserMentionClick]); - const showRealName = useRealName && !isMobile; - if (mention === 'all') { return ( @@ -49,7 +46,7 @@ const UserMentionElement = ({ mention }: UserMentionElementProps): ReactElement onClick={handleClick} data-uid={resolved._id} > - {handleUserMention((showRealName ? resolved.name : resolved.username) ?? mention, showMentionSymbol)} + {handleUserMention((useRealName ? resolved.name : resolved.username) ?? mention, showMentionSymbol)} ); }; diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index 7eecb2d845e9..c2a74c4a5327 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/i18n +## 0.0.3 + +### Patch Changes + +- 747ec6c70e: Updated slack bridge to add support for connecting using slack apps in addition to the slack legacy bot + +## 0.0.3-rc.0 + +### Patch Changes + +- 747ec6c70e: Updated slack bridge to add support for connecting using slack apps in addition to the slack legacy bot + ## 0.0.2 ### Patch Changes diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 08c924493580..7d1e35fa507f 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,16 +1,16 @@ { "name": "@rocket.chat/i18n", - "version": "0.0.2", + "version": "0.0.3", "private": true, "devDependencies": { - "@babel/core": "~7.22.10", - "@babel/preset-env": "~7.22.10", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "babel-jest": "^29.5.0", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", + "jest": "~29.6.4", + "ts-jest": "~29.1.1", "tsup": "^6.7.0", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "build": "node ./src/index.mjs", diff --git a/packages/i18n/src/index.mjs b/packages/i18n/src/index.mjs index 41f5eb83a4d6..3204c6c3fd80 100644 --- a/packages/i18n/src/index.mjs +++ b/packages/i18n/src/index.mjs @@ -88,9 +88,13 @@ const tds = `export interface RocketchatI18n { ${keys.map((key) => `${JSON.stringify(key)}: string;`).join('\n\t')} } -export declare const dict: Record; +const dict: { + [language: string]: RocketchatI18n; +}; export type RocketchatI18nKeys = keyof RocketchatI18n; + +export = dict; `; const languages = files.map((file) => path.basename(file, '.i18n.json')); diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index 3c454da0e972..d728fe76837a 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,191 @@ # @rocket.chat/instance-status +## 0.0.26 + +### Patch Changes + +- @rocket.chat/models@0.0.26 + +## 0.0.25 + +### Patch Changes + +- @rocket.chat/models@0.0.25 + +## 0.0.24 + +### Patch Changes + +- @rocket.chat/models@0.0.24 + +## 0.0.24-rc.12 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.12 + +## 0.0.24-rc.11 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.11 + +## 0.0.24-rc.10 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.10 + +## 0.0.24-rc.9 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.9 + +## 0.0.24-rc.8 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.8 + +## 0.0.24-rc.7 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.7 + +## 0.0.24-rc.6 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.6 + +## 0.0.24-rc.5 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.5 + +## 0.0.24-rc.4 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.4 + +## 0.0.24-rc.3 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.3 + +## 0.0.24-rc.2 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.2 + +## 0.0.24-rc.1 + +### Patch Changes + +- @rocket.chat/models@0.0.24-rc.1 + +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.3 + +## 0.0.21-rc.2 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.2 + +## 0.0.21-rc.1 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.1 + +## 0.0.21-rc.0 + +### Patch Changes + +- @rocket.chat/models@0.0.21-rc.0 + +## 0.0.23 + +### Patch Changes + +- @rocket.chat/models@0.0.23 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/models@0.0.22 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/models@0.0.21 + +## 0.0.20 + +### Patch Changes + +- @rocket.chat/models@0.0.20 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/models@0.0.19 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/models@0.0.18 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/models@0.0.17 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/models@0.0.16 + ## 0.0.15 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 4b6d8a882650..0d17ac557a2c 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.15", + "version": "0.0.26", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", "mongodb": "^4.17.1", "prettier": "~2.8.8", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/jwt/CHANGELOG.md b/packages/jwt/CHANGELOG.md new file mode 100644 index 000000000000..7f571b1cf1df --- /dev/null +++ b/packages/jwt/CHANGELOG.md @@ -0,0 +1,17 @@ +# @rocket.chat/jwt + +## 0.1.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +## 0.1.0-rc.0 + +### Minor Changes + +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. diff --git a/packages/jwt/package.json b/packages/jwt/package.json index b6be368917c3..144fb408411c 100644 --- a/packages/jwt/package.json +++ b/packages/jwt/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/jwt", - "version": "0.0.1", + "version": "0.1.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "ts-jest": "^29.1.1", - "typescript": "~5.2.2" + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index 7d537677ad04..ba3fff4290d5 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,194 @@ # @rocket.chat/livechat Change Log +## 1.14.11 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.2 + +## 1.14.10 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.1 + +## 1.14.9 + +### Patch Changes + +- Updated dependencies [c2f337664e] + - @rocket.chat/gazzodown@3.0.0 + +## 1.14.9-rc.12 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.19 + +## 1.14.9-rc.11 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.18 + +## 1.14.9-rc.10 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.17 + +## 1.14.9-rc.9 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.16 + +## 1.14.9-rc.8 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.15 + +## 1.14.9-rc.7 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.14 + +## 1.14.9-rc.6 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.13 + +## 1.14.9-rc.5 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.12 + +## 1.14.9-rc.4 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.11 + +## 1.14.9-rc.3 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.10 + +## 1.14.9-rc.2 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.9 + +## 1.14.9-rc.1 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.8 + +## 1.14.6-rc.7 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.7 + +## 1.14.6-rc.6 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.6 + +## 1.14.6-rc.5 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.5 + +## 1.14.6-rc.4 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.4 + +## 1.14.6-rc.3 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.3 + +## 1.14.6-rc.2 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.2 + +## 1.14.6-rc.1 + +### Patch Changes + +- @rocket.chat/gazzodown@3.0.0-rc.1 + +## 1.14.6-rc.0 + +### Patch Changes + +- Updated dependencies [c2f337664e] + - @rocket.chat/gazzodown@3.0.0-rc.0 + +## 1.14.8 + +### Patch Changes + +- d1c8e7ac13: Fixes reactivity issue with `registerGuest` Widget API Call, as well as other similar endpoint + - @rocket.chat/gazzodown@2.0.8 + +## 1.14.7 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.7 + +## 1.14.6 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.6 + +## 1.14.5 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.5 + +## 1.14.4 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.4 + +## 1.14.3 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.3 + +## 1.14.2 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.2 + +## 1.14.1 + +### Patch Changes + +- @rocket.chat/gazzodown@2.0.1 + ## 1.14.0 ### Minor Changes diff --git a/packages/livechat/README.md b/packages/livechat/README.md index 1b24a289a931..5e50c14da2c2 100644 --- a/packages/livechat/README.md +++ b/packages/livechat/README.md @@ -77,6 +77,7 @@ yarn test # run the storybook yarn storybook +``` ## Screens: ![image](https://user-images.githubusercontent.com/5263975/44279585-497b2980-a228-11e8-81a2-36bc3389549e.png) diff --git a/packages/livechat/package.json b/packages/livechat/package.json index bb92a0716669..9681dde5b0d4 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.14.0", + "version": "1.14.11", "files": [ "/build" ], @@ -24,23 +24,22 @@ "typecheck": "tsc -p tsconfig.typecheck.json" }, "devDependencies": { - "@babel/eslint-parser": "~7.22.9", - "@babel/preset-env": "~7.22.9", - "@babel/preset-typescript": "~7.22.5", + "@babel/eslint-parser": "~7.23.3", + "@babel/preset-env": "~7.22.20", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/ddp-client": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage-tokens": "^0.32.0", - "@rocket.chat/logo": "^0.31.28", + "@rocket.chat/fuselage-tokens": "~0.32.0", + "@rocket.chat/logo": "~0.31.28", "@storybook/addon-essentials": "~6.5.16", "@storybook/addon-postcss": "~2.0.0", "@storybook/preact": "~6.5.16", "@storybook/theming": "~6.5.16", - "@types/crypto-js": "~4.1.1", + "@types/crypto-js": "~4.1.3", "@types/mini-css-extract-plugin": "~1.4.3", - "@types/terser-webpack-plugin": "~4.2.2", - "@types/webpack": "~4.41.33", - "@types/webpack-bundle-analyzer": "^4", + "@types/webpack": "^5.28.4", + "@types/webpack-bundle-analyzer": "^4.6.2", "@types/webpack-dev-server": "~4.7.2", "@types/whatwg-fetch": "~0.0.33", "@typescript-eslint/eslint-plugin": "~5.60.1", @@ -57,7 +56,7 @@ "eslint-plugin-react-hooks": "~4.6.0", "file-loader": "^6.2.0", "gh-release": "^3.5.0", - "html-webpack-plugin": "^4.4.1", + "html-webpack-plugin": "^5.5.3", "husky": "^4.3.8", "if-env": "^1.0.4", "image-webpack-loader": "~8.1.0", @@ -70,7 +69,7 @@ "postcss-ie11-supports": "^0.1.3", "postcss-loader": "^3.0.0", "postcss-logical": "^4.0.2", - "postcss-scss": "^4.0.6", + "postcss-scss": "^4.0.9", "postcss-selector-not": "^4.0.1", "react-dom": "~17.0.2", "rimraf": "^3.0.2", @@ -82,11 +81,11 @@ "stylelint-order": "^5.0.0", "svg-loader": "^0.0.2", "terser-webpack-plugin": "~4.2.3", - "typescript": "~5.2.2", + "typescript": "~5.3.2", "url-loader": "^4.1.1", - "webpack": "~4.46.0", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-cli": "~4.10.0", + "webpack": "^5.89.0", + "webpack-bundle-analyzer": "^4.9.1", + "webpack-cli": "^5.1.4", "webpack-dev-server": "~4.13.3" }, "peerDependencies": { @@ -95,15 +94,15 @@ }, "dependencies": { "@rocket.chat/gazzodown": "workspace:^", - "@rocket.chat/message-parser": "next", + "@rocket.chat/message-parser": "~0.31.27", "@rocket.chat/random": "workspace:~", "@rocket.chat/sdk": "^1.0.0-alpha.42", - "@rocket.chat/ui-kit": "^0.32.1", + "@rocket.chat/ui-kit": "workspace:~", "css-vars-ponyfill": "^2.4.8", "date-fns": "^2.15.0", "emoji-mart": "^3.0.1", "history": "~5.3.0", - "i18next": "~23.4.5", + "i18next": "~23.4.9", "markdown-it": "^11.0.1", "mem": "^6.1.1", "mitt": "^2.1.0", @@ -111,8 +110,8 @@ "preact-router": "^3.2.1", "query-string": "^7.1.3", "react-hook-form": "~7.45.4", - "react-i18next": "~13.2.1", - "whatwg-fetch": "^3.6.2" + "react-i18next": "~13.2.2", + "whatwg-fetch": "^3.6.19" }, "browserslist": [ "last 2 versions", diff --git a/packages/livechat/src/lib/hooks.js b/packages/livechat/src/lib/hooks.js index b988579acfa8..311cf0b2a00b 100644 --- a/packages/livechat/src/lib/hooks.js +++ b/packages/livechat/src/lib/hooks.js @@ -14,6 +14,7 @@ const createOrUpdateGuest = async (guest) => { token && (await store.setState({ token })); const { visitor: user } = await Livechat.grantVisitor({ visitor: { ...guest } }); store.setState({ user }); + await loadConfig(); }; const updateIframeGuestData = (data) => { @@ -137,16 +138,11 @@ const api = { }, async setGuestToken(token) { - const { - token: localToken, - iframe, - iframe: { guest }, - } = store.state; + const { token: localToken } = store.state; if (token === localToken) { return; } - store.setState({ token, iframe: { ...iframe, guest: { ...guest, token } } }); - await loadConfig(); + await createOrUpdateGuest({ token }); }, setGuestName(name) { @@ -157,8 +153,8 @@ const api = { updateIframeGuestData({ email }); }, - registerGuest(data = {}) { - if (typeof data !== 'object') { + async registerGuest(data) { + if (!data || typeof data !== 'object') { return; } @@ -170,7 +166,9 @@ const api = { api.setDepartment(data.department); } - createOrUpdateGuest(data); + Livechat.unsubscribeAll(); + + await createOrUpdateGuest(data); }, async setLanguage(language) { diff --git a/packages/livechat/src/lib/triggers.js b/packages/livechat/src/lib/triggers.js index 4cf01090587c..efa9e9bdc65d 100644 --- a/packages/livechat/src/lib/triggers.js +++ b/packages/livechat/src/lib/triggers.js @@ -34,7 +34,7 @@ const getAgent = (triggerAction) => { let agent; try { - agent = await Livechat.nextAgent(department); + agent = await Livechat.nextAgent({ department }); } catch (error) { return reject(error); } diff --git a/packages/livechat/src/routes/Register/index.tsx b/packages/livechat/src/routes/Register/index.tsx index a4c483db1282..d9df7a5a3d4a 100644 --- a/packages/livechat/src/routes/Register/index.tsx +++ b/packages/livechat/src/routes/Register/index.tsx @@ -81,23 +81,25 @@ export const Register = ({ screenProps }: { screenProps: { [key: string]: unknow ...(department && { department }), }; - await dispatch({ loading: true, department }); + dispatch({ loading: true, department }); try { const { visitor: user } = await Livechat.grantVisitor({ visitor: { ...fields, token } }); - await dispatch({ user }); + dispatch({ user }); parentCall('callback', ['pre-chat-form-submit', fields]); registerCustomFields(customFields); } finally { - await dispatch({ loading: false }); + dispatch({ loading: false }); } }; const getDepartmentDefault = () => { - if (departments?.some((dept) => dept._id === guestDepartment)) { + if (departments.some((dept) => dept._id === guestDepartment)) { return guestDepartment; } }; + const availableDepartments = departments.filter((dept) => dept.showOnRegistration); + useEffect(() => { if (user?._id) { route('/'); @@ -157,7 +159,7 @@ export const Register = ({ screenProps }: { screenProps: { [key: string]: unknow ) : null} - {departments?.some((dept) => dept.showOnRegistration) ? ( + {availableDepartments.length ? ( ( ({ + options={sortArrayByColumn(availableDepartments, 'name').map(({ _id, name }: { _id: string; name: string }) => ({ value: _id, label: name, }))} diff --git a/packages/livechat/src/widget.js b/packages/livechat/src/widget.js index fafccb1f9c22..46781644ec36 100644 --- a/packages/livechat/src/widget.js +++ b/packages/livechat/src/widget.js @@ -54,6 +54,10 @@ function emitCallback(eventName, data) { } } +function clearAllCallbacks() { + callbacks.all.clear(); +} + // hooks function callHook(action, params) { if (!ready) { @@ -305,18 +309,22 @@ function setLanguage(language) { function showWidget() { callHook('showWidget'); + emitCallback('show-widget'); } function hideWidget() { callHook('hideWidget'); + emitCallback('hide-widget'); } function maximizeWidget() { callHook('maximizeWidget'); + emitCallback('chat-maximized'); } function minimizeWidget() { callHook('minimizeWidget'); + emitCallback('chat-minimized'); } function setParentUrl(url) { @@ -467,6 +475,7 @@ window.RocketChat.livechat = { setBusinessUnit, clearBusinessUnit, setParentUrl, + clearAllCallbacks, // callbacks onChatMaximized(fn) { diff --git a/packages/livechat/svg-component-loader.ts b/packages/livechat/svg-component-loader.ts index 8a1624f276db..42e28dc16c65 100644 --- a/packages/livechat/svg-component-loader.ts +++ b/packages/livechat/svg-component-loader.ts @@ -1,9 +1,9 @@ import type webpack from 'webpack'; -const SvgComponentLoader: webpack.loader.Loader = (content) => ` +const SvgComponentLoader: webpack.LoaderDefinition = (content) => ` var preact = require('preact'); var hooks = require('preact/hooks'); -${typeof content === 'string' ? content : content.toString('utf-8')} +${content} var attributes = module.exports.attributes; var content = module.exports.content; diff --git a/packages/livechat/webpack.config.ts b/packages/livechat/webpack.config.ts index be1587356903..361077be2a68 100644 --- a/packages/livechat/webpack.config.ts +++ b/packages/livechat/webpack.config.ts @@ -2,14 +2,13 @@ import path from 'path'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import MiniCssExtractPlugin from 'mini-css-extract-plugin'; -import TerserPlugin from 'terser-webpack-plugin'; import webpack from 'webpack'; import 'webpack-dev-server'; // Helper to use absolute paths in the webpack config const _ = (p: string) => path.resolve(__dirname, p); -const common = (args: webpack.CliConfigOptions): Partial => ({ +const common = (args: webpack.WebpackOptionsNormalized): Partial => ({ stats: 'errors-warnings', mode: args.mode, devtool: args.mode === 'production' ? 'source-map' : 'eval', @@ -23,28 +22,13 @@ const common = (args: webpack.CliConfigOptions): Partial optimization: { sideEffects: false, splitChunks: { - automaticNameDelimiter: '~', chunks: 'all', - maxAsyncRequests: 30, - maxInitialRequests: 30, - minChunks: 1, - minSize: 20000, - maxSize: 0, }, - noEmitOnErrors: true, - ...(args.mode === 'production' && { - minimizer: [ - new TerserPlugin({ - terserOptions: { - mangle: true, - }, - }), - ], - }), + emitOnErrors: false, }, }); -const config: webpack.MultiConfigurationFactory = (_env, args) => [ +const config = (_env: any, args: webpack.WebpackOptionsNormalized): webpack.Configuration[] => [ { ...common(args), entry: { @@ -143,7 +127,7 @@ const config: webpack.MultiConfigurationFactory = (_env, args) => [ new MiniCssExtractPlugin({ filename: args.mode === 'production' ? '[name].[contenthash:5].css' : '[name].css', chunkFilename: args.mode === 'production' ? '[name].chunk.[contenthash:5].css' : '[name].chunk.css', - }) as unknown as webpack.Plugin, + }) as unknown as webpack.WebpackPluginInstance, new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(args.mode === 'production' ? 'production' : 'development'), }), diff --git a/packages/log-format/package.json b/packages/log-format/package.json index dc21d5a87dfe..8ab2f5abc786 100644 --- a/packages/log-format/package.json +++ b/packages/log-format/package.json @@ -4,12 +4,12 @@ "private": true, "devDependencies": { "@types/chalk": "^2.2.0", - "@types/ejson": "^2.2.0", - "@types/jest": "~29.5.3", + "@types/ejson": "^2.2.1", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/logger/package.json b/packages/logger/package.json index 48968b3d5095..7628c4a65e6e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -3,11 +3,11 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -22,7 +22,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/emitter": "next", + "@rocket.chat/emitter": "~0.31.25", "pino": "^8.15.0" } } diff --git a/packages/logger/src/getPino.ts b/packages/logger/src/getPino.ts index 310afa35cb59..9361e168d11e 100644 --- a/packages/logger/src/getPino.ts +++ b/packages/logger/src/getPino.ts @@ -16,12 +16,14 @@ function logMethod(this: Logger, args: unknown[], method: any): void { return method.apply(this, args); } +const infoLevel = process.env.LESS_INFO_LOGS ? 20 : 35; + const mainPino = pino({ hooks: { logMethod }, customLevels: { - http: 35, - method: 35, - subscription: 35, + http: infoLevel, + method: infoLevel, + subscription: infoLevel, startup: 51, }, level: 'warn', diff --git a/packages/mock-providers/CHANGELOG.md b/packages/mock-providers/CHANGELOG.md index 915bcabc5395..2e9a3f48b899 100644 --- a/packages/mock-providers/CHANGELOG.md +++ b/packages/mock-providers/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/mock-providers +## 0.0.3 + +### Patch Changes + +- Updated dependencies [747ec6c70e] + - @rocket.chat/i18n@0.0.3 + +## 0.0.3-rc.0 + +### Patch Changes + +- Updated dependencies [747ec6c70e] + - @rocket.chat/i18n@0.0.3-rc.0 + ## 0.0.2 ### Patch Changes diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index c2aeb2665350..ee0d9a80ed61 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -1,22 +1,22 @@ { "name": "@rocket.chat/mock-providers", - "version": "0.0.2", + "version": "0.0.3", "private": true, "dependencies": { "@rocket.chat/i18n": "workspace:~", - "i18next": "~23.4.5", - "react-i18next": "~13.2.1" + "i18next": "~23.4.9", + "react-i18next": "~13.2.2" }, "devDependencies": { "@rocket.chat/ui-contexts": "workspace:*", "@storybook/react": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "react": "~17.0.2", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "peerDependencies": { "@tanstack/react-query": "*", diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx index ae3eeea4cf1d..15a4db77eb10 100644 --- a/packages/mock-providers/src/MockedAppRootBuilder.tsx +++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx @@ -48,7 +48,6 @@ export class MockedAppRootBuilder { }): Promise>> => { throw new Error('not implemented'); }, - getSingleStream: () => () => () => undefined, getStream: () => () => () => undefined, uploadToEndpoint: () => Promise.reject(new Error('not implemented')), callMethod: () => Promise.reject(new Error('not implemented')), @@ -436,7 +435,10 @@ export class MockedAppRootBuilder { handleServerInteraction: () => undefined, off: () => undefined, on: () => undefined, + openView: () => undefined, disposeView: () => undefined, + notifyBusy: () => undefined, + notifyIdle: () => undefined, }} > {/* diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index 8d03eaafa208..410f6af99889 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,230 @@ # @rocket.chat/model-typings +## 0.2.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + +## 0.2.0 + +### Minor Changes + +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: chore: Calculate & Store MAC stats + Added new info to the stats: `omnichannelContactsBySource`, `uniqueContactsOfLastMonth`, `uniqueContactsOfLastWeek`, `uniqueContactsOfYesterday` +- 223dce18a3: Do not allow auto-translation to be enabled in E2E rooms +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + +## 0.2.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 + +## 0.2.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 + +## 0.2.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 + +## 0.2.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 + +## 0.2.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 + +## 0.2.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 + +## 0.2.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 + +## 0.2.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 + +## 0.2.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 + +## 0.2.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 + +## 0.2.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 + +## 0.2.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 + +## 0.2.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 + +## 0.2.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 + +## 0.2.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 + +## 0.2.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 + +## 0.2.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 + +## 0.2.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 + +## 0.2.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 + +## 0.2.0-rc.0 + +### Minor Changes + +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- dea1fe9191: chore: Calculate & Store MAC stats + Added new info to the stats: `omnichannelContactsBySource`, `uniqueContactsOfLastMonth`, `uniqueContactsOfLastWeek`, `uniqueContactsOfYesterday` +- 223dce18a3: Do not allow auto-translation to be enabled in E2E rooms +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + +## 0.1.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 0.1.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 0.1.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + +## 0.1.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 + +## 0.1.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 + +## 0.1.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 + +## 0.1.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 + +## 0.1.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 + ## 0.1.0 ### Minor Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 5174bf22f97a..50d1dc381102 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,15 +1,15 @@ { "name": "@rocket.chat/model-typings", - "version": "0.1.0", + "version": "0.2.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", - "@types/node-rsa": "^1.1.1", + "@types/jest": "~29.5.7", + "@types/node-rsa": "^1.1.3", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/model-typings/src/index.ts b/packages/model-typings/src/index.ts index a1874b144347..23e77ff1de29 100644 --- a/packages/model-typings/src/index.ts +++ b/packages/model-typings/src/index.ts @@ -79,4 +79,3 @@ export * from './models/IAuditLogModel'; export * from './models/ICronHistoryModel'; export * from './models/IMigrationsModel'; export * from './models/IModerationReportsModel'; -export * from './models/ICloudAnnouncementsModel'; diff --git a/packages/model-typings/src/models/IBannersModel.ts b/packages/model-typings/src/models/IBannersModel.ts index 4fe496bb954c..e0706c2b184a 100644 --- a/packages/model-typings/src/models/IBannersModel.ts +++ b/packages/model-typings/src/models/IBannersModel.ts @@ -9,4 +9,6 @@ export interface IBannersModel extends IBaseModel { findActiveByRoleOrId(roles: string[], platform: BannerPlatform, bannerId?: string, options?: FindOptions): FindCursor; disable(bannerId: string): Promise; + + createOrUpdate(banner: Optional): Promise; } diff --git a/packages/model-typings/src/models/IBaseModel.ts b/packages/model-typings/src/models/IBaseModel.ts index e0ae05cba0c5..36f34a008508 100644 --- a/packages/model-typings/src/models/IBaseModel.ts +++ b/packages/model-typings/src/models/IBaseModel.ts @@ -45,6 +45,8 @@ export interface IBaseModel< > { col: Collection; + createIndexes(): Promise; + getCollectionName(): string; findOneAndUpdate(query: Filter, update: UpdateFilter | T, options?: FindOneAndUpdateOptions): Promise>; diff --git a/packages/model-typings/src/models/ICloudAnnouncementsModel.ts b/packages/model-typings/src/models/ICloudAnnouncementsModel.ts deleted file mode 100644 index 672ff8c316a0..000000000000 --- a/packages/model-typings/src/models/ICloudAnnouncementsModel.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Cloud } from '@rocket.chat/core-typings'; - -import type { IBaseModel } from './IBaseModel'; - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ICloudAnnouncementsModel extends IBaseModel {} diff --git a/packages/model-typings/src/models/IImportsModel.ts b/packages/model-typings/src/models/IImportsModel.ts index a0a2055de588..309160d4c057 100644 --- a/packages/model-typings/src/models/IImportsModel.ts +++ b/packages/model-typings/src/models/IImportsModel.ts @@ -4,7 +4,7 @@ import type { UpdateResult, FindOptions, FindCursor, Document } from 'mongodb'; import type { IBaseModel } from './IBaseModel'; export interface IImportsModel extends IBaseModel { - findLastImport(): Promise; + findLastImport(): Promise; hasValidOperationInStatus(allowedStatus: IImport['status'][]): Promise; invalidateAllOperations(): Promise; invalidateOperationsExceptId(id: string): Promise; diff --git a/packages/model-typings/src/models/ILivechatAgentActivityModel.ts b/packages/model-typings/src/models/ILivechatAgentActivityModel.ts index 9fb4d90fbe0f..8d14e3b6e423 100644 --- a/packages/model-typings/src/models/ILivechatAgentActivityModel.ts +++ b/packages/model-typings/src/models/ILivechatAgentActivityModel.ts @@ -26,11 +26,19 @@ export interface ILivechatAgentActivityModel extends IBaseModel; - findAvailableServiceTimeHistory(params: { + findAvailableServiceTimeHistory(p: { start: string; end: string; fullReport: boolean; - onlyCount: boolean; - options: any; + onlyCount: true; + options?: { sort?: Record; offset?: number; count?: number }; + }): AggregationCursor<{ total: number }>; + + findAvailableServiceTimeHistory(p: { + start: string; + end: string; + fullReport: boolean; + onlyCount?: false; + options?: { sort?: Record; offset?: number; count?: number }; }): AggregationCursor; } diff --git a/packages/model-typings/src/models/ILivechatInquiryModel.ts b/packages/model-typings/src/models/ILivechatInquiryModel.ts index a74ebd2356e9..6cad9d91865e 100644 --- a/packages/model-typings/src/models/ILivechatInquiryModel.ts +++ b/packages/model-typings/src/models/ILivechatInquiryModel.ts @@ -19,6 +19,7 @@ export interface ILivechatInquiryModel extends IBaseModel; findNextAndLock(queueSortBy: OmnichannelSortingMechanismSettingType, department?: string): Promise; unlock(inquiryId: string): Promise; + unlockAndQueue(inquiryId: string): Promise; unlockAll(): Promise; getCurrentSortedQueueAsync(props: { inquiryId?: string; @@ -40,4 +41,5 @@ export interface ILivechatInquiryModel extends IBaseModel; removeDefaultAgentById(inquiryId: string): Promise; removeByVisitorToken(token: string): Promise; + markInquiryActiveForPeriod(rid: string, period: string): Promise; } diff --git a/packages/model-typings/src/models/ILivechatRoomsModel.ts b/packages/model-typings/src/models/ILivechatRoomsModel.ts index 20100cbb4f61..a228a4fea864 100644 --- a/packages/model-typings/src/models/ILivechatRoomsModel.ts +++ b/packages/model-typings/src/models/ILivechatRoomsModel.ts @@ -135,7 +135,7 @@ export interface ILivechatRoomsModel extends IBaseModel { updateSurveyFeedbackById(_id: string, surveyFeedback: unknown): Promise; updateDataByToken(token: string, key: string, value: string, overwrite?: boolean): Promise; saveRoomById( - data: { _id: string; topic: string; tags: string[]; livechatData?: Record } & Record, + data: { _id: string; topic?: string; tags?: string[]; livechatData?: Record } & Record, ): Promise; findById(_id: string, fields?: FindOptions['projection']): FindCursor; findByIds( @@ -176,7 +176,7 @@ export interface ILivechatRoomsModel extends IBaseModel { findOneOpenByVisitorToken(visitorToken: string, options?: FindOptions): Promise; findOneOpenByVisitorTokenAndDepartmentIdAndSource( visitorToken: string, - departmentId: string, + departmentId?: string, source?: string, options?: FindOptions, ): Promise; @@ -215,13 +215,13 @@ export interface ILivechatRoomsModel extends IBaseModel { getAnalyticsMetricsBetweenDate( t: 'l', date: { gte: Date; lt: Date }, - data?: { departmentId: string }, + data?: { departmentId?: string }, extraQuery?: Filter, ): FindCursor>; getAnalyticsMetricsBetweenDateWithMessages( t: string, date: { gte: Date; lt: Date }, - data?: { departmentId: string }, + data?: { departmentId?: string }, extraQuery?: Document, extraMatchers?: Document, ): AggregationCursor>; diff --git a/packages/model-typings/src/models/ILivechatVisitorsModel.ts b/packages/model-typings/src/models/ILivechatVisitorsModel.ts index 5c598c6a6a97..b899d42a015f 100644 --- a/packages/model-typings/src/models/ILivechatVisitorsModel.ts +++ b/packages/model-typings/src/models/ILivechatVisitorsModel.ts @@ -60,4 +60,8 @@ export interface ILivechatVisitorsModel extends IBaseModel { findEnabled(query: Filter, options?: FindOptions): FindCursor; countVisitorsOnPeriod(period: string): Promise; + saveGuestById( + _id: string, + data: { name?: string; username?: string; email?: string; phone?: string; livechatData: { [k: string]: any } }, + ): Promise; } diff --git a/packages/model-typings/src/models/IMessagesModel.ts b/packages/model-typings/src/models/IMessagesModel.ts index d681405850fa..143080799671 100644 --- a/packages/model-typings/src/models/IMessagesModel.ts +++ b/packages/model-typings/src/models/IMessagesModel.ts @@ -18,10 +18,18 @@ import type { UpdateResult, Document, Filter, + ModifyResult, } from 'mongodb'; import type { FindPaginated, IBaseModel } from './IBaseModel'; +type PaginatedRequest = { + count?: number; + offset?: number; + sort?: `{ "${S}": ${1 | -1} }` | string; + /* deprecated */ + query?: string; +}; export interface IMessagesModel extends IBaseModel { findPaginatedVisibleByMentionAndRoomId( username: IUser['username'], @@ -43,13 +51,21 @@ export interface IMessagesModel extends IBaseModel { findDiscussionsByRoomAndText(rid: IRoom['_id'], text: string, options?: FindOptions): FindPaginated>; - findAllNumberOfTransferredRooms(params: { - start: string; - end: string; - departmentId: ILivechatDepartment['_id']; - onlyCount: boolean; - options: any; - }): AggregationCursor; + findAllNumberOfTransferredRooms(p: { + start: Date; + end: Date; + departmentId?: ILivechatDepartment['_id']; + onlyCount: true; + options?: PaginatedRequest; + }): AggregationCursor<{ total: number }>; + + findAllNumberOfTransferredRooms(p: { + start: Date; + end: Date; + departmentId?: ILivechatDepartment['_id']; + onlyCount?: false; + options?: PaginatedRequest; + }): AggregationCursor<{ _id: string | null; numberOfTransferredRooms: number }>; getTotalOfMessagesSentByDate(params: { start: Date; end: Date; options?: any }): Promise; @@ -252,7 +268,7 @@ export interface IMessagesModel extends IBaseModel { getMessageByFileId(fileID: string): Promise; setThreadMessagesAsRead(tmid: string, until: Date): Promise; updateRepliesByThreadId(tmid: string, replies: string[], ts: Date): Promise; - refreshDiscussionMetadata(room: Pick): Promise; + refreshDiscussionMetadata(room: Pick): Promise>; findUnreadThreadMessagesByDate( tmid: string, userId: string, diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index 66ffe9232749..a4743216f7d4 100644 --- a/packages/model-typings/src/models/IRoomsModel.ts +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -110,6 +110,8 @@ export interface IRoomsModel extends IBaseModel { findOneByNameOrFname(name: NonNullable, options?: FindOptions): Promise; + findOneByJoinCodeAndId(joinCode: string, rid: IRoom['_id'], options?: FindOptions): Promise; + findOneByNonValidatedName(name: NonNullable, options?: FindOptions): Promise; allRoomSourcesCount(): AggregationCursor<{ _id: Required; count: number }>; @@ -239,7 +241,7 @@ export interface IRoomsModel extends IBaseModel { incUsersCountById(rid: string, inc: number): Promise; incUsersCountNotDMsByIds(rids: string[], inc: number): Promise; setLastMessageById(rid: string, lastMessage: IRoom['lastMessage']): Promise; - resetLastMessageById(rid: string, lastMessage?: IMessage | null): Promise; + resetLastMessageById(rid: string, lastMessage: IMessage | null, msgCountDelta?: number): Promise; replaceUsername(username: string, newUsername: string): Promise; replaceMutedUsername(username: string, newUsername: string): Promise; replaceUsernameOfUserByUserId(userId: string, newUsername: string): Promise; diff --git a/packages/model-typings/src/models/IUploadsModel.ts b/packages/model-typings/src/models/IUploadsModel.ts index d5be641c9c37..1e80fcfe39b5 100644 --- a/packages/model-typings/src/models/IUploadsModel.ts +++ b/packages/model-typings/src/models/IUploadsModel.ts @@ -1,5 +1,5 @@ -import type { IUpload } from '@rocket.chat/core-typings'; -import type { FindCursor, WithId, Filter } from 'mongodb'; +import type { IRoom, IUpload } from '@rocket.chat/core-typings'; +import type { FindCursor, WithId, Filter, FindOptions } from 'mongodb'; import type { FindPaginated } from './IBaseModel'; import type { IBaseUploadsModel } from './IBaseUploadsModel'; @@ -8,4 +8,10 @@ export interface IUploadsModel extends IBaseUploadsModel { findNotHiddenFilesOfRoom(roomId: string, searchText: string, fileType: string, limit: number): FindCursor; findPaginatedWithoutThumbs(query: Filter, options?: any): FindPaginated>>; + + findImagesByRoomId( + rid: IRoom['_id'], + uploadedAt?: Date, + options?: Omit, 'sort'>, + ): FindPaginated>>; } diff --git a/packages/model-typings/src/models/IUsersModel.ts b/packages/model-typings/src/models/IUsersModel.ts index f14f5bc90d0d..f9a2b1c45a2a 100644 --- a/packages/model-typings/src/models/IUsersModel.ts +++ b/packages/model-typings/src/models/IUsersModel.ts @@ -9,7 +9,7 @@ import type { AtLeast, ILivechatAgentStatus, } from '@rocket.chat/core-typings'; -import type { Document, UpdateResult, FindCursor, FindOptions, Filter, InsertOneResult, DeleteResult } from 'mongodb'; +import type { Document, UpdateResult, FindCursor, FindOptions, Filter, InsertOneResult, DeleteResult, ModifyResult } from 'mongodb'; import type { FindPaginated, IBaseModel } from './IBaseModel'; @@ -279,8 +279,10 @@ export interface IUsersModel extends IBaseModel { disableEmail2FAByUserId(userId: string): Promise; findByIdsWithPublicE2EKey(userIds: string[], options?: FindOptions): FindCursor; resetE2EKey(userId: string): Promise; - removeExpiredEmailCodesOfUserId(userId: string): Promise; - removeEmailCodeByUserIdAndCode(userId: string, code: string): Promise; + removeExpiredEmailCodeOfUserId(userId: string): Promise; + removeEmailCodeByUserId(userId: string): Promise; + increaseInvalidEmailCodeAttempt(userId: string): Promise; + maxInvalidEmailCodeAttemptsReached(userId: string, maxAttemtps: number): Promise; addEmailCodeByUserId(userId: string, code: string, expire: Date): Promise; findActiveUsersInRoles(roles: string[], options?: FindOptions): FindCursor; countActiveUsersInRoles(roles: string[], options?: FindOptions): Promise; @@ -387,4 +389,6 @@ export interface IUsersModel extends IBaseModel { options: FindOptions, ): Promise<{ sortedResults: (T & { departments: string[] })[]; totalCount: { total: number }[] }[]>; countByRole(roleName: string): Promise; + removeEmailCodeOfUserId(userId: string): Promise; + incrementInvalidEmailCodeAttempt(userId: string): Promise>; } diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index ac261acbc4d7..0455bb65fe80 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,199 @@ # @rocket.chat/models +## 0.0.26 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.2 + +## 0.0.25 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.1 + +## 0.0.24 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [223dce18a3] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] + - @rocket.chat/model-typings@0.2.0 + +## 0.0.24-rc.12 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.19 + +## 0.0.24-rc.11 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.18 + +## 0.0.24-rc.10 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.17 + +## 0.0.24-rc.9 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.16 + +## 0.0.24-rc.8 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.15 + +## 0.0.24-rc.7 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.14 + +## 0.0.24-rc.6 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.13 + +## 0.0.24-rc.5 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.12 + +## 0.0.24-rc.4 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.11 + +## 0.0.24-rc.3 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.10 + +## 0.0.24-rc.2 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.9 + +## 0.0.24-rc.1 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.8 + +## 0.0.21-rc.7 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.7 + +## 0.0.21-rc.6 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.6 + +## 0.0.21-rc.5 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.5 + +## 0.0.21-rc.4 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.4 + +## 0.0.21-rc.3 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.3 + +## 0.0.21-rc.2 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.2 + +## 0.0.21-rc.1 + +### Patch Changes + +- @rocket.chat/model-typings@0.2.0-rc.1 + +## 0.0.21-rc.0 + +### Patch Changes + +- Updated dependencies [dea1fe9191] +- Updated dependencies [223dce18a3] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [5f81a0f3cb] + - @rocket.chat/model-typings@0.2.0-rc.0 + +## 0.0.23 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.8 + +## 0.0.22 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.7 + +## 0.0.21 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.6 + +## 0.0.20 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.5 + +## 0.0.19 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.4 + +## 0.0.18 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.3 + +## 0.0.17 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.2 + +## 0.0.16 + +### Patch Changes + +- @rocket.chat/model-typings@0.1.1 + ## 0.0.15 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index 1644a8362c77..0a9f25958118 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/models", - "version": "0.0.15", + "version": "0.0.26", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "dependencies": { "@rocket.chat/model-typings": "workspace:^" diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts index 1e83fe72b93e..e1cf91f1b0ee 100644 --- a/packages/models/src/index.ts +++ b/packages/models/src/index.ts @@ -78,7 +78,6 @@ import type { ICronHistoryModel, IMigrationsModel, IModerationReportsModel, - ICloudAnnouncementsModel, } from '@rocket.chat/model-typings'; import { proxify } from './proxify'; @@ -171,4 +170,3 @@ export const AuditLog = proxify('IAuditLogModel'); export const CronHistory = proxify('ICronHistoryModel'); export const Migrations = proxify('IMigrationsModel'); export const ModerationReports = proxify('IModerationReportsModel'); -export const CloudAnnouncements = proxify('ICloudAnnouncementsModel'); diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json index dc91a3722016..a645c724f593 100644 --- a/packages/node-poplib/package.json +++ b/packages/node-poplib/package.json @@ -3,11 +3,11 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "test": "jest" diff --git a/packages/password-policies/package.json b/packages/password-policies/package.json index 52fa766671db..36f424cbe555 100644 --- a/packages/password-policies/package.json +++ b/packages/password-policies/package.json @@ -3,13 +3,13 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/chai": "^4.3.5", - "@types/jest": "~29.5.3", - "chai": "^4.3.7", + "@types/chai": "^4.3.9", + "@types/jest": "~29.5.7", + "chai": "^4.3.10", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/random/package.json b/packages/random/package.json index 15ca3ee0b47a..09625c0d6906 100644 --- a/packages/random/package.json +++ b/packages/random/package.json @@ -14,16 +14,16 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "volta": { "extends": "../../package.json" diff --git a/packages/release-action/package.json b/packages/release-action/package.json index 0a1e3ded8927..5402dcc793bf 100644 --- a/packages/release-action/package.json +++ b/packages/release-action/package.json @@ -10,11 +10,11 @@ "main": "dist/index.js", "packageManager": "yarn@3.5.1", "devDependencies": { - "@types/node": "^16.18.36", - "typescript": "~5.2.2" + "@types/node": "^16.18.60", + "typescript": "~5.3.2" }, "dependencies": { - "@actions/core": "^1.10.0", + "@actions/core": "^1.10.1", "@actions/exec": "^1.1.1", "@actions/github": "^5.1.1", "@octokit/plugin-throttling": "^6.0.0", diff --git a/packages/release-action/src/fixWorkspaceVersionsBeforePublish.ts b/packages/release-action/src/fixWorkspaceVersionsBeforePublish.ts index 3a45e4fb8794..cb949326464b 100644 --- a/packages/release-action/src/fixWorkspaceVersionsBeforePublish.ts +++ b/packages/release-action/src/fixWorkspaceVersionsBeforePublish.ts @@ -46,7 +46,17 @@ export async function fixWorkspaceVersionsBeforePublish() { throw new Error(`Could not find version for workspace ${dependency}`); } - packageJson[dependencyType][dependency] = `^${realVersion}`; + const semver = dependencyVersion.slice('workspace:'.length); + + if (semver === '*') { + packageJson[dependencyType][dependency] = `=${realVersion}`; + } else if (semver === '^') { + packageJson[dependencyType][dependency] = `^${realVersion}`; + } else if (semver === '~') { + packageJson[dependencyType][dependency] = `~${realVersion}`; + } else { + packageJson[dependencyType][dependency] = semver; + } } } } diff --git a/packages/release-action/src/index.ts b/packages/release-action/src/index.ts index ca9dab36ac65..51956e9e2a8d 100644 --- a/packages/release-action/src/index.ts +++ b/packages/release-action/src/index.ts @@ -7,6 +7,7 @@ import { bumpNextVersion } from './bumpNextVersion'; import { setupGitUser } from './gitUtils'; import { publishRelease } from './publishRelease'; import { startPatchRelease } from './startPatchRelease'; +import { updatePRDescription } from './updatePRDescription'; // const getOptionalInput = (name: string) => core.getInput(name) || undefined; @@ -45,6 +46,8 @@ import { startPatchRelease } from './startPatchRelease'; await bumpNextVersion({ githubToken, mainPackagePath }); } else if (action === 'patch') { await startPatchRelease({ baseRef, githubToken, mainPackagePath }); + } else if (action === 'update-pr-description') { + await updatePRDescription({ githubToken, mainPackagePath }); } })().catch((err) => { core.error(err); diff --git a/packages/release-action/src/updatePRDescription.ts b/packages/release-action/src/updatePRDescription.ts new file mode 100644 index 000000000000..0fc6386636ea --- /dev/null +++ b/packages/release-action/src/updatePRDescription.ts @@ -0,0 +1,75 @@ +import fs from 'fs'; +import path from 'path'; + +import * as core from '@actions/core'; +import { exec } from '@actions/exec'; +import * as github from '@actions/github'; + +import { setupOctokit } from './setupOctokit'; +import { getChangelogEntry, getEngineVersionsMd, readPackageJson } from './utils'; + +export async function updatePRDescription({ + githubToken, + mainPackagePath, + cwd = process.cwd(), +}: { + githubToken: string; + mainPackagePath: string; + cwd?: string; +}) { + const octokit = setupOctokit(githubToken); + + // generate change logs from changesets + await exec('yarn', ['changeset', 'version']); + + // get version from main package + const { version: newVersion } = await readPackageJson(mainPackagePath); + + const mainPackageChangelog = path.join(mainPackagePath, 'CHANGELOG.md'); + + const changelogContents = fs.readFileSync(mainPackageChangelog, 'utf8'); + const changelogEntry = getChangelogEntry(changelogContents, newVersion); + if (!changelogEntry) { + // we can find a changelog but not the entry for this version + // if this is true, something has probably gone wrong + throw new Error('Could not find changelog entry for version newVersion'); + } + + const releaseBody = (await getEngineVersionsMd(cwd)) + changelogEntry.content; + + core.info('get PR description'); + const result = await octokit.rest.pulls.get({ + pull_number: github.context.issue.number, + body: releaseBody, + ...github.context.repo, + }); + + const { body: originalBody = '' } = result.data; + + const cleanBody = originalBody?.replace(/.*/s, '').trim() || ''; + + const bodyUpdated = `${cleanBody} + + + + +_You can see below a preview of the release change log:_ + +# ${newVersion} + +${releaseBody} +`; + + if (bodyUpdated === originalBody) { + core.info('no changes to PR description'); + return; + } + + core.info('update PR description'); + await octokit.rest.pulls.update({ + owner: github.context.repo.owner, + repo: github.context.repo.repo, + pull_number: github.context.issue.number, + body: bodyUpdated, + }); +} diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index da3d48464546..2892cce58c7b 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,256 @@ # @rocket.chat/rest-typings +## 6.5.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 + +## 6.5.1 + +### Patch Changes + +- c2b224fd82: fix Federation Regression, builds service correctly +- Updated dependencies [c2b224fd82] + - @rocket.chat/core-typings@6.5.1 + +## 6.5.0 + +### Minor Changes + +- 92613680b7: Added option to select between two script engine options for the integrations +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- a98f3ff303: feat: added `licenses.info` endpoint +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/license@0.1.0 + +## 6.5.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/license@0.1.0-rc.19 + +## 6.5.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/license@0.1.0-rc.18 + +## 6.5.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/license@0.1.0-rc.17 + +## 6.5.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/license@0.1.0-rc.16 + +## 6.5.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/license@0.1.0-rc.15 + +## 6.5.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/license@0.1.0-rc.14 + +## 6.5.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/license@0.1.0-rc.13 + +## 6.5.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/license@0.1.0-rc.12 + +## 6.5.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/license@0.1.0-rc.11 + +## 6.5.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/license@0.1.0-rc.10 + +## 6.5.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/license@0.1.0-rc.9 + +## 6.5.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/license@0.1.0-rc.8 + +## 6.5.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/license@0.1.0-rc.7 + +## 6.5.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/license@0.1.0-rc.6 + +## 6.5.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/license@0.1.0-rc.5 + +## 6.5.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/license@0.1.0-rc.4 + +## 6.5.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/license@0.1.0-rc.3 + +## 6.5.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/license@0.1.0-rc.2 + +## 6.5.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/license@0.1.0-rc.1 + +## 6.5.0-rc.0 + +### Minor Changes + +- 92613680b7: Added option to select between two script engine options for the integrations +- ec1b2b9846: Create a deployment fingerprint to identify possible deployment changes caused by database cloning. A question to the admin will confirm if it's a regular deployment change or an intent of a new deployment and correct identification values as needed. + The fingerprint is composed by `${siteUrl}${dbConnectionString}` and hashed via `sha256` in `base64`. + An environment variable named `AUTO_ACCEPT_FINGERPRINT`, when set to `true`, can be used to auto-accept an expected fingerprint change as a regular deployment update. +- a98f3ff303: feat: added `licenses.info` endpoint +- 5f81a0f3cb: Implemented the License library, it is used to handle the functionality like expiration date, modules, limits, etc. + Also added a version v3 of the license, which contains an extended list of features. + v2 is still supported, since we convert it to v3 on the fly. + +### Patch Changes + +- 5b9d6883bf: feat: Improve UI when MAC limits are reached + feat: Limit endpoints on MAC limit reached +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/license@0.1.0-rc.0 + +## 6.4.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 + +## 6.4.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 + +## 6.4.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 + +## 6.4.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 + +## 6.4.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 + +## 6.4.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 + +## 6.4.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 + +## 6.4.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 + ## 6.4.0 ### Minor Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index d5996987acf1..5e3708da8d75 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,15 +1,15 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.4.0", + "version": "6.6.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "jest-environment-jsdom": "~29.6.1", + "jest": "~29.6.4", + "jest-environment-jsdom": "~29.6.4", "mongodb": "^4.17.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -24,11 +24,10 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "1.41.0-alpha.290", + "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/license": "workspace:^", - "@rocket.chat/message-parser": "next", - "@rocket.chat/ui-kit": "^0.32.1", + "@rocket.chat/message-parser": "~0.31.27", + "@rocket.chat/ui-kit": "workspace:~", "ajv": "^8.11.0", "ajv-formats": "^2.1.1" }, diff --git a/packages/rest-typings/src/apps/index.ts b/packages/rest-typings/src/apps/index.ts index 31427afb3fee..5d4dfa8f4588 100644 --- a/packages/rest-typings/src/apps/index.ts +++ b/packages/rest-typings/src/apps/index.ts @@ -12,8 +12,8 @@ import type { AppRequestFilter, AppRequestsStats, PaginatedAppRequests, - UiKit, } from '@rocket.chat/core-typings'; +import type * as UiKit from '@rocket.chat/ui-kit'; export type AppsEndpoints = { '/apps/count': { @@ -53,14 +53,7 @@ export type AppsEndpoints = { GET: () => { apps: { id: string; - languages: { - [key: string]: { - Params: string; - Description: string; - Setting_Name: string; - Setting_Description: string; - }; - }; + languages: { [language: string]: { [key: string]: string } }; }[]; }; }; diff --git a/packages/rest-typings/src/default/index.ts b/packages/rest-typings/src/default/index.ts index 0be60fc4413b..b3aa5d3aa535 100644 --- a/packages/rest-typings/src/default/index.ts +++ b/packages/rest-typings/src/default/index.ts @@ -1,38 +1,36 @@ // eslint-disable-next-line @typescript-eslint/naming-convention export interface DefaultEndpoints { '/info': { - GET: () => { - info: { - build: { - arch: string; - cpus: number; - date: string; - freeMemory: number; - nodeVersion: string; - osRelease: string; - platform: string; - totalMemory: number; - }; - commit: { - author?: string; - branch?: string; - date?: string; - hash?: string; - subject?: string; - tag?: string; - }; - marketplaceApiVersion: string; - version: string; - tag?: string; - branch?: string; - }; - supportedVersions?: { signed: string }; - minimumClientVersions: { - desktop: string; - mobile: string; - }; - version: string | undefined; - }; + GET: () => + | { + info: { + build: { + arch: string; + cpus: number; + date: string; + freeMemory: number; + nodeVersion: string; + osRelease: string; + platform: string; + totalMemory: number; + }; + commit: { + author?: string; + branch?: string; + date?: string; + hash?: string; + subject?: string; + tag?: string; + }; + marketplaceApiVersion: string; + version: string; + tag?: string; + branch?: string; + }; + } + | { + version: string | undefined; + }; }; '/ecdh_proxy/initEncryptedSession': { POST: () => void; diff --git a/packages/rest-typings/src/v1/auth.ts b/packages/rest-typings/src/v1/auth.ts index c09876b264a7..cec772eaacee 100644 --- a/packages/rest-typings/src/v1/auth.ts +++ b/packages/rest-typings/src/v1/auth.ts @@ -1,6 +1,12 @@ import Ajv from 'ajv'; -export type LoginProps = { user: Record | string; username: string; email: string; password: string; code: string }; +type Password = string | { hashed: string }; + +type EmailLogin = { email: string }; +type UsernameLogin = { username: string }; +type UserLogin = { user: UsernameLogin | EmailLogin | string }; + +export type LoginProps = (EmailLogin | UsernameLogin | UserLogin) & { code?: string; password?: Password }; type LogoutResponse = { message: string; @@ -24,7 +30,12 @@ const loginPropsSchema = { properties: { user: { type: 'object', nullable: true }, username: { type: 'string', nullable: true }, - password: { type: 'string', nullable: true }, + password: { + oneOf: [ + { type: 'string', nullable: true }, + { type: 'object', nullable: true }, + ], + }, email: { type: 'string', nullable: true }, code: { type: 'string', nullable: true }, }, diff --git a/packages/rest-typings/src/v1/channels/ChannelsImagesProps.ts b/packages/rest-typings/src/v1/channels/ChannelsImagesProps.ts new file mode 100644 index 000000000000..52c065b7c393 --- /dev/null +++ b/packages/rest-typings/src/v1/channels/ChannelsImagesProps.ts @@ -0,0 +1,14 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type ChannelsImagesProps = { + roomId: string; + startingFromId: string; + count?: number; + offset?: number; +}; +const channelsImagesPropsSchema = {}; +export const isChannelsImagesProps = ajv.compile(channelsImagesPropsSchema); diff --git a/packages/rest-typings/src/v1/channels/channels.ts b/packages/rest-typings/src/v1/channels/channels.ts index e5ae6175ffdf..328588ffb58b 100644 --- a/packages/rest-typings/src/v1/channels/channels.ts +++ b/packages/rest-typings/src/v1/channels/channels.ts @@ -1,4 +1,4 @@ -import type { IUpload, IMessage, IRoom, ITeam, IGetRoomRoles, IUser, IIntegration } from '@rocket.chat/core-typings'; +import type { IUpload, IUploadWithUser, IMessage, IRoom, ITeam, IGetRoomRoles, IUser, IIntegration } from '@rocket.chat/core-typings'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; import type { PaginatedResult } from '../../helpers/PaginatedResult'; @@ -10,6 +10,7 @@ import type { ChannelsDeleteProps } from './ChannelsDeleteProps'; import type { ChannelsGetAllUserMentionsByChannelProps } from './ChannelsGetAllUserMentionsByChannelProps'; import type { ChannelsGetIntegrationsProps } from './ChannelsGetIntegrationsProps'; import type { ChannelsHistoryProps } from './ChannelsHistoryProps'; +import type { ChannelsImagesProps } from './ChannelsImagesProps'; import type { ChannelsInviteProps } from './ChannelsInviteProps'; import type { ChannelsJoinProps } from './ChannelsJoinProps'; import type { ChannelsKickProps } from './ChannelsKickProps'; @@ -35,6 +36,11 @@ import type { ChannelsUnarchiveProps } from './ChannelsUnarchiveProps'; export type ChannelsEndpoints = { '/v1/channels.files': { GET: (params: PaginatedRequest<{ roomId: string } | { roomName: string }>) => PaginatedResult<{ + files: IUploadWithUser[]; + }>; + }; + '/v1/channels.images': { + GET: (params: ChannelsImagesProps) => PaginatedResult<{ files: IUpload[]; }>; }; diff --git a/packages/rest-typings/src/v1/channels/index.ts b/packages/rest-typings/src/v1/channels/index.ts index 981296e244fe..f0cf81ba622d 100644 --- a/packages/rest-typings/src/v1/channels/index.ts +++ b/packages/rest-typings/src/v1/channels/index.ts @@ -7,6 +7,7 @@ export * from './ChannelsCreateProps'; export * from './ChannelsDeleteProps'; export * from './ChannelsGetAllUserMentionsByChannelProps'; export * from './ChannelsHistoryProps'; +export * from './ChannelsImagesProps'; export * from './ChannelsJoinProps'; export * from './ChannelsKickProps'; export * from './ChannelsLeaveProps'; diff --git a/packages/rest-typings/src/v1/chat.ts b/packages/rest-typings/src/v1/chat.ts index b8def106c78a..c29e420a47f3 100644 --- a/packages/rest-typings/src/v1/chat.ts +++ b/packages/rest-typings/src/v1/chat.ts @@ -697,8 +697,8 @@ const ChatGetDeletedMessagesSchema = { export const isChatGetDeletedMessagesProps = ajv.compile(ChatGetDeletedMessagesSchema); type ChatPostMessage = - | { roomId: string; text?: string; alias?: string; emoji?: string; avatar?: string; attachments?: MessageAttachment[] } - | { channel: string; text?: string; alias?: string; emoji?: string; avatar?: string; attachments?: MessageAttachment[] }; + | { roomId: string | string[]; text?: string; alias?: string; emoji?: string; avatar?: string; attachments?: MessageAttachment[] } + | { channel: string | string[]; text?: string; alias?: string; emoji?: string; avatar?: string; attachments?: MessageAttachment[] }; const ChatPostMessageSchema = { oneOf: [ @@ -706,7 +706,15 @@ const ChatPostMessageSchema = { type: 'object', properties: { roomId: { - type: 'string', + oneOf: [ + { type: 'string' }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], }, text: { type: 'string', @@ -739,7 +747,15 @@ const ChatPostMessageSchema = { type: 'object', properties: { channel: { - type: 'string', + oneOf: [ + { type: 'string' }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], }, text: { type: 'string', diff --git a/packages/rest-typings/src/v1/cloud.ts b/packages/rest-typings/src/v1/cloud.ts index 90664dcc243b..7602034b6912 100644 --- a/packages/rest-typings/src/v1/cloud.ts +++ b/packages/rest-typings/src/v1/cloud.ts @@ -88,4 +88,10 @@ export type CloudEndpoints = { '/v1/cloud.registrationStatus': { GET: () => { registrationStatus: CloudRegistrationStatus }; }; + '/v1/cloud.syncWorkspace': { + POST: () => { success: boolean }; + }; + '/v1/cloud.removeLicense': { + POST: () => { success: boolean }; + }; }; diff --git a/packages/rest-typings/src/v1/dm/im.ts b/packages/rest-typings/src/v1/dm/im.ts index bd48bd6fd3b1..60d08abc56b2 100644 --- a/packages/rest-typings/src/v1/dm/im.ts +++ b/packages/rest-typings/src/v1/dm/im.ts @@ -1,4 +1,4 @@ -import type { IMessage, IRoom, IUser, IUpload } from '@rocket.chat/core-typings'; +import type { IMessage, IRoom, IUser, IUploadWithUser } from '@rocket.chat/core-typings'; import type { PaginatedRequest } from '../../helpers/PaginatedRequest'; import type { PaginatedResult } from '../../helpers/PaginatedResult'; @@ -42,7 +42,7 @@ export type ImEndpoints = { }; '/v1/im.files': { GET: (params: DmFileProps) => PaginatedResult<{ - files: IUpload[]; + files: IUploadWithUser[]; }>; }; '/v1/im.history': { diff --git a/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts b/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts index a6009fe20d85..df145849d9da 100644 --- a/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts +++ b/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts @@ -13,6 +13,8 @@ const FederationVerifyMatrixIdPropsSchema = { type: 'array', items: { type: 'string' }, uniqueItems: true, + minItems: 1, + maxItems: 15, }, }, additionalProperties: false, diff --git a/packages/rest-typings/src/v1/groups/groups.ts b/packages/rest-typings/src/v1/groups/groups.ts index 078becc6863e..529e086a81af 100644 --- a/packages/rest-typings/src/v1/groups/groups.ts +++ b/packages/rest-typings/src/v1/groups/groups.ts @@ -1,4 +1,4 @@ -import type { IMessage, IRoom, ITeam, IGetRoomRoles, IUser, IUpload, IIntegration, ISubscription } from '@rocket.chat/core-typings'; +import type { IMessage, IRoom, ITeam, IGetRoomRoles, IUser, IUploadWithUser, IIntegration, ISubscription } from '@rocket.chat/core-typings'; import type { PaginatedResult } from '../../helpers/PaginatedResult'; import type { GroupsAddAllProps } from './GroupsAddAllProps'; @@ -42,7 +42,7 @@ import type { GroupsUnarchiveProps } from './GroupsUnarchiveProps'; export type GroupsEndpoints = { '/v1/groups.files': { GET: (params: GroupsFilesProps) => PaginatedResult<{ - files: IUpload[]; + files: IUploadWithUser[]; }>; }; '/v1/groups.members': { diff --git a/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts b/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts new file mode 100644 index 000000000000..976ff2e66794 --- /dev/null +++ b/packages/rest-typings/src/v1/import/ImportersListParamsGET.ts @@ -0,0 +1,16 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +export type ImportersListParamsGET = Record; + +const ImportersListParamsGETSchema = { + type: 'object', + properties: {}, + additionalProperties: false, + required: [], +}; + +export const isImportersListParamsGET = ajv.compile(ImportersListParamsGETSchema); diff --git a/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts b/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts index fded90645613..310ea8c1d61a 100644 --- a/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts +++ b/packages/rest-typings/src/v1/import/StartImportParamsPOST.ts @@ -6,28 +6,24 @@ const ajv = new Ajv({ export type StartImportParamsPOST = { input: { - users: [ - { - user_id: string; - username: string; - email: string; - is_deleted: boolean; - is_bot: boolean; - do_import: boolean; - is_email_taken: boolean; - }, - ]; - channels: [ - { - channel_id: string; - name: string; - creator?: string; - is_archived: boolean; - do_import: boolean; - is_private: boolean; - is_direct: boolean; - }, - ]; + users: { + user_id: string; + username: string; + email: string; + is_deleted: boolean; + is_bot: boolean; + do_import: boolean; + is_email_taken: boolean; + }[]; + channels: { + channel_id: string; + name: string; + creator?: string; + is_archived: boolean; + do_import: boolean; + is_private: boolean; + is_direct: boolean; + }[]; }; }; diff --git a/packages/rest-typings/src/v1/import/import.ts b/packages/rest-typings/src/v1/import/import.ts index 1454200bab96..24d726d57e49 100644 --- a/packages/rest-typings/src/v1/import/import.ts +++ b/packages/rest-typings/src/v1/import/import.ts @@ -1,4 +1,4 @@ -import type { IImport, IImporterSelection, IImportProgress, ImportStatus, IImportUser } from '@rocket.chat/core-typings'; +import type { IImport, IImporterSelection, IImportProgress, IImporterInfo, ImportStatus, IImportUser } from '@rocket.chat/core-typings'; import type { DownloadPublicImportFileParamsPOST } from './DownloadPublicImportFileParamsPOST'; import type { StartImportParamsPOST } from './StartImportParamsPOST'; @@ -32,6 +32,9 @@ export type ImportEndpoints = { '/v1/getCurrentImportOperation': { GET: () => { operation: IImport }; }; + '/v1/importers.list': { + GET: () => Array; + }; '/v1/import.clear': { POST: () => void; }; diff --git a/packages/rest-typings/src/v1/import/index.ts b/packages/rest-typings/src/v1/import/index.ts index 622f4c1945b8..c1a6a39d144b 100644 --- a/packages/rest-typings/src/v1/import/index.ts +++ b/packages/rest-typings/src/v1/import/index.ts @@ -6,6 +6,7 @@ export * from './GetCurrentImportOperationParamsGET'; export * from './GetImportFileDataParamsGET'; export * from './GetImportProgressParamsGET'; export * from './GetLatestImportOperationsParamsGET'; +export * from './ImportersListParamsGET'; export * from './StartImportParamsPOST'; export * from './UploadImportFileParamsPOST'; export * from './ImportAddUsersParamsPOST'; diff --git a/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts b/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts index 6b0e7ce046d1..20838d734269 100644 --- a/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts +++ b/packages/rest-typings/src/v1/integrations/IntegrationsUpdateProps.ts @@ -9,6 +9,7 @@ export type IntegrationsUpdateProps = integrationId: string; channel: string; scriptEnabled: boolean; + scriptEngine: 'isolated-vm' | 'vm2'; overrideDestinationChannelEnabled?: boolean; script?: string; name: string; @@ -32,6 +33,7 @@ export type IntegrationsUpdateProps = token?: string; scriptEnabled: boolean; + scriptEngine: 'isolated-vm' | 'vm2'; script?: string; runOnEdits?: boolean; @@ -70,6 +72,10 @@ const integrationsUpdateSchema = { type: 'boolean', nullable: false, }, + scriptEngine: { + type: 'string', + nullable: false, + }, overrideDestinationChannelEnabled: { type: 'boolean', nullable: true, @@ -162,6 +168,10 @@ const integrationsUpdateSchema = { type: 'boolean', nullable: false, }, + scriptEngine: { + type: 'string', + nullable: false, + }, script: { type: 'string', nullable: true, diff --git a/packages/rest-typings/src/v1/licenses.ts b/packages/rest-typings/src/v1/licenses.ts index 4eb1ac196840..4a18bc113a6c 100644 --- a/packages/rest-typings/src/v1/licenses.ts +++ b/packages/rest-typings/src/v1/licenses.ts @@ -1,4 +1,4 @@ -import type { ILicenseV2, ILicenseV3, LicenseInfo } from '@rocket.chat/license'; +import type { ILicenseV2, ILicenseV3, LicenseInfo } from '@rocket.chat/core-typings'; import Ajv from 'ajv'; const ajv = new Ajv({ diff --git a/packages/rest-typings/src/v1/misc.ts b/packages/rest-typings/src/v1/misc.ts index 804b72a763de..cc06e1cc330a 100644 --- a/packages/rest-typings/src/v1/misc.ts +++ b/packages/rest-typings/src/v1/misc.ts @@ -235,13 +235,13 @@ export type MiscEndpoints = { '/v1/method.call/:method': { POST: (params: { message: string }) => { - message: unknown; + message: string; }; }; '/v1/method.callAnon/:method': { POST: (params: { message: string }) => { - message: unknown; + message: string; }; }; diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index 3baeae111202..d0338e3ea986 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -25,6 +25,7 @@ import type { ILivechatTriggerAction, ReportResult, ReportWithUnmatchingElements, + SMSProviderResponse, } from '@rocket.chat/core-typings'; import { ILivechatAgentStatus } from '@rocket.chat/core-typings'; import Ajv from 'ajv'; @@ -765,7 +766,7 @@ const LivechatUsersManagerGETSchema = { nullable: true, }, onlyAvailable: { - type: 'string', + type: 'boolean', nullable: true, }, excludeId: { @@ -3138,7 +3139,8 @@ const POSTLivechatAppearanceParamsSchema = { type: 'string', }, value: { - anyOf: [{ type: 'string' }, { type: 'boolean' }, { type: 'number' }], + // Be careful with anyOf - https://github.com/ajv-validator/ajv/issues/1140 + type: ['string', 'boolean', 'number'], }, }, required: ['_id', 'value'], @@ -3277,7 +3279,7 @@ export type OmnichannelEndpoints = { }>; }; '/v1/livechat/tags/:tagId': { - GET: () => ILivechatTag | null; + GET: () => ILivechatTag; }; '/v1/livechat/department': { GET: (params?: LivechatDepartmentProps) => PaginatedResult<{ @@ -3290,15 +3292,12 @@ export type OmnichannelEndpoints = { }; '/v1/livechat/department/:_id': { GET: (params: LivechatDepartmentId) => { - department: ILivechatDepartment | null; + department: ILivechatDepartment; agents?: ILivechatDepartmentAgents[]; }; PUT: (params: { department: LivechatDepartmentDTO; - agents: { - upsert?: { agentId: string; count?: number; order?: number }[]; - remove?: { agentId: string; count?: number; order?: number }; - }[]; + agents: Pick[]; }) => { department: ILivechatDepartment | null; agents: ILivechatDepartmentAgents[]; @@ -3359,7 +3358,7 @@ export type OmnichannelEndpoints = { }>; }; '/v1/livechat/custom-fields/:_id': { - GET: () => { customField: ILivechatCustomField | null }; + GET: () => { customField: ILivechatCustomField }; }; '/v1/livechat/:rid/messages': { GET: (params: LivechatRidMessagesProps) => PaginatedResult<{ @@ -3615,7 +3614,7 @@ export type OmnichannelEndpoints = { POST: (params: POSTLivechatTriggersParams) => void; }; '/v1/livechat/triggers/:_id': { - GET: () => { trigger: ILivechatTrigger | null }; + GET: () => { trigger: ILivechatTrigger }; DELETE: () => void; }; '/v1/livechat/rooms': { @@ -3719,6 +3718,9 @@ export type OmnichannelEndpoints = { value: string | number; }[]; }; + '/v1/livechat/sms-incoming/:service': { + POST: (params: unknown) => SMSProviderResponse; + }; } & { // EE '/v1/livechat/analytics/agents/average-service-time': { diff --git a/packages/rest-typings/src/v1/push.ts b/packages/rest-typings/src/v1/push.ts index c9f439357975..63e2015dbc36 100644 --- a/packages/rest-typings/src/v1/push.ts +++ b/packages/rest-typings/src/v1/push.ts @@ -65,4 +65,10 @@ export type PushEndpoints = { }; }; }; + '/v1/push.info': { + GET: () => { + pushGatewayEnabled: boolean; + defaultPushGateway: boolean; + }; + }; }; diff --git a/packages/server-cloud-communication/package.json b/packages/server-cloud-communication/package.json index 52a3ff801dac..7ed4865e3870 100644 --- a/packages/server-cloud-communication/package.json +++ b/packages/server-cloud-communication/package.json @@ -4,11 +4,11 @@ "private": true, "devDependencies": { "@rocket.chat/license": "workspace:^", - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.1.6" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "volta": { "extends": "../../package.json" diff --git a/packages/server-cloud-communication/src/definitions/index.ts b/packages/server-cloud-communication/src/definitions/index.ts index d554aa538059..4ac455ccefd1 100644 --- a/packages/server-cloud-communication/src/definitions/index.ts +++ b/packages/server-cloud-communication/src/definitions/index.ts @@ -17,6 +17,8 @@ type Message = { type Version = { version: string; expiration: Date; + security: boolean; + infoUrl: string; messages?: Message[]; }; diff --git a/packages/server-fetch/CHANGELOG.md b/packages/server-fetch/CHANGELOG.md new file mode 100644 index 000000000000..5d2cb827e3cc --- /dev/null +++ b/packages/server-fetch/CHANGELOG.md @@ -0,0 +1,13 @@ +# @rocket.chat/server-fetch + +## 0.0.2 + +### Patch Changes + +- 35363420f0: Fixed an issue where the payload of an HTTP request made by an app wouldn't be correctly encoded in some cases + +## 0.0.2-rc.0 + +### Patch Changes + +- 35363420f0: Fixed an issue where the payload of an HTTP request made by an app wouldn't be correctly encoded in some cases diff --git a/packages/server-fetch/package.json b/packages/server-fetch/package.json index 8509aa70d558..59104621711f 100644 --- a/packages/server-fetch/package.json +++ b/packages/server-fetch/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/server-fetch", - "version": "0.0.1", + "version": "0.0.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -25,7 +25,7 @@ "extends": "../../package.json" }, "dependencies": { - "@types/proxy-from-env": "^1.0.1", + "@types/proxy-from-env": "^1.0.3", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "node-fetch": "2.3.0", diff --git a/packages/sha256/package.json b/packages/sha256/package.json index b343cc5cae2d..1efcad244a7b 100644 --- a/packages/sha256/package.json +++ b/packages/sha256/package.json @@ -13,15 +13,15 @@ "test": "jest" }, "devDependencies": { - "@babel/core": "~7.22.9", - "@babel/preset-env": "~7.22.9", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "volta": { "extends": "../../package.json" diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index b5d9e6f419d4..f68310825d88 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/tools +## 0.2.0 + +### Minor Changes + +- 92613680b7: Added option to select between two script engine options for the integrations + +## 0.2.0-rc.0 + +### Minor Changes + +- 92613680b7: Added option to select between two script engine options for the integrations + ## 0.1.0 ### Minor Changes diff --git a/packages/tools/package.json b/packages/tools/package.json index ed5e7bdd44bf..1757b8d9b0ea 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/tools", - "version": "0.1.0", + "version": "0.2.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index b8bc90d9cb54..6ec3e38d358a 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -1,4 +1,5 @@ +export * from './normalizeLanguage'; export * from './pick'; -export * from './timezone'; export * from './stream'; +export * from './timezone'; export * from './wrapExceptions'; diff --git a/packages/tools/src/normalizeLanguage.ts b/packages/tools/src/normalizeLanguage.ts new file mode 100644 index 000000000000..9231d5c20da5 --- /dev/null +++ b/packages/tools/src/normalizeLanguage.ts @@ -0,0 +1,10 @@ +export const normalizeLanguage = (language: string): string => { + // Fix browsers having all-lowercase language settings eg. pt-br, en-us + const regex = /([a-z]{2,3})-([a-z]{2,4})/; + const matches = regex.exec(language); + if (matches) { + return `${matches[1]}-${matches[2].toUpperCase()}`; + } + + return language; +}; diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 77ab6ff504ca..d8b0e35da31d 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,193 @@ # @rocket.chat/ui-client +## 3.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.2 + +## 3.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.1 + +## 3.0.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0 + +## 3.0.0-rc.19 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.19 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.18 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.17 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.16 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.15 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.14 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.13 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.12 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.11 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.10 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.9 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.8 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.1 + ## 2.0.0 ### Minor Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 7edd02cc6e56..23b8828e4a4c 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/ui-client", - "version": "2.0.0", + "version": "3.0.2", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@rocket.chat/css-in-js": "next", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-hooks": "^0.32.1", - "@rocket.chat/icons": "^0.32.0", + "@babel/core": "~7.22.20", + "@rocket.chat/css-in-js": "~0.31.25", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/icons": "~0.32.0", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/ui-contexts": "workspace:~", "@storybook/addon-actions": "~6.5.16", @@ -20,26 +20,26 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/jest": "^0.2.26", + "@swc/jest": "^0.2.29", "@testing-library/jest-dom": "~5.16.5", - "@testing-library/react": "^12.1.2", + "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", "eslint": "~8.45.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "eslint-plugin-testing-library": "~5.11.0", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "eslint-plugin-testing-library": "~5.11.1", + "jest": "~29.6.4", "react": "^17.0.2", "react-dom": "^17.0.2", "react-hook-form": "~7.45.4", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", @@ -61,7 +61,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "2.0.0", + "@rocket.chat/ui-contexts": "3.0.2", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/src/components/Card/Card.stories.tsx b/packages/ui-client/src/components/Card/Card.stories.tsx deleted file mode 100644 index 56a2220219ed..000000000000 --- a/packages/ui-client/src/components/Card/Card.stories.tsx +++ /dev/null @@ -1,183 +0,0 @@ -import { Box, Button, ButtonGroup } from '@rocket.chat/fuselage'; -import type { ComponentMeta, ComponentStory } from '@storybook/react'; - -import { Card, CardBody, CardCol, CardColSection, CardColTitle, CardDivider, CardFooter, CardIcon, CardTitle } from '.'; -import TextSeparator from '../TextSeparator'; -import { UserStatus } from '../UserStatus'; - -export default { - title: 'Components/Card', - component: Card, - subcomponents: { - CardTitle, - CardBody, - CardCol, - CardColSection, - CardColTitle, - CardFooter, - CardDivider, - }, - parameters: { - layout: 'centered', - controls: { hideNoControlsWarning: true }, - }, -} as ComponentMeta; - -export const Example: ComponentStory = () => ( - - Usage - - - Users - - Total - - } - value={123} - /> - - - - {' '} - Online - - } - value={123} - /> - - - - {' '} - Busy - - } - value={123} - /> - - - - {' '} - Away - - } - value={123} - /> - - - - {' '} - Offline - - } - value={123} - /> - - - Types and Distribution - - - - - - - - Uploads - - - - - -); - -export const Single: ComponentStory = () => ( - - A card - - - - A Section -
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
- - Another Section -
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
-
-
- - - - - -
-); - -export const Double: ComponentStory = () => ( - - A card - - - - A Section -
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
- - Another Section -
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
-
- - - - A Section - - A bunch of stuff - - - A bunch of stuff - - - A bunch of stuff - - - A bunch of stuff - - - - Another Section -
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
A bunch of stuff
-
-
-
- - - - - -
-); diff --git a/packages/ui-client/src/components/Card/Card.tsx b/packages/ui-client/src/components/Card/Card.tsx deleted file mode 100644 index c078c09e80fd..000000000000 --- a/packages/ui-client/src/components/Card/Card.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const Card: FC = (props) => ( - -); - -export default Card; diff --git a/packages/ui-client/src/components/Card/CardBody.tsx b/packages/ui-client/src/components/Card/CardBody.tsx deleted file mode 100644 index d1b108abdd52..000000000000 --- a/packages/ui-client/src/components/Card/CardBody.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { FC, CSSProperties, ComponentProps } from 'react'; - -type CardBodyProps = { - flexDirection?: CSSProperties['flexDirection']; - height?: ComponentProps['height']; -}; - -const CardBody: FC = ({ children, flexDirection = 'row', height }) => ( - - {children} - -); - -export default CardBody; diff --git a/packages/ui-client/src/components/Card/CardCol.tsx b/packages/ui-client/src/components/Card/CardCol.tsx deleted file mode 100644 index dd14d7c93591..000000000000 --- a/packages/ui-client/src/components/Card/CardCol.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const CardCol: FC = ({ children }) => ( - - {children} - -); - -export default CardCol; diff --git a/packages/ui-client/src/components/Card/CardColSection.tsx b/packages/ui-client/src/components/Card/CardColSection.tsx deleted file mode 100644 index 9272d87e2ae5..000000000000 --- a/packages/ui-client/src/components/Card/CardColSection.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { ComponentProps, FC } from 'react'; - -const CardColSection: FC> = (props) => ; - -export default CardColSection; diff --git a/packages/ui-client/src/components/Card/CardColTitle.tsx b/packages/ui-client/src/components/Card/CardColTitle.tsx deleted file mode 100644 index 0d4d0a3d5a27..000000000000 --- a/packages/ui-client/src/components/Card/CardColTitle.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const CardColTitle: FC = ({ children }) => ( - - {children} - -); - -export default CardColTitle; diff --git a/packages/ui-client/src/components/Card/CardDivider.tsx b/packages/ui-client/src/components/Card/CardDivider.tsx deleted file mode 100644 index 31f3952ea28a..000000000000 --- a/packages/ui-client/src/components/Card/CardDivider.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { Divider } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const CardDivider: FC = () => ; - -export default CardDivider; diff --git a/packages/ui-client/src/components/Card/CardFooter.tsx b/packages/ui-client/src/components/Card/CardFooter.tsx deleted file mode 100644 index 88ef03fba6c6..000000000000 --- a/packages/ui-client/src/components/Card/CardFooter.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { ButtonGroup } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const CardFooter: FC = ({ children }) => {children}; - -export default CardFooter; diff --git a/packages/ui-client/src/components/Card/CardFooterWrapper.tsx b/packages/ui-client/src/components/Card/CardFooterWrapper.tsx deleted file mode 100644 index fa0cfffc802d..000000000000 --- a/packages/ui-client/src/components/Card/CardFooterWrapper.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; - -const CardFooterWrapper = ({ children }: { children: ReactNode }): ReactElement => {children}; - -export default CardFooterWrapper; diff --git a/packages/ui-client/src/components/Card/CardIcon.tsx b/packages/ui-client/src/components/Card/CardIcon.tsx deleted file mode 100644 index c409cd1d2053..000000000000 --- a/packages/ui-client/src/components/Card/CardIcon.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Box, Icon } from '@rocket.chat/fuselage'; -import type { ComponentProps, ReactElement, ReactNode } from 'react'; - -type CardIconProps = { children: ReactNode } | ComponentProps; - -const hasChildrenProp = (props: CardIconProps): props is { children: ReactNode } => 'children' in props; - -const CardIcon = (props: CardIconProps): ReactElement => ( - - {hasChildrenProp(props) ? props.children : } - -); - -export default CardIcon; diff --git a/packages/ui-client/src/components/Card/CardTitle.tsx b/packages/ui-client/src/components/Card/CardTitle.tsx deleted file mode 100644 index 8d7ef374334f..000000000000 --- a/packages/ui-client/src/components/Card/CardTitle.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; - -const CardTitle: FC = ({ children }) => ( - - {children} - -); - -export default CardTitle; diff --git a/packages/ui-client/src/components/Card/index.ts b/packages/ui-client/src/components/Card/index.ts deleted file mode 100644 index 76df65e5a809..000000000000 --- a/packages/ui-client/src/components/Card/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { default as Card } from './Card'; -export { default as CardBody } from './CardBody'; -export { default as CardCol } from './CardCol'; -export { default as CardColSection } from './CardColSection'; -export { default as CardColTitle } from './CardColTitle'; -export { default as CardDivider } from './CardDivider'; -export { default as CardFooter } from './CardFooter'; -export { default as CardFooterWrapper } from './CardFooterWrapper'; -export { default as CardIcon } from './CardIcon'; -export { default as CardTitle } from './CardTitle'; diff --git a/packages/ui-client/src/components/ExternalLink.tsx b/packages/ui-client/src/components/ExternalLink.tsx index 178e308fa8b6..0e7ef7a56148 100644 --- a/packages/ui-client/src/components/ExternalLink.tsx +++ b/packages/ui-client/src/components/ExternalLink.tsx @@ -1,9 +1,9 @@ import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; +import type { ComponentProps, FC } from 'react'; type ExternalLinkProps = { to: string; -}; +} & ComponentProps; export const ExternalLink: FC = ({ children, to, ...props }) => ( diff --git a/packages/ui-client/src/components/index.ts b/packages/ui-client/src/components/index.ts index 3de4bf411a5e..f5f37ac1c878 100644 --- a/packages/ui-client/src/components/index.ts +++ b/packages/ui-client/src/components/index.ts @@ -7,7 +7,6 @@ export * from '../hooks/useValidatePassword'; export { default as TextSeparator } from './TextSeparator'; export * from './TooltipComponent'; export * as UserStatus from './UserStatus'; -export * from './Card'; export * from './Header'; export * from './MultiSelectCustom/MultiSelectCustom'; export * from './FeaturePreview/FeaturePreview'; diff --git a/packages/ui-client/src/hooks/useDocumentTitle.spec.ts b/packages/ui-client/src/hooks/useDocumentTitle.spec.ts new file mode 100644 index 000000000000..e5df07fb354c --- /dev/null +++ b/packages/ui-client/src/hooks/useDocumentTitle.spec.ts @@ -0,0 +1,26 @@ +import { renderHook } from '@testing-library/react-hooks'; + +import { useDocumentTitle } from './useDocumentTitle'; + +const DEFAULT_TITLE = 'Default Title'; +const EXAMPLE_TITLE = 'Example Title'; + +it('should return the default title', () => { + const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE)); + + expect(result.current.title).toBe(DEFAULT_TITLE); +}); + +it('should return the default title and empty key value if refocus param is false', () => { + const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE, false)); + + expect(result.current.title).toBe(DEFAULT_TITLE); + expect(result.current.key).toBe(''); +}); + +it('should return the default title and the example title concatenated', () => { + renderHook(() => useDocumentTitle(DEFAULT_TITLE)); + const { result } = renderHook(() => useDocumentTitle(EXAMPLE_TITLE)); + + expect(result.current.title).toBe(`${EXAMPLE_TITLE} - ${DEFAULT_TITLE}`); +}); diff --git a/packages/ui-client/src/hooks/useDocumentTitle.ts b/packages/ui-client/src/hooks/useDocumentTitle.ts new file mode 100644 index 000000000000..5c5aca8b2296 --- /dev/null +++ b/packages/ui-client/src/hooks/useDocumentTitle.ts @@ -0,0 +1,54 @@ +import { Emitter } from '@rocket.chat/emitter'; +import { useCallback, useEffect } from 'react'; +import { useSyncExternalStore } from 'use-sync-external-store/shim'; + +const ee = new Emitter<{ + change: void; +}>(); + +const titles = new Set<{ + title?: string; + refocus?: boolean; +}>(); + +const useReactiveDocumentTitle = (): string => + useSyncExternalStore( + useCallback((callback) => ee.on('change', callback), []), + (): string => + Array.from(titles) + .reverse() + .map(({ title }) => title) + .join(' - '), + ); + +const useReactiveDocumentTitleKey = (): string => + useSyncExternalStore( + useCallback((callback) => ee.on('change', callback), []), + (): string => + Array.from(titles) + .filter(({ refocus }) => refocus) + .map(({ title }) => title) + .join(' - '), + ); + +export const useDocumentTitle = (documentTitle?: string, refocus = true) => { + useEffect(() => { + const titleObj = { + title: documentTitle, + refocus, + }; + + if (titleObj.title) { + titles.add(titleObj); + } + + ee.emit('change'); + + return () => { + titles.delete(titleObj); + ee.emit('change'); + }; + }, [documentTitle, refocus]); + + return { title: useReactiveDocumentTitle(), key: useReactiveDocumentTitleKey() }; +}; diff --git a/packages/ui-client/src/index.ts b/packages/ui-client/src/index.ts index 0e4454d38dbf..c04e795f6ab5 100644 --- a/packages/ui-client/src/index.ts +++ b/packages/ui-client/src/index.ts @@ -1,3 +1,4 @@ export * from './components'; export * from './hooks/useFeaturePreview'; export * from './hooks/useFeaturePreviewList'; +export * from './hooks/useDocumentTitle'; diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index b13328bd001b..f8bb912a4072 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -3,10 +3,10 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", + "@babel/core": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/icons": "^0.32.0", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/icons": "~0.32.0", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", "@storybook/addon-essentials": "~6.5.16", @@ -14,16 +14,16 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "peerDependencies": { "@rocket.chat/fuselage": "*", diff --git a/packages/ui-composer/src/MessageComposer/MessageComposerInput.tsx b/packages/ui-composer/src/MessageComposer/MessageComposerInput.tsx index c6204d1c6c18..870a633f9e50 100644 --- a/packages/ui-composer/src/MessageComposer/MessageComposerInput.tsx +++ b/packages/ui-composer/src/MessageComposer/MessageComposerInput.tsx @@ -15,13 +15,12 @@ type MessageComposerInputProps = ComponentProps; const MessageComposerInput = forwardRef(function MessageComposerInput( props: MessageComposerInputProps, - ref: Ref, + ref: Ref, ): ReactElement { return ( ); diff --git a/packages/ui-composer/src/MessageComposer/MessageComposerToolbar.tsx b/packages/ui-composer/src/MessageComposer/MessageComposerToolbar.tsx index 3521b40aef70..e357356c0050 100644 --- a/packages/ui-composer/src/MessageComposer/MessageComposerToolbar.tsx +++ b/packages/ui-composer/src/MessageComposer/MessageComposerToolbar.tsx @@ -2,7 +2,7 @@ import { Box } from '@rocket.chat/fuselage'; import type { ComponentProps, ReactElement } from 'react'; const MessageComposerToolbar = (props: ComponentProps): ReactElement => ( - + ); export default MessageComposerToolbar; diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index 9ce5fe770cdd..546adf3189ca 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,278 @@ # @rocket.chat/ui-contexts +## 3.0.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.2 +- @rocket.chat/rest-typings@6.5.2 +- @rocket.chat/ddp-client@0.2.11 + +## 3.0.1 + +### Patch Changes + +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] +- Updated dependencies [c2b224fd82] + - @rocket.chat/rest-typings@6.5.1 + - @rocket.chat/ddp-client@0.2.10 + - @rocket.chat/core-typings@6.5.1 + +## 3.0.0 + +### Patch Changes + +- 7da1edf866: Fixed an issue in the invite registration flow in which the user would not be automatically redirected to the homepage upon succesfully submiting the user registration form. +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0 + - @rocket.chat/rest-typings@6.5.0 + - @rocket.chat/ddp-client@0.2.9 + +## 3.0.0-rc.19 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.19 +- @rocket.chat/rest-typings@6.5.0-rc.19 +- @rocket.chat/ddp-client@0.2.9-rc.12 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.18 +- @rocket.chat/rest-typings@6.5.0-rc.18 +- @rocket.chat/ddp-client@0.2.9-rc.11 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.17 +- @rocket.chat/rest-typings@6.5.0-rc.17 +- @rocket.chat/ddp-client@0.2.9-rc.10 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.16 +- @rocket.chat/rest-typings@6.5.0-rc.16 +- @rocket.chat/ddp-client@0.2.9-rc.9 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.15 +- @rocket.chat/rest-typings@6.5.0-rc.15 +- @rocket.chat/ddp-client@0.2.9-rc.8 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.14 +- @rocket.chat/rest-typings@6.5.0-rc.14 +- @rocket.chat/ddp-client@0.2.9-rc.7 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.13 +- @rocket.chat/rest-typings@6.5.0-rc.13 +- @rocket.chat/ddp-client@0.2.9-rc.6 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.12 +- @rocket.chat/rest-typings@6.5.0-rc.12 +- @rocket.chat/ddp-client@0.2.9-rc.5 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.11 +- @rocket.chat/rest-typings@6.5.0-rc.11 +- @rocket.chat/ddp-client@0.2.9-rc.4 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.10 +- @rocket.chat/rest-typings@6.5.0-rc.10 +- @rocket.chat/ddp-client@0.2.9-rc.3 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.9 +- @rocket.chat/rest-typings@6.5.0-rc.9 +- @rocket.chat/ddp-client@0.2.9-rc.2 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.8 +- @rocket.chat/rest-typings@6.5.0-rc.8 +- @rocket.chat/ddp-client@0.2.9-rc.1 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.7 +- @rocket.chat/rest-typings@6.5.0-rc.7 +- @rocket.chat/ddp-client@0.2.6-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.6 +- @rocket.chat/rest-typings@6.5.0-rc.6 +- @rocket.chat/ddp-client@0.2.6-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.5 +- @rocket.chat/rest-typings@6.5.0-rc.5 +- @rocket.chat/ddp-client@0.2.6-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.4 +- @rocket.chat/rest-typings@6.5.0-rc.4 +- @rocket.chat/ddp-client@0.2.6-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.3 +- @rocket.chat/rest-typings@6.5.0-rc.3 +- @rocket.chat/ddp-client@0.2.6-rc.3 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.2 +- @rocket.chat/rest-typings@6.5.0-rc.2 +- @rocket.chat/ddp-client@0.2.6-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.5.0-rc.1 +- @rocket.chat/rest-typings@6.5.0-rc.1 +- @rocket.chat/ddp-client@0.2.6-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- 7da1edf866: Fixed an issue in the invite registration flow in which the user would not be automatically redirected to the homepage upon succesfully submiting the user registration form. +- Updated dependencies [dea1fe9191] +- Updated dependencies [c0ef13a0bf] +- Updated dependencies [5b9d6883bf] +- Updated dependencies [92613680b7] +- Updated dependencies [ec1b2b9846] +- Updated dependencies [a98f3ff303] +- Updated dependencies [5f81a0f3cb] +- Updated dependencies [dea1fe9191] + - @rocket.chat/core-typings@6.5.0-rc.0 + - @rocket.chat/rest-typings@6.5.0-rc.0 + - @rocket.chat/ddp-client@0.2.6-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.8 +- @rocket.chat/rest-typings@6.4.8 +- @rocket.chat/ddp-client@0.2.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.7 +- @rocket.chat/rest-typings@6.4.7 +- @rocket.chat/ddp-client@0.2.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.6 +- @rocket.chat/rest-typings@6.4.6 +- @rocket.chat/ddp-client@0.2.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.5 +- @rocket.chat/rest-typings@6.4.5 +- @rocket.chat/ddp-client@0.2.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.4 +- @rocket.chat/rest-typings@6.4.4 +- @rocket.chat/ddp-client@0.2.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.3 +- @rocket.chat/rest-typings@6.4.3 +- @rocket.chat/ddp-client@0.2.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.2 +- @rocket.chat/rest-typings@6.4.2 +- @rocket.chat/ddp-client@0.2.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/core-typings@6.4.1 +- @rocket.chat/rest-typings@6.4.1 +- @rocket.chat/ddp-client@0.2.1 + ## 2.0.0 ### Minor Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 25c1fb078768..b97863140c51 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,23 +1,24 @@ { "name": "@rocket.chat/ui-contexts", - "version": "2.0.0", + "version": "3.0.2", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/emitter": "next", - "@rocket.chat/fuselage-hooks": "^0.32.1", + "@rocket.chat/emitter": "~0.31.25", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/i18n": "workspace:~", "@rocket.chat/rest-typings": "workspace:^", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", - "@types/react-dom": "~17.0.20", - "@types/use-sync-external-store": "^0.0.3", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", + "@types/use-sync-external-store": "^0.0.5", "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "mongodb": "^4.17.1", "react": "~17.0.2", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { @@ -25,6 +26,7 @@ "@rocket.chat/ddp-client": "workspace:^", "@rocket.chat/emitter": "*", "@rocket.chat/fuselage-hooks": "*", + "@rocket.chat/i18n": "workspace:~", "@rocket.chat/rest-typings": "workspace:^", "react": "~17.0.2", "use-sync-external-store": "^1.2.0" diff --git a/packages/ui-contexts/src/ActionManagerContext.ts b/packages/ui-contexts/src/ActionManagerContext.ts index 76ca45cb6080..0847094bb4d1 100644 --- a/packages/ui-contexts/src/ActionManagerContext.ts +++ b/packages/ui-contexts/src/ActionManagerContext.ts @@ -1,11 +1,17 @@ -import type { DistributiveOmit, UiKit } from '@rocket.chat/core-typings'; +import type { DistributiveOmit } from '@rocket.chat/core-typings'; +import type * as UiKit from '@rocket.chat/ui-kit'; import { createContext } from 'react'; -type ActionManager = { +/** + * An action manager is responsible for handling interactions with the UiKit. + */ +export interface IActionManager { on(viewId: string, listener: (data: any) => void): void; on(eventName: 'busy', listener: ({ busy }: { busy: boolean }) => void): void; off(viewId: string, listener: (data: any) => any): void; off(eventName: 'busy', listener: ({ busy }: { busy: boolean }) => void): void; + notifyBusy(): void; + notifyIdle(): void; generateTriggerId(appId: string | undefined): string; emitInteraction(appId: string, userInteraction: DistributiveOmit): Promise; handleServerInteraction(interaction: UiKit.ServerInteraction): UiKit.ServerInteraction['type'] | undefined; @@ -14,7 +20,10 @@ type ActionManager = { view: UiKit.ContextualBarView; } | undefined; + openView(surface: 'modal', view: UiKit.ModalView): void; + openView(surface: 'banner', view: UiKit.BannerView): void; + openView(surface: 'contextual_bar', view: UiKit.ContextualBarView): void; disposeView(viewId: UiKit.ModalView['id'] | UiKit.BannerView['viewId'] | UiKit.ContextualBarView['id']): void; -}; +} -export const ActionManagerContext = createContext(undefined); +export const ActionManagerContext = createContext(undefined); diff --git a/packages/ui-contexts/src/LayoutContext.ts b/packages/ui-contexts/src/LayoutContext.ts index 694f55cffe38..2d900b5a7612 100644 --- a/packages/ui-contexts/src/LayoutContext.ts +++ b/packages/ui-contexts/src/LayoutContext.ts @@ -20,6 +20,12 @@ export type LayoutContextValue = { size: SizeLayout; contextualBarExpanded: boolean; contextualBarPosition: 'absolute' | 'relative' | 'fixed'; + hiddenActions: { + roomToolbox: Array; + messageToolbox: Array; + composerToolbox: Array; + userToolbox: Array; + }; }; export const LayoutContext = createContext({ @@ -40,4 +46,10 @@ export const LayoutContext = createContext({ }, contextualBarPosition: 'relative', contextualBarExpanded: false, + hiddenActions: { + roomToolbox: [], + messageToolbox: [], + composerToolbox: [], + userToolbox: [], + }, }); diff --git a/packages/ui-contexts/src/ServerContext/ServerContext.ts b/packages/ui-contexts/src/ServerContext/ServerContext.ts index 292b64882545..14a2b0e1a3ea 100644 --- a/packages/ui-contexts/src/ServerContext/ServerContext.ts +++ b/packages/ui-contexts/src/ServerContext/ServerContext.ts @@ -38,13 +38,6 @@ export type ServerContextValue = { retransmitToSelf?: boolean | undefined; }, ) => (eventName: K, callback: (...args: StreamerCallbackArgs) => void) => () => void; - getSingleStream: >( - streamName: N, - _options?: { - retransmit?: boolean | undefined; - retransmitToSelf?: boolean | undefined; - }, - ) => (eventName: K, callback: (...args: StreamerCallbackArgs) => void) => () => void; }; export const ServerContext = createContext({ @@ -57,5 +50,4 @@ export const ServerContext = createContext({ throw new Error('not implemented'); }, getStream: () => () => (): void => undefined, - getSingleStream: () => () => (): void => undefined, }); diff --git a/packages/ui-contexts/src/TranslationContext.ts b/packages/ui-contexts/src/TranslationContext.ts index d0f9bb6318c3..d8fa4423cc27 100644 --- a/packages/ui-contexts/src/TranslationContext.ts +++ b/packages/ui-contexts/src/TranslationContext.ts @@ -1,9 +1,6 @@ +import type { RocketchatI18nKeys } from '@rocket.chat/i18n'; import { createContext } from 'react'; -import type keys from './en.json'; - -export { keys }; - export type TranslationLanguage = { en: string; name: string; @@ -11,7 +8,7 @@ export type TranslationLanguage = { key: string; }; -export type TranslationKey = keyof typeof keys; +export type TranslationKey = RocketchatI18nKeys | `app-${string}.${string}`; export type TranslationContextValue = { languages: TranslationLanguage[]; diff --git a/packages/ui-contexts/src/UserContext.ts b/packages/ui-contexts/src/UserContext.ts index 92587c61fa05..14b9644e6a3c 100644 --- a/packages/ui-contexts/src/UserContext.ts +++ b/packages/ui-contexts/src/UserContext.ts @@ -29,7 +29,7 @@ export type LoginService = { clientConfig: unknown; title: string; - service: string; + service: 'meteor-developer'; buttonLabelText?: string; icon?: string; diff --git a/packages/ui-contexts/src/en.json b/packages/ui-contexts/src/en.json deleted file mode 120000 index 2d8842c5138a..000000000000 --- a/packages/ui-contexts/src/en.json +++ /dev/null @@ -1 +0,0 @@ -../../../apps/meteor/private/i18n/en.i18n.json \ No newline at end of file diff --git a/packages/ui-contexts/src/hooks/useLayoutHiddenActions.ts b/packages/ui-contexts/src/hooks/useLayoutHiddenActions.ts new file mode 100644 index 000000000000..d578f02e9bc9 --- /dev/null +++ b/packages/ui-contexts/src/hooks/useLayoutHiddenActions.ts @@ -0,0 +1,6 @@ +import { useContext } from 'react'; + +import type { LayoutContextValue } from '../LayoutContext'; +import { LayoutContext } from '../LayoutContext'; + +export const useLayoutHiddenActions = (): LayoutContextValue['hiddenActions'] => useContext(LayoutContext).hiddenActions; diff --git a/packages/ui-contexts/src/hooks/useStream.ts b/packages/ui-contexts/src/hooks/useStream.ts index 34c49c5a778c..d6fb5e76be78 100644 --- a/packages/ui-contexts/src/hooks/useStream.ts +++ b/packages/ui-contexts/src/hooks/useStream.ts @@ -28,21 +28,3 @@ export function useStream( const { getStream } = useContext(ServerContext); return useMemo(() => getStream(streamName, options), [getStream, streamName, options]); } - -/* - * @param streamName The name of the stream to subscribe to - * @returns A function that can be used to subscribe to the stream - * the main difference between this and useStream is that this function - * will only subscribe to the `stream + key` only once, but you can still add multiple callbacks - * to the same path - */ -export function useSingleStream( - streamName: N, - options?: { - retransmit?: boolean; - retransmitToSelf?: boolean; - }, -): StreamerCallback { - const { getSingleStream } = useContext(ServerContext); - return useMemo(() => getSingleStream(streamName, options), [getSingleStream, streamName, options]); -} diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts index d404dc921579..fb2f2b84d377 100644 --- a/packages/ui-contexts/src/index.ts +++ b/packages/ui-contexts/src/index.ts @@ -14,7 +14,7 @@ export { TooltipContext, TooltipContextValue } from './TooltipContext'; export { TranslationContext, TranslationContextValue } from './TranslationContext'; export { UserContext, UserContextValue, LoginService } from './UserContext'; export { DeviceContext, Device, IExperimentalHTMLAudioElement, DeviceContextValue } from './DeviceContext'; -export { ActionManagerContext } from './ActionManagerContext'; +export { ActionManagerContext, IActionManager } from './ActionManagerContext'; export { useAbsoluteUrl } from './hooks/useAbsoluteUrl'; export { useAllPermissions } from './hooks/useAllPermissions'; @@ -38,6 +38,7 @@ export { useLayout } from './hooks/useLayout'; export { useLayoutContextualBarExpanded } from './hooks/useLayoutContextualBarExpanded'; export { useLayoutContextualBarPosition } from './hooks/useLayoutContextualBarPosition'; export { useLayoutSizes } from './hooks/useLayoutSizes'; +export { useLayoutHiddenActions } from './hooks/useLayoutHiddenActions'; export { useLoadLanguage } from './hooks/useLoadLanguage'; export { useLoginWithPassword } from './hooks/useLoginWithPassword'; export { useLoginServices } from './hooks/useLoginServices'; @@ -66,7 +67,7 @@ export { useSettings } from './hooks/useSettings'; export { useSettingsDispatch } from './hooks/useSettingsDispatch'; export { useSettingSetValue } from './hooks/useSettingSetValue'; export { useSettingStructure } from './hooks/useSettingStructure'; -export { useStream, useSingleStream } from './hooks/useStream'; +export { useStream } from './hooks/useStream'; export { useToastMessageDispatch } from './hooks/useToastMessageDispatch'; export { useTooltipClose } from './hooks/useTooltipClose'; export { useTooltipOpen } from './hooks/useTooltipOpen'; diff --git a/packages/ui-kit/.eslintignore b/packages/ui-kit/.eslintignore new file mode 100644 index 000000000000..8225baa4a77d --- /dev/null +++ b/packages/ui-kit/.eslintignore @@ -0,0 +1,2 @@ +/node_modules +/dist diff --git a/packages/ui-kit/.eslintrc.json b/packages/ui-kit/.eslintrc.json new file mode 100644 index 000000000000..3b9bb45f4fd8 --- /dev/null +++ b/packages/ui-kit/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "extends": "@rocket.chat/eslint-config", + "env": { + "jest": true + } +} diff --git a/packages/ui-kit/.gitignore b/packages/ui-kit/.gitignore new file mode 100644 index 000000000000..b232802821e5 --- /dev/null +++ b/packages/ui-kit/.gitignore @@ -0,0 +1 @@ +/dist/* diff --git a/packages/ui-kit/.prettierignore b/packages/ui-kit/.prettierignore new file mode 100644 index 000000000000..8225baa4a77d --- /dev/null +++ b/packages/ui-kit/.prettierignore @@ -0,0 +1,2 @@ +/node_modules +/dist diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md new file mode 100644 index 000000000000..4658588cdce8 --- /dev/null +++ b/packages/ui-kit/CHANGELOG.md @@ -0,0 +1,276 @@ +# Change Log + +## 0.32.1 + +### Patch Changes + +- [`a97c7f086`](https://github.com/RocketChat/fuselage/commit/a97c7f08633e6e36a39c8933b530f9acacb83af0) Thanks [@dougfabris](https://github.com/dougfabris)! - chore: resolve-workspace-deps to publish pkg versions + +## 0.32.0 + +### Minor Changes + +- [`a04f9089d`](https://github.com/RocketChat/fuselage/commit/a04f9089d19ba32d2b2e80738d2d5f4dac0d3e0c) Thanks [@dougfabris](https://github.com/dougfabris)! - fix(ui-kit): Remove icons package dependency in ui-kit package + +- [`a04f9089d`](https://github.com/RocketChat/fuselage/commit/a04f9089d19ba32d2b2e80738d2d5f4dac0d3e0c) Thanks [@dougfabris](https://github.com/dougfabris)! - refactor(ui-kit): Review some types + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [0.31.0](https://github.com/RocketChat/fuselage/compare/v0.30.1...v0.31.0) (2021-12-28) + +### Bug Fixes + +- **ui-kit:** Fix `SurfaceRendererPayload` ([#556](https://github.com/RocketChat/fuselage/issues/556)) ([8d76a0d](https://github.com/RocketChat/fuselage/commit/8d76a0dadab5798afba1d6ce3911aa974d33c103)) + +### Features + +- Message Preview ([#587](https://github.com/RocketChat/fuselage/issues/587)) ([e69dad3](https://github.com/RocketChat/fuselage/commit/e69dad3a6619e98ff70bcd1cb68567a159187336)) +- New hooks for element size tracking ([#413](https://github.com/RocketChat/fuselage/issues/413)) ([8ca682c](https://github.com/RocketChat/fuselage/commit/8ca682c636d2e4813f7d346cb881513382be63cf)) + +## [0.30.1](https://github.com/RocketChat/fuselage/compare/v0.30.0...v0.30.1) (2021-10-20) + +### Bug Fixes + +- **ui-kit:** Fix `SurfaceRendererPayload` ([#556](https://github.com/RocketChat/fuselage/issues/556)) ([0508689](https://github.com/RocketChat/fuselage/commit/05086895e0f2ea26c7a00856a5e0c6fcffbc4615)) + +# [0.30.0](https://github.com/RocketChat/fuselage/compare/v0.29.0...v0.30.0) (2021-10-06) + +### Bug Fixes + +- **jest:** Adjust jest and ts-jest dependencies ([#547](https://github.com/RocketChat/fuselage/issues/547)) ([91a4fa1](https://github.com/RocketChat/fuselage/commit/91a4fa1365394001afe1bd46480bda3bafed5505)) + +# [0.29.0](https://github.com/RocketChat/fuselage/compare/v0.28.0...v0.29.0) (2021-08-31) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.28.0](https://github.com/RocketChat/fuselage/compare/v0.27.0...v0.28.0) (2021-07-30) + +### Bug Fixes + +- **fuselage-ui-kit:** Implements missing url prop for buttons ([#488](https://github.com/RocketChat/fuselage/issues/488)) ([bb19344](https://github.com/RocketChat/fuselage/commit/bb193441804c9b20174e2586d22c4b2845a486c3)) + +### Features + +- **onboarding-ui:** Administrator information form and Organization information form ([#489](https://github.com/RocketChat/fuselage/issues/489)) ([b289f68](https://github.com/RocketChat/fuselage/commit/b289f68676954b91c792d8d97680314178bf2c60)) +- styled API; monorepo grooming ([#482](https://github.com/RocketChat/fuselage/issues/482)) ([1b6b70c](https://github.com/RocketChat/fuselage/commit/1b6b70cf67ec16927b1566adc2350295a8927223)) + +# [0.27.0](https://github.com/RocketChat/fuselage/compare/v0.26.0...v0.27.0) (2021-06-28) + +### Features + +- **ui-kit:** Attachment Surface ([#474](https://github.com/RocketChat/fuselage/issues/474)) ([63bb5ea](https://github.com/RocketChat/fuselage/commit/63bb5ea044afc768295a50e0155406df6091b840)) +- ui-kit-unified ([#392](https://github.com/RocketChat/fuselage/issues/392)) ([ce48ca9](https://github.com/RocketChat/fuselage/commit/ce48ca9d9806283bba8be5df7c29c7aa8c1e716f)) + +# [0.26.0](https://github.com/RocketChat/fuselage/compare/v0.25.0...v0.26.0) (2021-05-28) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.25.0](https://github.com/RocketChat/fuselage/compare/v0.24.0...v0.25.0) (2021-05-19) + +### Features + +- [@rocket](https://github.com/rocket).chat/message-parser ([#443](https://github.com/RocketChat/fuselage/issues/443)) ([4722cdf](https://github.com/RocketChat/fuselage/commit/4722cdff46f5987f335d989be59649c7652bb12a)) + +# [0.24.0](https://github.com/RocketChat/fuselage/compare/v0.23.0...v0.24.0) (2021-04-28) + +### Features + +- [@rocket](https://github.com/rocket).chat/string-helpers ([#431](https://github.com/RocketChat/fuselage/issues/431)) ([2509d6a](https://github.com/RocketChat/fuselage/commit/2509d6acdbe5ec8b216e8d4430373797c5f5dfe2)) + +# [0.23.0](https://github.com/RocketChat/fuselage/compare/v0.22.0...v0.23.0) (2021-04-01) + +### Bug Fixes + +- **npm:** Wrong paths in "files" field of package.json ([6d3c811](https://github.com/RocketChat/fuselage/commit/6d3c811f6fd747de7f47aff145902d88476272ee)) + +# [0.22.0](https://github.com/RocketChat/fuselage/compare/v0.21.0...v0.22.0) (2021-02-26) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.21.0](https://github.com/RocketChat/fuselage/compare/v0.20.3...v0.21.0) (2021-01-31) + +### Features + +- Built modules for design tokens ([#356](https://github.com/RocketChat/fuselage/issues/356)) ([f9c3449](https://github.com/RocketChat/fuselage/commit/f9c344953b8161a4385cab3a3dcc8b6a7210446f)) +- linear_scale element ([#365](https://github.com/RocketChat/fuselage/issues/365)) ([43a4c54](https://github.com/RocketChat/fuselage/commit/43a4c54ed10d096ef2259ddcd30c3bbd97ae866a)) + +## [0.20.1](https://github.com/RocketChat/fuselage/compare/v0.20.0...v0.20.1) (2020-12-22) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.20.0](https://github.com/RocketChat/fuselage/compare/v0.19.0...v0.20.0) (2020-12-21) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.19.0](https://github.com/RocketChat/fuselage/compare/v0.18.0...v0.19.0) (2020-11-28) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.18.0](https://github.com/RocketChat/fuselage/compare/v0.17.3...v0.18.0) (2020-11-16) + +### Bug Fixes + +- Set a conservative output.environment on Webpack bundles ([#330](https://github.com/RocketChat/fuselage/issues/330)) ([62bf728](https://github.com/RocketChat/fuselage/commit/62bf728d3541d8d7ee72420347f2351359fb5df7)) + +## [0.17.3](https://github.com/RocketChat/fuselage/compare/v0.17.2...v0.17.3) (2020-11-16) + +### Bug Fixes + +- Set a conservative output.environment on Webpack bundles ([#330](https://github.com/RocketChat/fuselage/issues/330)) ([85d4a3a](https://github.com/RocketChat/fuselage/commit/85d4a3a5fd6881b07e97fb690d31baef405cfa69)) + +## [0.17.2](https://github.com/RocketChat/fuselage/compare/v0.17.1...v0.17.2) (2020-10-28) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.17.1](https://github.com/RocketChat/fuselage/compare/v0.17.0...v0.17.1) (2020-10-26) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.17.0](https://github.com/RocketChat/fuselage/compare/v0.16.0...v0.17.0) (2020-10-25) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.16.0](https://github.com/RocketChat/fuselage/compare/v0.15.1...v0.16.0) (2020-09-30) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.15.1](https://github.com/RocketChat/fuselage/compare/v0.15.0...v0.15.1) (2020-09-22) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.15.0](https://github.com/RocketChat/fuselage/compare/v0.14.1...v0.15.0) (2020-09-17) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.14.1](https://github.com/RocketChat/fuselage/compare/v0.14.0...v0.14.1) (2020-08-22) + +### Bug Fixes + +- UiKit - conditional block ([38d57ea](https://github.com/RocketChat/fuselage/commit/38d57ea9005aafc3820316beacfda43f620fa93f)) + +# [0.14.0](https://github.com/RocketChat/fuselage/compare/v0.13.2...v0.14.0) (2020-08-18) + +### Features + +- UiKit types ([#274](https://github.com/RocketChat/fuselage/issues/274)) ([e2ea79b](https://github.com/RocketChat/fuselage/commit/e2ea79b02a0fd6492c3fad06ba57cbb88d89da2b)) + +## [0.13.1](https://github.com/RocketChat/fuselage/compare/v0.13.0...v0.13.1) (2020-07-17) + +### Bug Fixes + +- Select mutations and ui-kit alerts ([#263](https://github.com/RocketChat/fuselage/issues/263)) ([661398d](https://github.com/RocketChat/fuselage/commit/661398dfdeaf827dadc46d24a7382d69f43f9742)) + +# [0.13.0](https://github.com/RocketChat/fuselage/compare/v0.12.0...v0.13.0) (2020-07-14) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.12.0](https://github.com/RocketChat/fuselage/compare/v0.11.0...v0.12.0) (2020-07-14) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.11.0](https://github.com/RocketChat/fuselage/compare/v0.10.0...v0.11.0) (2020-07-11) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.10.0](https://github.com/RocketChat/fuselage/compare/v0.9.0...v0.10.0) (2020-06-20) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.9.0](https://github.com/RocketChat/fuselage/compare/v0.8.0...v0.9.0) (2020-05-21) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.8.0](https://github.com/RocketChat/fuselage/compare/v0.7.1...v0.8.0) (2020-04-22) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.7.1](https://github.com/RocketChat/fuselage/compare/v0.7.0...v0.7.1) (2020-04-01) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.7.0](https://github.com/RocketChat/fuselage/compare/v0.6.2...v0.7.0) (2020-04-01) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.6.2](https://github.com/RocketChat/fuselage/compare/v0.6.1...v0.6.2) (2020-03-31) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.6.1](https://github.com/RocketChat/fuselage/compare/v0.6.0...v0.6.1) (2020-03-24) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.6.0](https://github.com/RocketChat/fuselage/compare/v0.5.0...v0.6.0) (2020-03-20) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.5.0](https://github.com/RocketChat/fuselage/compare/v0.4.1...v0.5.0) (2020-03-20) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +## [0.4.1](https://github.com/RocketChat/fuselage/compare/v0.4.0...v0.4.1) (2020-03-16) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.4.0](https://github.com/RocketChat/fuselage/compare/v0.3.0...v0.4.0) (2020-03-10) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.3.0](https://github.com/RocketChat/fuselage/compare/v0.2.0...v0.3.0) (2020-02-17) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.30...v0.2.0) (2020-02-13) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.29](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.28...v0.2.0-alpha.29) (2020-02-10) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.28](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.27...v0.2.0-alpha.28) (2020-02-10) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.26](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.25...v0.2.0-alpha.26) (2020-02-10) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.25](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.24...v0.2.0-alpha.25) (2020-02-10) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.24](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.23...v0.2.0-alpha.24) (2020-02-09) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.23](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.22...v0.2.0-alpha.23) (2020-02-07) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.22](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.21...v0.2.0-alpha.22) (2020-02-07) + +### Bug Fixes + +- uikit using react components ([#135](https://github.com/RocketChat/fuselage/issues/135)) ([52fcedb](https://github.com/RocketChat/fuselage/commit/52fcedb0efbc33ad4240c83fd92a325fcc9f0f4c)) + +# [0.2.0-alpha.21](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.20...v0.2.0-alpha.21) (2020-02-05) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.20](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.19...v0.2.0-alpha.20) (2020-02-01) + +**Note:** Version bump only for package @rocket.chat/ui-kit + +# [0.2.0-alpha.19](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.18...v0.2.0-alpha.19) (2020-01-13) + +### Features + +- Position, Modal, Options components ([#116](https://github.com/RocketChat/fuselage/issues/116)) ([af1916a](https://github.com/RocketChat/fuselage/commit/af1916a22c677939adda04fe417dafe406292762)), closes [#117](https://github.com/RocketChat/fuselage/issues/117) + +# [0.2.0-alpha.18](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.17...v0.2.0-alpha.18) (2019-12-31) + +### Features + +- UI Kit ([#95](https://github.com/RocketChat/fuselage/issues/95)) ([6d4162b](https://github.com/RocketChat/fuselage/commit/6d4162bb8c121b1e89f8c818e7106bce49f09c27)), closes [#94](https://github.com/RocketChat/fuselage/issues/94) [#109](https://github.com/RocketChat/fuselage/issues/109) [#108](https://github.com/RocketChat/fuselage/issues/108) [#111](https://github.com/RocketChat/fuselage/issues/111) diff --git a/packages/ui-kit/README.md b/packages/ui-kit/README.md new file mode 100644 index 000000000000..d7685c0d8ba0 --- /dev/null +++ b/packages/ui-kit/README.md @@ -0,0 +1,91 @@ + + +

+ + Rocket.Chat + +

+ +# `@rocket.chat/ui-kit` + +> Interactive UI elements for Rocket.Chat Apps + +--- + +[![npm@latest](https://img.shields.io/npm/v/@rocket.chat/ui-kit/latest?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/ui-kit/v/latest) [![npm@next](https://img.shields.io/npm/v/@rocket.chat/ui-kit/next?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/ui-kit/v/next) ![npm downloads](https://img.shields.io/npm/dw/@rocket.chat/ui-kit?style=flat-square) ![License: MIT](https://img.shields.io/npm/l/@rocket.chat/ui-kit?style=flat-square) + +![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/ui-kit?style=flat-square) ![npm bundle size](https://img.shields.io/bundlephobia/min/@rocket.chat/ui-kit?style=flat-square) + + + +## Install + + + +Add `@rocket.chat/ui-kit` as a dependency: + +```sh +npm i @rocket.chat/ui-kit + +# or, if you are using yarn: + +yarn add @rocket.chat/ui-kit +``` + + + +## Contributing + + + +Contributions, issues, and feature requests are welcome!
+Feel free to check the [issues](https://github.com/RocketChat/Rocket.Chat/issues). + + + +### Building + +As this package dependends on others in this monorepo, before anything run the following at the root directory: + + + +```sh +yarn build +``` + + + +### Linting + +To ensure the source is matching our coding style, we perform [linting](). +Before commiting, check if your code fits our style by running: + + + +```sh +yarn lint +``` + + + +Some linter warnings and errors can be automatically fixed: + + + +```sh +yarn lint-and-fix +``` + + + +### Running tests + +Whenever possible, add tests to describe exactly what your code do. You can run them by yourself: + + + +```sh +yarn test +``` + + diff --git a/packages/ui-kit/jest.config.js b/packages/ui-kit/jest.config.js new file mode 100644 index 000000000000..9dcb21e154ff --- /dev/null +++ b/packages/ui-kit/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + errorOnDeprecated: true, + testMatch: ['/src/**/*.spec.[jt]s?(x)'], +}; diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json new file mode 100644 index 000000000000..757557ee13d9 --- /dev/null +++ b/packages/ui-kit/package.json @@ -0,0 +1,61 @@ +{ + "name": "@rocket.chat/ui-kit", + "version": "0.32.1", + "description": "Interactive UI elements for Rocket.Chat Apps", + "homepage": "https://rocket.chat", + "author": { + "name": "Rocket.Chat", + "url": "https://rocket.chat/" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/RocketChat/Rocket.Chat.git" + }, + "bugs": { + "url": "https://github.com/RocketChat/Rocket.Chat/issues" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", + "files": [ + "/dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "run-s prepare .:build:clean .:build:esm .:build:cjs", + ".:build:clean": "rimraf dist", + ".:build:esm": "tsc -p tsconfig.json", + ".:build:cjs": "tsc -p tsconfig-cjs.json", + "lint": "eslint . --ext .ts,.tsx", + "test": "jest", + "prepare": "ts-patch install && typia patch" + }, + "devDependencies": { + "@babel/core": "~7.21.4", + "@babel/eslint-parser": "~7.23.3", + "@babel/plugin-transform-runtime": "~7.21.4", + "@babel/preset-env": "~7.21.4", + "@rocket.chat/eslint-config": "workspace:~", + "@types/jest": "~29.5.0", + "babel-loader": "~9.1.2", + "eslint": "~8.45.0", + "jest": "~29.5.0", + "npm-run-all": "~4.1.5", + "prettier": "~2.8.8", + "rimraf": "~3.0.2", + "ts-jest": "~29.1.1", + "ts-loader": "~9.4.2", + "ts-node": "~10.9.1", + "ts-patch": "~3.0.2", + "typescript": "~5.3.2" + }, + "dependencies": { + "typia": "~5.3.3" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/ui-kit/src/blocks/Actionable.ts b/packages/ui-kit/src/blocks/Actionable.ts new file mode 100644 index 000000000000..802201bd33cc --- /dev/null +++ b/packages/ui-kit/src/blocks/Actionable.ts @@ -0,0 +1,10 @@ +import type { ConfirmationDialog } from './ConfirmationDialog'; +import type { InputElementDispatchAction } from './InputElementDispatchAction'; + +export type Actionable = Block & { + appId: string; + blockId: string; + actionId: string; + confirm?: ConfirmationDialog; + dispatchActionConfig?: InputElementDispatchAction[]; +}; diff --git a/packages/ui-kit/src/blocks/ActionableElement.ts b/packages/ui-kit/src/blocks/ActionableElement.ts new file mode 100644 index 000000000000..9de645df1340 --- /dev/null +++ b/packages/ui-kit/src/blocks/ActionableElement.ts @@ -0,0 +1,38 @@ +import type { ButtonElement } from './elements/ButtonElement'; +import type { ChannelsSelectElement } from './elements/ChannelsSelectElement'; +import type { CheckboxElement } from './elements/CheckboxElement'; +import type { ConversationsSelectElement } from './elements/ConversationsSelectElement'; +import type { DatePickerElement } from './elements/DatePickerElement'; +import type { ExperimentalTabElement } from './elements/ExperimentalTabElement'; +import type { LinearScaleElement } from './elements/LinearScaleElement'; +import type { MultiChannelsSelectElement } from './elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from './elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from './elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from './elements/MultiUsersSelectElement'; +import type { OverflowElement } from './elements/OverflowElement'; +import type { PlainTextInputElement } from './elements/PlainTextInputElement'; +import type { RadioButtonElement } from './elements/RadioButtonElement'; +import type { StaticSelectElement } from './elements/StaticSelectElement'; +import type { TimePickerElement } from './elements/TimePickerElement'; +import type { ToggleSwitchElement } from './elements/ToggleSwitchElement'; +import type { UsersSelectElement } from './elements/UsersSelectElement'; + +export type ActionableElement = + | ButtonElement + | ChannelsSelectElement + | ConversationsSelectElement + | DatePickerElement + | LinearScaleElement + | MultiChannelsSelectElement + | MultiConversationsSelectElement + | MultiStaticSelectElement + | MultiUsersSelectElement + | OverflowElement + | PlainTextInputElement + | StaticSelectElement + | UsersSelectElement + | ToggleSwitchElement + | RadioButtonElement + | CheckboxElement + | TimePickerElement + | ExperimentalTabElement; diff --git a/packages/ui-kit/src/blocks/Block.ts b/packages/ui-kit/src/blocks/Block.ts new file mode 100644 index 000000000000..c94520608856 --- /dev/null +++ b/packages/ui-kit/src/blocks/Block.ts @@ -0,0 +1,5 @@ +import type { BlockElement } from './BlockElement'; +import type { LayoutBlock } from './LayoutBlock'; +import type { TextObject } from './TextObject'; + +export type Block = TextObject | BlockElement | LayoutBlock; diff --git a/packages/ui-kit/src/blocks/BlockElement.ts b/packages/ui-kit/src/blocks/BlockElement.ts new file mode 100644 index 000000000000..52d12291121d --- /dev/null +++ b/packages/ui-kit/src/blocks/BlockElement.ts @@ -0,0 +1,40 @@ +import type { ButtonElement } from './elements/ButtonElement'; +import type { ChannelsSelectElement } from './elements/ChannelsSelectElement'; +import type { CheckboxElement } from './elements/CheckboxElement'; +import type { ConversationsSelectElement } from './elements/ConversationsSelectElement'; +import type { DatePickerElement } from './elements/DatePickerElement'; +import type { ExperimentalTabElement } from './elements/ExperimentalTabElement'; +import type { ImageElement } from './elements/ImageElement'; +import type { LinearScaleElement } from './elements/LinearScaleElement'; +import type { MultiChannelsSelectElement } from './elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from './elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from './elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from './elements/MultiUsersSelectElement'; +import type { OverflowElement } from './elements/OverflowElement'; +import type { PlainTextInputElement } from './elements/PlainTextInputElement'; +import type { RadioButtonElement } from './elements/RadioButtonElement'; +import type { StaticSelectElement } from './elements/StaticSelectElement'; +import type { TimePickerElement } from './elements/TimePickerElement'; +import type { ToggleSwitchElement } from './elements/ToggleSwitchElement'; +import type { UsersSelectElement } from './elements/UsersSelectElement'; + +export type BlockElement = + | ButtonElement + | ChannelsSelectElement + | ConversationsSelectElement + | DatePickerElement + | ImageElement + | LinearScaleElement + | MultiChannelsSelectElement + | MultiConversationsSelectElement + | MultiStaticSelectElement + | MultiUsersSelectElement + | OverflowElement + | PlainTextInputElement + | StaticSelectElement + | UsersSelectElement + | ToggleSwitchElement + | RadioButtonElement + | CheckboxElement + | TimePickerElement + | ExperimentalTabElement; diff --git a/packages/ui-kit/src/blocks/BlockElementType.ts b/packages/ui-kit/src/blocks/BlockElementType.ts new file mode 100644 index 000000000000..2d4ec5fcfa43 --- /dev/null +++ b/packages/ui-kit/src/blocks/BlockElementType.ts @@ -0,0 +1,36 @@ +import type { BlockElement } from './BlockElement'; + +export enum BlockElementType { + BUTTON = 'button', + IMAGE = 'image', + OVERFLOW = 'overflow', + /** @deprecated */ + OVERFLOW_MENU = 'overflow', + PLAIN_TEXT_INPUT = 'plain_text_input', + STATIC_SELECT = 'static_select', + MULTI_STATIC_SELECT = 'multi_static_select', + /** @deprecated */ + CONVERSATION_SELECT = 'conversations_select', + /** @deprecated */ + CHANNEL_SELECT = 'channels_select', + /** @deprecated */ + USER_SELECT = 'users_select', + CONVERSATIONS_SELECT = 'conversations_select', + CHANNELS_SELECT = 'channels_select', + USERS_SELECT = 'users_select', + DATEPICKER = 'datepicker', + LINEAR_SCALE = 'linear_scale', + MULTI_CHANNELS_SELECT = 'multi_channels_select', + MULTI_CONVERSATIONS_SELECT = 'multi_conversations_select', + MULTI_USERS_SELECT = 'multi_users_select', + TOGGLE_SWITCH = 'toggle_switch', + RADIO_BUTTON = 'radio_button', + CHECKBOX = 'checkbox', + TIME_PICKER = 'time_picker', + TAB = 'tab', +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +type AssertEnumKeysFromBlockUnionTypes = { + [B in BlockElement as Uppercase]: (typeof BlockElementType)[Uppercase]; +}; diff --git a/packages/ui-kit/src/blocks/ButtonStyle.ts b/packages/ui-kit/src/blocks/ButtonStyle.ts new file mode 100644 index 000000000000..12a814743d8e --- /dev/null +++ b/packages/ui-kit/src/blocks/ButtonStyle.ts @@ -0,0 +1,5 @@ +/** @deprecated */ +export enum ButtonStyle { + PRIMARY = 'primary', + DANGER = 'danger', +} diff --git a/packages/ui-kit/src/blocks/ConfirmationDialog.ts b/packages/ui-kit/src/blocks/ConfirmationDialog.ts new file mode 100644 index 000000000000..9194087c7c16 --- /dev/null +++ b/packages/ui-kit/src/blocks/ConfirmationDialog.ts @@ -0,0 +1,10 @@ +import type { TextObject } from './TextObject'; +import type { PlainText } from './text/PlainText'; + +export type ConfirmationDialog = { + title: PlainText; + text: TextObject; + confirm: PlainText; + deny: PlainText; + style: 'primary' | 'danger'; +}; diff --git a/packages/ui-kit/src/blocks/ElementType.ts b/packages/ui-kit/src/blocks/ElementType.ts new file mode 100644 index 000000000000..57dc0029ce22 --- /dev/null +++ b/packages/ui-kit/src/blocks/ElementType.ts @@ -0,0 +1,23 @@ +/** @deprecated */ +export enum ElementType { + PLAIN_TEXT = 'plain_text', + MARKDOWN = 'mrkdwn', + DIVIDER = 'divider', + SECTION = 'section', + INPUT = 'input', + CONDITIONAL = 'conditional', + IMAGE = 'image', + ACTIONS = 'actions', + CONTEXT = 'context', + BUTTON = 'button', + OVERFLOW = 'overflow', + PLAIN_TEXT_INPUT = 'plain_text_input', + CONVERSATION_SELECT = 'conversations_select', + CHANNEL_SELECT = 'channels_select', + USER_SELECT = 'users_select', + STATIC_SELECT = 'static_select', + MULTI_STATIC_SELECT = 'multi_static_select', + DATEPICKER = 'datepicker', + LINEAR_SCALE = 'linear_scale', + TAB = 'tab', +} diff --git a/packages/ui-kit/src/blocks/InputElement.ts b/packages/ui-kit/src/blocks/InputElement.ts new file mode 100644 index 000000000000..82cc3f051ccb --- /dev/null +++ b/packages/ui-kit/src/blocks/InputElement.ts @@ -0,0 +1,5 @@ +import type { SelectElement } from './SelectElement'; +import type { DatePickerElement } from './elements/DatePickerElement'; +import type { PlainTextInputElement } from './elements/PlainTextInputElement'; + +export type InputElement = DatePickerElement | SelectElement | PlainTextInputElement; diff --git a/packages/ui-kit/src/blocks/InputElementDispatchAction.ts b/packages/ui-kit/src/blocks/InputElementDispatchAction.ts new file mode 100644 index 000000000000..ad5d38481946 --- /dev/null +++ b/packages/ui-kit/src/blocks/InputElementDispatchAction.ts @@ -0,0 +1 @@ +export type InputElementDispatchAction = 'on_character_entered' | 'on_item_selected'; diff --git a/packages/ui-kit/src/blocks/LayoutBlock.ts b/packages/ui-kit/src/blocks/LayoutBlock.ts new file mode 100644 index 000000000000..fb25ae4a20ee --- /dev/null +++ b/packages/ui-kit/src/blocks/LayoutBlock.ts @@ -0,0 +1,24 @@ +import type { ActionsBlock } from './layout/ActionsBlock'; +import type { CalloutBlock } from './layout/CalloutBlock'; +import type { ConditionalBlock } from './layout/ConditionalBlock'; +import type { ContextBlock } from './layout/ContextBlock'; +import type { DividerBlock } from './layout/DividerBlock'; +import type { ExperimentalTabNavigationBlock } from './layout/ExperimentalTabNavigationBlock'; +import type { ImageBlock } from './layout/ImageBlock'; +import type { InputBlock } from './layout/InputBlock'; +import type { PreviewBlock } from './layout/PreviewBlock'; +import type { SectionBlock } from './layout/SectionBlock'; +import type { VideoConferenceBlock } from './layout/VideoConferenceBlock'; + +export type LayoutBlock = + | PreviewBlock + | ActionsBlock + | ConditionalBlock + | ContextBlock + | DividerBlock + | ImageBlock + | InputBlock + | SectionBlock + | VideoConferenceBlock + | CalloutBlock + | ExperimentalTabNavigationBlock; diff --git a/packages/ui-kit/src/blocks/LayoutBlockType.ts b/packages/ui-kit/src/blocks/LayoutBlockType.ts new file mode 100644 index 000000000000..71090b274fce --- /dev/null +++ b/packages/ui-kit/src/blocks/LayoutBlockType.ts @@ -0,0 +1,20 @@ +import type { LayoutBlock } from './LayoutBlock'; + +export enum LayoutBlockType { + SECTION = 'section', + DIVIDER = 'divider', + IMAGE = 'image', + ACTIONS = 'actions', + CONTEXT = 'context', + INPUT = 'input', + CONDITIONAL = 'conditional', + PREVIEW = 'preview', + VIDEO_CONF = 'video_conf', + CALLOUT = 'callout', + TAB_NAVIGATION = 'tab_navigation', +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +type AssertEnumKeysFromBlockUnionTypes = { + [B in LayoutBlock as Uppercase]: (typeof LayoutBlockType)[Uppercase]; +}; diff --git a/packages/ui-kit/src/blocks/LayoutBlockish.ts b/packages/ui-kit/src/blocks/LayoutBlockish.ts new file mode 100644 index 000000000000..43e3fe659eaa --- /dev/null +++ b/packages/ui-kit/src/blocks/LayoutBlockish.ts @@ -0,0 +1,4 @@ +export type LayoutBlockish = Block & { + appId?: string; + blockId?: string; +}; diff --git a/packages/ui-kit/src/blocks/Option.ts b/packages/ui-kit/src/blocks/Option.ts new file mode 100644 index 000000000000..64e0dee57d00 --- /dev/null +++ b/packages/ui-kit/src/blocks/Option.ts @@ -0,0 +1,9 @@ +import type { TextObject } from './TextObject'; +import type { PlainText } from './text/PlainText'; + +export type Option = { + text: TextObject; + value: string; + description?: PlainText; + url?: string; +}; diff --git a/packages/ui-kit/src/blocks/OptionGroup.ts b/packages/ui-kit/src/blocks/OptionGroup.ts new file mode 100644 index 000000000000..6dc0da6f1350 --- /dev/null +++ b/packages/ui-kit/src/blocks/OptionGroup.ts @@ -0,0 +1,7 @@ +import type { Option } from './Option'; +import type { PlainText } from './text/PlainText'; + +export type OptionGroup = { + label: PlainText; + options: Option[]; +}; diff --git a/packages/ui-kit/src/blocks/RenderableBlock.ts b/packages/ui-kit/src/blocks/RenderableBlock.ts new file mode 100644 index 000000000000..934a475cfe48 --- /dev/null +++ b/packages/ui-kit/src/blocks/RenderableBlock.ts @@ -0,0 +1,4 @@ +import type { Block } from './Block'; +import type { ConditionalBlock } from './layout/ConditionalBlock'; + +export type RenderableBlock = Exclude; diff --git a/packages/ui-kit/src/blocks/RenderableLayoutBlock.ts b/packages/ui-kit/src/blocks/RenderableLayoutBlock.ts new file mode 100644 index 000000000000..6402b87602f9 --- /dev/null +++ b/packages/ui-kit/src/blocks/RenderableLayoutBlock.ts @@ -0,0 +1,4 @@ +import type { LayoutBlock } from './LayoutBlock'; +import type { ConditionalBlock } from './layout/ConditionalBlock'; + +export type RenderableLayoutBlock = Exclude; diff --git a/packages/ui-kit/src/blocks/SelectElement.ts b/packages/ui-kit/src/blocks/SelectElement.ts new file mode 100644 index 000000000000..3c018afd9ba9 --- /dev/null +++ b/packages/ui-kit/src/blocks/SelectElement.ts @@ -0,0 +1,18 @@ +import type { ChannelsSelectElement } from './elements/ChannelsSelectElement'; +import type { ConversationsSelectElement } from './elements/ConversationsSelectElement'; +import type { MultiChannelsSelectElement } from './elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from './elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from './elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from './elements/MultiUsersSelectElement'; +import type { StaticSelectElement } from './elements/StaticSelectElement'; +import type { UsersSelectElement } from './elements/UsersSelectElement'; + +export type SelectElement = + | ChannelsSelectElement + | ConversationsSelectElement + | MultiChannelsSelectElement + | MultiConversationsSelectElement + | MultiStaticSelectElement + | MultiUsersSelectElement + | StaticSelectElement + | UsersSelectElement; diff --git a/packages/ui-kit/src/blocks/TextObject.ts b/packages/ui-kit/src/blocks/TextObject.ts new file mode 100644 index 000000000000..e825851c61e0 --- /dev/null +++ b/packages/ui-kit/src/blocks/TextObject.ts @@ -0,0 +1,4 @@ +import type { Markdown } from './text/Markdown'; +import type { PlainText } from './text/PlainText'; + +export type TextObject = PlainText | Markdown; diff --git a/packages/ui-kit/src/blocks/TextObjectType.ts b/packages/ui-kit/src/blocks/TextObjectType.ts new file mode 100644 index 000000000000..4535cc76d36a --- /dev/null +++ b/packages/ui-kit/src/blocks/TextObjectType.ts @@ -0,0 +1,15 @@ +import type { TextObject } from './TextObject'; + +export enum TextObjectType { + /** @deprecated */ + PLAINTEXT = 'plain_text', + PLAIN_TEXT = 'plain_text', + /** @deprecated */ + MARKDOWN = 'mrkdwn', + MRKDWN = 'mrkdwn', +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +type AssertEnumKeysFromBlockUnionTypes = { + [B in TextObject as Uppercase]: (typeof TextObjectType)[Uppercase]; +}; diff --git a/packages/ui-kit/src/blocks/WithTranslations.ts b/packages/ui-kit/src/blocks/WithTranslations.ts new file mode 100644 index 000000000000..1cbb259f48fc --- /dev/null +++ b/packages/ui-kit/src/blocks/WithTranslations.ts @@ -0,0 +1,6 @@ +export type WithTranslations = T & { + i18n?: { + key: string; + args?: { [key: string]: string | number }; + }; +}; diff --git a/packages/ui-kit/src/blocks/deprecations.ts b/packages/ui-kit/src/blocks/deprecations.ts new file mode 100644 index 000000000000..badeed00af9a --- /dev/null +++ b/packages/ui-kit/src/blocks/deprecations.ts @@ -0,0 +1,147 @@ +/* eslint-disable @typescript-eslint/no-empty-interface */ +import type { LayoutBlock } from '..'; +import type { Actionable } from './Actionable'; +import type { Block } from './Block'; +import type { Option } from './Option'; +import type { TextObject } from './TextObject'; +import type { ButtonElement } from './elements/ButtonElement'; +import type { DatePickerElement } from './elements/DatePickerElement'; +import type { ImageElement } from './elements/ImageElement'; +import type { LinearScaleElement } from './elements/LinearScaleElement'; +import type { MultiStaticSelectElement } from './elements/MultiStaticSelectElement'; +import type { OverflowElement } from './elements/OverflowElement'; +import type { PlainTextInputElement } from './elements/PlainTextInputElement'; +import type { StaticSelectElement } from './elements/StaticSelectElement'; +import type { ActionsBlock } from './layout/ActionsBlock'; +import type { ConditionalBlock } from './layout/ConditionalBlock'; +import type { ContextBlock } from './layout/ContextBlock'; +import type { DividerBlock } from './layout/DividerBlock'; +import type { ImageBlock } from './layout/ImageBlock'; +import type { InputBlock } from './layout/InputBlock'; +import type { SectionBlock } from './layout/SectionBlock'; +import type { Markdown } from './text/Markdown'; +import type { PlainText } from './text/PlainText'; + +type InterfaceOf = Pick; + +/** @deprecated */ +export type ILinearScaleElement = InterfaceOf; +/** @deprecated */ +export type IPlainTextInput = InterfaceOf; +/** @deprecated */ +export type IStaticSelectElement = InterfaceOf; +/** @deprecated */ +export type IMultiStaticSelectElement = InterfaceOf; +/** @deprecated */ +export type IDatePickerElement = InterfaceOf; +/** @deprecated */ +export type IButtonElement = InterfaceOf; +/** @deprecated */ +export type IOverflowElement = InterfaceOf; +/** @deprecated */ +export type IImageElement = InterfaceOf; +/** @deprecated */ +export type IActionableElement = InterfaceOf>>; + +/** @deprecated */ +export type IActionsBlock = InterfaceOf; +/** @deprecated */ +export type ActionElement = InterfaceOf; +/** @deprecated */ +export type ISectionBlock = InterfaceOf; +/** @deprecated */ +export type SectionAccessoryElement = InterfaceOf>; +/** @deprecated */ +export type AccessoryElements = InterfaceOf>; +/** @deprecated */ +export type IImageBlock = InterfaceOf; +/** @deprecated */ +export type IDividerBlock = InterfaceOf; +/** @deprecated */ +export type IInputBlock = InterfaceOf; +/** @deprecated */ +export type InputElement = InterfaceOf; +/** @deprecated */ +export type IContextBlock = InterfaceOf; +/** @deprecated */ +export type ContextElement = InterfaceOf; +/** @deprecated */ +export type IConditionalBlock = InterfaceOf; +/** @deprecated */ +export type ConditionalBlockFilters = InterfaceOf>; +/** @deprecated */ +export type IConditionalBlockFilters = InterfaceOf; +/** @deprecated */ +export type IBlock = InterfaceOf; + +/** @deprecated */ +export type IPlainText = InterfaceOf; +/** @deprecated */ +export type IMarkdown = InterfaceOf<Markdown>; + +/** @deprecated */ +export type IElement = InterfaceOf<Block>; + +/** @deprecated */ +export type ITextObject = InterfaceOf<TextObject & { emoji?: boolean }>; + +/** @deprecated */ +export type IOptionObject = InterfaceOf<Omit<Option, 'description' | 'url'>>; + +/** @deprecated */ +export type IBlockElement = Pick<Block, 'type'>; + +/** @deprecated */ +export type IInteractiveElement = InterfaceOf< + IBlockElement & { + actionId: string; + } +>; + +/** @deprecated */ +export type IInputElement = InterfaceOf< + IBlockElement & { + actionId: string; + placeholder: ITextObject; + initialValue?: string | string[]; + } +>; + +export type IOverflowMenuElement = InterfaceOf< + IInteractiveElement & { + type: OverflowElement['type']; + options: IOptionObject[]; + } +>; + +export type IPlainTextInputElement = InterfaceOf<IInputElement & PlainTextInputElement>; + +export type ISelectElement = InterfaceOf< + IInputElement & { + type: StaticSelectElement['type'] | MultiStaticSelectElement['type']; + } +>; + +export { + /** @deprecated */ + ButtonStyle, +} from './ButtonStyle'; +export { + /** @deprecated */ + ConditionalBlockFiltersEngine, +} from '../rendering/ConditionalBlockFiltersEngine'; +export { + /** @deprecated */ + LayoutBlockType as BlockType, +} from './LayoutBlockType'; + +export { + ElementType, + /** @deprecated */ + ElementType as ELEMENT_TYPES, +} from './ElementType'; + +export { + /** @deprecated */ + BlockContext as BLOCK_CONTEXT, +} from '../rendering/BlockContext'; diff --git a/packages/ui-kit/src/blocks/elements/ButtonElement.ts b/packages/ui-kit/src/blocks/elements/ButtonElement.ts new file mode 100644 index 000000000000..c4cea6937036 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ButtonElement.ts @@ -0,0 +1,11 @@ +import type { Actionable } from '../Actionable'; +import type { PlainText } from '../text/PlainText'; + +export type ButtonElement = Actionable<{ + type: 'button'; + text: PlainText; + url?: string; + value?: string; + style?: 'primary' | 'secondary' | 'danger' | 'warning' | 'success'; + secondary?: boolean; +}>; diff --git a/packages/ui-kit/src/blocks/elements/ChannelsSelectElement.ts b/packages/ui-kit/src/blocks/elements/ChannelsSelectElement.ts new file mode 100644 index 000000000000..70db64b19328 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ChannelsSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type ChannelsSelectElement = Actionable<{ + type: 'channels_select'; +}>; diff --git a/packages/ui-kit/src/blocks/elements/CheckboxElement.ts b/packages/ui-kit/src/blocks/elements/CheckboxElement.ts new file mode 100644 index 000000000000..e6d0fb166b63 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/CheckboxElement.ts @@ -0,0 +1,8 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; + +export type CheckboxElement = Actionable<{ + type: 'checkbox'; + options: Option[]; + initialOptions?: Option[]; +}>; diff --git a/packages/ui-kit/src/blocks/elements/ConversationsSelectElement.ts b/packages/ui-kit/src/blocks/elements/ConversationsSelectElement.ts new file mode 100644 index 000000000000..c79929af19d9 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ConversationsSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type ConversationsSelectElement = Actionable<{ + type: 'conversations_select'; +}>; diff --git a/packages/ui-kit/src/blocks/elements/DatePickerElement.ts b/packages/ui-kit/src/blocks/elements/DatePickerElement.ts new file mode 100644 index 000000000000..998be37dcb8a --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/DatePickerElement.ts @@ -0,0 +1,8 @@ +import type { Actionable } from '../Actionable'; +import type { TextObject } from '../TextObject'; + +export type DatePickerElement = Actionable<{ + type: 'datepicker'; + placeholder?: TextObject; + initialDate?: string; +}>; diff --git a/packages/ui-kit/src/blocks/elements/ExperimentalTabElement.ts b/packages/ui-kit/src/blocks/elements/ExperimentalTabElement.ts new file mode 100644 index 000000000000..f80fa5c852bc --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ExperimentalTabElement.ts @@ -0,0 +1,9 @@ +import type { Actionable } from '../Actionable'; +import type { TextObject } from '../TextObject'; + +export type ExperimentalTabElement = Actionable<{ + type: 'tab'; + title: TextObject; + disabled?: boolean; + selected?: boolean; +}>; diff --git a/packages/ui-kit/src/blocks/elements/ImageElement.ts b/packages/ui-kit/src/blocks/elements/ImageElement.ts new file mode 100644 index 000000000000..0301c0fda1ff --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ImageElement.ts @@ -0,0 +1,5 @@ +export type ImageElement = { + type: 'image'; + imageUrl: string; + altText: string; +}; diff --git a/packages/ui-kit/src/blocks/elements/LinearScaleElement.ts b/packages/ui-kit/src/blocks/elements/LinearScaleElement.ts new file mode 100644 index 000000000000..cbbaebb61e31 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/LinearScaleElement.ts @@ -0,0 +1,11 @@ +import type { Actionable } from '../Actionable'; +import type { PlainText } from '../text/PlainText'; + +export type LinearScaleElement = Actionable<{ + type: 'linear_scale'; + minValue?: number; + maxValue?: number; + initialValue?: number; + preLabel?: PlainText; + postLabel?: PlainText; +}>; diff --git a/packages/ui-kit/src/blocks/elements/MultiChannelsSelectElement.ts b/packages/ui-kit/src/blocks/elements/MultiChannelsSelectElement.ts new file mode 100644 index 000000000000..2b0ec7d1e5c2 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/MultiChannelsSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type MultiChannelsSelectElement = Actionable<{ + type: 'multi_channels_select'; +}>; diff --git a/packages/ui-kit/src/blocks/elements/MultiConversationsSelectElement.ts b/packages/ui-kit/src/blocks/elements/MultiConversationsSelectElement.ts new file mode 100644 index 000000000000..a9117086cb10 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/MultiConversationsSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type MultiConversationsSelectElement = Actionable<{ + type: 'multi_conversations_select'; +}>; diff --git a/packages/ui-kit/src/blocks/elements/MultiStaticSelectElement.ts b/packages/ui-kit/src/blocks/elements/MultiStaticSelectElement.ts new file mode 100644 index 000000000000..96eb6e609d21 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/MultiStaticSelectElement.ts @@ -0,0 +1,14 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; +import type { OptionGroup } from '../OptionGroup'; +import type { TextObject } from '../TextObject'; + +export type MultiStaticSelectElement = Actionable<{ + type: 'multi_static_select'; + placeholder: TextObject; + options: readonly Option[]; + optionGroups?: readonly OptionGroup[]; + maxSelectItems?: number; + initialValue?: Option['value'][]; + initialOption?: Option[]; +}>; diff --git a/packages/ui-kit/src/blocks/elements/MultiUsersSelectElement.ts b/packages/ui-kit/src/blocks/elements/MultiUsersSelectElement.ts new file mode 100644 index 000000000000..7600b551c833 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/MultiUsersSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type MultiUsersSelectElement = Actionable<{ + type: 'multi_users_select'; +}>; diff --git a/packages/ui-kit/src/blocks/elements/OverflowElement.ts b/packages/ui-kit/src/blocks/elements/OverflowElement.ts new file mode 100644 index 000000000000..74da663ed4b2 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/OverflowElement.ts @@ -0,0 +1,7 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; + +export type OverflowElement = Actionable<{ + type: 'overflow'; + options: readonly Option[]; +}>; diff --git a/packages/ui-kit/src/blocks/elements/PlainTextInputElement.ts b/packages/ui-kit/src/blocks/elements/PlainTextInputElement.ts new file mode 100644 index 000000000000..40d5ea7fccdf --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/PlainTextInputElement.ts @@ -0,0 +1,11 @@ +import type { Actionable } from '../Actionable'; +import type { PlainText } from '../text/PlainText'; + +export type PlainTextInputElement = Actionable<{ + type: 'plain_text_input'; + placeholder?: PlainText; + initialValue?: string; + multiline?: boolean; + minLength?: number; + maxLength?: number; +}>; diff --git a/packages/ui-kit/src/blocks/elements/RadioButtonElement.ts b/packages/ui-kit/src/blocks/elements/RadioButtonElement.ts new file mode 100644 index 000000000000..81ee7ede083f --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/RadioButtonElement.ts @@ -0,0 +1,8 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; + +export type RadioButtonElement = Actionable<{ + type: 'radio_button'; + options: Option[]; + initialOption?: Option; +}>; diff --git a/packages/ui-kit/src/blocks/elements/StaticSelectElement.ts b/packages/ui-kit/src/blocks/elements/StaticSelectElement.ts new file mode 100644 index 000000000000..edf144d76a28 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/StaticSelectElement.ts @@ -0,0 +1,13 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; +import type { OptionGroup } from '../OptionGroup'; +import type { TextObject } from '../TextObject'; + +export type StaticSelectElement = Actionable<{ + type: 'static_select'; + placeholder: TextObject; + options: readonly Option[]; + optionGroups?: readonly OptionGroup[]; + initialOption?: Option; + initialValue?: Option['value']; +}>; diff --git a/packages/ui-kit/src/blocks/elements/TimePickerElement.ts b/packages/ui-kit/src/blocks/elements/TimePickerElement.ts new file mode 100644 index 000000000000..a0b291f4aa5a --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/TimePickerElement.ts @@ -0,0 +1,8 @@ +import type { Actionable } from '../Actionable'; +import type { TextObject } from '../TextObject'; + +export type TimePickerElement = Actionable<{ + type: 'time_picker'; + placeholder?: TextObject; + initialTime?: string; +}>; diff --git a/packages/ui-kit/src/blocks/elements/ToggleSwitchElement.ts b/packages/ui-kit/src/blocks/elements/ToggleSwitchElement.ts new file mode 100644 index 000000000000..fd4dfb45449c --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/ToggleSwitchElement.ts @@ -0,0 +1,8 @@ +import type { Actionable } from '../Actionable'; +import type { Option } from '../Option'; + +export type ToggleSwitchElement = Actionable<{ + type: 'toggle_switch'; + options: Option[]; + initialOptions?: Option[]; +}>; diff --git a/packages/ui-kit/src/blocks/elements/UsersSelectElement.ts b/packages/ui-kit/src/blocks/elements/UsersSelectElement.ts new file mode 100644 index 000000000000..df49c6e7af76 --- /dev/null +++ b/packages/ui-kit/src/blocks/elements/UsersSelectElement.ts @@ -0,0 +1,6 @@ +import type { Actionable } from '../Actionable'; + +/** @todo */ +export type UsersSelectElement = Actionable<{ + type: 'users_select'; +}>; diff --git a/packages/ui-kit/src/blocks/isActionsBlockElement.ts b/packages/ui-kit/src/blocks/isActionsBlockElement.ts new file mode 100644 index 000000000000..97242b0c8363 --- /dev/null +++ b/packages/ui-kit/src/blocks/isActionsBlockElement.ts @@ -0,0 +1,22 @@ +import type { BlockElement } from './BlockElement'; +import { BlockElementType } from './BlockElementType'; +import type { ActionsBlock } from './layout/ActionsBlock'; + +export const isActionsBlockElement = (block: BlockElement): block is ActionsBlock['elements'][number] => { + switch (block.type as ActionsBlock['elements'][number]['type']) { + case BlockElementType.BUTTON: + case BlockElementType.DATEPICKER: + case BlockElementType.LINEAR_SCALE: + case BlockElementType.MULTI_STATIC_SELECT: + case BlockElementType.OVERFLOW: + case BlockElementType.STATIC_SELECT: + case BlockElementType.TOGGLE_SWITCH: + case BlockElementType.CHECKBOX: + case BlockElementType.RADIO_BUTTON: + case BlockElementType.TIME_PICKER: + return true; + + default: + return false; + } +}; diff --git a/packages/ui-kit/src/blocks/isContextBlockElement.ts b/packages/ui-kit/src/blocks/isContextBlockElement.ts new file mode 100644 index 000000000000..903593c2d6da --- /dev/null +++ b/packages/ui-kit/src/blocks/isContextBlockElement.ts @@ -0,0 +1,17 @@ +import type { BlockElement } from './BlockElement'; +import { BlockElementType } from './BlockElementType'; +import type { TextObject } from './TextObject'; +import { TextObjectType } from './TextObjectType'; +import type { ContextBlock } from './layout/ContextBlock'; + +export const isContextBlockElement = (block: TextObject | BlockElement): block is ContextBlock['elements'][number] => { + switch (block.type as ContextBlock['elements'][number]['type']) { + case BlockElementType.IMAGE: + case TextObjectType.PLAIN_TEXT: + case TextObjectType.MARKDOWN: + return true; + + default: + return false; + } +}; diff --git a/packages/ui-kit/src/blocks/isInputBlockElement.ts b/packages/ui-kit/src/blocks/isInputBlockElement.ts new file mode 100644 index 000000000000..02d088d2a1d9 --- /dev/null +++ b/packages/ui-kit/src/blocks/isInputBlockElement.ts @@ -0,0 +1,20 @@ +import type { BlockElement } from './BlockElement'; +import { BlockElementType } from './BlockElementType'; +import type { InputBlock } from './layout/InputBlock'; + +export const isInputBlockElement = (block: BlockElement): block is InputBlock['element'] => { + switch (block.type as InputBlock['element']['type']) { + case BlockElementType.CHANNELS_SELECT: + case BlockElementType.CONVERSATIONS_SELECT: + case BlockElementType.DATEPICKER: + case BlockElementType.LINEAR_SCALE: + case BlockElementType.MULTI_STATIC_SELECT: + case BlockElementType.PLAIN_TEXT_INPUT: + case BlockElementType.STATIC_SELECT: + case BlockElementType.USERS_SELECT: + return true; + + default: + return false; + } +}; diff --git a/packages/ui-kit/src/blocks/isSectionBlockAccessoryElement.ts b/packages/ui-kit/src/blocks/isSectionBlockAccessoryElement.ts new file mode 100644 index 000000000000..dede19742f38 --- /dev/null +++ b/packages/ui-kit/src/blocks/isSectionBlockAccessoryElement.ts @@ -0,0 +1,18 @@ +import type { BlockElement } from './BlockElement'; +import { BlockElementType } from './BlockElementType'; +import type { SectionBlock } from './layout/SectionBlock'; + +export const isSectionBlockAccessoryElement = (block: BlockElement): block is Exclude<SectionBlock['accessory'], undefined> => { + switch (block.type as Exclude<SectionBlock['accessory'], undefined>['type']) { + case BlockElementType.BUTTON: + case BlockElementType.DATEPICKER: + case BlockElementType.IMAGE: + case BlockElementType.MULTI_STATIC_SELECT: + case BlockElementType.OVERFLOW: + case BlockElementType.STATIC_SELECT: + return true; + + default: + return false; + } +}; diff --git a/packages/ui-kit/src/blocks/isTextObject.ts b/packages/ui-kit/src/blocks/isTextObject.ts new file mode 100644 index 000000000000..78bc39f5ab8a --- /dev/null +++ b/packages/ui-kit/src/blocks/isTextObject.ts @@ -0,0 +1,5 @@ +import type { Block } from './Block'; +import type { TextObject } from './TextObject'; +import { TextObjectType } from './TextObjectType'; + +export const isTextObject = (block: Block): block is TextObject => (Object.values(TextObjectType) as string[]).includes(block.type); diff --git a/packages/ui-kit/src/blocks/layout/ActionsBlock.ts b/packages/ui-kit/src/blocks/layout/ActionsBlock.ts new file mode 100644 index 000000000000..dd871bdaf67c --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/ActionsBlock.ts @@ -0,0 +1,39 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { ButtonElement } from '../elements/ButtonElement'; +import type { ChannelsSelectElement } from '../elements/ChannelsSelectElement'; +import type { CheckboxElement } from '../elements/CheckboxElement'; +import type { ConversationsSelectElement } from '../elements/ConversationsSelectElement'; +import type { DatePickerElement } from '../elements/DatePickerElement'; +import type { LinearScaleElement } from '../elements/LinearScaleElement'; +import type { MultiChannelsSelectElement } from '../elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from '../elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from '../elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from '../elements/MultiUsersSelectElement'; +import type { OverflowElement } from '../elements/OverflowElement'; +import type { RadioButtonElement } from '../elements/RadioButtonElement'; +import type { StaticSelectElement } from '../elements/StaticSelectElement'; +import type { TimePickerElement } from '../elements/TimePickerElement'; +import type { ToggleSwitchElement } from '../elements/ToggleSwitchElement'; +import type { UsersSelectElement } from '../elements/UsersSelectElement'; + +export type ActionsBlock = LayoutBlockish<{ + type: 'actions'; + elements: readonly ( + | ButtonElement + | ChannelsSelectElement + | ConversationsSelectElement + | DatePickerElement + | LinearScaleElement + | MultiChannelsSelectElement + | MultiConversationsSelectElement + | MultiStaticSelectElement + | MultiUsersSelectElement + | OverflowElement + | StaticSelectElement + | UsersSelectElement + | ToggleSwitchElement + | CheckboxElement + | RadioButtonElement + | TimePickerElement + )[]; +}>; diff --git a/packages/ui-kit/src/blocks/layout/CalloutBlock.ts b/packages/ui-kit/src/blocks/layout/CalloutBlock.ts new file mode 100644 index 000000000000..fbb3e9279248 --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/CalloutBlock.ts @@ -0,0 +1,9 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { TextObject } from '../TextObject'; + +export type CalloutBlock = LayoutBlockish<{ + type: 'callout'; + title?: TextObject; + text: TextObject; + variant?: 'info' | 'danger' | 'warning' | 'success'; +}>; diff --git a/packages/ui-kit/src/blocks/layout/ConditionalBlock.ts b/packages/ui-kit/src/blocks/layout/ConditionalBlock.ts new file mode 100644 index 000000000000..ffe362b2f645 --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/ConditionalBlock.ts @@ -0,0 +1,11 @@ +import type { Conditions } from '../../rendering/Conditions'; +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { RenderableLayoutBlock } from '../RenderableLayoutBlock'; + +export type ConditionalBlock = LayoutBlockish<{ + type: 'conditional'; + when?: { + [K in keyof Conditions]: readonly Conditions[K][]; + }; + render: readonly RenderableLayoutBlock[]; +}>; diff --git a/packages/ui-kit/src/blocks/layout/ContextBlock.ts b/packages/ui-kit/src/blocks/layout/ContextBlock.ts new file mode 100644 index 000000000000..db4db8ae288a --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/ContextBlock.ts @@ -0,0 +1,9 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { TextObject } from '../TextObject'; +import type { ImageElement } from '../elements/ImageElement'; + +export type ContextBlockElements = TextObject | ImageElement; +export type ContextBlock = LayoutBlockish<{ + type: 'context'; + elements: readonly ContextBlockElements[]; +}>; diff --git a/packages/ui-kit/src/blocks/layout/DividerBlock.ts b/packages/ui-kit/src/blocks/layout/DividerBlock.ts new file mode 100644 index 000000000000..f03637aebfbf --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/DividerBlock.ts @@ -0,0 +1,5 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; + +export type DividerBlock = LayoutBlockish<{ + type: 'divider'; +}>; diff --git a/packages/ui-kit/src/blocks/layout/ExperimentalTabNavigationBlock.ts b/packages/ui-kit/src/blocks/layout/ExperimentalTabNavigationBlock.ts new file mode 100644 index 000000000000..748408c8873a --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/ExperimentalTabNavigationBlock.ts @@ -0,0 +1,7 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { ExperimentalTabElement } from '../elements/ExperimentalTabElement'; + +export type ExperimentalTabNavigationBlock = LayoutBlockish<{ + type: 'tab_navigation'; + tabs: readonly ExperimentalTabElement[]; +}>; diff --git a/packages/ui-kit/src/blocks/layout/ImageBlock.ts b/packages/ui-kit/src/blocks/layout/ImageBlock.ts new file mode 100644 index 000000000000..4e76422bf765 --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/ImageBlock.ts @@ -0,0 +1,9 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { PlainText } from '../text/PlainText'; + +export type ImageBlock = LayoutBlockish<{ + type: 'image'; + imageUrl: string; + altText: string; + title?: PlainText; +}>; diff --git a/packages/ui-kit/src/blocks/layout/InputBlock.ts b/packages/ui-kit/src/blocks/layout/InputBlock.ts new file mode 100644 index 000000000000..6b477952d4ad --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/InputBlock.ts @@ -0,0 +1,40 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { ChannelsSelectElement } from '../elements/ChannelsSelectElement'; +import type { CheckboxElement } from '../elements/CheckboxElement'; +import type { ConversationsSelectElement } from '../elements/ConversationsSelectElement'; +import type { DatePickerElement } from '../elements/DatePickerElement'; +import type { LinearScaleElement } from '../elements/LinearScaleElement'; +import type { MultiChannelsSelectElement } from '../elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from '../elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from '../elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from '../elements/MultiUsersSelectElement'; +import type { PlainTextInputElement } from '../elements/PlainTextInputElement'; +import type { RadioButtonElement } from '../elements/RadioButtonElement'; +import type { StaticSelectElement } from '../elements/StaticSelectElement'; +import type { TimePickerElement } from '../elements/TimePickerElement'; +import type { ToggleSwitchElement } from '../elements/ToggleSwitchElement'; +import type { UsersSelectElement } from '../elements/UsersSelectElement'; +import type { PlainText } from '../text/PlainText'; + +export type InputBlock = LayoutBlockish<{ + type: 'input'; + label: PlainText; + element: + | ChannelsSelectElement + | ConversationsSelectElement + | DatePickerElement + | LinearScaleElement + | MultiChannelsSelectElement + | MultiConversationsSelectElement + | MultiStaticSelectElement + | MultiUsersSelectElement + | PlainTextInputElement + | StaticSelectElement + | UsersSelectElement + | CheckboxElement + | RadioButtonElement + | TimePickerElement + | ToggleSwitchElement; + hint?: PlainText; + optional?: boolean; +}>; diff --git a/packages/ui-kit/src/blocks/layout/PreviewBlock.ts b/packages/ui-kit/src/blocks/layout/PreviewBlock.ts new file mode 100644 index 000000000000..308e804d9919 --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/PreviewBlock.ts @@ -0,0 +1,36 @@ +import type { LayoutBlockType } from '../LayoutBlockType'; +import type { TextObject } from '../TextObject'; +import type { ContextBlock } from './ContextBlock'; + +type Image = { + url: string; + dimensions?: { + width: number; + height: number; + }; +}; + +export type PreviewBlockBase = { + type: `${LayoutBlockType.PREVIEW}`; + title: TextObject[]; + description: TextObject[]; + footer?: ContextBlock; +}; + +export type PreviewBlockWithThumb = PreviewBlockBase & { + thumb: Image; +}; + +export type PreviewBlockWithPreview = PreviewBlockBase & { + preview: Image; + externalUrl?: string; + oembedUrl?: string; + thumb: undefined; +}; + +export type PreviewBlock = PreviewBlockBase | PreviewBlockWithThumb | PreviewBlockWithPreview; + +export const isPreviewBlockWithThumb = (previewBlock: PreviewBlock): previewBlock is PreviewBlockWithThumb => 'thumb' in previewBlock; + +export const isPreviewBlockWithPreview = (previewBlock: PreviewBlock): previewBlock is PreviewBlockWithPreview => + 'externalUrl' in previewBlock || 'oembedUrl' in previewBlock; diff --git a/packages/ui-kit/src/blocks/layout/SectionBlock.ts b/packages/ui-kit/src/blocks/layout/SectionBlock.ts new file mode 100644 index 000000000000..92e801b9be1f --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/SectionBlock.ts @@ -0,0 +1,15 @@ +import type { LayoutBlockish } from '../LayoutBlockish'; +import type { TextObject } from '../TextObject'; +import type { ButtonElement } from '../elements/ButtonElement'; +import type { DatePickerElement } from '../elements/DatePickerElement'; +import type { ImageElement } from '../elements/ImageElement'; +import type { MultiStaticSelectElement } from '../elements/MultiStaticSelectElement'; +import type { OverflowElement } from '../elements/OverflowElement'; +import type { StaticSelectElement } from '../elements/StaticSelectElement'; + +export type SectionBlock = LayoutBlockish<{ + type: 'section'; + text?: TextObject; + fields?: readonly TextObject[]; + accessory?: ButtonElement | DatePickerElement | ImageElement | MultiStaticSelectElement | OverflowElement | StaticSelectElement; +}>; diff --git a/packages/ui-kit/src/blocks/layout/VideoConferenceBlock.ts b/packages/ui-kit/src/blocks/layout/VideoConferenceBlock.ts new file mode 100644 index 000000000000..ffecc620f13a --- /dev/null +++ b/packages/ui-kit/src/blocks/layout/VideoConferenceBlock.ts @@ -0,0 +1,7 @@ +import type { LayoutBlockType } from '../LayoutBlockType'; +import type { LayoutBlockish } from '../LayoutBlockish'; + +export type VideoConferenceBlock = LayoutBlockish<{ + type: `${LayoutBlockType.VIDEO_CONF}`; + callId: string; +}>; diff --git a/packages/ui-kit/src/blocks/text/Markdown.ts b/packages/ui-kit/src/blocks/text/Markdown.ts new file mode 100644 index 000000000000..c856b16ab7fa --- /dev/null +++ b/packages/ui-kit/src/blocks/text/Markdown.ts @@ -0,0 +1,7 @@ +import type { WithTranslations } from '../WithTranslations'; + +export type Markdown = WithTranslations<{ + type: 'mrkdwn'; + text: string; + verbatim?: boolean; +}>; diff --git a/packages/ui-kit/src/blocks/text/PlainText.ts b/packages/ui-kit/src/blocks/text/PlainText.ts new file mode 100644 index 000000000000..1c7a9c7a5d30 --- /dev/null +++ b/packages/ui-kit/src/blocks/text/PlainText.ts @@ -0,0 +1,7 @@ +import type { WithTranslations } from '../WithTranslations'; + +export type PlainText = WithTranslations<{ + type: 'plain_text'; + text: string; + emoji?: boolean; +}>; diff --git a/packages/ui-kit/src/index.ts b/packages/ui-kit/src/index.ts new file mode 100644 index 000000000000..d1e6eb918f4c --- /dev/null +++ b/packages/ui-kit/src/index.ts @@ -0,0 +1,73 @@ +export { ConfirmationDialog } from './blocks/ConfirmationDialog'; +export { Option } from './blocks/Option'; +export { OptionGroup } from './blocks/OptionGroup'; + +export { PlainText } from './blocks/text/PlainText'; +export { Markdown } from './blocks/text/Markdown'; +export { TextObject } from './blocks/TextObject'; + +export { Conditions } from './rendering/Conditions'; + +export { ButtonElement } from './blocks/elements/ButtonElement'; +export { ChannelsSelectElement } from './blocks/elements/ChannelsSelectElement'; +export { ConversationsSelectElement } from './blocks/elements/ConversationsSelectElement'; +export { DatePickerElement } from './blocks/elements/DatePickerElement'; +export { ImageElement } from './blocks/elements/ImageElement'; +export { LinearScaleElement } from './blocks/elements/LinearScaleElement'; +export { MultiStaticSelectElement } from './blocks/elements/MultiStaticSelectElement'; +export { MultiChannelsSelectElement } from './blocks/elements/MultiChannelsSelectElement'; +export { MultiConversationsSelectElement } from './blocks/elements/MultiConversationsSelectElement'; +export { MultiUsersSelectElement } from './blocks/elements/MultiUsersSelectElement'; +export { OverflowElement } from './blocks/elements/OverflowElement'; +export { PlainTextInputElement } from './blocks/elements/PlainTextInputElement'; +export { StaticSelectElement } from './blocks/elements/StaticSelectElement'; +export { UsersSelectElement } from './blocks/elements/UsersSelectElement'; +export { ToggleSwitchElement } from './blocks/elements/ToggleSwitchElement'; +export { CheckboxElement } from './blocks/elements/CheckboxElement'; +export { RadioButtonElement } from './blocks/elements/RadioButtonElement'; +export { TimePickerElement } from './blocks/elements/TimePickerElement'; +export { BlockElement } from './blocks/BlockElement'; +export { ExperimentalTabElement } from './blocks/elements/ExperimentalTabElement'; + +export { ActionsBlock } from './blocks/layout/ActionsBlock'; +export { ConditionalBlock } from './blocks/layout/ConditionalBlock'; +export { ContextBlock } from './blocks/layout/ContextBlock'; +export * from './blocks/layout/PreviewBlock'; +export { DividerBlock } from './blocks/layout/DividerBlock'; +export { ImageBlock } from './blocks/layout/ImageBlock'; +export { InputBlock } from './blocks/layout/InputBlock'; +export { SectionBlock } from './blocks/layout/SectionBlock'; +export { VideoConferenceBlock } from './blocks/layout/VideoConferenceBlock'; +export { LayoutBlock } from './blocks/LayoutBlock'; +export { CalloutBlock } from './blocks/layout/CalloutBlock'; +export { ExperimentalTabNavigationBlock } from './blocks/layout/ExperimentalTabNavigationBlock'; + +export { InputElementDispatchAction } from './blocks/InputElementDispatchAction'; + +export { Block } from './blocks/Block'; +export { RenderableBlock } from './blocks/RenderableBlock'; + +export { LayoutBlockType } from './blocks/LayoutBlockType'; +export { BlockElementType } from './blocks/BlockElementType'; +export { TextObjectType } from './blocks/TextObjectType'; +export { BlockContext } from './rendering/BlockContext'; + +export * from './blocks/deprecations'; + +export { type BlockRenderers } from './rendering/BlockRenderers'; +export { type RenderableLayoutBlock } from './blocks/RenderableLayoutBlock'; + +export { SurfaceRenderer } from './rendering/SurfaceRenderer'; +export { ActionableElement } from './blocks/ActionableElement'; +export { ActionOf } from './rendering/ActionOf'; + +export * from './surfaces/View'; + +export * from './surfaces/attachment'; +export * from './surfaces/banner'; +export * from './surfaces/contextualBar'; +export * from './surfaces/message'; +export * from './surfaces/modal'; + +export * from './interactions/UserInteraction'; +export * from './interactions/ServerInteraction'; diff --git a/packages/ui-kit/src/interactions/ServerInteraction.ts b/packages/ui-kit/src/interactions/ServerInteraction.ts new file mode 100644 index 000000000000..5629907ed092 --- /dev/null +++ b/packages/ui-kit/src/interactions/ServerInteraction.ts @@ -0,0 +1,109 @@ +import typia from 'typia'; + +import type { BannerView } from '../surfaces/banner'; +import type { ContextualBarView } from '../surfaces/contextualBar'; +import type { ModalView } from '../surfaces/modal'; + +type OpenModalServerInteraction = { + type: 'modal.open'; + triggerId: string; + appId: string; + view: ModalView; +}; + +type UpdateModalServerInteraction = { + type: 'modal.update'; + triggerId: string; + appId: string; + view: ModalView; +}; + +type CloseModalServerInteraction = { + type: 'modal.close'; + triggerId: string; + appId: string; +}; + +type OpenBannerServerInteraction = { + type: 'banner.open'; + triggerId: string; + appId: string; +} & BannerView; + +type UpdateBannerServerInteraction = { + type: 'banner.update'; + triggerId: string; + appId: string; + view: BannerView; +}; + +type CloseBannerServerInteraction = { + type: 'banner.close'; + triggerId: string; + appId: string; + viewId: BannerView['viewId']; +}; + +type OpenContextualBarServerInteraction = { + type: 'contextual_bar.open'; + triggerId: string; + appId: string; + view: ContextualBarView; +}; + +type UpdateContextualBarServerInteraction = { + type: 'contextual_bar.update'; + triggerId: string; + appId: string; + view: ContextualBarView; +}; + +type CloseContextualBarServerInteraction = { + type: 'contextual_bar.close'; + triggerId: string; + appId: string; + view: ContextualBarView; +}; + +type ReportErrorsServerInteraction = { + type: 'errors'; + triggerId: string; + appId: string; + viewId: ModalView['id'] | BannerView['viewId'] | ContextualBarView['id']; + errors: { [field: string]: string }[]; +}; + +export type ServerInteraction = + | OpenModalServerInteraction + | UpdateModalServerInteraction + | CloseModalServerInteraction + | OpenBannerServerInteraction + | UpdateBannerServerInteraction + | CloseBannerServerInteraction + | OpenContextualBarServerInteraction + | UpdateContextualBarServerInteraction + | CloseContextualBarServerInteraction + | ReportErrorsServerInteraction; + +export const isOpenModalServerInteraction = typia.createIs<OpenModalServerInteraction>(); +export const isUpdateModalServerInteraction = typia.createIs<UpdateModalServerInteraction>(); +export const isCloseModalServerInteraction = typia.createIs<CloseModalServerInteraction>(); +export const isOpenBannerServerInteraction = typia.createIs<OpenBannerServerInteraction>(); +export const isUpdateBannerServerInteraction = typia.createIs<UpdateBannerServerInteraction>(); +export const isCloseBannerServerInteraction = typia.createIs<CloseBannerServerInteraction>(); +export const isOpenContextualBarServerInteraction = typia.createIs<OpenContextualBarServerInteraction>(); +export const isUpdateContextualBarServerInteraction = typia.createIs<UpdateContextualBarServerInteraction>(); +export const isCloseContextualBarServerInteraction = typia.createIs<CloseContextualBarServerInteraction>(); +export const isReportErrorsServerInteraction = typia.createIs<ReportErrorsServerInteraction>(); + +export const isServerInteraction = (input: unknown): input is ServerInteraction => + isOpenModalServerInteraction(input) || + isUpdateModalServerInteraction(input) || + isCloseModalServerInteraction(input) || + isOpenBannerServerInteraction(input) || + isUpdateBannerServerInteraction(input) || + isCloseBannerServerInteraction(input) || + isOpenContextualBarServerInteraction(input) || + isUpdateContextualBarServerInteraction(input) || + isCloseContextualBarServerInteraction(input) || + isReportErrorsServerInteraction(input); diff --git a/packages/ui-kit/src/interactions/UserInteraction.ts b/packages/ui-kit/src/interactions/UserInteraction.ts new file mode 100644 index 000000000000..384275e9d45f --- /dev/null +++ b/packages/ui-kit/src/interactions/UserInteraction.ts @@ -0,0 +1,131 @@ +import typia from 'typia'; + +import type { View } from '../surfaces/View'; + +export type MessageBlockActionUserInteraction = { + type: 'blockAction'; + actionId: string; + payload: { + blockId: string; + value: unknown; + }; + container: { + type: 'message'; + id: string; + }; + mid: string; + tmid?: string; + rid: string; + triggerId: string; +}; + +export type ViewBlockActionUserInteraction = { + type: 'blockAction'; + actionId: string; + payload: { + blockId: string; + value: unknown; + }; + container: { + type: 'view'; + id: string; + }; + triggerId: string; +}; + +export type ViewClosedUserInteraction = { + type: 'viewClosed'; + payload: { + viewId: string; + view: View & { + id: string; + state: { [blockId: string]: { [key: string]: unknown } }; + }; + isCleared?: boolean; + }; + triggerId: string; +}; + +export type ViewSubmitUserInteraction = { + type: 'viewSubmit'; + actionId?: undefined; + payload: { + view: View & { + id: string; + state: { [blockId: string]: { [key: string]: unknown } }; + }; + }; + triggerId: string; + viewId: string; +}; + +export type MessageBoxActionButtonUserInteraction = { + type: 'actionButton'; + actionId: string; + payload: { + context: 'messageBoxAction'; + message: string; + }; + mid?: undefined; + tmid?: string; + rid: string; + triggerId: string; +}; + +export type UserDropdownActionButtonUserInteraction = { + type: 'actionButton'; + actionId: string; + payload: { + context: 'userDropdownAction'; + message?: undefined; + }; + mid?: undefined; + tmid?: undefined; + rid?: undefined; + triggerId: string; +}; + +export type MesssageActionButtonUserInteraction = { + type: 'actionButton'; + actionId: string; + payload: { + context: 'messageAction'; + message?: undefined; + }; + mid: string; + tmid?: string; + rid: string; + triggerId: string; +}; + +export type RoomActionButtonUserInteraction = { + type: 'actionButton'; + actionId: string; + payload: { + context: 'roomAction'; + message?: undefined; + }; + mid?: undefined; + tmid?: undefined; + rid: string; + triggerId: string; +}; + +export type UserInteraction = + | MessageBlockActionUserInteraction + | ViewBlockActionUserInteraction + | ViewClosedUserInteraction + | ViewSubmitUserInteraction + | MessageBoxActionButtonUserInteraction + | UserDropdownActionButtonUserInteraction + | MesssageActionButtonUserInteraction + | RoomActionButtonUserInteraction; + +export const isMessageBlockActionUserInteraction = typia.createIs<MessageBlockActionUserInteraction>(); +export const isViewBlockActionUserInteraction = typia.createIs<ViewBlockActionUserInteraction>(); +export const isViewClosedUserInteraction = typia.createIs<ViewClosedUserInteraction>(); +export const isViewSubmitUserInteraction = typia.createIs<ViewSubmitUserInteraction>(); +export const isMessageBoxActionButtonUserInteraction = typia.createIs<MessageBoxActionButtonUserInteraction>(); +export const isUserDropdownActionButtonUserInteraction = typia.createIs<UserDropdownActionButtonUserInteraction>(); +export const isMesssageActionButtonUserInteraction = typia.createIs<MesssageActionButtonUserInteraction>(); +export const isRoomActionButtonUserInteraction = typia.createIs<RoomActionButtonUserInteraction>(); diff --git a/packages/ui-kit/src/isNotNull.ts b/packages/ui-kit/src/isNotNull.ts new file mode 100644 index 000000000000..10b67188a4f8 --- /dev/null +++ b/packages/ui-kit/src/isNotNull.ts @@ -0,0 +1 @@ +export const isNotNull = <T>(value: T | null): value is T => value !== null; diff --git a/packages/ui-kit/src/rendering/ActionOf.ts b/packages/ui-kit/src/rendering/ActionOf.ts new file mode 100644 index 000000000000..cae8829fde5c --- /dev/null +++ b/packages/ui-kit/src/rendering/ActionOf.ts @@ -0,0 +1,55 @@ +import type { ActionableElement } from '../blocks/ActionableElement'; +import type { Option } from '../blocks/Option'; +import type { ButtonElement } from '../blocks/elements/ButtonElement'; +import type { ChannelsSelectElement } from '../blocks/elements/ChannelsSelectElement'; +import type { CheckboxElement } from '../blocks/elements/CheckboxElement'; +import type { ConversationsSelectElement } from '../blocks/elements/ConversationsSelectElement'; +import type { DatePickerElement } from '../blocks/elements/DatePickerElement'; +import type { LinearScaleElement } from '../blocks/elements/LinearScaleElement'; +import type { MultiChannelsSelectElement } from '../blocks/elements/MultiChannelsSelectElement'; +import type { MultiConversationsSelectElement } from '../blocks/elements/MultiConversationsSelectElement'; +import type { MultiStaticSelectElement } from '../blocks/elements/MultiStaticSelectElement'; +import type { MultiUsersSelectElement } from '../blocks/elements/MultiUsersSelectElement'; +import type { OverflowElement } from '../blocks/elements/OverflowElement'; +import type { PlainTextInputElement } from '../blocks/elements/PlainTextInputElement'; +import type { RadioButtonElement } from '../blocks/elements/RadioButtonElement'; +import type { StaticSelectElement } from '../blocks/elements/StaticSelectElement'; +import type { TimePickerElement } from '../blocks/elements/TimePickerElement'; +import type { ToggleSwitchElement } from '../blocks/elements/ToggleSwitchElement'; +import type { UsersSelectElement } from '../blocks/elements/UsersSelectElement'; + +export type ActionOf<TElement extends ActionableElement> = TElement extends ButtonElement + ? ButtonElement['value'] + : TElement extends ChannelsSelectElement + ? unknown + : TElement extends ConversationsSelectElement + ? unknown + : TElement extends DatePickerElement + ? DatePickerElement['initialDate'] + : TElement extends LinearScaleElement + ? LinearScaleElement['initialValue'] + : TElement extends MultiChannelsSelectElement + ? unknown + : TElement extends MultiConversationsSelectElement + ? unknown + : TElement extends MultiStaticSelectElement + ? MultiStaticSelectElement['initialValue'] + : TElement extends MultiUsersSelectElement + ? unknown + : TElement extends OverflowElement + ? OverflowElement['options'][number]['value'] + : TElement extends PlainTextInputElement + ? PlainTextInputElement['initialValue'] + : TElement extends StaticSelectElement + ? StaticSelectElement['initialValue'] + : TElement extends UsersSelectElement + ? unknown + : TElement extends ToggleSwitchElement + ? Option['value'][] + : TElement extends RadioButtonElement + ? Option['value'] | undefined + : TElement extends CheckboxElement + ? Option['value'][] | undefined + : TElement extends TimePickerElement + ? TimePickerElement['initialTime'] + : never; diff --git a/packages/ui-kit/src/rendering/BlockContext.ts b/packages/ui-kit/src/rendering/BlockContext.ts new file mode 100644 index 000000000000..31bc87c028b6 --- /dev/null +++ b/packages/ui-kit/src/rendering/BlockContext.ts @@ -0,0 +1,8 @@ +export enum BlockContext { + NONE = -1, + BLOCK, + SECTION, + ACTION, + FORM, + CONTEXT, +} diff --git a/packages/ui-kit/src/rendering/BlockElementRenderer.ts b/packages/ui-kit/src/rendering/BlockElementRenderer.ts new file mode 100644 index 000000000000..891ce4a535fb --- /dev/null +++ b/packages/ui-kit/src/rendering/BlockElementRenderer.ts @@ -0,0 +1,8 @@ +import type { BlockElement } from '..'; +import type { BlockContext } from './BlockContext'; + +export type BlockElementRenderer<OutputElement, Block extends BlockElement = BlockElement> = ( + blockElement: Block, + context: BlockContext, + index: number, +) => OutputElement | null; diff --git a/packages/ui-kit/src/rendering/BlockRenderers.ts b/packages/ui-kit/src/rendering/BlockRenderers.ts new file mode 100644 index 000000000000..4a8bf3a29058 --- /dev/null +++ b/packages/ui-kit/src/rendering/BlockRenderers.ts @@ -0,0 +1,41 @@ +import type { BlockElement } from '../blocks/BlockElement'; +import type { RenderableLayoutBlock } from '../blocks/RenderableLayoutBlock'; +import type { TextObject } from '../blocks/TextObject'; +import type { DatePickerElement } from '../blocks/elements/DatePickerElement'; +import type { LinearScaleElement } from '../blocks/elements/LinearScaleElement'; +import type { MultiStaticSelectElement } from '../blocks/elements/MultiStaticSelectElement'; +import type { PlainTextInputElement } from '../blocks/elements/PlainTextInputElement'; +import type { StaticSelectElement } from '../blocks/elements/StaticSelectElement'; +import type { PlainText } from '../blocks/text/PlainText'; +import type { BlockElementRenderer } from './BlockElementRenderer'; +import type { LayoutBlockRenderer } from './LayoutBlockRenderer'; +import type { TextObjectRenderer } from './TextObjectRenderer'; + +export type BlockRenderers<T> = { + [B in RenderableLayoutBlock as B['type']]?: LayoutBlockRenderer<T, B>; +} & { + [B in TextObject as B['type']]: TextObjectRenderer<T, B>; +} & { + [B in BlockElement as B['type']]?: BlockElementRenderer<T, B>; +} & { + /** @deprecated */ + plainText?: TextObjectRenderer<T, PlainText>; + + /** @deprecated */ + text?: TextObjectRenderer<T>; + + /** @deprecated */ + datePicker?: BlockElementRenderer<T, DatePickerElement>; + + /** @deprecated */ + staticSelect?: BlockElementRenderer<T, StaticSelectElement>; + + /** @deprecated */ + multiStaticSelect?: BlockElementRenderer<T, MultiStaticSelectElement>; + + /** @deprecated */ + plainInput?: BlockElementRenderer<T, PlainTextInputElement>; + + /** @deprecated */ + linearScale?: BlockElementRenderer<T, LinearScaleElement>; +}; diff --git a/packages/ui-kit/src/rendering/ConditionalBlockFiltersEngine.ts b/packages/ui-kit/src/rendering/ConditionalBlockFiltersEngine.ts new file mode 100644 index 000000000000..21a5bc2442f3 --- /dev/null +++ b/packages/ui-kit/src/rendering/ConditionalBlockFiltersEngine.ts @@ -0,0 +1,5 @@ +/** @deprecated */ +export enum ConditionalBlockFiltersEngine { + ROCKETCHAT = 'rocket.chat', + LIVECHAT = 'livechat', +} diff --git a/packages/ui-kit/src/rendering/Conditions.ts b/packages/ui-kit/src/rendering/Conditions.ts new file mode 100644 index 000000000000..0b2c548549ba --- /dev/null +++ b/packages/ui-kit/src/rendering/Conditions.ts @@ -0,0 +1,3 @@ +export type Conditions = { + engine?: 'rocket.chat' | 'livechat'; +}; diff --git a/packages/ui-kit/src/rendering/LayoutBlockRenderer.ts b/packages/ui-kit/src/rendering/LayoutBlockRenderer.ts new file mode 100644 index 000000000000..030912415d32 --- /dev/null +++ b/packages/ui-kit/src/rendering/LayoutBlockRenderer.ts @@ -0,0 +1,8 @@ +import type { RenderableLayoutBlock } from '../blocks/RenderableLayoutBlock'; +import type { BlockContext } from './BlockContext'; + +export type LayoutBlockRenderer<T, B extends RenderableLayoutBlock = RenderableLayoutBlock> = ( + layoutBlock: B, + context: BlockContext.BLOCK, + index: number, +) => T | null; diff --git a/packages/ui-kit/src/rendering/SurfaceRenderer.ts b/packages/ui-kit/src/rendering/SurfaceRenderer.ts new file mode 100644 index 000000000000..aa185b5c6a8f --- /dev/null +++ b/packages/ui-kit/src/rendering/SurfaceRenderer.ts @@ -0,0 +1,148 @@ +import type { Block } from '../blocks/Block'; +import type { BlockElement } from '../blocks/BlockElement'; +import { LayoutBlockType } from '../blocks/LayoutBlockType'; +import type { RenderableLayoutBlock } from '../blocks/RenderableLayoutBlock'; +import type { TextObject } from '../blocks/TextObject'; +import { TextObjectType } from '../blocks/TextObjectType'; +import { isActionsBlockElement } from '../blocks/isActionsBlockElement'; +import { isContextBlockElement } from '../blocks/isContextBlockElement'; +import { isInputBlockElement } from '../blocks/isInputBlockElement'; +import { isSectionBlockAccessoryElement } from '../blocks/isSectionBlockAccessoryElement'; +import { isTextObject } from '../blocks/isTextObject'; +import type { ActionsBlock } from '../blocks/layout/ActionsBlock'; +import type { ContextBlock } from '../blocks/layout/ContextBlock'; +import type { InputBlock } from '../blocks/layout/InputBlock'; +import type { SectionBlock } from '../blocks/layout/SectionBlock'; +import type { Markdown } from '../blocks/text/Markdown'; +import type { PlainText } from '../blocks/text/PlainText'; +import { isNotNull } from '../isNotNull'; +import { BlockContext } from './BlockContext'; +import type { BlockRenderers } from './BlockRenderers'; +import type { Conditions } from './Conditions'; +import { renderBlockElement } from './renderBlockElement'; +import { renderLayoutBlock } from './renderLayoutBlock'; +import { renderTextObject } from './renderTextObject'; +import { resolveConditionalBlocks } from './resolveConditionalBlocks'; + +export abstract class SurfaceRenderer<TOutputObject, TAllowedLayoutBlock extends RenderableLayoutBlock = RenderableLayoutBlock> + implements BlockRenderers<TOutputObject> +{ + protected readonly allowedLayoutBlockTypes: Set<TAllowedLayoutBlock['type']>; + + public constructor(allowedLayoutBlockTypes: TAllowedLayoutBlock['type'][]) { + this.allowedLayoutBlockTypes = new Set(allowedLayoutBlockTypes); + } + + private isAllowedLayoutBlock = (block: Block): block is TAllowedLayoutBlock => + this.allowedLayoutBlockTypes.has(block.type as TAllowedLayoutBlock['type']); + + public render(blocks: readonly Block[], conditions?: Conditions): TOutputObject[] { + if (!Array.isArray(blocks)) { + return []; + } + + return blocks + .flatMap(resolveConditionalBlocks(conditions)) + .filter(this.isAllowedLayoutBlock) + .map(renderLayoutBlock(this)) + .filter(isNotNull); + } + + public renderTextObject(textObject: TextObject, index: number, context: BlockContext): TOutputObject | null { + return renderTextObject(this, context)(textObject, index); + } + + public renderActionsBlockElement(block: BlockElement, index: number): TOutputObject | null { + if (this.allowedLayoutBlockTypes.has(LayoutBlockType.ACTIONS) === false && !isActionsBlockElement(block)) { + return null; + } + + return renderBlockElement(this, BlockContext.ACTION)(block, index); + } + + /** @deprecated */ + public renderActions( + element: ActionsBlock['elements'][number], + _context: BlockContext, + _: undefined, + index: number, + ): TOutputObject | null { + return this.renderActionsBlockElement(element, index); + } + + public renderContextBlockElement(block: TextObject | BlockElement, index: number): TOutputObject | null { + if (this.allowedLayoutBlockTypes.has(LayoutBlockType.CONTEXT) === false && !isContextBlockElement(block)) { + return null; + } + + if (isTextObject(block)) { + return renderTextObject(this, BlockContext.CONTEXT)(block, index); + } + + return renderBlockElement(this, BlockContext.CONTEXT)(block, index); + } + + /** @deprecated */ + public renderContext( + element: ContextBlock['elements'][number], + _context: BlockContext, + _: undefined, + index: number, + ): TOutputObject | null { + return this.renderContextBlockElement(element, index); + } + + public renderInputBlockElement(block: BlockElement, index: number): TOutputObject | null { + if (this.allowedLayoutBlockTypes.has(LayoutBlockType.INPUT) === false && !isInputBlockElement(block)) { + return null; + } + + return renderBlockElement(this, BlockContext.FORM)(block, index); + } + + /** @deprecated */ + public renderInputs(element: InputBlock['element'], _context: BlockContext, _: undefined, index: number): TOutputObject | null { + return this.renderInputBlockElement(element, index); + } + + public renderSectionAccessoryBlockElement(block: BlockElement, index: number): TOutputObject | null { + if (this.allowedLayoutBlockTypes.has(LayoutBlockType.SECTION) === false && !isSectionBlockAccessoryElement(block)) { + return null; + } + + return renderBlockElement(this, BlockContext.SECTION)(block, index); + } + + /** @deprecated */ + public renderAccessories( + element: Exclude<SectionBlock['accessory'], undefined>, + _context: BlockContext, + _: undefined, + index: number, + ): TOutputObject | null { + return this.renderSectionAccessoryBlockElement(element, index); + } + + /** @deprecated */ + public plainText(element: PlainText, context: BlockContext = BlockContext.NONE, index = 0): TOutputObject | null { + return this[TextObjectType.PLAIN_TEXT](element, context, index); + } + + /** @deprecated */ + public text(textObject: TextObject, context: BlockContext = BlockContext.NONE, index = 0): TOutputObject | null { + switch (textObject.type) { + case TextObjectType.PLAIN_TEXT: + return this.plain_text(textObject, context, index); + + case TextObjectType.MRKDWN: + return this.mrkdwn(textObject, context, index); + + default: + return null; + } + } + + public abstract plain_text(textObject: PlainText, context: BlockContext, index: number): TOutputObject | null; + + public abstract mrkdwn(textObject: Markdown, context: BlockContext, index: number): TOutputObject | null; +} diff --git a/packages/ui-kit/src/rendering/TextObjectRenderer.ts b/packages/ui-kit/src/rendering/TextObjectRenderer.ts new file mode 100644 index 000000000000..2e61cb2f8259 --- /dev/null +++ b/packages/ui-kit/src/rendering/TextObjectRenderer.ts @@ -0,0 +1,8 @@ +import type { TextObject } from '../blocks/TextObject'; +import type { BlockContext } from './BlockContext'; + +export type TextObjectRenderer<OutputElement, Block extends TextObject = TextObject> = ( + textObject: Block, + context: BlockContext, + index: number, +) => OutputElement | null; diff --git a/packages/ui-kit/src/rendering/createSurfaceRenderer.ts b/packages/ui-kit/src/rendering/createSurfaceRenderer.ts new file mode 100644 index 000000000000..dcd91e73d852 --- /dev/null +++ b/packages/ui-kit/src/rendering/createSurfaceRenderer.ts @@ -0,0 +1,10 @@ +import type { Block } from '../blocks/Block'; +import type { RenderableLayoutBlock } from '../blocks/RenderableLayoutBlock'; +import type { Conditions } from './Conditions'; +import type { SurfaceRenderer } from './SurfaceRenderer'; + +export const createSurfaceRenderer = + <TAllowedLayoutBlock extends RenderableLayoutBlock>() => + <TOutputObject>(surfaceRenderer: SurfaceRenderer<TOutputObject, TAllowedLayoutBlock>, conditions?: Conditions) => + (blocks: readonly { type: string }[]): TOutputObject[] => + surfaceRenderer.render(blocks as Block[], conditions); diff --git a/packages/ui-kit/src/rendering/renderBlockElement.ts b/packages/ui-kit/src/rendering/renderBlockElement.ts new file mode 100644 index 000000000000..8e6794ae9bd9 --- /dev/null +++ b/packages/ui-kit/src/rendering/renderBlockElement.ts @@ -0,0 +1,41 @@ +import type { BlockElement } from '../blocks/BlockElement'; +import type { BlockContext } from './BlockContext'; +import type { BlockElementRenderer } from './BlockElementRenderer'; +import type { BlockRenderers } from './BlockRenderers'; + +const getBlockElementRenderer = <T>(renderers: BlockRenderers<T>, type: BlockElement['type']): BlockElementRenderer<T> | undefined => { + const renderer = renderers[type] as BlockElementRenderer<T> | undefined; + + if (renderer) { + return renderer; + } + + switch (type) { + case 'datepicker': + return renderers.datePicker as BlockElementRenderer<T> | undefined; + + case 'static_select': + return renderers.staticSelect as BlockElementRenderer<T> | undefined; + + case 'multi_static_select': + return renderers.multiStaticSelect as BlockElementRenderer<T> | undefined; + + case 'plain_text_input': + return renderers.plainInput as BlockElementRenderer<T> | undefined; + + case 'linear_scale': + return renderers.linearScale as BlockElementRenderer<T> | undefined; + } +}; + +export const renderBlockElement = + <T>(renderers: BlockRenderers<T>, context: BlockContext) => + (blockElement: BlockElement, index: number): T | null => { + const renderer = getBlockElementRenderer(renderers, blockElement.type); + + if (!renderer) { + return null; + } + + return renderer.call(renderers, blockElement, context, index); + }; diff --git a/packages/ui-kit/src/rendering/renderLayoutBlock.ts b/packages/ui-kit/src/rendering/renderLayoutBlock.ts new file mode 100644 index 000000000000..3e4a8b65ee87 --- /dev/null +++ b/packages/ui-kit/src/rendering/renderLayoutBlock.ts @@ -0,0 +1,22 @@ +import type { LayoutBlock } from '../blocks/LayoutBlock'; +import type { ConditionalBlock } from '../blocks/layout/ConditionalBlock'; +import { BlockContext } from './BlockContext'; +import type { BlockRenderers } from './BlockRenderers'; +import type { LayoutBlockRenderer } from './LayoutBlockRenderer'; + +const getLayoutBlockRenderer = <T>( + renderers: BlockRenderers<T>, + type: Exclude<LayoutBlock, ConditionalBlock>['type'], +): LayoutBlockRenderer<T> | undefined => renderers[type] as LayoutBlockRenderer<T> | undefined; + +export const renderLayoutBlock = + <T>(renderers: BlockRenderers<T>) => + (layoutBlock: Exclude<LayoutBlock, ConditionalBlock>, index: number): T | null => { + const renderer = getLayoutBlockRenderer(renderers, layoutBlock.type); + + if (!renderer) { + return null; + } + + return renderer.call(renderers, layoutBlock, BlockContext.BLOCK, index); + }; diff --git a/packages/ui-kit/src/rendering/renderTextObject.ts b/packages/ui-kit/src/rendering/renderTextObject.ts new file mode 100644 index 000000000000..cd99a192f9e0 --- /dev/null +++ b/packages/ui-kit/src/rendering/renderTextObject.ts @@ -0,0 +1,32 @@ +import type { TextObject } from '../blocks/TextObject'; +import type { BlockContext } from './BlockContext'; +import type { BlockRenderers } from './BlockRenderers'; +import type { TextObjectRenderer } from './TextObjectRenderer'; + +const getTextObjectRenderer = <T>(renderers: BlockRenderers<T>, type: TextObject['type']): TextObjectRenderer<T> | undefined => { + const renderer = renderers[type] as TextObjectRenderer<T> | undefined; + + if (renderer) { + return renderer; + } + + switch (type) { + case 'plain_text': + return (renderers.plainText ?? renderers.text) as TextObjectRenderer<T> | undefined; + + case 'mrkdwn': + return renderers.text as TextObjectRenderer<T> | undefined; + } +}; + +export const renderTextObject = + <T>(renderers: BlockRenderers<T>, context: BlockContext) => + (textObject: TextObject, index: number): T | null => { + const renderer = getTextObjectRenderer(renderers, textObject.type); + + if (!renderer) { + return null; + } + + return renderer.call(renderers, textObject, context, index); + }; diff --git a/packages/ui-kit/src/rendering/resolveConditionalBlocks.ts b/packages/ui-kit/src/rendering/resolveConditionalBlocks.ts new file mode 100644 index 000000000000..0b6000868757 --- /dev/null +++ b/packages/ui-kit/src/rendering/resolveConditionalBlocks.ts @@ -0,0 +1,30 @@ +import type { Block } from '../blocks/Block'; +import { LayoutBlockType } from '../blocks/LayoutBlockType'; +import type { ConditionalBlock } from '../blocks/layout/ConditionalBlock'; +import type { Conditions } from './Conditions'; + +const conditionsMatch = (conditions: Conditions | undefined = undefined, filters: ConditionalBlock['when'] = {}): boolean => { + if (!conditions) { + return true; + } + + if (Array.isArray(filters.engine) && !filters.engine.includes(conditions.engine)) { + return false; + } + + return true; +}; + +export const resolveConditionalBlocks = + (conditions?: Conditions) => + (block: Block): readonly Block[] => { + if (block.type !== LayoutBlockType.CONDITIONAL) { + return [block]; + } + + if (conditionsMatch(conditions, block.when)) { + return block.render; + } + + return []; + }; diff --git a/packages/ui-kit/src/surfaces/View.ts b/packages/ui-kit/src/surfaces/View.ts new file mode 100644 index 000000000000..d4d9c078b540 --- /dev/null +++ b/packages/ui-kit/src/surfaces/View.ts @@ -0,0 +1,15 @@ +import typia from 'typia'; + +import type { LayoutBlock } from '../blocks/LayoutBlock'; + +/** + * An instance of a UiKit surface and its metadata. + */ +export type View = { + /** The ID of the app that created this view. */ + appId: string; + /** The blocks that make up the content of the view. */ + blocks: LayoutBlock[]; +}; + +export const isView = typia.createIs<View>(); diff --git a/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.spec.ts b/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.spec.ts new file mode 100644 index 000000000000..dd4937d89193 --- /dev/null +++ b/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.spec.ts @@ -0,0 +1,1427 @@ +import { BlockContext } from '../../rendering/BlockContext'; +import { UiKitParserAttachment } from './UiKitParserAttachment'; +import { uiKitAttachment } from './uiKitAttachment'; + +class TestParser extends UiKitParserAttachment<unknown> { + plain_text = (element: any, context: any, index: any): any => ({ + component: 'text', + props: { + key: index, + children: element.text, + emoji: element.emoji, + block: context === BlockContext.BLOCK, + }, + }); + + mrkdwn = (element: any, context: any, index: any): any => ({ + component: 'markdown', + props: { + key: index, + children: element.text, + verbatim: Boolean(element.verbatim), + block: context === BlockContext.BLOCK, + }, + }); + + divider = (_element: any, context: any, index: any): any => ({ + component: 'divider', + props: { + key: index, + block: context === BlockContext.BLOCK, + }, + }); + + section = (element: any, context: any, index: any): any => { + let key = 0; + return { + component: 'section', + props: { + key: index, + children: [ + ...(element.text ? [this.text(element.text, BlockContext.SECTION, key++)] : []), + ...(element.fields?.map((field: any) => this.text(field, BlockContext.SECTION, key++)) ?? []), + ...(element.accessory ? [this.renderAccessories(element.accessory, BlockContext.SECTION, undefined, key++)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }; + }; + + actions = (element: any, context: any, index: any): any => ({ + component: 'actions', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderActions(element, BlockContext.ACTION, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + context = (element: any, context: any, index: any): any => ({ + component: 'context', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderContext(element, BlockContext.CONTEXT, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + button = (element: any, context: any, index: any): any => ({ + component: 'button', + props: { + key: index, + children: element.text ? [this.text(element.text, BlockContext.SECTION, 0)] : [], + ...(element.url && { href: element.url }), + ...(element.value && { value: element.value }), + variant: element.style ?? 'normal', + block: context === BlockContext.BLOCK, + }, + }); + + image = (element: any, context: any, index: any): any => { + if (context === BlockContext.BLOCK) { + let key = 0; + return { + component: 'image-container', + props: { + key: index, + children: [ + { + component: 'image', + props: { + key: key++, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }, + ...(element.title ? [this.plainText(element.title, -1, key++)] : []), + ], + block: true, + }, + }; + } + + return { + component: 'image', + props: { + key: index, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }; + }; + + overflow = (element: any, _context: any, index: any): any => ({ + component: 'menu', + props: { + key: index, + children: element.options.map((option: any, key: any) => ({ + component: 'menu-item', + props: { + key, + children: [this.text(option.text, -1, 0), ...(option.description ? [this.plainText(option.description, -1, 1)] : [])], + value: option.value, + ...(option.url && { url: option.url }), + }, + })), + }, + }); + + datePicker = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'date', + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + ...(element.initialDate && { defaultValue: element.initialDate }), + }, + }); + + staticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOption && { + defaultValue: element.options.find((option: any) => option.value === element.initialOption.value)?.value, + }), + }, + }); + + multiStaticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + multiple: true, + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOptions && { + defaultValue: element.options + .filter((option: any) => element.initialOptions.some((initialOption: any) => option.value === initialOption.value)) + .map((option: any) => option.value), + }), + }, + }); +} + +const parser = new TestParser(); +const parse = uiKitAttachment(parser); + +const conditionalParse = uiKitAttachment(parser, { + engine: 'rocket.chat', +}); + +describe('divider', () => { + it('renders', () => { + const payload = [ + { + type: 'divider', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'divider', + props: { + key: 0, + block: true, + }, + }, + ]); + }); +}); + +describe('section', () => { + it('renders text as plain_text', () => { + const payload = [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('render text as mrkdwn', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: + 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text fields', () => { + const payload = [ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 2, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 3, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as button', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with a button.', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with a button.', + verbatim: false, + block: false, + }, + }, + { + component: 'button', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as image', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an accessory image.', + }, + accessory: { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an accessory image.', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as overflow menu', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an overflow menu.', + }, + accessory: { + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-3', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-4', + }, + ], + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an overflow menu.', + verbatim: false, + block: false, + }, + }, + { + component: 'menu', + props: { + key: 1, + children: [ + { + component: 'menu-item', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-0', + }, + }, + { + component: 'menu-item', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-1', + }, + }, + { + component: 'menu-item', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-2', + }, + }, + { + component: 'menu-item', + props: { + key: 3, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-3', + }, + }, + { + component: 'menu-item', + props: { + key: 4, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-4', + }, + }, + ], + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as datepicker', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Pick a date for the deadline.', + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'Pick a date for the deadline.', + verbatim: false, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + }, + }, + ]); + }); +}); + +describe('image', () => { + it('renders with title', () => { + const payload = [ + { + type: 'image', + title: { + type: 'plain_text', + text: 'I Need a Marg', + emoji: true, + }, + imageUrl: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + altText: 'marg', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + alt: 'marg', + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: 'I Need a Marg', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders with no title', () => { + const payload = [ + { + type: 'image', + imageUrl: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + altText: 'inspiration', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + alt: 'inspiration', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('actions', () => { + it('renders all selects', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + null, + null, + null, + { + component: 'select', + props: { + key: 3, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders filtered conversations select', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select private conversation', + emoji: true, + }, + filter: { + include: ['private'], + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null], + block: true, + }, + }, + ]); + }); + + it('renders selects with initial options', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + initialConversation: 'D123', + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + initialUser: 'U123', + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + initialChannel: 'C123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null, null, null], + block: true, + }, + }, + ]); + }); + + it('renders button', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'button', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'input', + props: { + key: 0, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('context', () => { + it('renders plain text', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders mrkdwn', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'mrkdwn', + text: '*Cat* has approved this message.', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'markdown', + props: { + key: 1, + children: '*Cat* has approved this message.', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text and images', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: '*This* is :smile: markdown', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: '*This* is :smile: markdown', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 2, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 3, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('conditional', () => { + it('renders when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders when no conditions are set', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(parse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('does not render when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['livechat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([]); + }); +}); diff --git a/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.ts b/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.ts new file mode 100644 index 000000000000..00aa08a8bca0 --- /dev/null +++ b/packages/ui-kit/src/surfaces/attachment/UiKitParserAttachment.ts @@ -0,0 +1,17 @@ +import type { ActionsBlock } from '../../blocks/layout/ActionsBlock'; +import type { CalloutBlock } from '../../blocks/layout/CalloutBlock'; +import type { ContextBlock } from '../../blocks/layout/ContextBlock'; +import type { DividerBlock } from '../../blocks/layout/DividerBlock'; +import type { ImageBlock } from '../../blocks/layout/ImageBlock'; +import type { SectionBlock } from '../../blocks/layout/SectionBlock'; +import { SurfaceRenderer } from '../../rendering/SurfaceRenderer'; + +type AttachmentSurfaceLayoutBlock = ActionsBlock | ContextBlock | DividerBlock | ImageBlock | SectionBlock | CalloutBlock; + +export abstract class UiKitParserAttachment<T> extends SurfaceRenderer<T, AttachmentSurfaceLayoutBlock> { + public constructor() { + super(['actions', 'context', 'divider', 'image', 'section', 'callout']); + } +} + +export type AttachmentSurfaceLayout = AttachmentSurfaceLayoutBlock[]; diff --git a/packages/ui-kit/src/surfaces/attachment/index.ts b/packages/ui-kit/src/surfaces/attachment/index.ts new file mode 100644 index 000000000000..84dcb1e1c871 --- /dev/null +++ b/packages/ui-kit/src/surfaces/attachment/index.ts @@ -0,0 +1,2 @@ +export { UiKitParserAttachment, AttachmentSurfaceLayout } from './UiKitParserAttachment'; +export { uiKitAttachment } from './uiKitAttachment'; diff --git a/packages/ui-kit/src/surfaces/attachment/uiKitAttachment.ts b/packages/ui-kit/src/surfaces/attachment/uiKitAttachment.ts new file mode 100644 index 000000000000..8bb68b0b54cc --- /dev/null +++ b/packages/ui-kit/src/surfaces/attachment/uiKitAttachment.ts @@ -0,0 +1,4 @@ +import { createSurfaceRenderer } from '../../rendering/createSurfaceRenderer'; +import type { AttachmentSurfaceLayout } from './UiKitParserAttachment'; + +export const uiKitAttachment = createSurfaceRenderer<AttachmentSurfaceLayout[number]>(); diff --git a/packages/ui-kit/src/surfaces/banner/BannerView.ts b/packages/ui-kit/src/surfaces/banner/BannerView.ts new file mode 100644 index 000000000000..4857aa667ab4 --- /dev/null +++ b/packages/ui-kit/src/surfaces/banner/BannerView.ts @@ -0,0 +1,20 @@ +import type { Keys as IconName } from '@rocket.chat/icons'; +import typia from 'typia'; + +import type { View } from '../View'; +import type { BannerSurfaceLayout } from './UiKitParserBanner'; + +/** + * A view that is displayed as a banner. + */ +// Omitting `blocks` from `View` because array intersections are weird +export type BannerView = Omit<View, 'blocks'> & { + viewId: string; + inline?: boolean; + variant?: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; + icon?: IconName; + title?: string; // TODO: change to plain_text block in the future + blocks: BannerSurfaceLayout; +}; + +export const isBannerView = typia.createIs<BannerView>(); diff --git a/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.spec.ts b/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.spec.ts new file mode 100644 index 000000000000..f9439c06ae29 --- /dev/null +++ b/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.spec.ts @@ -0,0 +1,1904 @@ +import type { PlainText } from '../../blocks/text/PlainText'; +import { BlockContext } from '../../rendering/BlockContext'; +import { UiKitParserBanner } from './UiKitParserBanner'; +import { uiKitBanner } from './uiKitBanner'; + +class TestParser extends UiKitParserBanner<unknown> { + plain_text = (element: any, context: any, index: any): any => ({ + component: 'text', + props: { + key: index, + children: element.text, + emoji: element.emoji, + block: context === BlockContext.BLOCK, + }, + }); + + mrkdwn = (element: any, context: any, index: any): any => ({ + component: 'markdown', + props: { + key: index, + children: element.text, + verbatim: Boolean(element.verbatim), + block: context === BlockContext.BLOCK, + }, + }); + + divider = (_element: any, context: any, index: any): any => ({ + component: 'divider', + props: { + key: index, + block: context === BlockContext.BLOCK, + }, + }); + + section = (element: any, context: any, index: any): any => { + let key = 0; + return { + component: 'section', + props: { + key: index, + children: [ + ...(element.text ? [this.text(element.text, BlockContext.SECTION, key++)] : []), + ...(element.fields?.map((field: any) => this.text(field, BlockContext.SECTION, key++)) ?? []), + ...(element.accessory ? [this.renderAccessories(element.accessory, BlockContext.SECTION, undefined, key++)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }; + }; + + actions = (element: any, context: any, index: any): any => ({ + component: 'actions', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderActions(element, BlockContext.ACTION, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + context = (element: any, context: any, index: any): any => ({ + component: 'context', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderContext(element, BlockContext.CONTEXT, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + input = (element: any, context: any, index: any): any => ({ + component: 'input-group', + props: { + key: index, + children: [ + this.plainText(element.label, BlockContext.FORM, 0), + this.renderInputs(element.element, BlockContext.FORM, undefined, 1), + ...(element.hint ? [this.plainText(element.hint, BlockContext.FORM, 2)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }); + + button = (element: any, context: any, index: any): any => ({ + component: 'button', + props: { + key: index, + children: element.text ? [this.text(element.text, BlockContext.SECTION, 0)] : [], + ...(element.url && { href: element.url }), + ...(element.value && { value: element.value }), + variant: element.style ?? 'normal', + block: context === BlockContext.BLOCK, + }, + }); + + image = (element: any, context: any, index: any): any => { + if (context === BlockContext.BLOCK) { + let key = 0; + return { + component: 'image-container', + props: { + key: index, + children: [ + { + component: 'image', + props: { + key: key++, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }, + ...(element.title ? [this.plainText(element.title, -1, key++)] : []), + ], + block: true, + }, + }; + } + + return { + component: 'image', + props: { + key: index, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }; + }; + + overflow = (element: any, _context: any, index: any): any => ({ + component: 'menu', + props: { + key: index, + children: element.options.map((option: any, key: any) => ({ + component: 'menu-item', + props: { + key, + children: [this.text(option.text, -1, 0), ...(option.description ? [this.plainText(option.description, -1, 1)] : [])], + value: option.value, + ...(option.url && { url: option.url }), + }, + })), + }, + }); + + datePicker = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'date', + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + ...(element.initialDate && { defaultValue: element.initialDate }), + }, + }); + + staticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOption && { + defaultValue: element.options.find((option: any) => option.value === element.initialOption.value)?.value, + }), + }, + }); + + multiStaticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + multiple: true, + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOptions && { + defaultValue: element.options + .filter((option: any) => element.initialOptions.some((initialOption: any) => option.value === initialOption.value)) + .map((option: any) => option.value), + }), + }, + }); + + plainInput = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'text', + ...(element.placeholder && { + placeholder: this.plainText(element.placeholder, -1, 0), + }), + ...(element.initialValue && { defaultValue: element.initialValue }), + multiline: element.multiline ?? false, + ...(typeof element.minLength !== 'undefined' && { + minLength: element.minLength, + }), + ...(typeof element.maxLength !== 'undefined' && { + maxLength: element.maxLength, + }), + }, + }); + + linearScale = ({ minValue = 0, maxValue = 10 }: any, _context: any, index: any): any => ({ + component: 'linear-scale', + props: { + key: index, + children: Array.from({ length: maxValue - minValue + 1 }).map((_, key: any) => ({ + component: 'linear-scale-point', + props: { + key, + children: [ + this.text( + { + type: 'plain_text', + text: String(minValue + key), + emoji: true, + } as PlainText, + -1, + 0, + ), + ], + }, + })), + }, + }); +} + +const parser = new TestParser(); +const parse = uiKitBanner(parser); + +const conditionalParse = uiKitBanner(parser, { + engine: 'rocket.chat', +}); + +describe('divider', () => { + it('renders', () => { + const payload = [ + { + type: 'divider', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'divider', + props: { + key: 0, + block: true, + }, + }, + ]); + }); +}); + +describe('section', () => { + it('renders text as plain_text', () => { + const payload = [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('render text as mrkdwn', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: + 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text fields', () => { + const payload = [ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 2, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 3, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as button', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with a button.', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with a button.', + verbatim: false, + block: false, + }, + }, + { + component: 'button', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as image', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an accessory image.', + }, + accessory: { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an accessory image.', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as overflow menu', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an overflow menu.', + }, + accessory: { + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-3', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-4', + }, + ], + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an overflow menu.', + verbatim: false, + block: false, + }, + }, + { + component: 'menu', + props: { + key: 1, + children: [ + { + component: 'menu-item', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-0', + }, + }, + { + component: 'menu-item', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-1', + }, + }, + { + component: 'menu-item', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-2', + }, + }, + { + component: 'menu-item', + props: { + key: 3, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-3', + }, + }, + { + component: 'menu-item', + props: { + key: 4, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-4', + }, + }, + ], + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as datepicker', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Pick a date for the deadline.', + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'Pick a date for the deadline.', + verbatim: false, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + }, + }, + ]); + }); +}); + +describe('image', () => { + it('renders with title', () => { + const payload = [ + { + type: 'image', + title: { + type: 'plain_text', + text: 'I Need a Marg', + emoji: true, + }, + imageUrl: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + altText: 'marg', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + alt: 'marg', + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: 'I Need a Marg', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders with no title', () => { + const payload = [ + { + type: 'image', + imageUrl: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + altText: 'inspiration', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + alt: 'inspiration', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('actions', () => { + it('renders all selects', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + null, + null, + null, + { + component: 'select', + props: { + key: 3, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders filtered conversations select', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select private conversation', + emoji: true, + }, + filter: { + include: ['private'], + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null], + block: true, + }, + }, + ]); + }); + + it('renders selects with initial options', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + initialConversation: 'D123', + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + initialUser: 'U123', + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + initialChannel: 'C123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null, null, null], + block: true, + }, + }, + ]); + }); + + it('renders button', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'button', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'input', + props: { + key: 0, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('context', () => { + it('renders plain text', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders mrkdwn', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'mrkdwn', + text: '*Cat* has approved this message.', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'markdown', + props: { + key: 1, + children: '*Cat* has approved this message.', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text and images', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: '*This* is :smile: markdown', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: '*This* is :smile: markdown', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 2, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 3, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('input', () => { + it('renders multiline plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + multiline: true, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: true, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders multi users select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'multi_users_select', + placeholder: { + type: 'plain_text', + text: 'Select users', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + null, + ], + block: true, + }, + }, + ]); + }); + + it('renders static select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'select', + props: { + key: 1, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'input', + element: { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders linear scale', () => { + const payload = [ + { + type: 'input', + element: { + type: 'linear_scale', + maxValue: 2, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'linear-scale', + props: { + key: 1, + children: [ + { + component: 'linear-scale-point', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '0', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '1', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '2', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ], + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('conditional', () => { + it('renders when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders when no conditions are set', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(parse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('does not render when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['livechat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([]); + }); +}); diff --git a/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.ts b/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.ts new file mode 100644 index 000000000000..29b528bba2e6 --- /dev/null +++ b/packages/ui-kit/src/surfaces/banner/UiKitParserBanner.ts @@ -0,0 +1,18 @@ +import type { ActionsBlock } from '../../blocks/layout/ActionsBlock'; +import type { CalloutBlock } from '../../blocks/layout/CalloutBlock'; +import type { ContextBlock } from '../../blocks/layout/ContextBlock'; +import type { DividerBlock } from '../../blocks/layout/DividerBlock'; +import type { ImageBlock } from '../../blocks/layout/ImageBlock'; +import type { InputBlock } from '../../blocks/layout/InputBlock'; +import type { SectionBlock } from '../../blocks/layout/SectionBlock'; +import { SurfaceRenderer } from '../../rendering/SurfaceRenderer'; + +type BannerSurfaceLayoutBlock = ActionsBlock | ContextBlock | DividerBlock | ImageBlock | InputBlock | SectionBlock | CalloutBlock; + +export abstract class UiKitParserBanner<T> extends SurfaceRenderer<T, BannerSurfaceLayoutBlock> { + public constructor() { + super(['actions', 'context', 'divider', 'image', 'input', 'section']); + } +} + +export type BannerSurfaceLayout = BannerSurfaceLayoutBlock[]; diff --git a/packages/ui-kit/src/surfaces/banner/index.ts b/packages/ui-kit/src/surfaces/banner/index.ts new file mode 100644 index 000000000000..8da2b2508f9d --- /dev/null +++ b/packages/ui-kit/src/surfaces/banner/index.ts @@ -0,0 +1,3 @@ +export { BannerView, isBannerView } from './BannerView'; +export { BannerSurfaceLayout, UiKitParserBanner } from './UiKitParserBanner'; +export { uiKitBanner } from './uiKitBanner'; diff --git a/packages/ui-kit/src/surfaces/banner/uiKitBanner.ts b/packages/ui-kit/src/surfaces/banner/uiKitBanner.ts new file mode 100644 index 000000000000..10ec0d59b27c --- /dev/null +++ b/packages/ui-kit/src/surfaces/banner/uiKitBanner.ts @@ -0,0 +1,4 @@ +import { createSurfaceRenderer } from '../../rendering/createSurfaceRenderer'; +import type { BannerSurfaceLayout } from './UiKitParserBanner'; + +export const uiKitBanner = createSurfaceRenderer<BannerSurfaceLayout[number]>(); diff --git a/packages/ui-kit/src/surfaces/contextualBar/ContextualBarView.ts b/packages/ui-kit/src/surfaces/contextualBar/ContextualBarView.ts new file mode 100644 index 000000000000..00bb3048da7d --- /dev/null +++ b/packages/ui-kit/src/surfaces/contextualBar/ContextualBarView.ts @@ -0,0 +1,20 @@ +import typia from 'typia'; + +import type { TextObject } from '../../blocks/TextObject'; +import type { ButtonElement } from '../../blocks/elements/ButtonElement'; +import type { View } from '../View'; +import type { ContextualBarSurfaceLayout } from './UiKitParserContextualBar'; + +/** + * A view that is displayed as a contextual bar. + */ +// Omitting `blocks` from `View` because array intersections are weird +export type ContextualBarView = Omit<View, 'blocks'> & { + id: string; + title: TextObject; + close?: ButtonElement; + submit?: ButtonElement; + blocks: ContextualBarSurfaceLayout; +}; + +export const isContextualBarView = typia.createIs<ContextualBarView>(); diff --git a/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.spec.ts b/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.spec.ts new file mode 100644 index 000000000000..e6284de0d11b --- /dev/null +++ b/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.spec.ts @@ -0,0 +1,1905 @@ +import type { OverflowElement } from '../../blocks/elements/OverflowElement'; +import type { PlainText } from '../../blocks/text/PlainText'; +import { BlockContext } from '../../rendering/BlockContext'; +import { UiKitParserContextualBar } from './UiKitParserContextualBar'; +import { uiKitContextualBar } from './uiKitContextualBar'; + +class TestParser extends UiKitParserContextualBar<unknown> { + plain_text = (element: any, context: any, index: any): any => ({ + component: 'text', + props: { + key: index, + children: element.text, + emoji: element.emoji, + block: context === BlockContext.BLOCK, + }, + }); + + mrkdwn = (element: any, context: any, index: any): any => ({ + component: 'markdown', + props: { + key: index, + children: element.text, + verbatim: Boolean(element.verbatim), + block: context === BlockContext.BLOCK, + }, + }); + + divider = (_element: any, context: any, index: any): any => ({ + component: 'divider', + props: { + key: index, + block: context === BlockContext.BLOCK, + }, + }); + + section = (element: any, context: any, index: any): any => { + let key = 0; + return { + component: 'section', + props: { + key: index, + children: [ + ...(element.text ? [this.text(element.text, BlockContext.SECTION, key++)] : []), + ...(element.fields?.map((field: any) => this.text(field, BlockContext.SECTION, key++)) ?? []), + ...(element.accessory ? [this.renderAccessories(element.accessory, BlockContext.SECTION, undefined, key++)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }; + }; + + actions = (element: any, context: any, index: any): any => ({ + component: 'actions', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderActions(element, BlockContext.ACTION, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + context = (element: any, context: any, index: any): any => ({ + component: 'context', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderContext(element, BlockContext.CONTEXT, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + input = (element: any, context: any, index: any): any => ({ + component: 'input-group', + props: { + key: index, + children: [ + this.plainText(element.label, BlockContext.FORM, 0), + this.renderInputs(element.element, BlockContext.FORM, undefined, 1), + ...(element.hint ? [this.plainText(element.hint, BlockContext.FORM, 2)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }); + + button = (element: any, context: any, index: any): any => ({ + component: 'button', + props: { + key: index, + children: element.text ? [this.text(element.text, BlockContext.SECTION, 0)] : [], + ...(element.url && { href: element.url }), + ...(element.value && { value: element.value }), + variant: element.style ?? 'normal', + block: context === BlockContext.BLOCK, + }, + }); + + image = (element: any, context: any, index: any): any => { + if (context === BlockContext.BLOCK) { + let key = 0; + return { + component: 'image-container', + props: { + key: index, + children: [ + { + component: 'image', + props: { + key: key++, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }, + ...(element.title ? [this.plainText(element.title, -1, key++)] : []), + ], + block: true, + }, + }; + } + + return { + component: 'image', + props: { + key: index, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }; + }; + + overflow = (element: OverflowElement, _context: any, index: any): any => ({ + component: 'menu', + props: { + key: index, + children: element.options.map((option, key) => ({ + component: 'menu-item', + props: { + key, + children: [this.text(option.text, -1, 0), ...(option.description ? [this.plainText(option.description, -1, 1)] : [])], + value: option.value, + ...(option.url && { url: option.url }), + }, + })), + }, + }); + + datePicker = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'date', + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + ...(element.initialDate && { defaultValue: element.initialDate }), + }, + }); + + staticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOption && { + defaultValue: element.options.find((option: any) => option.value === element.initialOption.value)?.value, + }), + }, + }); + + multiStaticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + multiple: true, + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOptions && { + defaultValue: element.options + .filter((option: any) => element.initialOptions.some((initialOption: any) => option.value === initialOption.value)) + .map((option: any) => option.value), + }), + }, + }); + + plainInput = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'text', + ...(element.placeholder && { + placeholder: this.plainText(element.placeholder, -1, 0), + }), + ...(element.initialValue && { defaultValue: element.initialValue }), + multiline: element.multiline ?? false, + ...(typeof element.minLength !== 'undefined' && { + minLength: element.minLength, + }), + ...(typeof element.maxLength !== 'undefined' && { + maxLength: element.maxLength, + }), + }, + }); + + linearScale = ({ minValue = 0, maxValue = 10 }: any, _context: any, index: any): any => ({ + component: 'linear-scale', + props: { + key: index, + children: Array.from({ length: maxValue - minValue + 1 }).map((_, key: any) => ({ + component: 'linear-scale-point', + props: { + key, + children: [ + this.text( + { + type: 'plain_text', + text: String(minValue + key), + emoji: true, + } as PlainText, + -1, + 0, + ), + ], + }, + })), + }, + }); +} + +const parser = new TestParser(); +const parse = uiKitContextualBar(parser); + +const conditionalParse = uiKitContextualBar(parser, { + engine: 'rocket.chat', +}); + +describe('divider', () => { + it('renders', () => { + const payload = [ + { + type: 'divider', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'divider', + props: { + key: 0, + block: true, + }, + }, + ]); + }); +}); + +describe('section', () => { + it('renders text as plain_text', () => { + const payload = [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('render text as mrkdwn', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: + 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text fields', () => { + const payload = [ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 2, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 3, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as button', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with a button.', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with a button.', + verbatim: false, + block: false, + }, + }, + { + component: 'button', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as image', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an accessory image.', + }, + accessory: { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an accessory image.', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as overflow menu', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an overflow menu.', + }, + accessory: { + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-3', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-4', + }, + ], + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an overflow menu.', + verbatim: false, + block: false, + }, + }, + { + component: 'menu', + props: { + key: 1, + children: [ + { + component: 'menu-item', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-0', + }, + }, + { + component: 'menu-item', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-1', + }, + }, + { + component: 'menu-item', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-2', + }, + }, + { + component: 'menu-item', + props: { + key: 3, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-3', + }, + }, + { + component: 'menu-item', + props: { + key: 4, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-4', + }, + }, + ], + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as datepicker', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Pick a date for the deadline.', + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'Pick a date for the deadline.', + verbatim: false, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + }, + }, + ]); + }); +}); + +describe('image', () => { + it('renders with title', () => { + const payload = [ + { + type: 'image', + title: { + type: 'plain_text', + text: 'I Need a Marg', + emoji: true, + }, + imageUrl: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + altText: 'marg', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + alt: 'marg', + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: 'I Need a Marg', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders with no title', () => { + const payload = [ + { + type: 'image', + imageUrl: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + altText: 'inspiration', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + alt: 'inspiration', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('actions', () => { + it('renders all selects', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + null, + null, + null, + { + component: 'select', + props: { + key: 3, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders filtered conversations select', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select private conversation', + emoji: true, + }, + filter: { + include: ['private'], + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null], + block: true, + }, + }, + ]); + }); + + it('renders selects with initial options', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + initialConversation: 'D123', + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + initialUser: 'U123', + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + initialChannel: 'C123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null, null, null], + block: true, + }, + }, + ]); + }); + + it('renders button', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'button', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'input', + props: { + key: 0, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('context', () => { + it('renders plain text', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders mrkdwn', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'mrkdwn', + text: '*Cat* has approved this message.', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'markdown', + props: { + key: 1, + children: '*Cat* has approved this message.', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text and images', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: '*This* is :smile: markdown', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: '*This* is :smile: markdown', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 2, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 3, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('input', () => { + it('renders multiline plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + multiline: true, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: true, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders multi users select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'multi_users_select', + placeholder: { + type: 'plain_text', + text: 'Select users', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + null, + ], + block: true, + }, + }, + ]); + }); + + it('renders static select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'select', + props: { + key: 1, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'input', + element: { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders linear scale', () => { + const payload = [ + { + type: 'input', + element: { + type: 'linear_scale', + maxValue: 2, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'linear-scale', + props: { + key: 1, + children: [ + { + component: 'linear-scale-point', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '0', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '1', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '2', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ], + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('conditional', () => { + it('renders when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders when no conditions are set', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(parse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('does not render when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['livechat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([]); + }); +}); diff --git a/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.ts b/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.ts new file mode 100644 index 000000000000..6e3c0f110b9d --- /dev/null +++ b/packages/ui-kit/src/surfaces/contextualBar/UiKitParserContextualBar.ts @@ -0,0 +1,17 @@ +import type { ActionsBlock } from '../../blocks/layout/ActionsBlock'; +import type { ContextBlock } from '../../blocks/layout/ContextBlock'; +import type { DividerBlock } from '../../blocks/layout/DividerBlock'; +import type { ImageBlock } from '../../blocks/layout/ImageBlock'; +import type { InputBlock } from '../../blocks/layout/InputBlock'; +import type { SectionBlock } from '../../blocks/layout/SectionBlock'; +import { SurfaceRenderer } from '../../rendering/SurfaceRenderer'; + +type ContextualBarSurfaceLayoutBlock = ActionsBlock | ContextBlock | DividerBlock | ImageBlock | InputBlock | SectionBlock; + +export abstract class UiKitParserContextualBar<OutputElement> extends SurfaceRenderer<OutputElement, ContextualBarSurfaceLayoutBlock> { + public constructor() { + super(['actions', 'context', 'divider', 'image', 'input', 'section']); + } +} + +export type ContextualBarSurfaceLayout = ContextualBarSurfaceLayoutBlock[]; diff --git a/packages/ui-kit/src/surfaces/contextualBar/index.ts b/packages/ui-kit/src/surfaces/contextualBar/index.ts new file mode 100644 index 000000000000..958bb92dfbca --- /dev/null +++ b/packages/ui-kit/src/surfaces/contextualBar/index.ts @@ -0,0 +1,3 @@ +export { ContextualBarView, isContextualBarView } from './ContextualBarView'; +export { UiKitParserContextualBar, ContextualBarSurfaceLayout } from './UiKitParserContextualBar'; +export { uiKitContextualBar } from './uiKitContextualBar'; diff --git a/packages/ui-kit/src/surfaces/contextualBar/uiKitContextualBar.ts b/packages/ui-kit/src/surfaces/contextualBar/uiKitContextualBar.ts new file mode 100644 index 000000000000..b5de38b80162 --- /dev/null +++ b/packages/ui-kit/src/surfaces/contextualBar/uiKitContextualBar.ts @@ -0,0 +1,4 @@ +import { createSurfaceRenderer } from '../../rendering/createSurfaceRenderer'; +import type { ContextualBarSurfaceLayout } from './UiKitParserContextualBar'; + +export const uiKitContextualBar = createSurfaceRenderer<ContextualBarSurfaceLayout[number]>(); diff --git a/packages/ui-kit/src/surfaces/message/UiKitParserMessage.spec.ts b/packages/ui-kit/src/surfaces/message/UiKitParserMessage.spec.ts new file mode 100644 index 000000000000..d68a02b02068 --- /dev/null +++ b/packages/ui-kit/src/surfaces/message/UiKitParserMessage.spec.ts @@ -0,0 +1,1427 @@ +import { BlockContext } from '../../rendering/BlockContext'; +import { UiKitParserMessage } from './UiKitParserMessage'; +import { uiKitMessage } from './uiKitMessage'; + +class TestParser extends UiKitParserMessage<unknown> { + plain_text = (element: any, context: any, index: any): any => ({ + component: 'text', + props: { + key: index, + children: element.text, + emoji: element.emoji, + block: context === BlockContext.BLOCK, + }, + }); + + mrkdwn = (element: any, context: any, index: any): any => ({ + component: 'markdown', + props: { + key: index, + children: element.text, + verbatim: Boolean(element.verbatim), + block: context === BlockContext.BLOCK, + }, + }); + + divider = (_element: any, context: any, index: any): any => ({ + component: 'divider', + props: { + key: index, + block: context === BlockContext.BLOCK, + }, + }); + + section = (element: any, context: any, index: any): any => { + let key = 0; + return { + component: 'section', + props: { + key: index, + children: [ + ...(element.text ? [this.text(element.text, BlockContext.SECTION, key++)] : []), + ...(element.fields?.map((field: any) => this.text(field, BlockContext.SECTION, key++)) ?? []), + ...(element.accessory ? [this.renderAccessories(element.accessory, BlockContext.SECTION, undefined, key++)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }; + }; + + actions = (element: any, context: any, index: any): any => ({ + component: 'actions', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderActions(element, BlockContext.ACTION, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + context = (element: any, context: any, index: any): any => ({ + component: 'context', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderContext(element, BlockContext.CONTEXT, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + button = (element: any, context: any, index: any): any => ({ + component: 'button', + props: { + key: index, + children: element.text ? [this.text(element.text, BlockContext.SECTION, 0)] : [], + ...(element.url && { href: element.url }), + ...(element.value && { value: element.value }), + variant: element.style ?? 'normal', + block: context === BlockContext.BLOCK, + }, + }); + + image = (element: any, context: any, index: any): any => { + if (context === BlockContext.BLOCK) { + let key = 0; + return { + component: 'image-container', + props: { + key: index, + children: [ + { + component: 'image', + props: { + key: key++, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }, + ...(element.title ? [this.plainText(element.title, -1, key++)] : []), + ], + block: true, + }, + }; + } + + return { + component: 'image', + props: { + key: index, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }; + }; + + overflow = (element: any, _context: any, index: any): any => ({ + component: 'menu', + props: { + key: index, + children: element.options.map((option: any, key: any) => ({ + component: 'menu-item', + props: { + key, + children: [this.text(option.text, -1, 0), ...(option.description ? [this.plainText(option.description, -1, 1)] : [])], + value: option.value, + ...(option.url && { url: option.url }), + }, + })), + }, + }); + + datePicker = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'date', + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + ...(element.initialDate && { defaultValue: element.initialDate }), + }, + }); + + staticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOption && { + defaultValue: element.options.find((option: any) => option.value === element.initialOption.value)?.value, + }), + }, + }); + + multiStaticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + multiple: true, + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOptions && { + defaultValue: element.options + .filter((option: any) => element.initialOptions.some((initialOption: any) => option.value === initialOption.value)) + .map((option: any) => option.value), + }), + }, + }); +} + +const parser = new TestParser(); +const parse = uiKitMessage(parser); + +const conditionalParse = uiKitMessage(parser, { + engine: 'rocket.chat', +}); + +describe('divider', () => { + it('renders', () => { + const payload = [ + { + type: 'divider', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'divider', + props: { + key: 0, + block: true, + }, + }, + ]); + }); +}); + +describe('section', () => { + it('renders text as plain_text', () => { + const payload = [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('render text as mrkdwn', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: + 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text fields', () => { + const payload = [ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 2, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 3, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as button', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with a button.', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with a button.', + verbatim: false, + block: false, + }, + }, + { + component: 'button', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as image', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an accessory image.', + }, + accessory: { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an accessory image.', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as overflow menu', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an overflow menu.', + }, + accessory: { + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-3', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-4', + }, + ], + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an overflow menu.', + verbatim: false, + block: false, + }, + }, + { + component: 'menu', + props: { + key: 1, + children: [ + { + component: 'menu-item', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-0', + }, + }, + { + component: 'menu-item', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-1', + }, + }, + { + component: 'menu-item', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-2', + }, + }, + { + component: 'menu-item', + props: { + key: 3, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-3', + }, + }, + { + component: 'menu-item', + props: { + key: 4, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-4', + }, + }, + ], + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as datepicker', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Pick a date for the deadline.', + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'Pick a date for the deadline.', + verbatim: false, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + }, + }, + ]); + }); +}); + +describe('image', () => { + it('renders with title', () => { + const payload = [ + { + type: 'image', + title: { + type: 'plain_text', + text: 'I Need a Marg', + emoji: true, + }, + imageUrl: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + altText: 'marg', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + alt: 'marg', + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: 'I Need a Marg', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders with no title', () => { + const payload = [ + { + type: 'image', + imageUrl: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + altText: 'inspiration', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + alt: 'inspiration', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('actions', () => { + it('renders all selects', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + null, + null, + null, + { + component: 'select', + props: { + key: 3, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders filtered conversations select', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select private conversation', + emoji: true, + }, + filter: { + include: ['private'], + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null], + block: true, + }, + }, + ]); + }); + + it('renders selects with initial options', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + initialConversation: 'D123', + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + initialUser: 'U123', + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + initialChannel: 'C123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null, null, null], + block: true, + }, + }, + ]); + }); + + it('renders button', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'button', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'input', + props: { + key: 0, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('context', () => { + it('renders plain text', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders mrkdwn', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'mrkdwn', + text: '*Cat* has approved this message.', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'markdown', + props: { + key: 1, + children: '*Cat* has approved this message.', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text and images', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: '*This* is :smile: markdown', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: '*This* is :smile: markdown', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 2, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 3, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('conditional', () => { + it('renders when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders when no conditions are set', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(parse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('does not render when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['livechat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([]); + }); +}); diff --git a/packages/ui-kit/src/surfaces/message/UiKitParserMessage.ts b/packages/ui-kit/src/surfaces/message/UiKitParserMessage.ts new file mode 100644 index 000000000000..a8f4fdf4315e --- /dev/null +++ b/packages/ui-kit/src/surfaces/message/UiKitParserMessage.ts @@ -0,0 +1,27 @@ +import type { ActionsBlock } from '../../blocks/layout/ActionsBlock'; +import type { CalloutBlock } from '../../blocks/layout/CalloutBlock'; +import type { ContextBlock } from '../../blocks/layout/ContextBlock'; +import type { DividerBlock } from '../../blocks/layout/DividerBlock'; +import type { ImageBlock } from '../../blocks/layout/ImageBlock'; +import type { PreviewBlock } from '../../blocks/layout/PreviewBlock'; +import type { SectionBlock } from '../../blocks/layout/SectionBlock'; +import type { VideoConferenceBlock } from '../../blocks/layout/VideoConferenceBlock'; +import { SurfaceRenderer } from '../../rendering/SurfaceRenderer'; + +type MessageSurfaceLayoutBlock = + | ActionsBlock + | ContextBlock + | DividerBlock + | ImageBlock + | SectionBlock + | VideoConferenceBlock + | PreviewBlock + | CalloutBlock; + +export abstract class UiKitParserMessage<OutputElement> extends SurfaceRenderer<OutputElement, MessageSurfaceLayoutBlock> { + public constructor() { + super(['actions', 'context', 'divider', 'image', 'section', 'preview', 'video_conf', 'callout']); + } +} + +export type MessageSurfaceLayout = MessageSurfaceLayoutBlock[]; diff --git a/packages/ui-kit/src/surfaces/message/index.ts b/packages/ui-kit/src/surfaces/message/index.ts new file mode 100644 index 000000000000..39363c98cf49 --- /dev/null +++ b/packages/ui-kit/src/surfaces/message/index.ts @@ -0,0 +1,2 @@ +export { UiKitParserMessage, MessageSurfaceLayout } from './UiKitParserMessage'; +export { uiKitMessage } from './uiKitMessage'; diff --git a/packages/ui-kit/src/surfaces/message/uiKitMessage.ts b/packages/ui-kit/src/surfaces/message/uiKitMessage.ts new file mode 100644 index 000000000000..4a59b7e83e53 --- /dev/null +++ b/packages/ui-kit/src/surfaces/message/uiKitMessage.ts @@ -0,0 +1,4 @@ +import { createSurfaceRenderer } from '../../rendering/createSurfaceRenderer'; +import type { MessageSurfaceLayout } from './UiKitParserMessage'; + +export const uiKitMessage = createSurfaceRenderer<MessageSurfaceLayout[number]>(); diff --git a/packages/ui-kit/src/surfaces/modal/ModalView.ts b/packages/ui-kit/src/surfaces/modal/ModalView.ts new file mode 100644 index 000000000000..08c44a82dfef --- /dev/null +++ b/packages/ui-kit/src/surfaces/modal/ModalView.ts @@ -0,0 +1,21 @@ +import typia from 'typia'; + +import type { TextObject } from '../../blocks/TextObject'; +import type { ButtonElement } from '../../blocks/elements/ButtonElement'; +import type { View } from '../View'; +import type { ModalSurfaceLayout } from './UiKitParserModal'; + +/** + * A view that is displayed as a modal dialog. + */ +// Omitting `blocks` from `View` because array intersections are weird +export type ModalView = Omit<View, 'blocks'> & { + id: string; + showIcon?: boolean; + title: TextObject; + close?: ButtonElement; + submit?: ButtonElement; + blocks: ModalSurfaceLayout; +}; + +export const isModalView = typia.createIs<ModalView>(); diff --git a/packages/ui-kit/src/surfaces/modal/UiKitParserModal.spec.ts b/packages/ui-kit/src/surfaces/modal/UiKitParserModal.spec.ts new file mode 100644 index 000000000000..33691a21bfd5 --- /dev/null +++ b/packages/ui-kit/src/surfaces/modal/UiKitParserModal.spec.ts @@ -0,0 +1,1905 @@ +import type { OverflowElement } from '../../blocks/elements/OverflowElement'; +import type { PlainText } from '../../blocks/text/PlainText'; +import { BlockContext } from '../../rendering/BlockContext'; +import { UiKitParserModal } from './UiKitParserModal'; +import { uiKitModal } from './uiKitModal'; + +class TestParser extends UiKitParserModal<unknown> { + plain_text = (element: any, context: any, index: any): any => ({ + component: 'text', + props: { + key: index, + children: element.text, + emoji: element.emoji, + block: context === BlockContext.BLOCK, + }, + }); + + mrkdwn = (element: any, context: any, index: any): any => ({ + component: 'markdown', + props: { + key: index, + children: element.text, + verbatim: Boolean(element.verbatim), + block: context === BlockContext.BLOCK, + }, + }); + + divider = (_element: any, context: any, index: any): any => ({ + component: 'divider', + props: { + key: index, + block: context === BlockContext.BLOCK, + }, + }); + + section = (element: any, context: any, index: any): any => { + let key = 0; + return { + component: 'section', + props: { + key: index, + children: [ + ...(element.text ? [this.text(element.text, BlockContext.SECTION, key++)] : []), + ...(element.fields?.map((field: any) => this.text(field, BlockContext.SECTION, key++)) ?? []), + ...(element.accessory ? [this.renderAccessories(element.accessory, BlockContext.SECTION, undefined, key++)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }; + }; + + actions = (element: any, context: any, index: any): any => ({ + component: 'actions', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderActions(element, BlockContext.ACTION, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + context = (element: any, context: any, index: any): any => ({ + component: 'context', + props: { + key: index, + children: element.elements.map((element: any, key: number) => this.renderContext(element, BlockContext.CONTEXT, undefined, key)), + block: context === BlockContext.BLOCK, + }, + }); + + input = (element: any, context: any, index: any): any => ({ + component: 'input-group', + props: { + key: index, + children: [ + this.plainText(element.label, BlockContext.FORM, 0), + this.renderInputs(element.element, BlockContext.FORM, undefined, 1), + ...(element.hint ? [this.plainText(element.hint, BlockContext.FORM, 2)] : []), + ], + block: context === BlockContext.BLOCK, + }, + }); + + button = (element: any, context: any, index: any): any => ({ + component: 'button', + props: { + key: index, + children: element.text ? [this.text(element.text, BlockContext.SECTION, 0)] : [], + ...(element.url && { href: element.url }), + ...(element.value && { value: element.value }), + variant: element.style ?? 'normal', + block: context === BlockContext.BLOCK, + }, + }); + + image = (element: any, context: any, index: any): any => { + if (context === BlockContext.BLOCK) { + let key = 0; + return { + component: 'image-container', + props: { + key: index, + children: [ + { + component: 'image', + props: { + key: key++, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }, + ...(element.title ? [this.plainText(element.title, -1, key++)] : []), + ], + block: true, + }, + }; + } + + return { + component: 'image', + props: { + key: index, + src: element.imageUrl, + alt: element.altText, + block: false, + }, + }; + }; + + overflow = (element: OverflowElement, _context: any, index: any): any => ({ + component: 'menu', + props: { + key: index, + children: element.options.map((option, key) => ({ + component: 'menu-item', + props: { + key, + children: [this.text(option.text, -1, 0), ...(option.description ? [this.plainText(option.description, -1, 1)] : [])], + value: option.value, + ...(option.url && { url: option.url }), + }, + })), + }, + }); + + datePicker = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'date', + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + ...(element.initialDate && { defaultValue: element.initialDate }), + }, + }); + + staticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOption && { + defaultValue: element.options.find((option: any) => option.value === element.initialOption.value)?.value, + }), + }, + }); + + multiStaticSelect = (element: any, _context: any, index: any): any => ({ + component: 'select', + props: { + key: index, + ...(element.placeholder && { + placeholder: this.text(element.placeholder, -1, 0), + }), + multiple: true, + children: element.options.map((option: any, key: any) => ({ + component: 'option', + props: { + key, + children: this.text(option.text, -1, 0), + value: option.value, + ...(option.description && { + description: this.text(option.description, -1, 0), + }), + }, + })), + ...(element.initialOptions && { + defaultValue: element.options + .filter((option: any) => element.initialOptions.some((initialOption: any) => option.value === initialOption.value)) + .map((option: any) => option.value), + }), + }, + }); + + plainInput = (element: any, _context: any, index: any): any => ({ + component: 'input', + props: { + key: index, + type: 'text', + ...(element.placeholder && { + placeholder: this.plainText(element.placeholder, -1, 0), + }), + ...(element.initialValue && { defaultValue: element.initialValue }), + multiline: element.multiline ?? false, + ...(typeof element.minLength !== 'undefined' && { + minLength: element.minLength, + }), + ...(typeof element.maxLength !== 'undefined' && { + maxLength: element.maxLength, + }), + }, + }); + + linearScale = ({ minValue = 0, maxValue = 10 }: any, _context: any, index: any): any => ({ + component: 'linear-scale', + props: { + key: index, + children: Array.from({ length: maxValue - minValue + 1 }).map((_, key: any) => ({ + component: 'linear-scale-point', + props: { + key, + children: [ + this.text( + { + type: 'plain_text', + text: String(minValue + key), + emoji: true, + } as PlainText, + -1, + 0, + ), + ], + }, + })), + }, + }); +} + +const parser = new TestParser(); +const parse = uiKitModal(parser); + +const conditionalParse = uiKitModal(parser, { + engine: 'rocket.chat', +}); + +describe('divider', () => { + it('renders', () => { + const payload = [ + { + type: 'divider', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'divider', + props: { + key: 0, + block: true, + }, + }, + ]); + }); +}); + +describe('section', () => { + it('renders text as plain_text', () => { + const payload = [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('render text as mrkdwn', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: + 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text fields', () => { + const payload = [ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 2, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 3, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as button', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with a button.', + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with a button.', + verbatim: false, + block: false, + }, + }, + { + component: 'button', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as image', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an accessory image.', + }, + accessory: { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an accessory image.', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as overflow menu', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'This is a section block with an overflow menu.', + }, + accessory: { + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-3', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-4', + }, + ], + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'This is a section block with an overflow menu.', + verbatim: false, + block: false, + }, + }, + { + component: 'menu', + props: { + key: 1, + children: [ + { + component: 'menu-item', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-0', + }, + }, + { + component: 'menu-item', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-1', + }, + }, + { + component: 'menu-item', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-2', + }, + }, + { + component: 'menu-item', + props: { + key: 3, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-3', + }, + }, + { + component: 'menu-item', + props: { + key: 4, + children: [ + { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + ], + value: 'value-4', + }, + }, + ], + }, + }, + ], + }, + }, + ]); + }); + + it('renders accessory as datepicker', () => { + const payload = [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Pick a date for the deadline.', + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + block: true, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: 'Pick a date for the deadline.', + verbatim: false, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + }, + }, + ]); + }); +}); + +describe('image', () => { + it('renders with title', () => { + const payload = [ + { + type: 'image', + title: { + type: 'plain_text', + text: 'I Need a Marg', + emoji: true, + }, + imageUrl: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + altText: 'marg', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://assets3.thrillist.com/v1/image/1682388/size/tl-horizontal_main.jpg', + alt: 'marg', + block: false, + }, + }, + { + component: 'text', + props: { + key: 1, + children: 'I Need a Marg', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders with no title', () => { + const payload = [ + { + type: 'image', + imageUrl: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + altText: 'inspiration', + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'image-container', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://i1.wp.com/thetempest.co/wp-content/uploads/2017/08/The-wise-words-of-Michael-Scott-Imgur-2.jpg?w=1024&ssl=1', + alt: 'inspiration', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('actions', () => { + it('renders all selects', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + null, + null, + null, + { + component: 'select', + props: { + key: 3, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders filtered conversations select', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select private conversation', + emoji: true, + }, + filter: { + include: ['private'], + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null], + block: true, + }, + }, + ]); + }); + + it('renders selects with initial options', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true, + }, + initialConversation: 'D123', + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true, + }, + initialUser: 'U123', + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true, + }, + initialChannel: 'C123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [null, null, null], + block: true, + }, + }, + ]); + }); + + it('renders button', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'Click Me', + emoji: true, + }, + value: 'click_me_123', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'button', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Click Me', + emoji: true, + block: false, + }, + }, + ], + value: 'click_me_123', + variant: 'normal', + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'actions', + elements: [ + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'actions', + props: { + key: 0, + children: [ + { + component: 'input', + props: { + key: 0, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('context', () => { + it('renders plain text', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders mrkdwn', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'mrkdwn', + text: '*Cat* has approved this message.', + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'image', + props: { + key: 0, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'markdown', + props: { + key: 1, + children: '*Cat* has approved this message.', + verbatim: false, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders text and images', () => { + const payload = [ + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: '*This* is :smile: markdown', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'image', + imageUrl: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + altText: 'cute cat', + }, + { + type: 'plain_text', + text: 'Author: K A Applegate', + emoji: true, + }, + ], + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'context', + props: { + key: 0, + children: [ + { + component: 'markdown', + props: { + key: 0, + children: '*This* is :smile: markdown', + verbatim: false, + block: false, + }, + }, + { + component: 'image', + props: { + key: 1, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 2, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'image', + props: { + key: 3, + src: 'https://pbs.twimg.com/profile_images/625633822235693056/lNGUneLX_400x400.jpg', + alt: 'cute cat', + block: false, + }, + }, + { + component: 'text', + props: { + key: 4, + children: 'Author: K A Applegate', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('input', () => { + it('renders multiline plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + multiline: true, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: true, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders plain text input', () => { + const payload = [ + { + type: 'input', + element: { + type: 'plain_text_input', + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'text', + multiline: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders multi users select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'multi_users_select', + placeholder: { + type: 'plain_text', + text: 'Select users', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + null, + ], + block: true, + }, + }, + ]); + }); + + it('renders static select', () => { + const payload = [ + { + type: 'input', + element: { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true, + }, + options: [ + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-0', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-1', + }, + { + text: { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true, + }, + value: 'value-2', + }, + ], + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'select', + props: { + key: 1, + children: [ + { + component: 'option', + props: { + key: 0, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-0', + }, + }, + { + component: 'option', + props: { + key: 1, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-1', + }, + }, + { + component: 'option', + props: { + key: 2, + children: { + component: 'text', + props: { + key: 0, + children: '*this is plain_text text*', + emoji: true, + block: false, + }, + }, + value: 'value-2', + }, + }, + ], + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select an item', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders datepicker', () => { + const payload = [ + { + type: 'input', + element: { + type: 'datepicker', + initialDate: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true, + }, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'input', + props: { + key: 1, + type: 'date', + defaultValue: '1990-04-28', + placeholder: { + component: 'text', + props: { + key: 0, + children: 'Select a date', + emoji: true, + block: false, + }, + }, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders linear scale', () => { + const payload = [ + { + type: 'input', + element: { + type: 'linear_scale', + maxValue: 2, + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true, + }, + }, + ]; + expect(parse(payload)).toStrictEqual([ + { + component: 'input-group', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'Label', + emoji: true, + block: false, + }, + }, + { + component: 'linear-scale', + props: { + key: 1, + children: [ + { + component: 'linear-scale-point', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: '0', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 1, + children: [ + { + component: 'text', + props: { + key: 0, + children: '1', + emoji: true, + block: false, + }, + }, + ], + }, + }, + { + component: 'linear-scale-point', + props: { + key: 2, + children: [ + { + component: 'text', + props: { + key: 0, + children: '2', + emoji: true, + block: false, + }, + }, + ], + }, + }, + ], + }, + }, + ], + block: true, + }, + }, + ]); + }); +}); + +describe('conditional', () => { + it('renders when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('renders when no conditions are set', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['rocket.chat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(parse(blocks)).toStrictEqual([ + { + component: 'section', + props: { + key: 0, + children: [ + { + component: 'text', + props: { + key: 0, + children: 'This is a plain text section block.', + emoji: true, + block: false, + }, + }, + ], + block: true, + }, + }, + ]); + }); + + it('does not render when conditions match', () => { + const blocks = [ + { + type: 'conditional', + when: { + engine: ['livechat'], + }, + render: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'This is a plain text section block.', + emoji: true, + }, + }, + ], + }, + ]; + + expect(conditionalParse(blocks)).toStrictEqual([]); + }); +}); diff --git a/packages/ui-kit/src/surfaces/modal/UiKitParserModal.ts b/packages/ui-kit/src/surfaces/modal/UiKitParserModal.ts new file mode 100644 index 000000000000..598886675174 --- /dev/null +++ b/packages/ui-kit/src/surfaces/modal/UiKitParserModal.ts @@ -0,0 +1,18 @@ +import type { ActionsBlock } from '../../blocks/layout/ActionsBlock'; +import type { CalloutBlock } from '../../blocks/layout/CalloutBlock'; +import type { ContextBlock } from '../../blocks/layout/ContextBlock'; +import type { DividerBlock } from '../../blocks/layout/DividerBlock'; +import type { ImageBlock } from '../../blocks/layout/ImageBlock'; +import type { InputBlock } from '../../blocks/layout/InputBlock'; +import type { SectionBlock } from '../../blocks/layout/SectionBlock'; +import { SurfaceRenderer } from '../../rendering/SurfaceRenderer'; + +type ModalSurfaceLayoutBlock = ActionsBlock | ContextBlock | DividerBlock | ImageBlock | InputBlock | SectionBlock | CalloutBlock; + +export abstract class UiKitParserModal<OutputElement> extends SurfaceRenderer<OutputElement, ModalSurfaceLayoutBlock> { + public constructor() { + super(['actions', 'context', 'divider', 'image', 'input', 'section', 'callout']); + } +} + +export type ModalSurfaceLayout = ModalSurfaceLayoutBlock[]; diff --git a/packages/ui-kit/src/surfaces/modal/index.ts b/packages/ui-kit/src/surfaces/modal/index.ts new file mode 100644 index 000000000000..30deee80f876 --- /dev/null +++ b/packages/ui-kit/src/surfaces/modal/index.ts @@ -0,0 +1,3 @@ +export { ModalView, isModalView } from './ModalView'; +export { ModalSurfaceLayout, UiKitParserModal } from './UiKitParserModal'; +export { uiKitModal } from './uiKitModal'; diff --git a/packages/ui-kit/src/surfaces/modal/uiKitModal.ts b/packages/ui-kit/src/surfaces/modal/uiKitModal.ts new file mode 100644 index 000000000000..a100994a5d50 --- /dev/null +++ b/packages/ui-kit/src/surfaces/modal/uiKitModal.ts @@ -0,0 +1,4 @@ +import { createSurfaceRenderer } from '../../rendering/createSurfaceRenderer'; +import type { ModalSurfaceLayout } from './UiKitParserModal'; + +export const uiKitModal = createSurfaceRenderer<ModalSurfaceLayout[number]>(); diff --git a/packages/ui-kit/tsconfig-cjs.json b/packages/ui-kit/tsconfig-cjs.json new file mode 100644 index 000000000000..e7a9363b63d7 --- /dev/null +++ b/packages/ui-kit/tsconfig-cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist/cjs/", + "plugins": [{ "transform": "typia/lib/transform" }] + } +} diff --git a/packages/ui-kit/tsconfig.json b/packages/ui-kit/tsconfig.json new file mode 100644 index 000000000000..65a91827e173 --- /dev/null +++ b/packages/ui-kit/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES5", + "module": "ES2020", + "lib": ["ES2020"], + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./dist/esm/", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "plugins": [{ "transform": "typia/lib/transform" }] + }, + "exclude": ["dist/", "src/**/*.spec.ts"] +} diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index e28f20ad9ff4..f96c59883d24 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,193 @@ # @rocket.chat/ui-video-conf +## 3.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.2 + +## 3.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.1 + +## 3.0.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0 + +## 3.0.0-rc.19 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.19 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.18 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.17 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.16 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.15 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.14 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.13 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.12 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.11 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.10 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.9 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.8 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.1 + ## 2.0.0 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 2e880b3db8bb..c319f4bfd6da 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,15 +1,15 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "2.0.0", + "version": "3.0.2", "private": true, "devDependencies": { - "@babel/core": "~7.22.9", - "@rocket.chat/css-in-js": "next", + "@babel/core": "~7.22.20", + "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-hooks": "^0.32.1", - "@rocket.chat/icons": "^0.32.0", - "@rocket.chat/styled": "next", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/icons": "~0.32.0", + "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-contexts": "workspace:^", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", @@ -18,16 +18,16 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@types/babel__core": "~7.20.1", - "@types/jest": "~29.5.3", + "@types/babel__core": "~7.20.3", + "@types/jest": "~29.5.7", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-storybook": "~0.6.12", - "jest": "~29.6.1", + "eslint-plugin-storybook": "~0.6.15", + "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "peerDependencies": { "@rocket.chat/css-in-js": "*", @@ -35,7 +35,7 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-contexts": "2.0.0", + "@rocket.chat/ui-contexts": "3.0.2", "react": "^17.0.2", "react-dom": "^17.0.2" }, @@ -53,7 +53,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/emitter": "next" + "@rocket.chat/emitter": "~0.31.25" }, "volta": { "extends": "../../package.json" diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index 35ae7c9ae5e9..29ca8498fdca 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,224 @@ # @rocket.chat/uikit-playground +## 0.2.11 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.2 +- @rocket.chat/fuselage-ui-kit@3.0.2 + +## 0.2.10 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.1 +- @rocket.chat/fuselage-ui-kit@3.0.1 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0 + - @rocket.chat/fuselage-ui-kit@3.0.0 + +## 0.2.9-rc.12 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.19 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.19 + +## 0.2.9-rc.11 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.18 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.18 + +## 0.2.9-rc.10 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.17 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.17 + +## 0.2.9-rc.9 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.16 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.16 + +## 0.2.9-rc.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.15 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.15 + +## 0.2.9-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.14 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.14 + +## 0.2.9-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.13 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.13 + +## 0.2.9-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.12 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.12 + +## 0.2.9-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.11 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.11 + +## 0.2.9-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.10 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.10 + +## 0.2.9-rc.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.9 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.9 + +## 0.2.9-rc.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.8 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.8 + +## 0.2.6-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.7 + +## 0.2.6-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.6 + +## 0.2.6-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.5 + +## 0.2.6-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.4 + +## 0.2.6-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.3 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.3 + +## 0.2.6-rc.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.2 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.2 + +## 0.2.6-rc.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.1 +- @rocket.chat/fuselage-ui-kit@3.0.0-rc.1 + +## 0.2.6-rc.0 + +### Patch Changes + +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + - @rocket.chat/fuselage-ui-kit@3.0.0-rc.0 + +## 0.2.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 +- @rocket.chat/fuselage-ui-kit@2.0.8 + +## 0.2.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 +- @rocket.chat/fuselage-ui-kit@2.0.7 + +## 0.2.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 +- @rocket.chat/fuselage-ui-kit@2.0.6 + +## 0.2.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.5 +- @rocket.chat/fuselage-ui-kit@2.0.5 + +## 0.2.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.4 +- @rocket.chat/fuselage-ui-kit@2.0.4 + +## 0.2.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.3 +- @rocket.chat/fuselage-ui-kit@2.0.3 + +## 0.2.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.2 +- @rocket.chat/fuselage-ui-kit@2.0.2 + +## 0.2.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.1 +- @rocket.chat/fuselage-ui-kit@2.0.1 + ## 0.2.0 ### Minor Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index d9abdf001162..009eec761168 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.0", + "version": "0.2.11", "type": "module", "scripts": { "dev": "vite", @@ -14,15 +14,15 @@ "@codemirror/lang-json": "^6.0.1", "@codemirror/tooltip": "^0.19.16", "@lezer/highlight": "^1.1.6", - "@rocket.chat/css-in-js": "next", - "@rocket.chat/fuselage": "^0.35.0", - "@rocket.chat/fuselage-hooks": "^0.32.1", - "@rocket.chat/fuselage-polyfills": "next", - "@rocket.chat/fuselage-tokens": "^0.32.0", + "@rocket.chat/css-in-js": "~0.31.25", + "@rocket.chat/fuselage": "^0.42.0", + "@rocket.chat/fuselage-hooks": "~0.32.1", + "@rocket.chat/fuselage-polyfills": "~0.31.25", + "@rocket.chat/fuselage-tokens": "~0.32.0", "@rocket.chat/fuselage-ui-kit": "workspace:~", - "@rocket.chat/icons": "^0.32.0", - "@rocket.chat/logo": "^0.31.28", - "@rocket.chat/styled": "next", + "@rocket.chat/icons": "~0.32.0", + "@rocket.chat/logo": "~0.31.28", + "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-contexts": "workspace:~", "codemirror": "^6.0.1", "eslint4b-prebuilt": "^6.7.2", @@ -36,17 +36,17 @@ "use-subscription": "^1.8.0" }, "devDependencies": { - "@types/react": "~17.0.62", - "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "~17.0.20", - "@types/use-subscription": "^1.0.0", + "@types/react": "~17.0.69", + "@types/react-beautiful-dnd": "^13.1.6", + "@types/react-dom": "~17.0.22", + "@types/use-subscription": "^1.0.1", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "@vitejs/plugin-react": "^4.0.0", "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.1", - "typescript": "~5.2.2", + "eslint-plugin-react-refresh": "^0.4.4", + "typescript": "~5.3.2", "vite": "^4.3.9" }, "volta": { diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index 2f4946f4ba48..ed642f33bdd0 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,191 @@ # @rocket.chat/web-ui-registration +## 3.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.2 + +## 3.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.1 + +## 3.0.0 + +### Patch Changes + +- 7da1edf866: Fixed an issue in the invite registration flow in which the user would not be automatically redirected to the homepage upon succesfully submiting the user registration form. +- Updated dependencies [7da1edf866] +- Updated dependencies [92613680b7] + - @rocket.chat/ui-contexts@3.0.0 + - @rocket.chat/tools@0.2.0 + +## 3.0.0-rc.18 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.19 + +## 3.0.0-rc.17 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.18 + +## 3.0.0-rc.16 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.17 + +## 3.0.0-rc.15 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.16 + +## 3.0.0-rc.14 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.15 + +## 3.0.0-rc.13 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.14 + +## 3.0.0-rc.12 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.13 + +## 3.0.0-rc.11 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.12 + +## 3.0.0-rc.10 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.11 + +## 3.0.0-rc.9 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.10 + +## 3.0.0-rc.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.9 + +## 3.0.0-rc.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.8 + +## 3.0.0-rc.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.7 + +## 3.0.0-rc.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.6 + +## 3.0.0-rc.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.5 + +## 3.0.0-rc.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.4 + +## 3.0.0-rc.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.2 + +## 3.0.0-rc.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@3.0.0-rc.1 + +## 3.0.0-rc.0 + +### Patch Changes + +- 7da1edf866: Fixed an issue in the invite registration flow in which the user would not be automatically redirected to the homepage upon succesfully submiting the user registration form. +- Updated dependencies [7da1edf866] + - @rocket.chat/ui-contexts@3.0.0-rc.0 + +## 2.0.8 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.8 + +## 2.0.7 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.7 + +## 2.0.6 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.6 + +## 2.0.5 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.5 + +## 2.0.4 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.4 + +## 2.0.3 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.3 + +## 2.0.2 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.2 + +## 2.0.1 + +### Patch Changes + +- @rocket.chat/ui-contexts@2.0.1 + ## 2.0.0 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index f26718de571a..9c37b99b13f2 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "2.0.0", + "version": "3.0.2", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -17,13 +17,14 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput" }, "devDependencies": { - "@babel/core": "~7.22.10", - "@babel/preset-env": "~7.22.10", - "@babel/preset-react": "~7.22.5", - "@babel/preset-typescript": "~7.22.5", + "@babel/core": "~7.22.20", + "@babel/preset-env": "~7.22.20", + "@babel/preset-react": "~7.22.15", + "@babel/preset-typescript": "~7.22.15", "@rocket.chat/i18n": "workspace:~", - "@rocket.chat/layout": "next", + "@rocket.chat/layout": "~0.31.26", "@rocket.chat/mock-providers": "workspace:~", + "@rocket.chat/tools": "workspace:~", "@rocket.chat/ui-client": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", "@storybook/addon-actions": "~6.5.16", @@ -32,24 +33,25 @@ "@storybook/builder-webpack4": "~6.5.16", "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", - "@storybook/testing-library": "^0.2.0", + "@storybook/testing-library": "^0.2.2", "@tanstack/react-query": "^4.16.1", "@testing-library/react": "^13.3.0", - "@types/jest": "~29.5.3", - "@types/react": "~17.0.62", + "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", "babel-loader": "~8.3.0", "eslint": "~8.45.0", - "jest": "~29.6.1", + "jest": "~29.6.4", "react": "~17.0.2", "react-hook-form": "~7.45.4", - "react-i18next": "~13.2.1", + "react-i18next": "~13.2.2", "storybook-dark-mode": "~3.0.1", - "ts-jest": "~29.0.5", - "typescript": "~5.2.2" + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" }, "peerDependencies": { "@rocket.chat/layout": "*", - "@rocket.chat/ui-contexts": "2.0.0", + "@rocket.chat/tools": "*", + "@rocket.chat/ui-contexts": "3.0.2", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", diff --git a/packages/web-ui-registration/src/EmailConfirmationForm.tsx b/packages/web-ui-registration/src/EmailConfirmationForm.tsx index 285181b6aa35..680d90897632 100644 --- a/packages/web-ui-registration/src/EmailConfirmationForm.tsx +++ b/packages/web-ui-registration/src/EmailConfirmationForm.tsx @@ -63,7 +63,7 @@ export const EmailConfirmationForm = ({ email, onBackToLogin }: { email?: string </Form.Container> <Form.Footer> <ButtonGroup> - <Button disabled={sendEmail.isLoading} type='submit' primary> + <Button loading={sendEmail.isLoading} type='submit' primary> {t('registration.component.form.sendConfirmationEmail')} </Button> </ButtonGroup> diff --git a/packages/web-ui-registration/src/GuestForm.tsx b/packages/web-ui-registration/src/GuestForm.tsx index 59df56837d86..d6b5fe15f135 100644 --- a/packages/web-ui-registration/src/GuestForm.tsx +++ b/packages/web-ui-registration/src/GuestForm.tsx @@ -1,11 +1,13 @@ import { Button, ButtonGroup } from '@rocket.chat/fuselage'; import { Form } from '@rocket.chat/layout'; +import { useDocumentTitle } from '@rocket.chat/ui-client'; import { useTranslation } from 'react-i18next'; import type { DispatchLoginRouter } from './hooks/useLoginRouter'; const GuestForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRouter }) => { const { t } = useTranslation(); + useDocumentTitle(t('registration.component.login'), false); return ( <Form> diff --git a/packages/web-ui-registration/src/LoginForm.tsx b/packages/web-ui-registration/src/LoginForm.tsx index a6876614f4df..1c6e0661104f 100644 --- a/packages/web-ui-registration/src/LoginForm.tsx +++ b/packages/web-ui-registration/src/LoginForm.tsx @@ -13,6 +13,7 @@ import { } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import { Form, ActionLink } from '@rocket.chat/layout'; +import { useDocumentTitle } from '@rocket.chat/ui-client'; import { useLoginWithPassword, useSetting } from '@rocket.chat/ui-contexts'; import { useMutation } from '@tanstack/react-query'; import type { ReactElement } from 'react'; @@ -79,6 +80,8 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute const usernameOrEmailPlaceholder = String(useSetting('Accounts_EmailOrUsernamePlaceholder')); const passwordPlaceholder = String(useSetting('Accounts_PasswordPlaceholder')); + useDocumentTitle(t('registration.component.login'), false); + const loginMutation = useMutation({ mutationFn: (formData: { username: string; password: string }) => { return login(formData.username, formData.password); @@ -197,7 +200,7 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute </Form.Container> <Form.Footer> <ButtonGroup stretch> - <Button disabled={loginMutation.isLoading} type='submit' primary> + <Button loading={loginMutation.isLoading} type='submit' primary> {t('registration.component.login')} </Button> </ButtonGroup> diff --git a/packages/web-ui-registration/src/RegisterForm.tsx b/packages/web-ui-registration/src/RegisterForm.tsx index df327f05ed61..0eda77879be7 100644 --- a/packages/web-ui-registration/src/RegisterForm.tsx +++ b/packages/web-ui-registration/src/RegisterForm.tsx @@ -290,7 +290,7 @@ export const RegisterForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRo </Form.Container> <Form.Footer> <ButtonGroup> - <Button type='submit' disabled={registerUser.isLoading} primary> + <Button type='submit' loading={registerUser.isLoading} primary> {t('registration.component.form.joinYourTeam')} </Button> </ButtonGroup> diff --git a/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx b/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx index a14f48e754ca..08cf481061f9 100644 --- a/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx +++ b/packages/web-ui-registration/src/RegisterSecretPageRouter.tsx @@ -1,5 +1,7 @@ +import { useDocumentTitle } from '@rocket.chat/ui-client'; import { useSetting } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; import RegisterForm from './RegisterForm'; import RegisterFormDisabled from './RegisterFormDisabled'; @@ -14,19 +16,22 @@ export const RegisterSecretPageRouter = ({ origin, }: { setLoginRoute: DispatchLoginRouter; - origin: 'register' | 'secret-register'; + origin: 'register' | 'secret-register' | 'invite-register'; }): ReactElement => { + const { t } = useTranslation(); const registrationMode = useSetting<string>('Accounts_RegistrationForm'); const isPublicRegistration = registrationMode === 'Public'; const isRegistrationAllowedForSecret = registrationMode === 'Secret URL'; const isRegistrationDisabled = registrationMode === 'Disabled' || (origin === 'register' && isRegistrationAllowedForSecret); + useDocumentTitle(t('registration.component.form.createAnAccount'), false); + if (origin === 'secret-register' && !isRegistrationAllowedForSecret) { return <SecretRegisterInvalidForm />; } - if (isPublicRegistration) { + if (isPublicRegistration || (origin === 'invite-register' && isRegistrationAllowedForSecret)) { return ( <RegisterTemplate> <RegisterForm setLoginRoute={setLoginRoute} /> diff --git a/packages/web-ui-registration/src/RegistrationPageRouter.tsx b/packages/web-ui-registration/src/RegistrationPageRouter.tsx index 3c92f528fa9c..a8d2064b5769 100644 --- a/packages/web-ui-registration/src/RegistrationPageRouter.tsx +++ b/packages/web-ui-registration/src/RegistrationPageRouter.tsx @@ -1,3 +1,4 @@ +import { useSession } from '@rocket.chat/ui-contexts'; import type { ReactElement, ReactNode } from 'react'; import GuestForm from './GuestForm'; @@ -15,7 +16,8 @@ export const RegistrationPageRouter = ({ defaultRoute?: LoginRoutes; children?: ReactNode; }): ReactElement | null => { - const [route, setLoginRoute] = useLoginRouter(defaultRoute); + const defaultRouteSession = useSession('loginDefaultState') as LoginRoutes | undefined; + const [route, setLoginRoute] = useLoginRouter(defaultRouteSession || defaultRoute); if (route === 'guest') { return ( @@ -41,7 +43,7 @@ export const RegistrationPageRouter = ({ ); } - if (route === 'secret-register' || route === 'register') { + if (route === 'secret-register' || route === 'register' || route === 'invite-register') { return <RegisterSecretPageRouter origin={route} setLoginRoute={setLoginRoute} />; } diff --git a/packages/web-ui-registration/src/ResetPassword/ResetPasswordPage.tsx b/packages/web-ui-registration/src/ResetPassword/ResetPasswordPage.tsx index 19b0a13983bb..15290a823d4a 100644 --- a/packages/web-ui-registration/src/ResetPassword/ResetPasswordPage.tsx +++ b/packages/web-ui-registration/src/ResetPassword/ResetPasswordPage.tsx @@ -147,7 +147,7 @@ const ResetPasswordPage = (): ReactElement => { </Form.Container> <Form.Footer> <ButtonGroup> - <Button primary disabled={isSubmitting} type='submit'> + <Button primary loading={isSubmitting} type='submit'> {t('Reset')} </Button> </ButtonGroup> diff --git a/packages/web-ui-registration/src/ResetPasswordForm.tsx b/packages/web-ui-registration/src/ResetPasswordForm.tsx index d53b5d1fd793..ae771c4494f7 100644 --- a/packages/web-ui-registration/src/ResetPasswordForm.tsx +++ b/packages/web-ui-registration/src/ResetPasswordForm.tsx @@ -1,6 +1,7 @@ import { FieldGroup, TextInput, Field, FieldLabel, FieldRow, FieldError, ButtonGroup, Button, Callout } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import { Form, ActionLink } from '@rocket.chat/layout'; +import { useDocumentTitle } from '@rocket.chat/ui-client'; import type { ReactElement } from 'react'; import { useEffect, useRef } from 'react'; import { useForm } from 'react-hook-form'; @@ -15,6 +16,8 @@ export const ResetPasswordForm = ({ setLoginRoute }: { setLoginRoute: DispatchLo const formLabelId = useUniqueId(); const forgotPasswordFormRef = useRef<HTMLElement>(null); + useDocumentTitle(t('registration.component.resetPassword'), false); + const { register, handleSubmit, @@ -84,7 +87,7 @@ export const ResetPasswordForm = ({ setLoginRoute }: { setLoginRoute: DispatchLo </Form.Container> <Form.Footer> <ButtonGroup> - <Button type='submit' disabled={isSubmitting} primary> + <Button type='submit' loading={isSubmitting} primary> {t('registration.page.resetPassword.sendInstructions')} </Button> </ButtonGroup> diff --git a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx index 17b45e9157cb..0d08fba8a3ac 100644 --- a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx +++ b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx @@ -1,21 +1,11 @@ import { Button } from '@rocket.chat/fuselage'; import { useLocalStorage } from '@rocket.chat/fuselage-hooks'; import { HorizontalWizardLayoutCaption } from '@rocket.chat/layout'; +import { normalizeLanguage } from '@rocket.chat/tools'; import { type TranslationLanguage, useSetting, useLoadLanguage, useLanguage, useLanguages } from '@rocket.chat/ui-contexts'; import { type ReactElement, type UIEvent, useMemo, useEffect } from 'react'; import { Trans, useTranslation } from 'react-i18next'; -const normalizeLanguage = (language: string): string => { - // Fix browsers having all-lowercase language settings eg. pt-br, en-us - const regex = /([a-z]{2,3})-([a-z]{2,4})/; - const matches = regex.exec(language); - if (matches) { - return `${matches[1]}-${matches[2].toUpperCase()}`; - } - - return language; -}; - const useSuggestedLanguages = ({ browserLanguage = normalizeLanguage(window.navigator.language ?? 'en'), }: { diff --git a/packages/web-ui-registration/src/hooks/useLoginRouter.ts b/packages/web-ui-registration/src/hooks/useLoginRouter.ts index 6c907e39a1c5..5a5b1e98223e 100644 --- a/packages/web-ui-registration/src/hooks/useLoginRouter.ts +++ b/packages/web-ui-registration/src/hooks/useLoginRouter.ts @@ -1,7 +1,15 @@ import type { Dispatch } from 'react'; import { useState } from 'react'; -export type LoginRoutes = 'login' | 'reset-password' | 'register' | 'register-invalid' | 'secret-register' | 'guest' | 'anonymous'; +export type LoginRoutes = + | 'login' + | 'reset-password' + | 'register' + | 'register-invalid' + | 'secret-register' + | 'invite-register' + | 'guest' + | 'anonymous'; export const useLoginRouter = (route: LoginRoutes): [LoginRoutes, DispatchLoginRouter] => useState<LoginRoutes>(route); diff --git a/yarn.lock b/yarn.lock index dc01a3898eba..a31fa7be0b8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,13 +12,13 @@ __metadata: languageName: node linkType: hard -"@actions/core@npm:^1.10.0": - version: 1.10.0 - resolution: "@actions/core@npm:1.10.0" +"@actions/core@npm:^1.10.1": + version: 1.10.1 + resolution: "@actions/core@npm:1.10.1" dependencies: "@actions/http-client": ^2.0.1 uuid: ^8.3.2 - checksum: 0a75621e007ab20d887434cdd165f0b9036f14c22252a2faed33543d8b9d04ec95d823e69ca636a25245574e4585d73e1e9e47a845339553c664f9f2c9614669 + checksum: 96524c2725e70e3c3176b4e4d93a1358a86f3c5ca777db9a2f65eadfa672f00877db359bf60fffc416c33838ffb4743db93bcc5bf53e76199dd28bf7f7ff8e80 languageName: node linkType: hard @@ -975,7 +975,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.10, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": version: 7.22.13 resolution: "@babel/code-frame@npm:7.22.13" dependencies: @@ -985,6 +985,23 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.21.5": + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.20, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.20 resolution: "@babel/compat-data@npm:7.22.20" @@ -1016,67 +1033,67 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.4, @babel/core@npm:^7.7.5": - version: 7.23.0 - resolution: "@babel/core@npm:7.23.0" +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.7, @babel/core@npm:^7.21.4, @babel/core@npm:^7.7.5, @babel/core@npm:~7.22.20": + version: 7.22.20 + resolution: "@babel/core@npm:7.22.20" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.13 - "@babel/generator": ^7.23.0 + "@babel/generator": ^7.22.15 "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.23.0 - "@babel/helpers": ^7.23.0 - "@babel/parser": ^7.23.0 + "@babel/helper-module-transforms": ^7.22.20 + "@babel/helpers": ^7.22.15 + "@babel/parser": ^7.22.16 "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.0 - "@babel/types": ^7.23.0 - convert-source-map: ^2.0.0 + "@babel/traverse": ^7.22.20 + "@babel/types": ^7.22.19 + convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: cebd9b48dbc970a7548522f207f245c69567e5ea17ebb1a4e4de563823cf20a01177fe8d2fe19b6e1461361f92fa169fd0b29f8ee9d44eeec84842be1feee5f2 + checksum: 73663a079194b5dc406b2e2e5e50db81977d443e4faf7ef2c27e5836cd9a359e81e551115193dc9b1a93471275351a972e54904f4d3aa6cb156f51e26abf6765 languageName: node linkType: hard -"@babel/core@npm:~7.22.10, @babel/core@npm:~7.22.9": - version: 7.22.10 - resolution: "@babel/core@npm:7.22.10" +"@babel/core@npm:~7.21.4": + version: 7.21.8 + resolution: "@babel/core@npm:7.21.8" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.22.10 - "@babel/generator": ^7.22.10 - "@babel/helper-compilation-targets": ^7.22.10 - "@babel/helper-module-transforms": ^7.22.9 - "@babel/helpers": ^7.22.10 - "@babel/parser": ^7.22.10 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.10 - "@babel/types": ^7.22.10 + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.5 + "@babel/helper-compilation-targets": ^7.21.5 + "@babel/helper-module-transforms": ^7.21.5 + "@babel/helpers": ^7.21.5 + "@babel/parser": ^7.21.8 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.5 + "@babel/types": ^7.21.5 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 - semver: ^6.3.1 - checksum: cc4efa09209fe1f733cf512e9e4bb50870b191ab2dee8014e34cd6e731f204e48476cc53b4bbd0825d4d342304d577ae43ff5fd8ab3896080673c343321acb32 + semver: ^6.3.0 + checksum: f28118447355af2a90bd340e2e60699f94c8020517eba9b71bf8ebff62fa9e00d63f076e033f9dfb97548053ad62ada45fafb0d96584b1a90e8aef5a3b8241b1 languageName: node linkType: hard -"@babel/eslint-parser@npm:~7.22.9": - version: 7.22.9 - resolution: "@babel/eslint-parser@npm:7.22.9" +"@babel/eslint-parser@npm:~7.23.3": + version: 7.23.3 + resolution: "@babel/eslint-parser@npm:7.23.3" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 semver: ^6.3.1 peerDependencies: - "@babel/core": ">=7.11.0" + "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 - checksum: 4f417796c803056aad2c8fa69b8a7a78a1fdacc307d95702f22894cab42b83554e47de7d0b3cfbee667f25014bca0179f859aa86ceb684b09803192e1200b48d + checksum: 9573daebe21af5123c302c307be80cacf1c2bf236a9497068a14726d3944ef55e1282519d0ccf51882dfc369359a3442299c98cb22a419e209924db39d4030fd languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.22.10, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.22.15, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.7.2": version: 7.23.0 resolution: "@babel/generator@npm:7.23.0" dependencies: @@ -1088,6 +1105,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.21.5, @babel/generator@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/generator@npm:7.23.5" + dependencies: + "@babel/types": ^7.23.5 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -1097,6 +1126,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" + dependencies: + "@babel/types": ^7.22.15 + checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.5" @@ -1106,7 +1144,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.10, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": +"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.21.5, @babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.15 resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: @@ -1151,6 +1189,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + regexpu-core: ^5.3.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.1.5": version: 0.1.5 resolution: "@babel/helper-define-polyfill-provider@npm:0.1.5" @@ -1169,6 +1220,22 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.3.3": + version: 0.3.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.3.3" + dependencies: + "@babel/helper-compilation-targets": ^7.17.7 + "@babel/helper-plugin-utils": ^7.16.7 + debug: ^4.1.1 + lodash.debounce: ^4.0.8 + resolve: ^1.14.2 + semver: ^6.1.2 + peerDependencies: + "@babel/core": ^7.4.0-0 + checksum: 8e3fe75513302e34f6d92bd67b53890e8545e6c5bca8fe757b9979f09d68d7e259f6daea90dc9e01e332c4f8781bda31c5fe551c82a277f9bc0bec007aed497c + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.4.2": version: 0.4.2 resolution: "@babel/helper-define-polyfill-provider@npm:0.4.2" @@ -1184,7 +1251,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": +"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-environment-visitor@npm:7.22.20" checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 @@ -1219,7 +1286,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": +"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.21.4, @babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: @@ -1228,7 +1295,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.22.9, @babel/helper-module-transforms@npm:^7.23.0": +"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.20, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-module-transforms@npm:7.23.0" dependencies: @@ -1243,6 +1310,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.21.5, @babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -1259,13 +1341,26 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.21.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-wrap-function": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.5, @babel/helper-remap-async-to-generator@npm:^7.22.9": version: 7.22.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.9" @@ -1279,7 +1374,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.16.7, @babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": +"@babel/helper-replace-supers@npm:^7.16.7, @babel/helper-replace-supers@npm:^7.22.20, @babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": version: 7.22.20 resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: @@ -1326,6 +1421,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -1333,13 +1435,31 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.16.7, @babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.22.5": +"@babel/helper-validator-option@npm:^7.16.7, @babel/helper-validator-option@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-validator-option@npm:7.22.15" checksum: 68da52b1e10002a543161494c4bc0f4d0398c8fdf361d5f7f4272e95c45d5b32d974896d44f6a0ea7378c9204988879d73613ca683e13bd1304e46d25ff67a8d languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.21.0": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-wrap-function@npm:7.22.20" + dependencies: + "@babel/helper-function-name": ^7.22.5 + "@babel/template": ^7.22.15 + "@babel/types": ^7.22.19 + checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.9": version: 7.22.10 resolution: "@babel/helper-wrap-function@npm:7.22.10" @@ -1351,14 +1471,25 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.22.10, @babel/helpers@npm:^7.23.0": - version: 7.23.1 - resolution: "@babel/helpers@npm:7.23.1" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.22.15": + version: 7.23.2 + resolution: "@babel/helpers@npm:7.23.2" dependencies: "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.0 + "@babel/traverse": ^7.23.2 "@babel/types": ^7.23.0 - checksum: acfc345102045c24ea2a4d60e00dcf8220e215af3add4520e2167700661338e6a80bd56baf44bb764af05ec6621101c9afc315dc107e18c61fa6da8acbdbb893 + checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.21.5": + version: 7.23.5 + resolution: "@babel/helpers@npm:7.23.5" + dependencies: + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.5 + "@babel/types": ^7.23.5 + checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 languageName: node linkType: hard @@ -1373,7 +1504,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.10, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.16, @babel/parser@npm:^7.23.0": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -1382,6 +1524,26 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.21.8, @babel/parser@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/parser@npm:7.23.5" + bin: + parser: ./bin/babel-parser.js + checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" @@ -1393,6 +1555,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.20.7": + version: 7.23.3 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.23.3 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" @@ -1406,7 +1581,21 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.12.1": +"@babel/plugin-proposal-async-generator-functions@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" + dependencies: + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-remap-async-to-generator": ^7.18.9 + "@babel/plugin-syntax-async-generators": ^7.8.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 111109ee118c9e69982f08d5e119eab04190b36a0f40e22e873802d941956eee66d2aa5a15f5321e51e3f9aa70a91136451b987fe15185ef8cc547ac88937723 + languageName: node + linkType: hard + +"@babel/plugin-proposal-class-properties@npm:^7.12.1, @babel/plugin-proposal-class-properties@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" dependencies: @@ -1418,6 +1607,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-class-static-block@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-class-static-block@npm:7.21.0" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 236c0ad089e7a7acab776cc1d355330193314bfcd62e94e78f2df35817c6144d7e0e0368976778afd6b7c13e70b5068fa84d7abbf967d4f182e60d03f9ef802b + languageName: node + linkType: hard + "@babel/plugin-proposal-decorators@npm:^7.12.12": version: 7.17.8 resolution: "@babel/plugin-proposal-decorators@npm:7.17.8" @@ -1433,6 +1635,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-dynamic-import@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-dynamic-import@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 96b1c8a8ad8171d39e9ab106be33bde37ae09b22fb2c449afee9a5edf3c537933d79d963dcdc2694d10677cb96da739cdf1b53454e6a5deab9801f28a818bb2f + languageName: node + linkType: hard + "@babel/plugin-proposal-export-default-from@npm:^7.12.1": version: 7.16.7 resolution: "@babel/plugin-proposal-export-default-from@npm:7.16.7" @@ -1445,7 +1659,43 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.12.1, @babel/plugin-proposal-nullish-coalescing-operator@npm:~7.18.6": +"@babel/plugin-proposal-export-namespace-from@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.18.9" + dependencies: + "@babel/helper-plugin-utils": ^7.18.9 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 84ff22bacc5d30918a849bfb7e0e90ae4c5b8d8b65f2ac881803d1cf9068dffbe53bd657b0e4bc4c20b4db301b1c85f1e74183cf29a0dd31e964bd4e97c363ef + languageName: node + linkType: hard + +"@babel/plugin-proposal-json-strings@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-json-strings@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/plugin-syntax-json-strings": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 25ba0e6b9d6115174f51f7c6787e96214c90dd4026e266976b248a2ed417fe50fddae72843ffb3cbe324014a18632ce5648dfac77f089da858022b49fd608cb3 + languageName: node + linkType: hard + +"@babel/plugin-proposal-logical-assignment-operators@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.20.7" + dependencies: + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: cdd7b8136cc4db3f47714d5266f9e7b592a2ac5a94a5878787ce08890e97c8ab1ca8e94b27bfeba7b0f2b1549a026d9fc414ca2196de603df36fb32633bbdc19 + languageName: node + linkType: hard + +"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.12.1, @babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.6, @babel/plugin-proposal-nullish-coalescing-operator@npm:~7.18.6": version: 7.18.6 resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" dependencies: @@ -1457,6 +1707,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-numeric-separator@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f370ea584c55bf4040e1f78c80b4eeb1ce2e6aaa74f87d1a48266493c33931d0b6222d8cee3a082383d6bb648ab8d6b7147a06f974d3296ef3bc39c7851683ec + languageName: node + linkType: hard + "@babel/plugin-proposal-object-rest-spread@npm:7.12.1": version: 7.12.1 resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.12.1" @@ -1470,7 +1732,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.12.1": +"@babel/plugin-proposal-object-rest-spread@npm:^7.12.1, @babel/plugin-proposal-object-rest-spread@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" dependencies: @@ -1485,7 +1747,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:~7.21.0": +"@babel/plugin-proposal-optional-catch-binding@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7b5b39fb5d8d6d14faad6cb68ece5eeb2fd550fb66b5af7d7582402f974f5bc3684641f7c192a5a57e0f59acfae4aada6786be1eba030881ddc590666eff4d1e + languageName: node + linkType: hard + +"@babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:^7.21.0, @babel/plugin-proposal-optional-chaining@npm:~7.21.0": version: 7.21.0 resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" dependencies: @@ -1498,7 +1772,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.12.1": +"@babel/plugin-proposal-private-methods@npm:^7.12.1, @babel/plugin-proposal-private-methods@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" dependencies: @@ -1533,6 +1807,32 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-private-property-in-object@npm:^7.21.0": + version: 7.21.11 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" + dependencies: + "@babel/helper-annotate-as-pure": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1b880543bc5f525b360b53d97dd30807302bb82615cd42bf931968f59003cac75629563d6b104868db50abd22235b3271fdf679fea5db59a267181a99cc0c265 + languageName: node + linkType: hard + +"@babel/plugin-proposal-unicode-property-regex@npm:^7.18.6, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": + version: 7.18.6 + resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.18.6 + "@babel/helper-plugin-utils": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a8575ecb7ff24bf6c6e94808d5c84bb5a0c6dd7892b54f09f4646711ba0ee1e1668032b3c43e3e1dfec2c5716c302e851ac756c1645e15882d73df6ad21ae951 + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -1632,6 +1932,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.20.0": + version: 7.23.3 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-assertions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" @@ -1820,6 +2131,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.15" @@ -1834,6 +2156,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.20.7": + version: 7.23.3 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" + dependencies: + "@babel/helper-module-imports": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" @@ -1847,6 +2182,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" @@ -1869,6 +2215,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.21.0": + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fc4b2100dd9f2c47d694b4b35ae8153214ccb4e24ef545c259a9db17211b18b6a430f22799b56db8f6844deaeaa201af45a03331d0c80cc28b0c4e3c814570e4 + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-class-properties@npm:7.22.5" @@ -1913,6 +2270,37 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.21.0": + version: 7.23.5 + resolution: "@babel/plugin-transform-classes@npm:7.23.5" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 + "@babel/helper-split-export-declaration": ^7.22.6 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6d0dd3b0828e84a139a51b368f33f315edee5688ef72c68ba25e0175c68ea7357f9c8810b3f61713e368a3063cdcec94f3a2db952e453b0b14ef428a34aa8169 + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/template": ^7.22.15 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 80452661dc25a0956f89fe98cb562e8637a9556fb6c00d312c57653ce7df8798f58d138603c7e1aad96614ee9ccd10c47e50ab9ded6b6eded5adeb230d2a982e + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" @@ -1936,6 +2324,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.21.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9e015099877272501162419bfe781689aec5c462cd2aec752ee22288f209eec65969ff11b8fdadca2eaddea71d705d3bba5b9c60752fcc1be67874fcec687105 + languageName: node + linkType: hard + +"@babel/plugin-transform-dotall-regex@npm:^7.18.6, @babel/plugin-transform-dotall-regex@npm:^7.4.4": + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" @@ -1948,6 +2359,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.18.9": + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" @@ -1971,6 +2393,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" @@ -2018,6 +2452,30 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a6288122a5091d96c744b9eb23dc1b2d4cce25f109ac1e26a0ea03c4ea60330e6f3cc58530b33ba7369fa07163b71001399a145238b7e92bff6270ef3b9c32a0 + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.18.9": + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" + dependencies: + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-function-name@npm:7.22.5" @@ -2043,6 +2501,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.18.9": + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-literals@npm:7.22.5" @@ -2066,6 +2535,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" @@ -2077,6 +2557,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.20.11": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" + dependencies: + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d163737b6a3d67ea579c9aa3b83d4df4b5c34d9dcdf25f415f027c0aa8cded7bac2750d2de5464081f67a042ad9e1c03930c2fab42acd79f9e57c00cf969ddff + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" @@ -2089,7 +2581,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.15, @babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": +"@babel/plugin-transform-modules-commonjs@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" + dependencies: + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-simple-access": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 720a231ceade4ae4d2632478db4e7fecf21987d444942b72d523487ac8d715ca97de6c8f415c71e939595e1a4776403e7dc24ed68fe9125ad4acf57753c9bff7 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-commonjs@npm:^7.22.15, @babel/plugin-transform-modules-commonjs@npm:^7.23.0": version: 7.23.0 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" dependencies: @@ -2102,6 +2607,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.20.11": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" + dependencies: + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0d2fdd993c785aecac9e0850cd5ed7f7d448f0fbb42992a950cc0590167144df25d82af5aac9a5c99ef913d2286782afa44e577af30c10901c5ee8984910fa1f + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.22.11": version: 7.23.0 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" @@ -2116,6 +2635,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" + dependencies: + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 586a7a2241e8b4e753a37af9466a9ffa8a67b4ba9aa756ad7500712c05d8fa9a8c1ed4f7bd25fae2a8265e6cf8fe781ec85a8ee885dd34cf50d8955ee65f12dc + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" @@ -2128,7 +2659,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.20.5, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" dependencies: @@ -2140,6 +2671,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-new-target@npm:7.22.5" @@ -2190,6 +2732,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-object-super@npm:7.22.5" @@ -2227,6 +2781,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.23.3": + version: 7.23.4 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e7a4c08038288057b7a08d68c4d55396ada9278095509ca51ed8dfb72a7f13f26bdd7c5185de21079fe0a9d60d22c227cb32e300d266c1bda40f70eee9f4bc1e + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-parameters@npm:7.22.15" @@ -2238,6 +2805,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.21.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a735b3e85316d17ec102e3d3d1b6993b429bdb3b494651c9d754e3b7d270462ee1f1a126ccd5e3d871af5e683727e9ef98c9d34d4a42204fffaabff91052ed16 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-private-methods@npm:7.22.5" @@ -2264,6 +2842,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" @@ -2319,18 +2908,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.12.12, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" +"@babel/plugin-transform-react-jsx@npm:^7.12.12, @babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/types": ^7.22.5 + "@babel/types": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c8f93f29f32cf79683ca2b8958fd62f38155674846ef27a7d4b6fbeb8713c37257418391731b58ff8024ec37b888bed5960e615a3f552e28245d2082e7f2a2df + checksum: 3899054e89550c3a0ef041af7c47ee266e2e934f498ee80fefeda778a6aa177b48aa8b4d2a8bf5848de977fec564571699ab952d9fa089c4c19b45ddb121df09 languageName: node linkType: hard @@ -2346,6 +2935,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + regenerator-transform: ^0.15.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" @@ -2358,6 +2959,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" @@ -2369,6 +2981,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-runtime@npm:~7.21.4": + version: 7.21.4 + resolution: "@babel/plugin-transform-runtime@npm:7.21.4" + dependencies: + "@babel/helper-module-imports": ^7.21.4 + "@babel/helper-plugin-utils": ^7.20.2 + babel-plugin-polyfill-corejs2: ^0.3.3 + babel-plugin-polyfill-corejs3: ^0.6.0 + babel-plugin-polyfill-regenerator: ^0.4.1 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7e2e6b0d6f9762fde58738829e4d3b5e13dc88ccc1463e4eee83c8d8f50238eeb8e3699923f5ad4d7edf597515f74d67fbb14eb330225075fc7733b547e22145 + languageName: node + linkType: hard + "@babel/plugin-transform-shorthand-properties@npm:^7.12.1, @babel/plugin-transform-shorthand-properties@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" @@ -2380,6 +3008,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.12.1, @babel/plugin-transform-spread@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-spread@npm:7.22.5" @@ -2392,6 +3031,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.20.7": + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8fd5cac201e77a0b4825745f4e07a25f923842f282f006b3a79223c00f61075c8868d12eafec86b2642cd0b32077cdd32314e27bcb75ee5e6a68c0144140dcf2 + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" @@ -2414,6 +3076,28 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.18.9": + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.18.9": + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" @@ -2425,7 +3109,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.22.15, @babel/plugin-transform-typescript@npm:^7.22.5": +"@babel/plugin-transform-typescript@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-transform-typescript@npm:7.22.15" dependencies: @@ -2439,6 +3123,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.21.5": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" @@ -2462,6 +3157,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.18.6": + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.22.15 + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" @@ -2486,7 +3193,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:~7.22.10, @babel/preset-env@npm:~7.22.9": +"@babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:~7.22.20": version: 7.22.20 resolution: "@babel/preset-env@npm:7.22.20" dependencies: @@ -2576,6 +3283,92 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:~7.21.4": + version: 7.21.5 + resolution: "@babel/preset-env@npm:7.21.5" + dependencies: + "@babel/compat-data": ^7.21.5 + "@babel/helper-compilation-targets": ^7.21.5 + "@babel/helper-plugin-utils": ^7.21.5 + "@babel/helper-validator-option": ^7.21.0 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.20.7 + "@babel/plugin-proposal-async-generator-functions": ^7.20.7 + "@babel/plugin-proposal-class-properties": ^7.18.6 + "@babel/plugin-proposal-class-static-block": ^7.21.0 + "@babel/plugin-proposal-dynamic-import": ^7.18.6 + "@babel/plugin-proposal-export-namespace-from": ^7.18.9 + "@babel/plugin-proposal-json-strings": ^7.18.6 + "@babel/plugin-proposal-logical-assignment-operators": ^7.20.7 + "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 + "@babel/plugin-proposal-numeric-separator": ^7.18.6 + "@babel/plugin-proposal-object-rest-spread": ^7.20.7 + "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 + "@babel/plugin-proposal-optional-chaining": ^7.21.0 + "@babel/plugin-proposal-private-methods": ^7.18.6 + "@babel/plugin-proposal-private-property-in-object": ^7.21.0 + "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + "@babel/plugin-syntax-import-assertions": ^7.20.0 + "@babel/plugin-syntax-import-meta": ^7.10.4 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/plugin-syntax-top-level-await": ^7.14.5 + "@babel/plugin-transform-arrow-functions": ^7.21.5 + "@babel/plugin-transform-async-to-generator": ^7.20.7 + "@babel/plugin-transform-block-scoped-functions": ^7.18.6 + "@babel/plugin-transform-block-scoping": ^7.21.0 + "@babel/plugin-transform-classes": ^7.21.0 + "@babel/plugin-transform-computed-properties": ^7.21.5 + "@babel/plugin-transform-destructuring": ^7.21.3 + "@babel/plugin-transform-dotall-regex": ^7.18.6 + "@babel/plugin-transform-duplicate-keys": ^7.18.9 + "@babel/plugin-transform-exponentiation-operator": ^7.18.6 + "@babel/plugin-transform-for-of": ^7.21.5 + "@babel/plugin-transform-function-name": ^7.18.9 + "@babel/plugin-transform-literals": ^7.18.9 + "@babel/plugin-transform-member-expression-literals": ^7.18.6 + "@babel/plugin-transform-modules-amd": ^7.20.11 + "@babel/plugin-transform-modules-commonjs": ^7.21.5 + "@babel/plugin-transform-modules-systemjs": ^7.20.11 + "@babel/plugin-transform-modules-umd": ^7.18.6 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.20.5 + "@babel/plugin-transform-new-target": ^7.18.6 + "@babel/plugin-transform-object-super": ^7.18.6 + "@babel/plugin-transform-parameters": ^7.21.3 + "@babel/plugin-transform-property-literals": ^7.18.6 + "@babel/plugin-transform-regenerator": ^7.21.5 + "@babel/plugin-transform-reserved-words": ^7.18.6 + "@babel/plugin-transform-shorthand-properties": ^7.18.6 + "@babel/plugin-transform-spread": ^7.20.7 + "@babel/plugin-transform-sticky-regex": ^7.18.6 + "@babel/plugin-transform-template-literals": ^7.18.9 + "@babel/plugin-transform-typeof-symbol": ^7.18.9 + "@babel/plugin-transform-unicode-escapes": ^7.21.5 + "@babel/plugin-transform-unicode-regex": ^7.18.6 + "@babel/preset-modules": ^0.1.5 + "@babel/types": ^7.21.5 + babel-plugin-polyfill-corejs2: ^0.3.3 + babel-plugin-polyfill-corejs3: ^0.6.0 + babel-plugin-polyfill-regenerator: ^0.4.1 + core-js-compat: ^3.25.1 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 86e167f3a351c89f8cd1409262481ece6ddc085b76147e801530ce29d60b1cfda8b264b1efd1ae27b8181b073a923c7161f21e2ebc0a41d652d717b10cf1c829 + languageName: node + linkType: hard + "@babel/preset-flow@npm:^7.12.1": version: 7.16.7 resolution: "@babel/preset-flow@npm:7.16.7" @@ -2602,19 +3395,34 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/preset-react@npm:7.22.5" +"@babel/preset-modules@npm:^0.1.5": + version: 0.1.6 + resolution: "@babel/preset-modules@npm:0.1.6" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 + "@babel/plugin-transform-dotall-regex": ^7.4.4 + "@babel/types": ^7.4.4 + esutils: ^2.0.2 + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 9700992d2b9526e703ab49eb8c4cd0b26bec93594d57c6b808967619df1a387565e0e58829b65b5bd6d41049071ea0152c9195b39599515fddb3e52b09a55ff0 + languageName: node + linkType: hard + +"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/preset-react@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-transform-react-display-name": ^7.22.5 - "@babel/plugin-transform-react-jsx": ^7.22.5 + "@babel/plugin-transform-react-jsx": ^7.22.15 "@babel/plugin-transform-react-jsx-development": ^7.22.5 "@babel/plugin-transform-react-pure-annotations": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b977c7ee83e93f62d77e61929ca3d97e5291e026e2f025a1b8b7ac9186486ed56c7d5bc36f0becabe0c24e8c42a4e4f2243a3cf841384cfafc3204c5d3e6c619 + checksum: c3ef99dfa2e9f57d2e08603e883aa20f47630a826c8e413888a93ae6e0084b5016871e463829be125329d40a1ba0a89f7c43d77b6dab52083c225cb43e63d10e languageName: node linkType: hard @@ -2633,24 +3441,24 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/preset-typescript@npm:7.22.5" +"@babel/preset-typescript@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/preset-typescript@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/plugin-transform-modules-commonjs": ^7.22.5 - "@babel/plugin-transform-typescript": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.22.15 + "@babel/plugin-transform-typescript": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7be1670cb4404797d3a473bd72d66eb2b3e0f2f8a672a5e40bdb0812cc66085ec84bcd7b896709764cabf042fdc6b7f2d4755ac7cce10515eb596ff61dab5154 + checksum: 02ac4d5c812a52357c8f517f81584725f06f385d54ccfda89dd082e0ed89a94bd9f4d9b05fa1cbdcf426e3489c1921f04c93c5acc5deea83407a64c22ad2feb4 languageName: node linkType: hard -"@babel/register@npm:^7.12.1, @babel/register@npm:~7.22.5": - version: 7.22.5 - resolution: "@babel/register@npm:7.22.5" +"@babel/register@npm:^7.12.1, @babel/register@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/register@npm:7.22.15" dependencies: clone-deep: ^4.0.1 find-cache-dir: ^2.0.0 @@ -2659,7 +3467,7 @@ __metadata: source-map-support: ^0.5.16 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 723ce27fdad6faee5b3f51ef4f5154f7f285d61da665367de14de85abbe1c81ccbac11f699671cd0ed6b755dd430f28a62364fed5d49f2527625a9ea3bf40056 + checksum: 5497be6773608cd2d874210edd14499fce464ddbea170219da55955afe4c9173adb591164193458fd639e43b7d1314088a6186f4abf241476c59b3f0da6afd6f languageName: node linkType: hard @@ -2679,12 +3487,21 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2, @babel/runtime@npm:~7.22.6": - version: 7.22.10 - resolution: "@babel/runtime@npm:7.22.10" +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": + version: 7.23.4 + resolution: "@babel/runtime@npm:7.23.4" dependencies: regenerator-runtime: ^0.14.0 - checksum: 524d41517e68953dbc73a4f3616b8475e5813f64e28ba89ff5fca2c044d535c2ea1a3f310df1e5bb06162e1f0b401b5c4af73fe6e2519ca2450d9d8c44cf268d + checksum: 8eb6a6b2367f7d60e7f7dd83f477cc2e2fdb169e5460694d7614ce5c730e83324bcf29251b70940068e757ad1ee56ff8073a372260d90cad55f18a825caf97cd + languageName: node + linkType: hard + +"@babel/runtime@npm:~7.22.15": + version: 7.22.15 + resolution: "@babel/runtime@npm:7.22.15" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 793296df1e41599a935a3d77ec01eb6088410d3fd4dbe4e92f06c6b7bb2f8355024e6d78621a3a35f44e0e23b0b59107f23d585384df4f3123256a1e1492040e languageName: node linkType: hard @@ -2697,7 +3514,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.12.7, @babel/template@npm:^7.20.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" dependencies: @@ -2708,9 +3525,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.22.10, @babel/traverse@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/traverse@npm:7.23.0" +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.22.20, @babel/traverse@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" dependencies: "@babel/code-frame": ^7.22.13 "@babel/generator": ^7.23.0 @@ -2722,7 +3539,25 @@ __metadata: "@babel/types": ^7.23.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 0b17fae53269e1af2cd3edba00892bc2975ad5df9eea7b84815dab07dfec2928c451066d51bc65b4be61d8499e77db7e547ce69ef2a7b0eca3f96269cb43a0b0 + checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.21.5, @babel/traverse@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/traverse@npm:7.23.5" + dependencies: + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.23.5 + "@babel/types": ^7.23.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d languageName: node linkType: hard @@ -2737,6 +3572,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.21.5, @babel/types@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/types@npm:7.23.5" + dependencies: + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 + to-fast-properties: ^2.0.0 + checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -2840,12 +3686,12 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^6.1.3": - version: 6.1.3 - resolution: "@changesets/apply-release-plan@npm:6.1.3" +"@changesets/apply-release-plan@npm:^6.1.4": + version: 6.1.4 + resolution: "@changesets/apply-release-plan@npm:6.1.4" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/get-version-range-type": ^0.3.2 "@changesets/git": ^2.0.0 "@changesets/types": ^5.2.1 @@ -2856,22 +3702,22 @@ __metadata: outdent: ^0.5.0 prettier: ^2.7.1 resolve-from: ^5.0.0 - semver: ^5.4.1 - checksum: 3772a6e0ede33abdac6fcc52359307f770d5fafa53295c83e0a11b81e5802b2fe5e74e4d672c0a082f5d73dc1a9ef56509870b81824111396f74de99ada9526b + semver: ^7.5.3 + checksum: d386aee70c5483c97d964c6fa1191878005b7050d34b2e1e4a1ad66d9ad44f8f20d1c884e01e770b954bd2d4364f935510e53ae896212669f67e5c37b2a610c7 languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^5.2.3": - version: 5.2.3 - resolution: "@changesets/assemble-release-plan@npm:5.2.3" +"@changesets/assemble-release-plan@npm:^5.2.4": + version: 5.2.4 + resolution: "@changesets/assemble-release-plan@npm:5.2.4" dependencies: "@babel/runtime": ^7.20.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - semver: ^5.4.1 - checksum: 2c61894414736b12e9a26903d73c387b65f4caba398e280488b885f4d0f4bb307aaa6bae140dfd754c85de6557bd07645accda2af6b8794837ab43823ba6215c + semver: ^7.5.3 + checksum: 32f443a0afec3d5a4afc68c8de32e8ff88531ea24976b50583b1d6870d71cec2729f27952af82854eb54e2ad0a619872d211d654c596ee0eb42c83ab54ad15ae languageName: node linkType: hard @@ -2884,18 +3730,18 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:^2.26.1": - version: 2.26.1 - resolution: "@changesets/cli@npm:2.26.1" +"@changesets/cli@npm:^2.26.2": + version: 2.26.2 + resolution: "@changesets/cli@npm:2.26.2" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/apply-release-plan": ^6.1.3 - "@changesets/assemble-release-plan": ^5.2.3 + "@changesets/apply-release-plan": ^6.1.4 + "@changesets/assemble-release-plan": ^5.2.4 "@changesets/changelog-git": ^0.1.14 - "@changesets/config": ^2.3.0 + "@changesets/config": ^2.3.1 "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 - "@changesets/get-release-plan": ^3.0.16 + "@changesets/get-dependents-graph": ^1.3.6 + "@changesets/get-release-plan": ^3.0.17 "@changesets/git": ^2.0.0 "@changesets/logger": ^0.0.5 "@changesets/pre": ^1.0.14 @@ -2904,7 +3750,7 @@ __metadata: "@changesets/write": ^0.2.3 "@manypkg/get-packages": ^1.1.3 "@types/is-ci": ^3.0.0 - "@types/semver": ^6.0.0 + "@types/semver": ^7.5.0 ansi-colors: ^4.1.3 chalk: ^2.1.0 enquirer: ^2.3.0 @@ -2917,28 +3763,28 @@ __metadata: p-limit: ^2.2.0 preferred-pm: ^3.0.0 resolve-from: ^5.0.0 - semver: ^5.4.1 + semver: ^7.5.3 spawndamnit: ^2.0.0 term-size: ^2.1.0 tty-table: ^4.1.5 bin: changeset: bin.js - checksum: d7d6445ebbc1b2718d97852a2275f59af32020e8a1e1efe666767819dd862c7794ce50627ad52f1f97ba4bc57c81bfc4750e92265757cc94ab2d44198d2afb10 + checksum: fc7b5bf319b19abed7a8d33a9fbd9ce49108af61c9c51920f609a49cb0c557f0b998711250d0cac149d0bed8a522f3109c4d8b0dda65b96ff2f823d16ca2f972 languageName: node linkType: hard -"@changesets/config@npm:^2.3.0": - version: 2.3.0 - resolution: "@changesets/config@npm:2.3.0" +"@changesets/config@npm:^2.3.1": + version: 2.3.1 + resolution: "@changesets/config@npm:2.3.1" dependencies: "@changesets/errors": ^0.1.4 - "@changesets/get-dependents-graph": ^1.3.5 + "@changesets/get-dependents-graph": ^1.3.6 "@changesets/logger": ^0.0.5 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 fs-extra: ^7.0.1 micromatch: ^4.0.2 - checksum: 68a61437ffeda219f22f6d4d32bf8d428e6f284d7e0e191c0629f64f035a051b4068222b1ea3ff1866e5944a153004735dab82205404919f6806c97c546700b1 + checksum: 8af58e3add4751ac8ce2c01f026ac8843b8d1c07c9a3df6518496eaef67f56458a84cad310763c588f7eccbf6831afbf280df7e05e78b294027b6b847be3d0cc languageName: node linkType: hard @@ -2951,31 +3797,31 @@ __metadata: languageName: node linkType: hard -"@changesets/get-dependents-graph@npm:^1.3.5": - version: 1.3.5 - resolution: "@changesets/get-dependents-graph@npm:1.3.5" +"@changesets/get-dependents-graph@npm:^1.3.6": + version: 1.3.6 + resolution: "@changesets/get-dependents-graph@npm:1.3.6" dependencies: "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 chalk: ^2.1.0 fs-extra: ^7.0.1 - semver: ^5.4.1 - checksum: d7abb1da21804fd66b1458e46be2f2aec741145a43500b0463a5acfbb420ac5ce776a7328fa660ad4e6e811f933bd6f36e7bbaf00fb3f591d46f0b8e7108fdcd + semver: ^7.5.3 + checksum: d2cbbc5041063b939899502d1b264a0d9edb655acefd7f6197883229156bb7cfd1ace642ae4a1f7f7b432f2c51429f5dc9851ff5a9ed47f1c0159916e66627a9 languageName: node linkType: hard -"@changesets/get-release-plan@npm:^3.0.16": - version: 3.0.16 - resolution: "@changesets/get-release-plan@npm:3.0.16" +"@changesets/get-release-plan@npm:^3.0.17": + version: 3.0.17 + resolution: "@changesets/get-release-plan@npm:3.0.17" dependencies: "@babel/runtime": ^7.20.1 - "@changesets/assemble-release-plan": ^5.2.3 - "@changesets/config": ^2.3.0 + "@changesets/assemble-release-plan": ^5.2.4 + "@changesets/config": ^2.3.1 "@changesets/pre": ^1.0.14 "@changesets/read": ^0.5.9 "@changesets/types": ^5.2.1 "@manypkg/get-packages": ^1.1.3 - checksum: ab8360c17f69437ad51edfd8910a2609ab8dc1e8cf006994b3938b2551b1eb08b7ab8043b8bf1e94916cbadd89e357a0c1148e20eab8bb5e3ae284384d239942 + checksum: 8a0e3794d0f1e6220d173dbec96352ad69b585d013c3183888ca598dfdfcaa8a5ac3f7f36d5c511575cdc3559c2ad6f8cecfaa16ba9c24380899a81daa7af924 languageName: node linkType: hard @@ -3863,50 +4709,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/console@npm:29.6.1" +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 slash: ^3.0.0 - checksum: d0ab23a00947bfb4bff8c0a7e5a7afd16519de16dde3fe7e77b9f13e794c6df7043ecf7fcdde66ac0d2b5fb3262e9cab3d92eaf61f89a12d3b8e3602e06a9902 + checksum: 0e3624e32c5a8e7361e889db70b170876401b7d70f509a2538c31d5cd50deb0c1ae4b92dc63fe18a0902e0a48c590c21d53787a0df41a52b34fa7cab96c384d6 languageName: node linkType: hard -"@jest/core@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/core@npm:29.6.1" +"@jest/core@npm:^29.5.0, @jest/core@npm:^29.6.4, @jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/reporters": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/reporters": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^29.5.0 - jest-config: ^29.6.1 - jest-haste-map: ^29.6.1 - jest-message-util: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-resolve-dependencies: ^29.6.1 - jest-runner: ^29.6.1 - jest-runtime: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 - jest-watcher: ^29.6.1 + jest-changed-files: ^29.7.0 + jest-config: ^29.7.0 + jest-haste-map: ^29.7.0 + jest-message-util: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-resolve-dependencies: ^29.7.0 + jest-runner: ^29.7.0 + jest-runtime: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 + jest-watcher: ^29.7.0 micromatch: ^4.0.4 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -3914,7 +4760,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 736dcc90c6c58dd9e1d2da122103b851187719ce3b3d4167689c63e68252632cd817712955b52ddaa648eba9c6f98f86cd58677325f0db4185f76899c64d7dac + checksum: af759c9781cfc914553320446ce4e47775ae42779e73621c438feb1e4231a5d4862f84b1d8565926f2d1aab29b3ec3dcfdc84db28608bdf5f29867124ebcfc0d languageName: node linkType: hard @@ -3927,72 +4773,72 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/environment@npm:29.6.1" +"@jest/environment@npm:^29.6.4, @jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" dependencies: - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.1 - checksum: fb671f91f27e7aa1ba04983ef87a83f0794a597aba0a57d08cbb1fcb484c2aedc2201e99f85fafe27aec9be78af6f2d1d7e6ea88267938992a1d0f9d4615f5b2 + jest-mock: ^29.7.0 + checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 languageName: node linkType: hard -"@jest/expect-utils@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/expect-utils@npm:29.6.1" +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" dependencies: - jest-get-type: ^29.4.3 - checksum: 037ee017eca62f7b45e1465fb5c6f9e92d5709a9ac716b8bff0bd294240a54de734e8f968fb69309cc4aef6c83b9552d5a821f3b18371af394bf04783859d706 + jest-get-type: ^29.6.3 + checksum: 75eb177f3d00b6331bcaa057e07c0ccb0733a1d0a1943e1d8db346779039cb7f103789f16e502f888a3096fb58c2300c38d1f3748b36a7fa762eb6f6d1b160ed languageName: node linkType: hard -"@jest/expect@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/expect@npm:29.6.1" +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" dependencies: - expect: ^29.6.1 - jest-snapshot: ^29.6.1 - checksum: 5c56977b3cc8489744d97d9dc2dcb196c1dfecc83a058a7ef0fd4f63d68cf120a23d27669272d1e1b184fb4337b85e4ac1fc7f886e3988fdf243d42d73973eac + expect: ^29.7.0 + jest-snapshot: ^29.7.0 + checksum: a01cb85fd9401bab3370618f4b9013b90c93536562222d920e702a0b575d239d74cecfe98010aaec7ad464f67cf534a353d92d181646a4b792acaa7e912ae55e languageName: node linkType: hard -"@jest/fake-timers@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/fake-timers@npm:29.6.1" +"@jest/fake-timers@npm:^29.6.4, @jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@sinonjs/fake-timers": ^10.0.2 "@types/node": "*" - jest-message-util: ^29.6.1 - jest-mock: ^29.6.1 - jest-util: ^29.6.1 - checksum: 86991276944b7d6c2ada3703a272517f5f8f2f4e2af1fe26065f6db1dac4dc6299729a88c46bcb781dcc1b20504c1d4bbd8119fd8a0838ac81a9a4b5d2c8e429 + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 languageName: node linkType: hard -"@jest/globals@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/globals@npm:29.6.1" +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/expect": ^29.6.1 - "@jest/types": ^29.6.1 - jest-mock: ^29.6.1 - checksum: fcca0b970a8b4894a1cdff0f500a86b45609e72c0a4319875e9504237b839df1a46c44d2f1362c6d87fdc7a05928edcc4b5a3751c9e6648dd70a761cdab64c94 + "@jest/environment": ^29.7.0 + "@jest/expect": ^29.7.0 + "@jest/types": ^29.6.3 + jest-mock: ^29.7.0 + checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 languageName: node linkType: hard -"@jest/reporters@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/reporters@npm:29.6.1" +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 "@types/node": "*" chalk: ^4.0.0 @@ -4001,13 +4847,13 @@ __metadata: glob: ^7.1.3 graceful-fs: ^4.2.9 istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 + istanbul-lib-instrument: ^6.0.0 istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 - jest-worker: ^29.6.1 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + jest-worker: ^29.7.0 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -4017,7 +4863,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: b7dae415f3f6342b4db2671261bbee29af20a829f42135316c3dd548b9ef85290c9bb64a0e3aec4a55486596be1257ac8216a0f8d9794acd43f8b8fb686fc7e3 + checksum: 7eadabd62cc344f629024b8a268ecc8367dba756152b761bdcb7b7e570a3864fc51b2a9810cd310d85e0a0173ef002ba4528d5ea0329fbf66ee2a3ada9c40455 languageName: node linkType: hard @@ -4030,47 +4876,47 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/schemas@npm:29.6.0" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: "@sinclair/typebox": ^0.27.8 - checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 languageName: node linkType: hard -"@jest/source-map@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/source-map@npm:29.6.0" +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" dependencies: "@jridgewell/trace-mapping": ^0.3.18 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: 9c6c40387410bb70b2fae8124287fc28f6bdd1b2d7f24348e8611e1bb638b404518228a4ce64a582365b589c536ae8e7ebab0126cef59a87874b71061d19783b + checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb languageName: node linkType: hard -"@jest/test-result@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/test-result@npm:29.6.1" +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/types": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 9397a3a3410c5df564e79297b1be4fe33807a6157a017a1f74b54a6ef14de1530f12b922299e822e66a82c53269da16661772bffde3d883a78c5eefd2cd6d1cc + checksum: 67b6317d526e335212e5da0e768e3b8ab8a53df110361b80761353ad23b6aea4432b7c5665bdeb87658ea373b90fb1afe02ed3611ef6c858c7fba377505057fa languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/test-sequencer@npm:29.6.1" +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" dependencies: - "@jest/test-result": ^29.6.1 + "@jest/test-result": ^29.7.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 + jest-haste-map: ^29.7.0 slash: ^3.0.0 - checksum: f3437178b5dca0401ed2e990d8b69161442351856d56f5725e009a487f5232b51039f8829673884b9bea61c861120d08a53a36432f4a4b8aab38915a68f7000d + checksum: 73f43599017946be85c0b6357993b038f875b796e2f0950487a82f4ebcb115fa12131932dd9904026b4ad8be131fe6e28bd8d0aa93b1563705185f9804bff8bd languageName: node linkType: hard @@ -4097,26 +4943,26 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/transform@npm:29.6.1" +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@jridgewell/trace-mapping": ^0.3.18 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^2.0.0 fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.1 + jest-haste-map: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-util: ^29.7.0 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.2 - checksum: 1635cd66e4b3dbba0689ecefabc6137301756c9c12d1d23e25124dd0dd9b4a6a38653d51e825e90f74faa022152ac1eaf200591fb50417aa7e1f7d1d1c2bc11d + checksum: 0f8ac9f413903b3cb6d240102db848f2a354f63971ab885833799a9964999dd51c388162106a807f810071f864302cdd8e3f0c241c29ce02d85a36f18f3f40ab languageName: node linkType: hard @@ -4146,17 +4992,17 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/types@npm:29.6.1" +"@jest/types@npm:^29.5.0, @jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc languageName: node linkType: hard @@ -4570,219 +5416,247 @@ __metadata: languageName: node linkType: hard -"@nivo/annotations@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/annotations@npm:0.80.0" +"@nivo/annotations@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/annotations@npm:0.84.0" dependencies: - "@nivo/colors": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/prop-types": ^15.7.2 lodash: ^4.17.21 + prop-types: ^15.7.2 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: 6b2dcc3cc443a660b10feab378b816e84f8aff4390345f8316852d88dcd893af0c8de63aad6bb6296ae13c55e4cce4a57f3f3898f5fdac03bb756df24a81d3fd + checksum: ae3936c6cd5b2ea4fd06635572618086db900c4f455992332a47b190263e993cbbffc9f0169102d23cd46f80ce08e25bb35ea098d09b64286c570294e65e6c0e languageName: node linkType: hard -"@nivo/arcs@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/arcs@npm:0.80.0" +"@nivo/arcs@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/arcs@npm:0.84.0" dependencies: - "@nivo/colors": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/d3-shape": ^2.0.0 d3-shape: ^1.3.5 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: 2cc210d9c62b35713eb19a2f5ffbe7138d9133519f9a8092d5a59c7388bce3bedbf13f0b5b344b31db36f52ee0fe5bde31058f5ef0628e84e994d942d01a63a4 + checksum: 306deb912bb54871ea94321a1b0b0e8391dbb2e4437e43696d399c072553713f217692799ad45308723d16c40e478709700d1ffb70e6a83f4a91a811c87c347a languageName: node linkType: hard -"@nivo/axes@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/axes@npm:0.80.0" +"@nivo/axes@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/axes@npm:0.84.0" dependencies: - "@nivo/scales": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/core": 0.84.0 + "@nivo/scales": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/d3-format": ^1.4.1 + "@types/d3-time-format": ^2.3.1 + "@types/prop-types": ^15.7.2 d3-format: ^1.4.4 d3-time-format: ^3.0.0 + prop-types: ^15.7.2 peerDependencies: - "@nivo/core": 0.80.0 - prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: 59cea2b3f2dc547f3ebbe920b4c789ac8c5dd4b3e5ba3c323d84f63d052faf813655cca8bb861a035ee064a8d71931bb35e956fc581051c0e86c4a80a1e581df + checksum: 29ad1233935f11f659b1ee18b55f8cb235b6d5eee402381ae7e89c47de565afa81fe30fcf769d28f1cacbc9d2c961d220554089a0a48c742a90cb7c4afc29e51 languageName: node linkType: hard -"@nivo/bar@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/bar@npm:0.80.0" +"@nivo/bar@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/bar@npm:0.84.0" dependencies: - "@nivo/annotations": 0.80.0 - "@nivo/axes": 0.80.0 - "@nivo/colors": 0.80.0 - "@nivo/legends": 0.80.0 - "@nivo/scales": 0.80.0 - "@nivo/tooltip": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/annotations": 0.84.0 + "@nivo/axes": 0.84.0 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@nivo/legends": 0.84.0 + "@nivo/scales": 0.84.0 + "@nivo/tooltip": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/d3-scale": ^3.2.3 + "@types/d3-shape": ^2.0.0 d3-scale: ^3.2.3 d3-shape: ^1.3.5 lodash: ^4.17.21 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: ab1a243b256970fd4b8a7874e67bbc95aac8d175865ba87b2c1fbc04394d823a752f13b485250aa53528790b5fa8c015a5a66e858ad43883bc6ec8cb49587a52 + checksum: abe7178cbcd2b57fa10804998055e093fa852b99c1296cd09eb202423e8f1f502fe010743c25c2cb2d2f7028560634c266f0a3d94182db82d9fbf767f824ad5d languageName: node linkType: hard -"@nivo/colors@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/colors@npm:0.80.0" +"@nivo/colors@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/colors@npm:0.84.0" dependencies: - d3-color: ^2.0.0 + "@nivo/core": 0.84.0 + "@types/d3-color": ^2.0.0 + "@types/d3-scale": ^3.2.3 + "@types/d3-scale-chromatic": ^2.0.0 + "@types/prop-types": ^15.7.2 + d3-color: ^3.1.0 d3-scale: ^3.2.3 d3-scale-chromatic: ^2.0.0 lodash: ^4.17.21 + prop-types: ^15.7.2 peerDependencies: - "@nivo/core": 0.80.0 - prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: 0dc2044c984d8180d2f0a13fba6b6cdda0a18eec6ef71e9e523794f7ba70ed896231840f22c93f7e30b8730fde26ec07fff8e3d08fef120e91c8a9d552aa1fca + checksum: a319a4d860bf8c6489efa069bcec8e7bc09e859d14e81cfb8e1972fc09ae294ad1e5ca347287846eb41a2e382dd08063b427d942f1030d1dec74049b1bef2f95 languageName: node linkType: hard -"@nivo/core@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/core@npm:0.80.0" +"@nivo/core@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/core@npm:0.84.0" dependencies: - "@nivo/recompose": 0.80.0 - "@react-spring/web": 9.4.5 - d3-color: ^2.0.0 + "@nivo/recompose": 0.84.0 + "@nivo/tooltip": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/d3-shape": ^2.0.0 + d3-color: ^3.1.0 d3-format: ^1.4.4 - d3-interpolate: ^2.0.1 + d3-interpolate: ^3.0.1 d3-scale: ^3.2.3 - d3-scale-chromatic: ^2.0.0 + d3-scale-chromatic: ^3.0.0 d3-shape: ^1.3.5 d3-time-format: ^3.0.0 lodash: ^4.17.21 peerDependencies: - "@nivo/tooltip": 0.80.0 prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: 05fd9ccc9d9876affea17498a2007f5974641c7a2bb1c12c4d8f97bdae48519dd5882c65653074b6756d14eef47dbaeaf8b8243d3e5389efd3d1e180ecbfde75 + checksum: 0b76c624c3f43e07f306cfbc18c86205011cb9928d62322d1ac37784353fd11e95381f4250b8546e536e26c79dda096011fbc4f14778236f7d43b60085ac622b languageName: node linkType: hard -"@nivo/heatmap@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/heatmap@npm:0.80.0" +"@nivo/heatmap@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/heatmap@npm:0.84.0" dependencies: - "@nivo/annotations": 0.80.0 - "@nivo/axes": 0.80.0 - "@nivo/colors": 0.80.0 - "@nivo/legends": 0.80.0 - "@nivo/tooltip": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/annotations": 0.84.0 + "@nivo/axes": 0.84.0 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@nivo/legends": 0.84.0 + "@nivo/scales": 0.84.0 + "@nivo/tooltip": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + "@types/d3-scale": ^3.2.3 d3-scale: ^3.2.3 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: a2bd7693b80bb6ea995a34ad1c6a789d123a8fc9cff7919183f854d4ad49374f80f4c7086d44640b09e0dea5a5fd5c07b3738d35dc7c49c2ad92d1b02d8e0e48 + checksum: f7cf0e843e7ce5c3b8f5310a788ef17e7385371cc668e6920c169545d4d763b2574fe645cacc6009a3ab4f23b4430c606ef0de98da681fb4e0352045e0b74143 languageName: node linkType: hard -"@nivo/legends@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/legends@npm:0.80.0" +"@nivo/legends@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/legends@npm:0.84.0" + dependencies: + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@types/d3-scale": ^3.2.3 + "@types/prop-types": ^15.7.2 + d3-scale: ^3.2.3 + prop-types: ^15.7.2 peerDependencies: - "@nivo/core": 0.80.0 - prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: 659aba35105143ac7da663a51bc6a69f815e23efd278b8b1314bd48b9c853f4c3b7e9cf61de1439390eff3983b754eaea5dd3923fa2caad97b0fca6133a05ae9 + checksum: 321c44b168d8fe8f3133182c398a339b77c2105a0f5522093e08e4beb0aeecaec8ecc50c9fe92ecac98d94013b21243892b51a0ba95b5c36b2017c70161290a5 languageName: node linkType: hard -"@nivo/line@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/line@npm:0.80.0" +"@nivo/line@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/line@npm:0.84.0" dependencies: - "@nivo/annotations": 0.80.0 - "@nivo/axes": 0.80.0 - "@nivo/colors": 0.80.0 - "@nivo/legends": 0.80.0 - "@nivo/scales": 0.80.0 - "@nivo/tooltip": 0.80.0 - "@nivo/voronoi": 0.80.0 - "@react-spring/web": 9.4.5 + "@nivo/annotations": 0.84.0 + "@nivo/axes": 0.84.0 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@nivo/legends": 0.84.0 + "@nivo/scales": 0.84.0 + "@nivo/tooltip": 0.84.0 + "@nivo/voronoi": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 d3-shape: ^1.3.5 + prop-types: ^15.7.2 peerDependencies: - "@nivo/core": 0.80.0 - prop-types: ">= 15.5.10 < 16.0.0" react: ">= 16.14.0 < 19.0.0" - checksum: e2d83971e5d530b4465e628f926d2b311a39ce0fa137b0c942532ca58959d78ced21166e83ce9644c91bf2a2929ac539fdd4307fc7ceda986050346b662de1a3 + checksum: 70dc4caf8335d0eaab76610a11fcbf63dc2ea0d9a2bf7f4c177972de5acf071478c8d02599ec32caf2bf130106304c6b5a0991da760512d2808ad222d84dba3e languageName: node linkType: hard -"@nivo/pie@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/pie@npm:0.80.0" +"@nivo/pie@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/pie@npm:0.84.0" dependencies: - "@nivo/arcs": 0.80.0 - "@nivo/colors": 0.80.0 - "@nivo/legends": 0.80.0 - "@nivo/tooltip": 0.80.0 + "@nivo/arcs": 0.84.0 + "@nivo/colors": 0.84.0 + "@nivo/core": 0.84.0 + "@nivo/legends": 0.84.0 + "@nivo/tooltip": 0.84.0 + "@types/d3-shape": ^2.0.0 d3-shape: ^1.3.5 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: 7267588118b21c01573ffb498e2c24b560a50097900dc4d6426cd4633c9dade51fd4a5fa868747fe9f190eb5e336892461985424cc2f4c990707f7ac610931db + checksum: 5308b191c9aceba492785b36885eea50187aedf489523b45b580b9f8bccaf6c0477cc9a19a7264345bcb6288cbd0096524af69cab8253936d3bacad1a0d45231 languageName: node linkType: hard -"@nivo/recompose@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/recompose@npm:0.80.0" +"@nivo/recompose@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/recompose@npm:0.84.0" dependencies: + "@types/prop-types": ^15.7.2 + "@types/react-lifecycles-compat": ^3.0.1 + prop-types: ^15.7.2 react-lifecycles-compat: ^3.0.4 peerDependencies: react: ">= 16.14.0 < 19.0.0" - checksum: 5495eeba137f4d3a46d1ada99948c5b097ccf00c532f10a627bb0525c6fbab14d93c9297a25d90c0041f72432efbd4e9a2ef5d408063e2c4cf25d05f33b1fcc5 + checksum: 7b1dbd32a3ffa35332e30f4bb642413ca5a9f999de042e0e63d933b619ed8da2f1d57a7fa524b10a7a571fc2e1aa39ea9dca026e9d536efd3aacbd53fbe4a1a8 languageName: node linkType: hard -"@nivo/scales@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/scales@npm:0.80.0" +"@nivo/scales@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/scales@npm:0.84.0" dependencies: + "@types/d3-scale": ^3.2.3 + "@types/d3-time": ^1.1.1 + "@types/d3-time-format": ^3.0.0 d3-scale: ^3.2.3 d3-time: ^1.0.11 d3-time-format: ^3.0.0 lodash: ^4.17.21 - checksum: 75bdc838ab593306268cda2c098430cb5ff1f20ab73dd5d61845fa013e30fd85020c910c9dd0a7641d90ee04f86031af71a250f5f5992fe74a23bcf4fb954f95 + checksum: 0f1f6dcfa8963baabefde0aea11bcc208f54f137d776df20a251912254ed6815b3a880d12e256cdd649053c5123ef5018b8fb6798fb0fa8653f021421d43ce03 languageName: node linkType: hard -"@nivo/tooltip@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/tooltip@npm:0.80.0" +"@nivo/tooltip@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/tooltip@npm:0.84.0" dependencies: - "@react-spring/web": 9.4.5 - peerDependencies: - "@nivo/core": 0.80.0 - checksum: bc0eec5d0d05f653186b040105d7451c823d8ee0844b7767f3d827424346d6379966452055be168994132ca8610f1956798274701a1bb948d3e8d961f23a07b7 + "@nivo/core": 0.84.0 + "@react-spring/web": 9.4.5 || ^9.7.2 + checksum: 110f924bd8dda5c9e921bba8e143557e3ecd3de46ae7acffb47c6f954f1080269d3cf1e187e62edb94fb512708bd531d34cc33533a039b1d72ec9faabbf98f19 languageName: node linkType: hard -"@nivo/voronoi@npm:0.80.0": - version: 0.80.0 - resolution: "@nivo/voronoi@npm:0.80.0" +"@nivo/voronoi@npm:0.84.0": + version: 0.84.0 + resolution: "@nivo/voronoi@npm:0.84.0" dependencies: + "@nivo/core": 0.84.0 + "@types/d3-delaunay": ^5.3.0 + "@types/d3-scale": ^3.2.3 d3-delaunay: ^5.3.0 d3-scale: ^3.2.3 peerDependencies: - "@nivo/core": 0.80.0 react: ">= 16.14.0 < 19.0.0" - checksum: 7b4f844611f64742c5ed14e94fa7a3f813d0b6cde04c40c3d597e0d4180977db8fe957ff4f4b1c5a131e4c43e20a01e684c8b934e0b9583d726b2b13986e9efb + checksum: 1f3dd880ae10e6b230a678830cea1f8d6b7218ba551e350fe6bd21bcf378bad74ff5e3460696e387c7839c92b862268277e4e2750b3e0afbb9272c28e1779bb6 languageName: node linkType: hard @@ -5024,19 +5898,14 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.37.1": - version: 1.37.1 - resolution: "@playwright/test@npm:1.37.1" +"@playwright/test@npm:^1.40.1": + version: 1.40.1 + resolution: "@playwright/test@npm:1.40.1" dependencies: - "@types/node": "*" - fsevents: 2.3.2 - playwright-core: 1.37.1 - dependenciesMeta: - fsevents: - optional: true + playwright: 1.40.1 bin: playwright: cli.js - checksum: b7038f29000289103c08b215eff7aabdda70cdc1375fa7dad0e81651be71086a1e2fc0e0e29dc70348037c366cf0cc69f762373fda34ba1a74aa1658741d9195 + checksum: ae094e6cb809365c0707ee2b184e42d2a2542569ada020d2d44ca5866066941262bd9a67af185f86c2fb0133c9b712ea8cb73e2959a289e4261c5fd17077283c languageName: node linkType: hard @@ -6617,47 +7486,47 @@ __metadata: languageName: node linkType: hard -"@react-pdf/font@npm:^2.3.6": - version: 2.3.6 - resolution: "@react-pdf/font@npm:2.3.6" +"@react-pdf/font@npm:^2.3.7": + version: 2.3.7 + resolution: "@react-pdf/font@npm:2.3.7" dependencies: "@babel/runtime": ^7.20.13 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 cross-fetch: ^3.1.5 fontkit: ^2.0.2 is-url: ^1.2.4 - checksum: 572e34d416ad645e609afcb582c6b8baabe4017019bbfa696b90dddfcb3931069a9dc71124f1bf9b75652063f8c434880c383b212edc659a66dd2be3879f4213 + checksum: bf3f774045294c3e4f2f7b3e86e631ee01dddfe8e8c11fb97264cfa1fbf21e4f3c4ed0684d4971c967c4c175bb918e56f7c1d0dbeac4aa1adf30c618f965f3c9 languageName: node linkType: hard -"@react-pdf/image@npm:^2.2.1": - version: 2.2.1 - resolution: "@react-pdf/image@npm:2.2.1" +"@react-pdf/image@npm:^2.2.2": + version: 2.2.2 + resolution: "@react-pdf/image@npm:2.2.2" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/png-js": ^2.2.0 cross-fetch: ^3.1.5 - checksum: d2b3c9e5b6a23c377724072c875eaeea6389fa513ae0e88ed442d7efb0eaa373b0f195e7c6b9404297ede802d063cf20109800f4d7b951087f66bb64f7c04f1a + checksum: f14c5595ba25f54a2274c1ec4b2d19b195108f05ac34960a0ec8c03499f2090faa9937428ed1d189597fb675733b4d68d092d98c18319e0ef6efa530d12c605b languageName: node linkType: hard -"@react-pdf/layout@npm:^3.6.2": - version: 3.6.2 - resolution: "@react-pdf/layout@npm:3.6.2" +"@react-pdf/layout@npm:^3.6.3": + version: 3.6.3 + resolution: "@react-pdf/layout@npm:3.6.3" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 - "@react-pdf/image": ^2.2.1 + "@react-pdf/image": ^2.2.2 "@react-pdf/pdfkit": ^3.0.2 "@react-pdf/primitives": ^3.0.0 - "@react-pdf/stylesheet": ^4.1.7 + "@react-pdf/stylesheet": ^4.1.8 "@react-pdf/textkit": ^4.2.0 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 "@react-pdf/yoga": ^4.1.2 cross-fetch: ^3.1.5 emoji-regex: ^10.2.1 queue: ^6.0.1 - checksum: 15816b14aa7ba8720ea5da88f3cf269070c189a2600959c61c92314aebf04e72c691df6947a1bda04d61a561ee68b046e1c8110960da121ffb63badb3d893d08 + checksum: 812b5f3c3f27fba2fc6a15c35a3e9191e4d6407ff4a23a96c2d99889842c26f15bf03531e67c607cc2114ed731739d03f02c934926db7bc05926ef29ed959dad languageName: node linkType: hard @@ -6691,35 +7560,35 @@ __metadata: languageName: node linkType: hard -"@react-pdf/render@npm:^3.2.6": - version: 3.2.6 - resolution: "@react-pdf/render@npm:3.2.6" +"@react-pdf/render@npm:^3.2.7": + version: 3.2.7 + resolution: "@react-pdf/render@npm:3.2.7" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 "@react-pdf/primitives": ^3.0.0 "@react-pdf/textkit": ^4.2.0 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 abs-svg-path: ^0.1.1 color-string: ^1.5.3 normalize-svg-path: ^1.1.0 parse-svg-path: ^0.1.2 svg-arc-to-cubic-bezier: ^3.2.0 - checksum: 9d0bde1e5042db8a251e474092415bd49ed4b01d7d1d404e50e6f7480d282cf59f51ed9fe08deed633aefcdcee424dd955bf4e659471905326e2911e672db925 + checksum: 74bb7190d006fee7b2df074bb28ade1f0bdf4a20a33998cdc2826974f4b4fc3622e660a598a4f4623046c12009bc3b663aa8701d9361a487334b84c7c2512de7 languageName: node linkType: hard -"@react-pdf/renderer@npm:^3.1.12": - version: 3.1.12 - resolution: "@react-pdf/renderer@npm:3.1.12" +"@react-pdf/renderer@npm:^3.1.14": + version: 3.1.14 + resolution: "@react-pdf/renderer@npm:3.1.14" dependencies: "@babel/runtime": ^7.20.13 - "@react-pdf/font": ^2.3.6 - "@react-pdf/layout": ^3.6.2 + "@react-pdf/font": ^2.3.7 + "@react-pdf/layout": ^3.6.3 "@react-pdf/pdfkit": ^3.0.2 "@react-pdf/primitives": ^3.0.0 - "@react-pdf/render": ^3.2.6 - "@react-pdf/types": ^2.3.3 + "@react-pdf/render": ^3.2.7 + "@react-pdf/types": ^2.3.4 events: ^3.3.0 object-assign: ^4.1.1 prop-types: ^15.6.2 @@ -6727,22 +7596,22 @@ __metadata: scheduler: ^0.17.0 peerDependencies: react: ^16.8.6 || ^17.0.0 || ^18.0.0 - checksum: 7fa9779c8594e8e650fc121de5b89a40268ccab62b89a87c32f110bb4ea97adacd1d0fb2893533e3834613478bed71de2c1161e88e42916862b1523d7f10367e + checksum: f0313c066b5e9f34e87940a86dd344d07347829781407ea9e7d24480213624b8d0457a8258c09b62c6cfe145120f4e06978ebf7d18e7272a2e8a7d21f02c6202 languageName: node linkType: hard -"@react-pdf/stylesheet@npm:^4.1.7": - version: 4.1.7 - resolution: "@react-pdf/stylesheet@npm:4.1.7" +"@react-pdf/stylesheet@npm:^4.1.8": + version: 4.1.8 + resolution: "@react-pdf/stylesheet@npm:4.1.8" dependencies: "@babel/runtime": ^7.20.13 "@react-pdf/fns": 2.0.1 - "@react-pdf/types": ^2.3.3 + "@react-pdf/types": ^2.3.4 color-string: ^1.5.3 hsl-to-hex: ^1.0.0 media-engine: ^1.0.3 postcss-value-parser: ^4.1.0 - checksum: f120ebe017fe48db6559105f080619b0f1f37931a87da9d1f3ac64ab75792c320ba08c4ee85e907040546b99e37d62e1571bc2de5e5cbbcf8891a6521b46bd3a + checksum: c5339fdb49ee0420a6633e0955632073440fb0d235f0153164dae17401c5880995cf835c8ca1cf81a23ba83e4377439584ee86d2ab695796f01030791ab4f31f languageName: node linkType: hard @@ -6758,10 +7627,10 @@ __metadata: languageName: node linkType: hard -"@react-pdf/types@npm:^2.3.3": - version: 2.3.3 - resolution: "@react-pdf/types@npm:2.3.3" - checksum: f4d9e5ba0b8481cb485d17922079f320de469500495f9bbd06161fca7e9deb127ea860c38c34f01d1339c519e032c0d9f63ea681c13eeedee2c8ef5cc0b79d19 +"@react-pdf/types@npm:^2.3.4": + version: 2.3.4 + resolution: "@react-pdf/types@npm:2.3.4" + checksum: 3aa1b00581c69b5078fbc946d7c86abc984c2bef6a1b4b51e236be6719efd6773f794d390356df6d8355aa3c1f5a3a4a4bdca1e2d3c31fe3d3bf55250e405b02 languageName: node linkType: hard @@ -6774,70 +7643,61 @@ __metadata: languageName: node linkType: hard -"@react-spring/animated@npm:~9.4.5": - version: 9.4.5 - resolution: "@react-spring/animated@npm:9.4.5" +"@react-spring/animated@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/animated@npm:9.7.3" dependencies: - "@react-spring/shared": ~9.4.5 - "@react-spring/types": ~9.4.5 + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 peerDependencies: - react: ^16.8.0 || >=17.0.0 || >=18.0.0 - checksum: e85c0bd65bd76e1c8ca830b22e31956401e29593cbc1df7560f5b77bd7b31acded61e1732717803cdfd993f30c2559ffbd6fb5f0d48b1c749323bee3597d7834 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 468942ca3a11c02c3e56def26b2da9dd10ddbed548004245c4ac309cce00b58d971e781abed67db0d652f72737eaa73766ea9a43b8ef3b08a7ed2eddc04d4c39 languageName: node linkType: hard -"@react-spring/core@npm:~9.4.5": - version: 9.4.5 - resolution: "@react-spring/core@npm:9.4.5" +"@react-spring/core@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/core@npm:9.7.3" dependencies: - "@react-spring/animated": ~9.4.5 - "@react-spring/rafz": ~9.4.5 - "@react-spring/shared": ~9.4.5 - "@react-spring/types": ~9.4.5 + "@react-spring/animated": ~9.7.3 + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 peerDependencies: - react: ^16.8.0 || >=17.0.0 || >=18.0.0 - checksum: e5aee7f68f15c9d5d6f230703d22cb34edb8aae3ba0d70c01847f7c78e47f9f8177f87c095aff5ed1b98c2a218238d5ec28f9bf451f3e13bfdad6e3170a60226 - languageName: node - linkType: hard - -"@react-spring/rafz@npm:~9.4.5": - version: 9.4.5 - resolution: "@react-spring/rafz@npm:9.4.5" - checksum: 0ac722881b107baf55338a0123bc889d88faca53f034eb6d26ebab3ae6e4dc1717654b09d0e6e5e9bf587c2ba182d6aae90ca22c833dc55024ee52d88f8579a2 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 8a80a07276458fd14099320eda824e58a11ce3a9b03a5c9cd3f4252adb4d26da04ee5caf5cbc961199f55c2d58a99638d5ea292cdb6aa029208dbab741b5c531 languageName: node linkType: hard -"@react-spring/shared@npm:~9.4.5": - version: 9.4.5 - resolution: "@react-spring/shared@npm:9.4.5" +"@react-spring/shared@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/shared@npm:9.7.3" dependencies: - "@react-spring/rafz": ~9.4.5 - "@react-spring/types": ~9.4.5 + "@react-spring/types": ~9.7.3 peerDependencies: - react: ^16.8.0 || >=17.0.0 || >=18.0.0 - checksum: 2f20e410c03166de19b2d668d6841d24778c37da3083d37fe70acfcf2cf0cb3bd4a5cf92d42f1590b9de5d0a6603dc75cf8c319c0089df4e713226364a204b51 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 912b5e567eb5345c9a6c8e8c0c2d69b1f411af72a0685b95831809c267c89846a31341ca071f284ace98b3cb5de647054dc76f6ace81d6379513eaf96b52f195 languageName: node linkType: hard -"@react-spring/types@npm:~9.4.5": - version: 9.4.5 - resolution: "@react-spring/types@npm:9.4.5" - checksum: f8fecb54015de23899cc595d949e3676835e612d4dda05af470cab9ee20dd98c86ebca1c4ba75d2a9f63a4acba4b75febf6bab71da0b2e9556e6ff684b22f139 +"@react-spring/types@npm:~9.7.3": + version: 9.7.3 + resolution: "@react-spring/types@npm:9.7.3" + checksum: f47b81fe556464aa54a78603311cb584d6a0f03088522229afb058265bbe2ade2095a55ec7f4e960c3b9cceaa5d47865bc41fc6643c0f5f4bd3d8650203d8389 languageName: node linkType: hard -"@react-spring/web@npm:9.4.5": - version: 9.4.5 - resolution: "@react-spring/web@npm:9.4.5" +"@react-spring/web@npm:9.4.5 || ^9.7.2": + version: 9.7.3 + resolution: "@react-spring/web@npm:9.7.3" dependencies: - "@react-spring/animated": ~9.4.5 - "@react-spring/core": ~9.4.5 - "@react-spring/shared": ~9.4.5 - "@react-spring/types": ~9.4.5 + "@react-spring/animated": ~9.7.3 + "@react-spring/core": ~9.7.3 + "@react-spring/shared": ~9.7.3 + "@react-spring/types": ~9.7.3 peerDependencies: - react: ^16.8.0 || >=17.0.0 || >=18.0.0 - react-dom: ^16.8.0 || >=17.0.0 || >=18.0.0 - checksum: 9d7eea4b8b0399c205743acade141679f3f729a64631f8480d44d14bb59781ea807977a4671cbe1d56e31389b69ef325ec975275446f08997f555f2981d220c8 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 7f5cd05b2314b7f2f715e1926abcf9aa0a539399b222ab34e989144f48350adfcd2edab65d41425570f72c57f602fc6994d6730fbeed902171ac527b630a8a9b languageName: node linkType: hard @@ -7720,16 +8580,16 @@ __metadata: dependencies: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next - "@types/bcrypt": ^5.0.0 - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@rocket.chat/string-helpers": ~0.31.25 + "@types/bcrypt": ^5.0.1 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 bcrypt: ^5.0.1 ejson: ^2.2.3 eslint: ~8.45.0 @@ -7738,14 +8598,14 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 - uuid: ^9.0.0 + typescript: ~5.3.2 + uuid: ^9.0.1 languageName: unknown linkType: soft @@ -7753,11 +8613,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/account-utils@workspace:packages/account-utils" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7765,18 +8625,18 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/agenda@workspace:packages/agenda" dependencies: - "@types/debug": ^4.1.8 - "@types/jest": ~29.5.3 + "@types/debug": ^4.1.10 + "@types/jest": ~29.5.7 cron: ~1.8.2 date.js: ~0.3.3 debug: ~4.1.1 eslint: ~8.45.0 human-interval: ^2.0.1 - jest: ~29.6.1 + jest: ~29.6.4 moment-timezone: ~0.5.43 mongodb: ^4.17.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7786,43 +8646,25 @@ __metadata: dependencies: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/jest": ~29.5.3 - "@types/strict-uri-encode": ^2.0.0 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/jest": ~29.5.7 + "@types/strict-uri-encode": ^2.0.1 eslint: ~8.45.0 filter-obj: ^3.0.0 - jest: ~29.6.1 + jest: ~29.6.4 jest-fetch-mock: ^3.0.3 query-string: ^7.1.3 split-on-first: ^3.0.0 strict-uri-encode: ^2.0.0 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/apps-engine@npm:1.41.0-alpha.290": - version: 1.41.0-alpha.290 - resolution: "@rocket.chat/apps-engine@npm:1.41.0-alpha.290" - dependencies: - adm-zip: ^0.5.9 - cryptiles: ^4.1.3 - jose: ^4.11.1 - lodash.clonedeep: ^4.5.0 - semver: ^5.7.1 - stack-trace: 0.0.10 - uuid: ^3.4.0 - vm2: ^3.9.19 - peerDependencies: - "@rocket.chat/ui-kit": "*" - checksum: f31f4c9bac7f036d22b023688d9854196340f5813112a016848ddbea9589088ab5a2a7830b691c24ef01e9cce98e9046c5b8780bc46dd3bef6f3a05207d51a60 - languageName: node - linkType: hard - -"@rocket.chat/apps-engine@npm:1.41.0-alpha.312": - version: 1.41.0-alpha.312 - resolution: "@rocket.chat/apps-engine@npm:1.41.0-alpha.312" +"@rocket.chat/apps-engine@npm:1.41.0": + version: 1.41.0 + resolution: "@rocket.chat/apps-engine@npm:1.41.0" dependencies: adm-zip: ^0.5.9 cryptiles: ^4.1.3 @@ -7830,11 +8672,11 @@ __metadata: lodash.clonedeep: ^4.5.0 semver: ^5.7.1 stack-trace: 0.0.10 - uuid: ^3.4.0 + uuid: ~8.3.2 vm2: ^3.9.19 peerDependencies: "@rocket.chat/ui-kit": "*" - checksum: 003853d3c4d4374ab984474026e4ae657daf4591fe4c375b914aa57c27f576af0fcba66e70c539e056b5d80a1ef655775f6f3a07bf81a36ab6fd438ce464e70f + checksum: 2e7fa2856bdbdc6b0dd2456e9aa5e5804a4198f8df0306a002c5e71681466d3fc2cb0a1253668d5e24fa21345a7dd7eed3458a257e1e4cc59a4e8a3876579aa5 languageName: node linkType: hard @@ -7844,15 +8686,15 @@ __metadata: dependencies: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@rocket.chat/string-helpers": ~0.31.25 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -7860,13 +8702,13 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7874,15 +8716,15 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/base64@workspace:packages/base64" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7890,12 +8732,12 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/cas-validate@workspace:packages/cas-validate" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 cheerio: 1.0.0-rc.10 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7903,28 +8745,28 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/core-services@workspace:packages/core-services" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/message-parser": next + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/message-parser": ~0.31.27 "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/ui-kit": ^0.32.1 - "@types/babel__core": ^7 - "@types/babel__preset-env": ^7 - "@types/fibers": ^3.1.1 - "@types/jest": ~29.5.3 + "@rocket.chat/ui-kit": "workspace:~" + "@types/babel__core": ^7.20.3 + "@types/babel__preset-env": ^7.9.4 + "@types/fibers": ^3.1.3 + "@types/jest": ~29.5.7 babel-jest: ^29.5.0 eslint: ~8.45.0 fibers: ^5.0.3 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 prettier: ~2.8.8 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7932,15 +8774,15 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/core-typings@workspace:packages/core-typings" dependencies: - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/message-parser": next - "@rocket.chat/ui-kit": ^0.32.1 + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/message-parser": ~0.31.27 + "@rocket.chat/ui-kit": "workspace:~" eslint: ~8.45.0 mongodb: ^4.17.1 prettier: ~2.8.8 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -7952,16 +8794,16 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/random": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/css-in-js@npm:^0.31.25": +"@rocket.chat/css-in-js@npm:^0.31.25, @rocket.chat/css-in-js@npm:~0.31.25": version: 0.31.25 resolution: "@rocket.chat/css-in-js@npm:0.31.25" dependencies: @@ -7974,28 +8816,6 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-in-js@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/css-in-js@npm:0.31.26-dev.19" - dependencies: - "@emotion/hash": ^0.9.0 - "@rocket.chat/css-supports": ~0.31.26-dev.19 - "@rocket.chat/memo": ~0.31.26-dev.19 - "@rocket.chat/stylis-logical-props-middleware": ~0.31.26-dev.19 - stylis: ~4.1.3 - checksum: 4d1381558188c4625051420a6760e613189abca9cf06c23beb833e582229975a0aaac9aef89a788f161ad5a99344a3d028042d90a33d5144668577aa647a78f3 - languageName: node - linkType: hard - -"@rocket.chat/css-in-js@npm:~0.31.26-dev.19": - version: 0.31.26-dev.23 - resolution: "@rocket.chat/css-in-js@npm:0.31.26-dev.23" - dependencies: - "@rocket.chat/memo": ^0.31.25 - checksum: 6d71bd0f232c8ea3fc2711347064ddd14925b1c2b8713f6d7649b98679455029a53ee41d08b98d010da3ea4789afa21a15901a92efef61dee7b32d6965157445 - languageName: node - linkType: hard - "@rocket.chat/css-supports@npm:^0.31.25": version: 0.31.25 resolution: "@rocket.chat/css-supports@npm:0.31.25" @@ -8005,30 +8825,21 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-supports@npm:~0.31.26-dev.19, @rocket.chat/css-supports@npm:~0.31.26-dev.23": - version: 0.31.26-dev.23 - resolution: "@rocket.chat/css-supports@npm:0.31.26-dev.23" - dependencies: - "@rocket.chat/memo": ~0.31.26-dev.23 - checksum: a4f25562df67214b1c92c85a1cd16eb03fc2aea385f48cdde42ad0053b9e03a92ca9e3486d1387c7a31cf68f47fa888825f31acae8f4700ee2b9f03495286a12 - languageName: node - linkType: hard - "@rocket.chat/ddp-client@workspace:^, @rocket.chat/ddp-client@workspace:ee/packages/ddp-client": version: 0.0.0-use.local resolution: "@rocket.chat/ddp-client@workspace:ee/packages/ddp-client" dependencies: "@rocket.chat/api-client": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/jest": ~29.5.3 - "@types/ws": ^8.5.5 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/jest": ~29.5.7 + "@types/ws": ^8.5.8 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 - typescript: ~5.2.2 + typescript: ~5.3.2 ws: ^8.13.0 peerDependencies: "@rocket.chat/emitter": "*" @@ -8039,26 +8850,26 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer" dependencies: - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/instance-status": "workspace:^" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next + "@rocket.chat/string-helpers": ~0.31.25 "@rocket.chat/ui-contexts": "workspace:^" - "@types/ejson": ^2.2.0 - "@types/gc-stats": ^1 - "@types/meteor": ^2.9.2 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/ejson": ^2.2.1 + "@types/gc-stats": ^1.4.2 + "@types/meteor": ^2.9.5 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 "@types/sharp": ^0.30.5 "@types/uuid": ^8.3.4 - "@types/ws": ^8.5.5 + "@types/ws": ^8.5.8 colorette: ^1.4.0 ejson: ^2.2.3 eslint: ~8.45.0 @@ -8068,35 +8879,35 @@ __metadata: gc-stats: ^1.4.0 jaeger-client: ^3.19.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 pino-pretty: ^7.6.1 polka: ^0.5.2 - sharp: ^0.30.7 + sharp: ^0.32.6 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 underscore: ^1.13.6 uuid: ^7.0.3 ws: ^8.8.1 languageName: unknown linkType: soft -"@rocket.chat/emitter@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/emitter@npm:0.31.26-dev.19" - checksum: 56e89b1a2325792df59607ea4f75acba5355ccf9a0149a83a8058c1700316833c11cbce7bf58229a5118c719157840a3d7575f1b3aecea30dce90a23945577a5 +"@rocket.chat/emitter@npm:~0.31.25": + version: 0.31.25 + resolution: "@rocket.chat/emitter@npm:0.31.25" + checksum: bcb7fbd947507446b9902157adea89ed873f499f5493e9de4eee14795e52a3678b2dd7353f827721f985773dc0a39f51f387bc4e40202e2afb666444437a6041 languageName: node linkType: hard -"@rocket.chat/eslint-config@workspace:^, @rocket.chat/eslint-config@workspace:packages/eslint-config": +"@rocket.chat/eslint-config@workspace:^, @rocket.chat/eslint-config@workspace:packages/eslint-config, @rocket.chat/eslint-config@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/eslint-config@workspace:packages/eslint-config" dependencies: "@babel/core": ^7.20.7 - "@babel/eslint-parser": ~7.22.9 - "@types/eslint": ~8.44.0 + "@babel/eslint-parser": ~7.23.3 + "@types/eslint": ~8.44.6 "@types/prettier": ^2.6.3 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 @@ -8104,7 +8915,7 @@ __metadata: eslint-config-prettier: ~8.8.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-import: ~2.26.0 - eslint-plugin-jest: ~27.2.2 + eslint-plugin-jest: ~27.2.3 eslint-plugin-prettier: ~4.2.1 prettier: ~2.8.8 languageName: unknown @@ -8115,13 +8926,13 @@ __metadata: resolution: "@rocket.chat/favicon@workspace:packages/favicon" dependencies: eslint: ~8.45.0 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/forked-matrix-appservice-bridge@npm:^4.0.1": - version: 4.0.1 - resolution: "@rocket.chat/forked-matrix-appservice-bridge@npm:4.0.1" +"@rocket.chat/forked-matrix-appservice-bridge@npm:^4.0.2": + version: 4.0.2 + resolution: "@rocket.chat/forked-matrix-appservice-bridge@npm:4.0.2" dependencies: "@alloc/quick-lru": ^5.2.0 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 @@ -8141,13 +8952,13 @@ __metadata: uuid: ^8.3.2 winston: ^3.3.3 winston-daily-rotate-file: ^4.5.1 - checksum: 218a46170d084bfe672f3a7e48a33d2179b314c0a4d021b1f7d9d8a6388a9bdb52daa7e3abd1502c40f6f7e6cec689ea24dc942d92bc51e4e37d5ba62d5b8f73 + checksum: 1fc078d972995282fa74537607a1fe1e0ae4012a066d7d40df4190d423eaf461cbaa9bfae02ce8c17169b0eca2209b43025008da1d0baf764711034f290427c6 languageName: node linkType: hard -"@rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.2": - version: 0.6.0-beta.2 - resolution: "@rocket.chat/forked-matrix-bot-sdk@npm:0.6.0-beta.2" +"@rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.2, @rocket.chat/forked-matrix-bot-sdk@npm:^0.6.0-beta.3": + version: 0.6.0-beta.3 + resolution: "@rocket.chat/forked-matrix-bot-sdk@npm:0.6.0-beta.3" dependencies: "@rocket.chat/forked-matrix-sdk-crypto-nodejs": ^0.1.0-beta.12 "@types/express": ^4.17.13 @@ -8165,21 +8976,21 @@ __metadata: request: ^2.88.2 request-promise: ^4.2.6 sanitize-html: ^2.6.1 - checksum: f2ce128ab6d93289d711161c217ad0d2c0b879ae37c8c5527b3aea7294845c19f713f69fccde65d260f07780777be80718b73e8bdc38a6c65cba94a94fd7d85d + checksum: 43f04e2416b4fc88a6c716002d17725bec7083efe7ae5efc15d5304d8dbe35ed6f570d849877de151f8020a98fb5ba339cb23f11c20d47adab3bbcb6c3443a3a languageName: node linkType: hard -"@rocket.chat/forked-matrix-sdk-crypto-nodejs@npm:^0.1.0-beta.12": - version: 0.1.0-beta.12 - resolution: "@rocket.chat/forked-matrix-sdk-crypto-nodejs@npm:0.1.0-beta.12" +"@rocket.chat/forked-matrix-sdk-crypto-nodejs@npm:0.1.0-beta.13": + version: 0.1.0-beta.13 + resolution: "@rocket.chat/forked-matrix-sdk-crypto-nodejs@npm:0.1.0-beta.13" dependencies: "@napi-rs/cli": ^2.2.0 shelljs: ^0.8.4 - checksum: 61a25753631a9d6d3ee37e437a6b453f0d596beb6d938dea6712793b941baf7bbfbb2240299049bb126ebeddaa65d119f8e716070929e7317f96ae582e457f91 + checksum: 2f21ef393c498eb06040def813169e15c740505a74dc161b8e3703e37bc746de5aa8cbbf637b093cd2dc7f35fb36da1eec2e0e8ae3d5fd7cba6e95846f3c13e9 languageName: node linkType: hard -"@rocket.chat/fuselage-hooks@npm:^0.32.1": +"@rocket.chat/fuselage-hooks@npm:^0.32.1, @rocket.chat/fuselage-hooks@npm:~0.32.1": version: 0.32.1 resolution: "@rocket.chat/fuselage-hooks@npm:0.32.1" dependencies: @@ -8191,9 +9002,9 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-polyfills@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/fuselage-polyfills@npm:0.31.26-dev.19" +"@rocket.chat/fuselage-polyfills@npm:~0.31.25": + version: 0.31.25 + resolution: "@rocket.chat/fuselage-polyfills@npm:0.31.25" dependencies: "@juggle/resize-observer": ^3.4.0 clipboard-polyfill: ^3.0.3 @@ -8201,13 +9012,13 @@ __metadata: focus-visible: ^5.2.0 focus-within-polyfill: ^5.2.1 new-event-polyfill: ^1.0.1 - checksum: 2a8363bb177ee5f345bcafac856bcd5726df405f929d945fa366530c7535c125380b2818dbd0cf8b6675c69617435c40af7d143b7afe191abfb0d5652678f60f + checksum: 191731a2b8bc963287e7072fa8eb7a7b3cc255b6bd8ecabb3c0303e8f3f046213a6a1bcc1d6c2812ce664657fb92c46bf370c6d3ff9981ba58140819189f2b62 languageName: node linkType: hard -"@rocket.chat/fuselage-toastbar@npm:next": - version: 0.32.0-dev.403 - resolution: "@rocket.chat/fuselage-toastbar@npm:0.32.0-dev.403" +"@rocket.chat/fuselage-toastbar@npm:~0.31.25": + version: 0.31.25 + resolution: "@rocket.chat/fuselage-toastbar@npm:0.31.25" peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" @@ -8215,11 +9026,11 @@ __metadata: "@rocket.chat/styled": "*" react: ^17.0.2 react-dom: ^17.0.2 - checksum: 674a621ccabfcb802817fcd92236376417bbac90458736f655b6500c363e76b238a3c14a5cd0df0ad42b50c7b3b5ea675d3e918f767d20688768141c72511d69 + checksum: 0dcc6e38c45594efefefe5763ef5bf98296cdf2f9b189f2f0c062d1d9bedf460b10508ccaaa689e2a656876f224eb9c9ac74e48fcd6acacb794c6fab3e8d4c33 languageName: node linkType: hard -"@rocket.chat/fuselage-tokens@npm:^0.32.0": +"@rocket.chat/fuselage-tokens@npm:^0.32.0, @rocket.chat/fuselage-tokens@npm:~0.32.0": version: 0.32.0 resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0" checksum: 8da7836877ba93462f90d13de6d3d3add8b2758b58c7988e14a8f0deffd1ceef0547f26d4c60a7ddc881e21e3327b5a04cbf17336e5ca8ab9c19789d8e6af3c0 @@ -8230,17 +9041,21 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/fuselage-ui-kit@workspace:packages/fuselage-ui-kit" dependencies: - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/preset-typescript": ~7.22.15 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/fuselage-polyfills": next + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/gazzodown": "workspace:^" - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/prettier-config": next - "@rocket.chat/styled": next + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/prettier-config": ~0.31.25 + "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-contexts": "workspace:^" - "@rocket.chat/ui-kit": ^0.32.1 + "@rocket.chat/ui-kit": "workspace:~" "@rocket.chat/ui-video-conf": "workspace:^" "@storybook/addon-essentials": ~6.5.16 "@storybook/addons": ~6.5.16 @@ -8250,8 +9065,10 @@ __metadata: "@storybook/source-loader": ~6.5.16 "@storybook/theming": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 + "@types/babel__core": ^7.20.3 + "@types/babel__preset-env": ^7.9.4 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 babel-loader: ~8.2.5 cross-env: ^7.0.3 eslint: ~8.45.0 @@ -8260,9 +9077,11 @@ __metadata: prettier: ~2.8.8 react-docgen-typescript-plugin: ~1.0.5 react-dom: ^17.0.2 + react-i18next: ~13.2.2 rimraf: ^3.0.2 + storybook-dark-mode: ~3.0.1 tslib: ^2.5.3 - typescript: ~5.2.2 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/apps-engine": "*" "@rocket.chat/eslint-config": 0.6.0 @@ -8272,18 +9091,18 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 2.0.0 + "@rocket.chat/ui-contexts": 3.0.2 "@rocket.chat/ui-kit": "*" - "@rocket.chat/ui-video-conf": 2.0.0 + "@rocket.chat/ui-video-conf": 3.0.2 "@tanstack/react-query": "*" react: "*" react-dom: "*" languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.35.0": - version: 0.35.0 - resolution: "@rocket.chat/fuselage@npm:0.35.0" +"@rocket.chat/fuselage@npm:^0.42.0": + version: 0.42.0 + resolution: "@rocket.chat/fuselage@npm:0.42.0" dependencies: "@rocket.chat/css-in-js": ^0.31.25 "@rocket.chat/css-supports": ^0.31.25 @@ -8301,7 +9120,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 46deea587a1ab4c80a25f4e93882905e2f24778c0e612b7cdd18bfb0c72b2c079d4eee6fe7ad4c52a62354197ebed0a62eaf939b5714859b7086c923668f3f05 + checksum: e9c5869a6b2918ad0490cbcd2b3d7777e8b76bcd9c8d772327af9c83136d99261fcd1266aaa1013b034cbe8a5b88adc3f1383a60c9c2051173c363d0eebae80e languageName: node linkType: hard @@ -8309,13 +9128,13 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/gazzodown@workspace:packages/gazzodown" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/css-in-js": next - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-tokens": ^0.32.0 - "@rocket.chat/message-parser": next - "@rocket.chat/styled": next + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-tokens": ~0.32.0 + "@rocket.chat/message-parser": ~0.31.27 + "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-client": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" "@storybook/addon-actions": ~6.5.16 @@ -8327,15 +9146,15 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 "@testing-library/jest-dom": ^5.16.5 "@testing-library/react": ~12.1.5 - "@types/jest": ~29.5.3 - "@types/katex": ~0.16.0 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/testing-library__jest-dom": ~5.14.6 + "@types/jest": ~29.5.7 + "@types/katex": ~0.16.5 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/testing-library__jest-dom": ~5.14.9 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 babel-loader: ^8.3.0 @@ -8343,27 +9162,27 @@ __metadata: eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 + eslint-plugin-storybook: ~0.6.15 highlight.js: ^11.5.1 identity-obj-proxy: ^3.0.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 - katex: ~0.16.7 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 + katex: ~0.16.9 outdent: ^0.8.0 react-docgen-typescript-plugin: ~1.0.5 react-dom: ~17.0.2 react-error-boundary: ^3.1.4 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: - "@rocket.chat/core-typings": 6.4.0 + "@rocket.chat/core-typings": 6.6.0-develop "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 2.0.0 - "@rocket.chat/ui-contexts": 2.0.0 + "@rocket.chat/ui-client": 3.0.2 + "@rocket.chat/ui-contexts": 3.0.2 katex: "*" react: "*" languageName: unknown @@ -8373,18 +9192,18 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/i18n@workspace:packages/i18n" dependencies: - "@babel/core": ~7.22.10 - "@babel/preset-env": ~7.22.10 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 babel-jest: ^29.5.0 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 + jest: ~29.6.4 + ts-jest: ~29.1.1 tsup: ^6.7.0 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/icons@npm:^0.32.0": +"@rocket.chat/icons@npm:~0.32.0": version: 0.32.0 resolution: "@rocket.chat/icons@npm:0.32.0" checksum: 013c819eaaa5a2abc6e35f237e904c35ba105eb0be101dadba678732815423c3a4e01e0e65d0301acfeac77bc59e3aa2bc997744e3c7611c0814c733118cb248 @@ -8400,7 +9219,7 @@ __metadata: eslint: ~8.45.0 mongodb: ^4.17.1 prettier: ~2.8.8 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -8408,24 +9227,24 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/jwt@workspace:packages/jwt" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 jose: ^4.14.4 ts-jest: ^29.1.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/layout@npm:next": - version: 0.32.0-dev.312 - resolution: "@rocket.chat/layout@npm:0.32.0-dev.312" +"@rocket.chat/layout@npm:~0.31.26": + version: 0.31.26 + resolution: "@rocket.chat/layout@npm:0.31.26" peerDependencies: "@rocket.chat/fuselage": "*" react: 17.0.2 react-dom: 17.0.2 react-i18next: ~11.15.4 - checksum: c3db8279b66794b349b740fa61f56a9759fe7f61856408c6c20b6cdf3c799f309de1388d2449db2b17199278fa1d17c6f41a9cfe7bf24f3fa5692a9cbbeae8a2 + checksum: 473b3ce43f7e5c495bbbfb54c628a1da9fda672fee0aeef74a25690a462b243982749bb1ba6933130381aea8aae61fb9aed6b45d6c3ec370c7555e1ac69930ce languageName: node linkType: hard @@ -8436,18 +9255,18 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/jwt": "workspace:^" "@rocket.chat/logger": "workspace:^" - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 - "@types/bcrypt": ^5.0.0 - "@types/jest": ~29.5.3 - "@types/ws": ^8.5.5 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 + "@types/bcrypt": ^5.0.1 + "@types/jest": ~29.5.7 + "@types/ws": ^8.5.8 bcrypt: ^5.0.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 - ts-jest: ~29.0.5 - typescript: ^5.2.2 + ts-jest: ~29.1.1 + typescript: ^5.3.2 languageName: unknown linkType: soft @@ -8455,28 +9274,27 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/livechat@workspace:packages/livechat" dependencies: - "@babel/eslint-parser": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 + "@babel/eslint-parser": ~7.23.3 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage-tokens": ^0.32.0 + "@rocket.chat/fuselage-tokens": ~0.32.0 "@rocket.chat/gazzodown": "workspace:^" - "@rocket.chat/logo": ^0.31.28 - "@rocket.chat/message-parser": next + "@rocket.chat/logo": ~0.31.28 + "@rocket.chat/message-parser": ~0.31.27 "@rocket.chat/random": "workspace:~" "@rocket.chat/sdk": ^1.0.0-alpha.42 - "@rocket.chat/ui-kit": ^0.32.1 + "@rocket.chat/ui-kit": "workspace:~" "@storybook/addon-essentials": ~6.5.16 "@storybook/addon-postcss": ~2.0.0 "@storybook/preact": ~6.5.16 "@storybook/theming": ~6.5.16 - "@types/crypto-js": ~4.1.1 + "@types/crypto-js": ~4.1.3 "@types/mini-css-extract-plugin": ~1.4.3 - "@types/terser-webpack-plugin": ~4.2.2 - "@types/webpack": ~4.41.33 - "@types/webpack-bundle-analyzer": ^4 + "@types/webpack": ^5.28.4 + "@types/webpack-bundle-analyzer": ^4.6.2 "@types/webpack-dev-server": ~4.7.2 "@types/whatwg-fetch": ~0.0.33 "@typescript-eslint/eslint-plugin": ~5.60.1 @@ -8497,9 +9315,9 @@ __metadata: file-loader: ^6.2.0 gh-release: ^3.5.0 history: ~5.3.0 - html-webpack-plugin: ^4.4.1 + html-webpack-plugin: ^5.5.3 husky: ^4.3.8 - i18next: ~23.4.5 + i18next: ~23.4.9 if-env: ^1.0.4 image-webpack-loader: ~8.1.0 lorem-ipsum: ^2.0.8 @@ -8514,14 +9332,14 @@ __metadata: postcss-ie11-supports: ^0.1.3 postcss-loader: ^3.0.0 postcss-logical: ^4.0.2 - postcss-scss: ^4.0.6 + postcss-scss: ^4.0.9 postcss-selector-not: ^4.0.1 preact: 10.15.1 preact-router: ^3.2.1 query-string: ^7.1.3 react-dom: ~17.0.2 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 rimraf: ^3.0.2 sass: ~1.62.1 sass-loader: ~10.4.1 @@ -8531,13 +9349,13 @@ __metadata: stylelint-order: ^5.0.0 svg-loader: ^0.0.2 terser-webpack-plugin: ~4.2.3 - typescript: ~5.2.2 + typescript: ~5.3.2 url-loader: ^4.1.1 - webpack: ~4.46.0 - webpack-bundle-analyzer: ^4.9.0 - webpack-cli: ~4.10.0 + webpack: ^5.89.0 + webpack-bundle-analyzer: ^4.9.1 + webpack-cli: ^5.1.4 webpack-dev-server: ~4.13.3 - whatwg-fetch: ^3.6.2 + whatwg-fetch: ^3.6.19 peerDependencies: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/logo": "*" @@ -8549,14 +9367,14 @@ __metadata: resolution: "@rocket.chat/log-format@workspace:packages/log-format" dependencies: "@types/chalk": ^2.2.0 - "@types/ejson": ^2.2.0 - "@types/jest": ~29.5.3 + "@types/ejson": ^2.2.1 + "@types/jest": ~29.5.7 chalk: ^4.0.0 ejson: ^2.2.3 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -8564,17 +9382,17 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/logger@workspace:packages/logger" dependencies: - "@rocket.chat/emitter": next - "@types/jest": ~29.5.3 + "@rocket.chat/emitter": ~0.31.25 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 pino: ^8.15.0 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/logo@npm:^0.31.28": +"@rocket.chat/logo@npm:~0.31.28": version: 0.31.28 resolution: "@rocket.chat/logo@npm:0.31.28" dependencies: @@ -8587,33 +9405,19 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/memo@npm:^0.31.25": +"@rocket.chat/memo@npm:^0.31.25, @rocket.chat/memo@npm:~0.31.25": version: 0.31.25 resolution: "@rocket.chat/memo@npm:0.31.25" checksum: 92d595c68d76a5258fb37ed4639e2709ba290c5d240df1272d81a2ab6b4be28ee2dd5b721dad940fe2638a89e8d14e684a970c59890003a06ce6088c655b7c0e languageName: node linkType: hard -"@rocket.chat/memo@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/memo@npm:0.31.26-dev.19" - checksum: 387c29643c0d725b2e2d3b79eeebf2ed3ac2fa518178d2836913dddf48f2aa72e80b277d54c77ac0498c144324cdfd3449bae883895c316fbb43c7dbbfcb3993 - languageName: node - linkType: hard - -"@rocket.chat/memo@npm:~0.31.26-dev.19, @rocket.chat/memo@npm:~0.31.26-dev.23": - version: 0.31.26-dev.23 - resolution: "@rocket.chat/memo@npm:0.31.26-dev.23" - checksum: 68301161d87ba25347f1d2ab85c139ba86c5fdd1101f41678808c19ba461772814f4bff048a30e4aefd08978fe2feb952c541bddc0beb6bc3cd190bd7852393b - languageName: node - linkType: hard - -"@rocket.chat/message-parser@npm:next": - version: 0.32.0-dev.377 - resolution: "@rocket.chat/message-parser@npm:0.32.0-dev.377" +"@rocket.chat/message-parser@npm:~0.31.27": + version: 0.31.27 + resolution: "@rocket.chat/message-parser@npm:0.31.27" dependencies: tldts: ~5.7.112 - checksum: 9980ac9fbcce92a6ad521e5b48b8c6b990186046ff984a2408156d15494996d3963aa575d403dd813c78bcb5ea6c374c0a12f1a96c8342fea7782da005aab3b5 + checksum: 27f206171ce744d66ba727b5329cacafb29b00e9e95ae0109fba839a48d2b3cc4a087f91120e6dbee040a482a8e9738b5063419aaae25ef6c8727bc3d8c007c2 languageName: node linkType: hard @@ -8622,67 +9426,67 @@ __metadata: resolution: "@rocket.chat/meteor@workspace:apps/meteor" dependencies: "@axe-core/playwright": ^4.7.3 - "@babel/core": ~7.22.9 - "@babel/eslint-parser": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/eslint-parser": ~7.23.3 "@babel/plugin-proposal-nullish-coalescing-operator": ~7.18.6 "@babel/plugin-proposal-optional-chaining": ~7.21.0 - "@babel/preset-env": ~7.22.9 - "@babel/preset-react": ~7.22.5 - "@babel/register": ~7.22.5 - "@babel/runtime": ~7.22.6 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/register": ~7.22.15 + "@babel/runtime": ~7.22.15 "@bugsnag/js": ~7.20.2 "@bugsnag/plugin-react": ~7.19.0 "@faker-js/faker": ~8.0.2 "@google-cloud/storage": ^6.11.0 "@kaciras/deasync": ^1.0.3 - "@nivo/bar": 0.80.0 - "@nivo/core": 0.80.0 - "@nivo/heatmap": 0.80.0 - "@nivo/line": 0.80.0 - "@nivo/pie": 0.80.0 - "@playwright/test": ^1.37.1 + "@nivo/bar": 0.84.0 + "@nivo/core": 0.84.0 + "@nivo/heatmap": 0.84.0 + "@nivo/line": 0.84.0 + "@nivo/pie": 0.84.0 + "@playwright/test": ^1.40.1 "@react-aria/color": ^3.0.0-beta.15 - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/account-utils": "workspace:^" "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" - "@rocket.chat/apps-engine": 1.41.0-alpha.312 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/base64": "workspace:^" "@rocket.chat/cas-validate": "workspace:^" "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/cron": "workspace:^" - "@rocket.chat/css-in-js": next - "@rocket.chat/emitter": next + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/favicon": "workspace:^" - "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.1 - "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.2 - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/fuselage-polyfills": next - "@rocket.chat/fuselage-toastbar": next - "@rocket.chat/fuselage-tokens": ^0.32.0 + "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.2 + "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.3 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/fuselage-polyfills": ~0.31.25 + "@rocket.chat/fuselage-toastbar": ~0.31.25 + "@rocket.chat/fuselage-tokens": ~0.32.0 "@rocket.chat/fuselage-ui-kit": "workspace:^" "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/i18n": "workspace:^" - "@rocket.chat/icons": ^0.32.0 + "@rocket.chat/icons": ~0.32.0 "@rocket.chat/instance-status": "workspace:^" "@rocket.chat/jwt": "workspace:^" - "@rocket.chat/layout": next + "@rocket.chat/layout": ~0.31.26 "@rocket.chat/license": "workspace:^" "@rocket.chat/livechat": "workspace:^" "@rocket.chat/log-format": "workspace:^" "@rocket.chat/logger": "workspace:^" - "@rocket.chat/logo": ^0.31.28 - "@rocket.chat/memo": next - "@rocket.chat/message-parser": next + "@rocket.chat/logo": ~0.31.28 + "@rocket.chat/memo": ~0.31.25 + "@rocket.chat/message-parser": ~0.31.27 "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/mp3-encoder": 0.24.0 "@rocket.chat/omnichannel-services": "workspace:^" - "@rocket.chat/onboarding-ui": ^0.32.1 + "@rocket.chat/onboarding-ui": ~0.33.3 "@rocket.chat/password-policies": "workspace:^" "@rocket.chat/pdf-worker": "workspace:^" "@rocket.chat/poplib": "workspace:^" @@ -8692,16 +9496,17 @@ __metadata: "@rocket.chat/server-cloud-communication": "workspace:^" "@rocket.chat/server-fetch": "workspace:^" "@rocket.chat/sha256": "workspace:^" - "@rocket.chat/string-helpers": next + "@rocket.chat/string-helpers": ~0.31.25 "@rocket.chat/tools": "workspace:^" "@rocket.chat/ui-client": "workspace:^" "@rocket.chat/ui-composer": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" - "@rocket.chat/ui-kit": ^0.32.1 + "@rocket.chat/ui-kit": "workspace:~" "@rocket.chat/ui-theming": "workspace:^" "@rocket.chat/ui-video-conf": "workspace:^" "@rocket.chat/web-ui-registration": "workspace:^" "@settlin/spacebars-loader": ^1.0.9 + "@slack/bolt": ^3.14.0 "@slack/rtm-api": ^6.0.0 "@storybook/addon-a11y": 6.5.16 "@storybook/addon-essentials": ~6.5.16 @@ -8710,89 +9515,88 @@ __metadata: "@storybook/addons": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": 0.0.13 - "@swc/core": ^1.3.66 - "@swc/jest": ^0.2.26 + "@swc/core": ^1.3.95 + "@swc/jest": ^0.2.29 "@tanstack/react-query": ^4.16.1 "@tanstack/react-query-devtools": ^4.19.1 "@testing-library/react": ~12.1.5 "@testing-library/react-hooks": ^8.0.1 "@testing-library/user-event": ~13.5.0 - "@types/adm-zip": ^0.5.0 - "@types/archiver": ^5.3.2 - "@types/bad-words": ^3.0.1 - "@types/bcrypt": ^5.0.0 - "@types/body-parser": ^1.19.2 - "@types/busboy": ^1.5.0 - "@types/chai": ^4.3.5 - "@types/chai-as-promised": ^7.1.5 - "@types/chai-datetime": 0.0.37 - "@types/chai-dom": 0.0.13 - "@types/chai-spies": ~1.0.3 - "@types/clipboard": ^2.0.7 - "@types/codemirror": ^5.60.8 - "@types/cookie": ^0.5.1 - "@types/cookie-parser": ^1.4.3 - "@types/cors": ^2.8.13 - "@types/cssom": ^0.4.1 + "@types/adm-zip": ^0.5.3 + "@types/archiver": ^5.3.4 + "@types/bad-words": ^3.0.2 + "@types/bcrypt": ^5.0.1 + "@types/body-parser": ^1.19.4 + "@types/busboy": ^1.5.2 + "@types/chai": ^4.3.9 + "@types/chai-as-promised": ^7.1.7 + "@types/chai-datetime": 0.0.38 + "@types/chai-dom": 1.11.2 + "@types/chai-spies": ~1.0.5 + "@types/codemirror": ^5.60.12 + "@types/cookie": ^0.5.3 + "@types/cookie-parser": ^1.4.5 + "@types/cors": ^2.8.15 + "@types/cssom": ^0.4.2 "@types/dompurify": ^2.3.3 - "@types/ejson": ^2.2.0 - "@types/express": ^4.17.17 + "@types/ejson": ^2.2.1 + "@types/express": ^4.17.20 "@types/express-rate-limit": ^5.1.3 - "@types/fibers": ^3.1.1 - "@types/google-libphonenumber": ^7.4.23 - "@types/gravatar": ^1.8.3 + "@types/fibers": ^3.1.3 + "@types/google-libphonenumber": ^7.4.29 + "@types/gravatar": ^1.8.5 "@types/he": ^1.1.2 - "@types/i18next-sprintf-postprocessor": ^0.2.0 - "@types/imap": ^0.8.37 + "@types/i18next-sprintf-postprocessor": ^0.2.2 + "@types/imap": ^0.8.39 "@types/jsdom": ^16.2.15 - "@types/jsdom-global": ^3.0.4 - "@types/jsrsasign": ^10.5.8 + "@types/jsdom-global": ^3.0.6 + "@types/jsrsasign": ^10.5.11 "@types/katex": ^0.14.0 - "@types/later": ^1.2.7 + "@types/later": ^1.2.8 "@types/ldapjs": ^2.2.5 - "@types/less": ~3.0.3 - "@types/lodash": ^4.14.195 - "@types/lodash.debounce": ^4.0.7 - "@types/lodash.get": ^4.4.7 - "@types/mailparser": ^3.4.0 + "@types/less": ~3.0.5 + "@types/lodash": ^4.14.200 + "@types/lodash.debounce": ^4.0.8 + "@types/lodash.get": ^4.4.8 + "@types/mailparser": ^3.4.3 "@types/marked": ^4.0.8 - "@types/meteor-collection-hooks": ^0.8.6 + "@types/meteor-collection-hooks": ^0.8.8 "@types/mkdirp": ^1.0.2 "@types/mocha": "github:whitecolor/mocha-types" "@types/moment-timezone": ^0.5.30 - "@types/node": ^14.18.51 - "@types/node-gcm": ^1.0.1 - "@types/node-rsa": ^1.1.1 - "@types/nodemailer": ^6.4.8 - "@types/oauth2-server": ^3.0.13 - "@types/object-path": ^0.11.1 - "@types/parseurl": ^1.3.1 - "@types/photoswipe": ^4.1.2 - "@types/prometheus-gc-stats": ^0.6.2 - "@types/proxy-from-env": ^1.0.1 - "@types/proxyquire": ^1.3.28 - "@types/psl": ^1.1.0 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/rewire": ^2.5.28 - "@types/sanitize-html": ^2.9.0 + "@types/node": ^14.18.63 + "@types/node-gcm": ^1.0.3 + "@types/node-rsa": ^1.1.3 + "@types/nodemailer": ^6.4.13 + "@types/oauth2-server": ^3.0.15 + "@types/object-path": ^0.11.3 + "@types/parseurl": ^1.3.2 + "@types/prometheus-gc-stats": ^0.6.3 + "@types/proxy-from-env": ^1.0.3 + "@types/proxyquire": ^1.3.30 + "@types/psl": ^1.1.2 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/rewire": ^2.5.29 + "@types/sanitize-html": ^2.9.3 "@types/semver": ^7.3.10 "@types/sharp": ^0.30.5 - "@types/sinon": ^10.0.15 - "@types/speakeasy": ^2.0.7 - "@types/strict-uri-encode": ^2.0.0 + "@types/sinon": ^10.0.20 + "@types/speakeasy": ^2.0.9 + "@types/strict-uri-encode": ^2.0.1 "@types/string-strip-html": ^5.0.1 - "@types/supertest": ^2.0.12 - "@types/textarea-caret": ^3.0.1 - "@types/ua-parser-js": ^0.7.36 - "@types/use-subscription": ^1.0.0 - "@types/use-sync-external-store": ^0.0.3 + "@types/supertest": ^2.0.15 + "@types/supports-color": ~7.2.0 + "@types/textarea-caret": ^3.0.2 + "@types/ua-parser-js": ^0.7.38 + "@types/use-subscription": ^1.0.1 + "@types/use-sync-external-store": ^0.0.5 "@types/uuid": ^8.3.4 - "@types/xml-crypto": ~1.4.2 - "@types/xml-encryption": ~1.2.1 + "@types/xml-crypto": ~1.4.4 + "@types/xml-encryption": ~1.2.3 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 - "@xmldom/xmldom": ^0.8.8 + "@xmldom/xmldom": ^0.8.10 adm-zip: 0.5.10 ajv: ^8.11.0 ajv-formats: ~2.1.1 @@ -8812,7 +9616,7 @@ __metadata: bson: ^4.6.4 busboy: ^1.6.0 bytebuffer: 5.0.1 - chai: ^4.3.7 + chai: ^4.3.10 chai-as-promised: ^7.1.1 chai-datetime: ^1.8.0 chai-dom: ^1.11.0 @@ -8820,8 +9624,7 @@ __metadata: chalk: ^4.0.0 change-case: ^4.1.2 chart.js: ^3.8.0 - clipboard: ^2.0.11 - codemirror: ^5.65.13 + codemirror: ^5.65.15 colorette: ^2.0.20 colors: ^1.4.0 connect: ^3.7.0 @@ -8846,11 +9649,11 @@ __metadata: eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-import: ~2.26.0 eslint-plugin-no-floating-promise: ~1.0.2 - eslint-plugin-playwright: ~0.15.0 + eslint-plugin-playwright: ~0.15.3 eslint-plugin-prettier: ~4.2.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-testing-library: ~5.11.0 + eslint-plugin-testing-library: ~5.11.1 eslint-plugin-you-dont-need-lodash-underscore: ~6.12.0 eventemitter3: ^4.0.7 exif-be-gone: ^1.3.2 @@ -8863,8 +9666,8 @@ __metadata: file-type: ^16.5.4 filenamify: ^4.3.0 filesize: 9.0.11 - generate-password: ^1.7.0 - google-libphonenumber: ^3.2.32 + generate-password: ^1.7.1 + google-libphonenumber: ^3.2.33 googleapis: ^104.0.0 gravatar: ^1.8.2 he: ^1.2.0 @@ -8872,7 +9675,7 @@ __metadata: hljs9: "npm:highlight.js@^9.18.5" http-proxy-agent: ^5.0.0 human-interval: ^2.0.1 - i18next: ~23.4.5 + i18next: ~23.4.9 i18next-http-backend: ^1.4.5 i18next-sprintf-postprocessor: ^0.2.2 iconv-lite: ^0.6.3 @@ -8881,14 +9684,13 @@ __metadata: ip-range-check: ^0.2.0 is-svg: ^4.3.2 isolated-vm: 4.4.2 - jest: ~29.6.1 - jquery: ^3.6.0 + jest: ~29.6.4 jschardet: ^3.0.0 jsdom: ^16.7.0 jsdom-global: ^3.0.2 jsrsasign: ^10.5.24 juice: ^8.0.0 - katex: ^0.16.7 + katex: ~0.16.9 ldap-escape: ^2.0.6 ldapjs: ^2.3.3 limax: ^3.0.0 @@ -8904,7 +9706,7 @@ __metadata: mime-type: ^4.0.0 mkdirp: ^1.0.4 mocha: ^9.2.2 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment: ^2.29.4 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 @@ -8923,11 +9725,10 @@ __metadata: path: ^0.12.7 path-to-regexp: ^6.2.1 pdfjs-dist: ^2.13.216 - photoswipe: ^4.1.3 pino: ^8.15.0 pino-pretty: ^7.6.1 - playwright-qase-reporter: ^1.2.0-alpha.3 - postcss: ~8.4.24 + playwright-qase-reporter: ^1.2.1 + postcss: ~8.4.31 postcss-custom-properties: ^11.0.0 postcss-easy-import: ^3.0.0 postcss-load-config: ^3.1.4 @@ -8936,28 +9737,28 @@ __metadata: postcss-url: ^10.1.3 postis: ^2.2.0 prettier: ~2.8.8 - prom-client: ^14.0.1 - prometheus-gc-stats: ^0.6.4 + prom-client: ^14.2.0 + prometheus-gc-stats: ^0.6.5 proxy-from-env: ^1.1.0 proxyquire: ^2.1.3 psl: ^1.8.0 query-string: ^7.1.3 queue-fifo: ^0.2.6 - rc-scrollbars: ^1.1.5 + rc-scrollbars: ^1.1.6 react: ~17.0.2 react-aria: ~3.23.1 react-docgen-typescript-plugin: ^1.0.5 react-dom: ~17.0.2 react-error-boundary: ^3.1.4 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 react-keyed-flatten-children: ^1.3.0 react-virtuoso: ^1.11.1 redis: ^4.0.6 rewire: ^6.0.0 sanitize-html: ^2.7.2 semver: ^7.3.7 - sharp: ^0.30.7 + sharp: ^0.32.6 sinon: ^14.0.2 sip.js: ^0.20.1 sodium-native: ^3.3.0 @@ -8970,7 +9771,9 @@ __metadata: stylelint: ^14.9.1 stylelint-order: ^5.0.0 supertest: ^6.2.3 + supports-color: ~7.2.0 suretype: ~2.4.1 + swiper: ^9.3.2 tar-stream: ^1.6.2 template-file: ^6.0.1 textarea-caret: ^3.1.0 @@ -8979,8 +9782,9 @@ __metadata: turndown: ^7.1.2 twilio: ^3.76.1 twit: ^2.2.11 - typescript: ~5.2.2 - ua-parser-js: ^1.0.35 + typescript: ~5.3.2 + typia: ^5.3.3 + ua-parser-js: ^1.0.37 underscore: ^1.13.6 universal-perf-hooks: ^1.0.1 url-polyfill: ^1.1.12 @@ -8988,7 +9792,7 @@ __metadata: use-sync-external-store: ^1.2.0 uuid: ^8.3.2 vm2: ^3.9.19 - webdav: ^4.11.2 + webdav: ^4.11.3 xml-crypto: ~3.1.0 xml-encryption: ~3.0.2 xml2js: ~0.5.0 @@ -9004,14 +9808,14 @@ __metadata: "@rocket.chat/ui-contexts": "workspace:*" "@storybook/react": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - i18next: ~23.4.5 - jest: ~29.6.1 + i18next: ~23.4.9 + jest: ~29.6.4 react: ~17.0.2 - react-i18next: ~13.2.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + react-i18next: ~13.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@tanstack/react-query": "*" react: "*" @@ -9023,13 +9827,13 @@ __metadata: resolution: "@rocket.chat/model-typings@workspace:packages/model-typings" dependencies: "@rocket.chat/core-typings": "workspace:^" - "@types/jest": ~29.5.3 - "@types/node-rsa": ^1.1.1 + "@types/jest": ~29.5.7 + "@types/node-rsa": ^1.1.3 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9038,11 +9842,11 @@ __metadata: resolution: "@rocket.chat/models@workspace:packages/models" dependencies: "@rocket.chat/model-typings": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9061,30 +9865,30 @@ __metadata: dependencies: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/pdf-worker": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next + "@rocket.chat/string-helpers": ~0.31.25 "@rocket.chat/tools": "workspace:^" - "@types/jest": ~29.5.3 - "@types/node": ^14.18.51 + "@types/jest": ~29.5.7 + "@types/node": ^14.18.63 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 eventemitter3: ^4.0.7 fibers: ^5.0.3 - jest: ~29.6.1 + jest: ~29.6.4 mem: ^8.1.1 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.1 pino: ^8.15.0 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9092,10 +9896,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/omnichannel-transcript@workspace:ee/apps/omnichannel-transcript" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" @@ -9104,9 +9908,9 @@ __metadata: "@rocket.chat/pdf-worker": "workspace:^" "@rocket.chat/tools": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 @@ -9115,7 +9919,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.1 @@ -9123,13 +9927,13 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/onboarding-ui@npm:^0.32.1": - version: 0.32.1 - resolution: "@rocket.chat/onboarding-ui@npm:0.32.1" +"@rocket.chat/onboarding-ui@npm:~0.33.3": + version: 0.33.3 + resolution: "@rocket.chat/onboarding-ui@npm:0.33.3" dependencies: i18next: ~21.6.16 react-hook-form: ~7.27.1 @@ -9144,7 +9948,7 @@ __metadata: react: 17.0.2 react-dom: 17.0.2 react-i18next: ~11.15.4 - checksum: 362938332de5d865e12b891288e631e579e1f6f0d8da99004d27d1fc5722e25821b68cb60de8cb51cf8768daae0f9bf68cbd374580e8e8bfdb292f8ed6ee8cb1 + checksum: 18c7e0a78a171086a22aeccde772357f0c06bf561955f3898be0009f2f609698ae67154b91af9841d9a4ae7eb8b2e7ec4ec3e47e8221b35e57fe4ac3adb0d2b7 languageName: node linkType: hard @@ -9152,13 +9956,13 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/password-policies@workspace:packages/password-policies" dependencies: - "@types/chai": ^4.3.5 - "@types/jest": ~29.5.3 - chai: ^4.3.7 + "@types/chai": ^4.3.9 + "@types/jest": ~29.5.7 + chai: ^4.3.10 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9166,29 +9970,29 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/pdf-worker@workspace:ee/packages/pdf-worker" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/fuselage-tokens": ^0.32.0 + "@rocket.chat/fuselage-tokens": ~0.32.0 "@storybook/addon-essentials": ~6.5.16 "@storybook/react": ~6.5.16 "@testing-library/jest-dom": ^5.16.5 "@testing-library/react": ~13.4.0 - "@types/emojione": ^2.2.6 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/testing-library__jest-dom": ~5.14.6 + "@types/emojione": ^2.2.8 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/testing-library__jest-dom": ~5.14.9 emoji-assets: ^7.0.1 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 moment: ^2.29.4 moment-timezone: ^0.5.43 react: ^18.2.0 react-dom: ^18.2.0 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9196,11 +10000,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/poplib@workspace:packages/node-poplib" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9210,15 +10014,15 @@ __metadata: dependencies: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/presence": "workspace:^" - "@rocket.chat/string-helpers": next - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@rocket.chat/string-helpers": ~0.31.25 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -9226,13 +10030,13 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9240,30 +10044,30 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/presence@workspace:ee/packages/presence" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 - "@babel/preset-typescript": ~7.22.5 - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-typescript": ~7.22.15 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@types/node": ^14.18.51 + "@types/node": ^14.18.63 babel-jest: ^29.0.3 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/prettier-config@npm:next": - version: 0.31.17-dev.32 - resolution: "@rocket.chat/prettier-config@npm:0.31.17-dev.32" +"@rocket.chat/prettier-config@npm:~0.31.25": + version: 0.31.25 + resolution: "@rocket.chat/prettier-config@npm:0.31.25" peerDependencies: - prettier: ^2.2.1 - checksum: 9bec76f8dd9b3a7203258b8b07185fb1acdc8c43ed8adea02655aec2fb6794ce232f270504889e1e716f4ac6002d54100cad943a3062e3579578c96f80656a1d + prettier: ~2.7.1 + checksum: 4c0be678e7c161bf132014aa3f986b84f4ec06808b5149f967d52515fb929ee07d073b00a60e197256c8244e02b7e521be20707d6f841de4949d8f516fb8ec09 languageName: node linkType: hard @@ -9271,18 +10075,18 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/queue-worker@workspace:ee/apps/queue-worker" dependencies: - "@react-pdf/renderer": ^3.1.12 + "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/omnichannel-services": "workspace:^" - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 @@ -9291,7 +10095,7 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.1 @@ -9299,7 +10103,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9307,16 +10111,16 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/random@workspace:packages/random" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9324,18 +10128,18 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/release-action@workspace:packages/release-action" dependencies: - "@actions/core": ^1.10.0 + "@actions/core": ^1.10.1 "@actions/exec": ^1.1.1 "@actions/github": ^5.1.1 "@octokit/plugin-throttling": ^6.0.0 "@rocket.chat/eslint-config": "workspace:^" - "@types/node": ^16.18.36 + "@types/node": ^16.18.60 eslint: ~8.45.0 mdast-util-to-string: 2.0.0 remark-parse: 9.0.0 remark-stringify: 9.0.1 semver: ^7.5.2 - typescript: ~5.2.2 + typescript: ~5.3.2 unified: 9.2.2 languageName: unknown linkType: soft @@ -9344,21 +10148,20 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/rest-typings@workspace:packages/rest-typings" dependencies: - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/license": "workspace:^" - "@rocket.chat/message-parser": next - "@rocket.chat/ui-kit": ^0.32.1 - "@types/jest": ~29.5.3 + "@rocket.chat/message-parser": ~0.31.27 + "@rocket.chat/ui-kit": "workspace:~" + "@types/jest": ~29.5.7 ajv: ^8.11.0 ajv-formats: ^2.1.1 eslint: ~8.45.0 - jest: ~29.6.1 - jest-environment-jsdom: ~29.6.1 + jest: ~29.6.4 + jest-environment-jsdom: ~29.6.4 mongodb: ^4.17.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9380,11 +10183,11 @@ __metadata: resolution: "@rocket.chat/server-cloud-communication@workspace:packages/server-cloud-communication" dependencies: "@rocket.chat/license": "workspace:^" - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.1.6 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9392,16 +10195,16 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/server-fetch@workspace:packages/server-fetch" dependencies: - "@types/jest": ~29.5.3 - "@types/proxy-from-env": ^1.0.1 + "@types/jest": ~29.5.7 + "@types/proxy-from-env": ^1.0.3 eslint: ~8.45.0 http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.1 - jest: ~29.6.1 + jest: ~29.6.4 node-fetch: 2.3.0 proxy-from-env: ^1.1.0 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9409,15 +10212,15 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/sha256@workspace:packages/sha256" dependencies: - "@babel/core": ~7.22.9 - "@babel/preset-env": ~7.22.9 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9427,17 +10230,17 @@ __metadata: dependencies: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next - "@types/bcrypt": ^5.0.0 - "@types/gc-stats": ^1 - "@types/node": ^14.18.51 - "@types/polka": ^0.5.4 + "@rocket.chat/string-helpers": ~0.31.25 + "@types/bcrypt": ^5.0.1 + "@types/gc-stats": ^1.4.2 + "@types/node": ^14.18.63 + "@types/polka": ^0.5.6 ejson: ^2.2.3 eslint: ~8.45.0 event-loop-stats: ^1.4.1 @@ -9445,24 +10248,24 @@ __metadata: fibers: ^5.0.3 gc-stats: ^1.4.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.4.0 pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 languageName: unknown linkType: soft -"@rocket.chat/string-helpers@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/string-helpers@npm:0.31.26-dev.19" - checksum: eb8f130f6e264483e1fc64dc3fe88bdb8e2d93ccefd168cacdc96aa8f0a4df27791045a38f33cb8db29dd063191e14c08210d6f187e5e93acde7e2d658b05128 +"@rocket.chat/string-helpers@npm:~0.31.25": + version: 0.31.25 + resolution: "@rocket.chat/string-helpers@npm:0.31.25" + checksum: 9fd3f25a9e87a6c33bea1fb521c51e7e6497ad5f9b695807b8b0b98b3130799924305adaa1ea851f10ed2ffc64af8270f3f14339ac181f64b038cb1fd8f8819f languageName: node linkType: hard -"@rocket.chat/styled@npm:^0.31.25": +"@rocket.chat/styled@npm:^0.31.25, @rocket.chat/styled@npm:~0.31.25": version: 0.31.25 resolution: "@rocket.chat/styled@npm:0.31.25" dependencies: @@ -9471,15 +10274,6 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/styled@npm:next": - version: 0.31.26-dev.19 - resolution: "@rocket.chat/styled@npm:0.31.26-dev.19" - dependencies: - "@rocket.chat/css-in-js": ~0.31.26-dev.19 - checksum: f65cd023bc99af913e2550b39ae21d51da0391699c914a5cabdf556afe1659d22bc70f2924b30084c7cf2547da952750ab96745d6162fcec74ef2b5bbfb8e01a - languageName: node - linkType: hard - "@rocket.chat/stylis-logical-props-middleware@npm:^0.31.25": version: 0.31.25 resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.25" @@ -9491,27 +10285,16 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/stylis-logical-props-middleware@npm:~0.31.26-dev.19": - version: 0.31.26-dev.23 - resolution: "@rocket.chat/stylis-logical-props-middleware@npm:0.31.26-dev.23" - dependencies: - "@rocket.chat/css-supports": ~0.31.26-dev.23 - peerDependencies: - stylis: 4.0.10 - checksum: b2fbfad3b2f4dedd9023b30d4cdc51e76ae76faeeca5819cf697e896c02fd4bb2dde5bbc428b377d77f32011fd8cc82c6d98a84d66b93056ef981c13aee1dc67 - languageName: node - linkType: hard - -"@rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools": +"@rocket.chat/tools@workspace:^, @rocket.chat/tools@workspace:packages/tools, @rocket.chat/tools@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/tools@workspace:packages/tools" dependencies: - "@types/jest": ~29.5.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 moment-timezone: ^0.5.43 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 languageName: unknown linkType: soft @@ -9519,11 +10302,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-client@workspace:packages/ui-client" dependencies: - "@babel/core": ~7.22.9 - "@rocket.chat/css-in-js": next - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/icons": ^0.32.0 + "@babel/core": ~7.22.20 + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/icons": ~0.32.0 "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/ui-contexts": "workspace:~" "@storybook/addon-actions": ~6.5.16 @@ -9536,32 +10319,32 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/jest": ^0.2.26 + "@swc/jest": ^0.2.29 "@testing-library/jest-dom": ~5.16.5 - "@testing-library/react": ^12.1.2 + "@testing-library/react": ^12.1.5 "@testing-library/react-hooks": ^8.0.1 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 eslint: ~8.45.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - eslint-plugin-testing-library: ~5.11.0 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + eslint-plugin-testing-library: ~5.11.1 + jest: ~29.6.4 react: ^17.0.2 react-dom: ^17.0.2 react-hook-form: ~7.45.4 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 2.0.0 + "@rocket.chat/ui-contexts": 3.0.2 react: ~17.0.2 languageName: unknown linkType: soft @@ -9570,10 +10353,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-composer@workspace:packages/ui-composer" dependencies: - "@babel/core": ~7.22.9 + "@babel/core": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/icons": ^0.32.0 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/icons": ~0.32.0 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 "@storybook/addon-essentials": ~6.5.16 @@ -9581,16 +10364,16 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/icons": "*" @@ -9604,48 +10387,68 @@ __metadata: resolution: "@rocket.chat/ui-contexts@workspace:packages/ui-contexts" dependencies: "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next - "@rocket.chat/fuselage-hooks": ^0.32.1 + "@rocket.chat/emitter": ~0.31.25 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/i18n": "workspace:~" "@rocket.chat/password-policies": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 - "@types/react-dom": ~17.0.20 - "@types/use-sync-external-store": ^0.0.3 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 + "@types/use-sync-external-store": ^0.0.5 eslint: ~8.45.0 eslint-plugin-react-hooks: ^4.6.0 - jest: ~29.6.1 + jest: ~29.6.4 mongodb: ^4.17.1 react: ~17.0.2 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 use-sync-external-store: ^1.2.0 peerDependencies: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/ddp-client": "workspace:^" "@rocket.chat/emitter": "*" "@rocket.chat/fuselage-hooks": "*" + "@rocket.chat/i18n": "workspace:~" "@rocket.chat/rest-typings": "workspace:^" react: ~17.0.2 use-sync-external-store: ^1.2.0 languageName: unknown linkType: soft -"@rocket.chat/ui-kit@npm:^0.32.1": - version: 0.32.1 - resolution: "@rocket.chat/ui-kit@npm:0.32.1" - checksum: dec0d2ebc23786dae2dc62d598b89482abbd810a71527ba99a5fb0f36e3de51647e4ab13a0bb514d760156f92780c22a88317701d886fd934d848c0fd5961579 - languageName: node - linkType: hard +"@rocket.chat/ui-kit@workspace:packages/ui-kit, @rocket.chat/ui-kit@workspace:~": + version: 0.0.0-use.local + resolution: "@rocket.chat/ui-kit@workspace:packages/ui-kit" + dependencies: + "@babel/core": ~7.21.4 + "@babel/eslint-parser": ~7.23.3 + "@babel/plugin-transform-runtime": ~7.21.4 + "@babel/preset-env": ~7.21.4 + "@rocket.chat/eslint-config": "workspace:~" + "@types/jest": ~29.5.0 + babel-loader: ~9.1.2 + eslint: ~8.45.0 + jest: ~29.5.0 + npm-run-all: ~4.1.5 + prettier: ~2.8.8 + rimraf: ~3.0.2 + ts-jest: ~29.1.1 + ts-loader: ~9.4.2 + ts-node: ~10.9.1 + ts-patch: ~3.0.2 + typescript: ~5.3.2 + typia: ~5.3.3 + languageName: unknown + linkType: soft "@rocket.chat/ui-theming@workspace:^, @rocket.chat/ui-theming@workspace:ee/packages/ui-theming": version: 0.0.0-use.local resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming" dependencies: - "@rocket.chat/css-in-js": next - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/icons": ^0.32.0 + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/icons": ~0.32.0 "@rocket.chat/ui-contexts": "workspace:~" "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -9657,18 +10460,18 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 eslint: ~8.45.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-testing-library: ^5.11.0 - jest: ~29.6.1 + eslint-plugin-testing-library: ^5.11.1 + jest: ~29.6.4 react: ~17.0.2 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" @@ -9682,14 +10485,14 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-video-conf@workspace:packages/ui-video-conf" dependencies: - "@babel/core": ~7.22.9 - "@rocket.chat/css-in-js": next - "@rocket.chat/emitter": next + "@babel/core": ~7.22.20 + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/styled": next + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-contexts": "workspace:^" "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -9698,23 +10501,23 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@types/babel__core": ~7.20.1 - "@types/jest": ~29.5.3 + "@types/babel__core": ~7.20.3 + "@types/jest": ~29.5.7 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-storybook: ~0.6.12 - jest: ~29.6.1 + eslint-plugin-storybook: ~0.6.15 + jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-contexts": 2.0.0 + "@rocket.chat/ui-contexts": 3.0.2 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -9728,27 +10531,27 @@ __metadata: "@codemirror/lang-json": ^6.0.1 "@codemirror/tooltip": ^0.19.16 "@lezer/highlight": ^1.1.6 - "@rocket.chat/css-in-js": next - "@rocket.chat/fuselage": ^0.35.0 - "@rocket.chat/fuselage-hooks": ^0.32.1 - "@rocket.chat/fuselage-polyfills": next - "@rocket.chat/fuselage-tokens": ^0.32.0 + "@rocket.chat/css-in-js": ~0.31.25 + "@rocket.chat/fuselage": ^0.42.0 + "@rocket.chat/fuselage-hooks": ~0.32.1 + "@rocket.chat/fuselage-polyfills": ~0.31.25 + "@rocket.chat/fuselage-tokens": ~0.32.0 "@rocket.chat/fuselage-ui-kit": "workspace:~" - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/logo": ^0.31.28 - "@rocket.chat/styled": next + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/logo": ~0.31.28 + "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-contexts": "workspace:~" - "@types/react": ~17.0.62 - "@types/react-beautiful-dnd": ^13.1.4 - "@types/react-dom": ~17.0.20 - "@types/use-subscription": ^1.0.0 + "@types/react": ~17.0.69 + "@types/react-beautiful-dnd": ^13.1.6 + "@types/react-dom": ~17.0.22 + "@types/use-subscription": ^1.0.1 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 "@vitejs/plugin-react": ^4.0.0 codemirror: ^6.0.1 eslint: ~8.45.0 eslint-plugin-react-hooks: ^4.6.0 - eslint-plugin-react-refresh: ^0.4.1 + eslint-plugin-react-refresh: ^0.4.4 eslint4b-prebuilt: ^6.7.2 rc-scrollbars: ^1.1.6 react: ^17.0.2 @@ -9757,7 +10560,7 @@ __metadata: react-router-dom: ^6.11.2 react-split-pane: ^0.1.92 react-virtuoso: ^4.3.10 - typescript: ~5.2.2 + typescript: ~5.3.2 use-subscription: ^1.8.0 vite: ^4.3.9 languageName: unknown @@ -9767,13 +10570,14 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/web-ui-registration@workspace:packages/web-ui-registration" dependencies: - "@babel/core": ~7.22.10 - "@babel/preset-env": ~7.22.10 - "@babel/preset-react": ~7.22.5 - "@babel/preset-typescript": ~7.22.5 + "@babel/core": ~7.22.20 + "@babel/preset-env": ~7.22.20 + "@babel/preset-react": ~7.22.15 + "@babel/preset-typescript": ~7.22.15 "@rocket.chat/i18n": "workspace:~" - "@rocket.chat/layout": next + "@rocket.chat/layout": ~0.31.26 "@rocket.chat/mock-providers": "workspace:~" + "@rocket.chat/tools": "workspace:~" "@rocket.chat/ui-client": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" "@storybook/addon-actions": ~6.5.16 @@ -9782,23 +10586,24 @@ __metadata: "@storybook/builder-webpack4": ~6.5.16 "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 - "@storybook/testing-library": ^0.2.0 + "@storybook/testing-library": ^0.2.2 "@tanstack/react-query": ^4.16.1 "@testing-library/react": ^13.3.0 - "@types/jest": ~29.5.3 - "@types/react": ~17.0.62 + "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 babel-loader: ~8.3.0 eslint: ~8.45.0 - jest: ~29.6.1 + jest: ~29.6.4 react: ~17.0.2 react-hook-form: ~7.45.4 - react-i18next: ~13.2.1 + react-i18next: ~13.2.2 storybook-dark-mode: ~3.0.1 - ts-jest: ~29.0.5 - typescript: ~5.2.2 + ts-jest: ~29.1.1 + typescript: ~5.3.2 peerDependencies: "@rocket.chat/layout": "*" - "@rocket.chat/ui-contexts": 2.0.0 + "@rocket.chat/tools": "*" + "@rocket.chat/ui-contexts": 3.0.2 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" @@ -9906,6 +10711,29 @@ __metadata: languageName: node linkType: hard +"@slack/bolt@npm:^3.14.0": + version: 3.14.0 + resolution: "@slack/bolt@npm:3.14.0" + dependencies: + "@slack/logger": ^4.0.0 + "@slack/oauth": ^2.6.1 + "@slack/socket-mode": ^1.3.2 + "@slack/types": ^2.8.0 + "@slack/web-api": ^6.7.1 + "@types/express": ^4.16.1 + "@types/promise.allsettled": ^1.0.3 + "@types/tsscmp": ^1.0.0 + axios: ^0.27.2 + express: ^4.16.4 + path-to-regexp: ^6.2.1 + please-upgrade-node: ^3.2.0 + promise.allsettled: ^1.0.2 + raw-body: ^2.3.3 + tsscmp: ^1.0.6 + checksum: 2f8775cc244b09b5f74d0586f94acca2e86b1d68d695839a1951b77a75e874a64aa7ce0b09305d53edfb37e8b8beb802cd55524f1e39c70dc60b229705177497 + languageName: node + linkType: hard + "@slack/logger@npm:>=1.0.0 <3.0.0": version: 2.0.0 resolution: "@slack/logger@npm:2.0.0" @@ -9915,6 +10743,38 @@ __metadata: languageName: node linkType: hard +"@slack/logger@npm:^3.0.0": + version: 3.0.0 + resolution: "@slack/logger@npm:3.0.0" + dependencies: + "@types/node": ">=12.0.0" + checksum: 6512d0e9e4be47ea465705ab9b6e6901f36fa981da0d4a657fde649d452b567b351002049b5ee0a22569b5119bf6c2f61befd5b8022d878addb7a99c91b03389 + languageName: node + linkType: hard + +"@slack/logger@npm:^4.0.0": + version: 4.0.0 + resolution: "@slack/logger@npm:4.0.0" + dependencies: + "@types/node": ">=18.0.0" + checksum: dc79e9d2032c4bf9ce01d96cc72882f003dd376d036f172d4169662cfc2c9b384a80d5546b06021578dd473e7059f064303f0ba851eeb153387f2081a1e3062e + languageName: node + linkType: hard + +"@slack/oauth@npm:^2.6.1": + version: 2.6.1 + resolution: "@slack/oauth@npm:2.6.1" + dependencies: + "@slack/logger": ^3.0.0 + "@slack/web-api": ^6.3.0 + "@types/jsonwebtoken": ^8.3.7 + "@types/node": ">=12" + jsonwebtoken: ^9.0.0 + lodash.isstring: ^4.0.1 + checksum: d86baf8e729f94d108c6fb2c94bd9553dd5070232d6c86da9399769abed69abab84dad6e47b4aeebab140fc4911b7c8e2941ea370ab87149e487092c66e6c348 + languageName: node + linkType: hard + "@slack/rtm-api@npm:^6.0.0": version: 6.0.0 resolution: "@slack/rtm-api@npm:6.0.0" @@ -9933,6 +10793,24 @@ __metadata: languageName: node linkType: hard +"@slack/socket-mode@npm:^1.3.2": + version: 1.3.2 + resolution: "@slack/socket-mode@npm:1.3.2" + dependencies: + "@slack/logger": ^3.0.0 + "@slack/web-api": ^6.2.3 + "@types/node": ">=12.0.0" + "@types/p-queue": ^2.3.2 + "@types/ws": ^7.4.7 + eventemitter3: ^3.1.0 + finity: ^0.5.4 + p-cancelable: ^1.1.0 + p-queue: ^2.4.2 + ws: ^7.5.3 + checksum: ab955ed97798e3c13973f984c1eaa2f58a542af0fc6b0ecc6210f049bdb01a6f2b8705312a4e04ff999f27f190e483d14610d12c7d41004ba2bd0e31c23caf16 + languageName: node + linkType: hard + "@slack/types@npm:^1.7.0": version: 1.10.0 resolution: "@slack/types@npm:1.10.0" @@ -9940,6 +10818,13 @@ __metadata: languageName: node linkType: hard +"@slack/types@npm:^2.8.0": + version: 2.9.0 + resolution: "@slack/types@npm:2.9.0" + checksum: 98fc451928865c65526311189bdb91364834bd071cabd960657838bda6aa1b5918e5b92a6b89967457bcbafe59f420b7d0b642ce6add3e32c5ad2935e57fcd51 + languageName: node + linkType: hard + "@slack/web-api@npm:^5.3.0": version: 5.15.0 resolution: "@slack/web-api@npm:5.15.0" @@ -9958,6 +10843,25 @@ __metadata: languageName: node linkType: hard +"@slack/web-api@npm:^6.2.3, @slack/web-api@npm:^6.3.0, @slack/web-api@npm:^6.7.1": + version: 6.9.0 + resolution: "@slack/web-api@npm:6.9.0" + dependencies: + "@slack/logger": ^3.0.0 + "@slack/types": ^2.8.0 + "@types/is-stream": ^1.1.0 + "@types/node": ">=12.0.0" + axios: ^0.27.2 + eventemitter3: ^3.1.0 + form-data: ^2.5.0 + is-electron: 2.2.2 + is-stream: ^1.1.0 + p-queue: ^6.6.1 + p-retry: ^4.0.0 + checksum: 534518ac573f55bcaead562620dc173e6569bdcf4974f953df22feab06012eceff8a63a5f858da1185b1c237a764b07c44254adc55e450d059a05b6aaee17b0b + languageName: node + linkType: hard + "@storybook/addon-a11y@npm:6.5.16": version: 6.5.16 resolution: "@storybook/addon-a11y@npm:6.5.16" @@ -11260,7 +12164,7 @@ __metadata: "@storybook/react-docgen-typescript-plugin@patch:@storybook/react-docgen-typescript-plugin@npm%3A1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0#./.yarn/patches/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40.patch::locator=rocket.chat%40workspace%3A.": version: 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0 - resolution: "@storybook/react-docgen-typescript-plugin@patch:@storybook/react-docgen-typescript-plugin@npm%3A1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0#./.yarn/patches/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40.patch::version=1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0&hash=c5d5d9&locator=rocket.chat%40workspace%3A." + resolution: "@storybook/react-docgen-typescript-plugin@patch:@storybook/react-docgen-typescript-plugin@npm%3A1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0#./.yarn/patches/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40.patch::version=1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0&hash=0878d5&locator=rocket.chat%40workspace%3A." dependencies: debug: ^4.1.1 endent: ^2.0.1 @@ -11463,14 +12367,14 @@ __metadata: languageName: node linkType: hard -"@storybook/testing-library@npm:^0.2.0": - version: 0.2.0 - resolution: "@storybook/testing-library@npm:0.2.0" +"@storybook/testing-library@npm:^0.2.2": + version: 0.2.2 + resolution: "@storybook/testing-library@npm:0.2.2" dependencies: "@testing-library/dom": ^9.0.0 - "@testing-library/user-event": ^14.0.0 + "@testing-library/user-event": ^14.4.0 ts-dedent: ^2.2.0 - checksum: 1c1c16aea6f961de344f5d43bdfd2847bc5f44df1037c2e1383312bb6b842e2c17a805670fc9cfe1a8425f9e48e240fe5d025ab3d4802a198cfe9eb6ed8e7636 + checksum: 8ccdc1fbbb3472264c56b0aaf2f1c5d273f1ae9b230a53adf9cf82bf82c1a555550894f0e8869c206fa07b1fe8423da4d56590377756c58de3ec560b35a96c46 languageName: node linkType: hard @@ -11541,90 +12445,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-darwin-arm64@npm:1.3.66" +"@swc/core-darwin-arm64@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-darwin-arm64@npm:1.3.95" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-darwin-x64@npm:1.3.66" +"@swc/core-darwin-x64@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-darwin-x64@npm:1.3.95" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.66" +"@swc/core-linux-arm-gnueabihf@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.95" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.66" +"@swc/core-linux-arm64-gnu@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.95" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.66" +"@swc/core-linux-arm64-musl@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.95" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.66" +"@swc/core-linux-x64-gnu@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.95" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-linux-x64-musl@npm:1.3.66" +"@swc/core-linux-x64-musl@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-linux-x64-musl@npm:1.3.95" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.66" +"@swc/core-win32-arm64-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.95" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.66" +"@swc/core-win32-ia32-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.95" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.66": - version: 1.3.66 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.66" +"@swc/core-win32-x64-msvc@npm:1.3.95": + version: 1.3.95 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.95" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.66": - version: 1.3.66 - resolution: "@swc/core@npm:1.3.66" +"@swc/core@npm:^1.3.95": + version: 1.3.95 + resolution: "@swc/core@npm:1.3.95" dependencies: - "@swc/core-darwin-arm64": 1.3.66 - "@swc/core-darwin-x64": 1.3.66 - "@swc/core-linux-arm-gnueabihf": 1.3.66 - "@swc/core-linux-arm64-gnu": 1.3.66 - "@swc/core-linux-arm64-musl": 1.3.66 - "@swc/core-linux-x64-gnu": 1.3.66 - "@swc/core-linux-x64-musl": 1.3.66 - "@swc/core-win32-arm64-msvc": 1.3.66 - "@swc/core-win32-ia32-msvc": 1.3.66 - "@swc/core-win32-x64-msvc": 1.3.66 + "@swc/core-darwin-arm64": 1.3.95 + "@swc/core-darwin-x64": 1.3.95 + "@swc/core-linux-arm-gnueabihf": 1.3.95 + "@swc/core-linux-arm64-gnu": 1.3.95 + "@swc/core-linux-arm64-musl": 1.3.95 + "@swc/core-linux-x64-gnu": 1.3.95 + "@swc/core-linux-x64-musl": 1.3.95 + "@swc/core-win32-arm64-msvc": 1.3.95 + "@swc/core-win32-ia32-msvc": 1.3.95 + "@swc/core-win32-x64-msvc": 1.3.95 + "@swc/counter": ^0.1.1 + "@swc/types": ^0.1.5 peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -11651,7 +12557,14 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: e6029c648ba47c522bed51a9f2fee606f82de1f9233e2e89197e43b0a4867054174ca05e825e688cdc4de332221c0da2e12ba7ba875549e8b5432aa70fe19263 + checksum: 49856ad64fa16151f7f784956c8134060c5ed612c9b3fcb79e33676c77219f61fa3bb6b9e0dd15d78c7bff92cacc0c944d2b4e60849eb93caca917a8544b1c2c + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.1": + version: 0.1.2 + resolution: "@swc/counter@npm:0.1.2" + checksum: 8427c594f1f0cf44b83885e9c8fe1e370c9db44ae96e07a37c117a6260ee97797d0709483efbcc244e77bac578690215f45b23254c4cd8a70fb25ddbb50bf33e languageName: node linkType: hard @@ -11664,15 +12577,22 @@ __metadata: languageName: node linkType: hard -"@swc/jest@npm:^0.2.26": - version: 0.2.26 - resolution: "@swc/jest@npm:0.2.26" +"@swc/jest@npm:^0.2.29": + version: 0.2.29 + resolution: "@swc/jest@npm:0.2.29" dependencies: "@jest/create-cache-key-function": ^27.4.2 jsonc-parser: ^3.2.0 peerDependencies: "@swc/core": "*" - checksum: 771821ed08cf168ca0b6307dee7689253d0af0685acd08408ac431860a7c42ace892db2cb6bb6dcfe297edbdce0f2e22d44ed4ed72d1c621be9e841cffd408a0 + checksum: 9eaad322310f34e81f67d41411a7d60663341af1bd9fb65456faa914c936d849d6f643fa3b942a187d52e71e62c33097098c639d25c2047fa874f49bf51cec76 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b languageName: node linkType: hard @@ -11797,7 +12717,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^12.1.2, @testing-library/react@npm:~12.1.5": +"@testing-library/react@npm:^12.1.5, @testing-library/react@npm:~12.1.5": version: 12.1.5 resolution: "@testing-library/react@npm:12.1.5" dependencies: @@ -11836,12 +12756,12 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^14.0.0": - version: 14.4.3 - resolution: "@testing-library/user-event@npm:14.4.3" +"@testing-library/user-event@npm:^14.4.0": + version: 14.5.1 + resolution: "@testing-library/user-event@npm:14.5.1" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 852c48ea6db1c9471b18276617c84fec4320771e466cd58339a732ca3fd73ad35e5a43ae14f51af51a8d0a150dcf60fcaab049ef367871207bea8f92c4b8195e + checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519 languageName: node linkType: hard @@ -11901,21 +12821,21 @@ __metadata: languageName: node linkType: hard -"@types/adm-zip@npm:^0.5.0": - version: 0.5.0 - resolution: "@types/adm-zip@npm:0.5.0" +"@types/adm-zip@npm:^0.5.3": + version: 0.5.3 + resolution: "@types/adm-zip@npm:0.5.3" dependencies: "@types/node": "*" - checksum: 11dd013584e47d431bdf7c115b73cd3162c1a1eca0fbb911f691c9734e904cfe4a01ac1d2d3cbf76d0a952e01fcce8a01fd6fb1c150675a29d740a7fb15325b2 + checksum: 995e21441cc6fe180f12ebf4e722bc6dbde0f9c765e57353018a0969a27cf15542c3f5451bfa1a82b958d5ed5e371fb3cbe55f934076dae22d8bf6a259a536bf languageName: node linkType: hard -"@types/archiver@npm:^5.3.2": - version: 5.3.2 - resolution: "@types/archiver@npm:5.3.2" +"@types/archiver@npm:^5.3.4": + version: 5.3.4 + resolution: "@types/archiver@npm:5.3.4" dependencies: "@types/readdir-glob": "*" - checksum: 9db5b4fdc1740fa07d08340ed827598cc6eda97406ac18a06a158670c7124d4120650a3b9cd660e9e39b42f033cf8f052566da32681e8ad91163473df88a3c4c + checksum: 4ef27b99091ada9b8f13017d5b9e6d42a439e35a7858b30e040c408e081d98d8db6307b0762500288b5da38cab9823c4756b6abae1fdd2658d42bfb09eb7c5fb languageName: node linkType: hard @@ -11933,16 +12853,16 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7, @types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:~7.20.1": - version: 7.20.1 - resolution: "@types/babel__core@npm:7.20.1" +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.3, @types/babel__core@npm:~7.20.3": + version: 7.20.3 + resolution: "@types/babel__core@npm:7.20.3" dependencies: "@babel/parser": ^7.20.7 "@babel/types": ^7.20.7 "@types/babel__generator": "*" "@types/babel__template": "*" "@types/babel__traverse": "*" - checksum: 9fcd9691a33074802d9057ff70b0e3ff3778f52470475b68698a0f6714fbe2ccb36c16b43dc924eb978cd8a81c1f845e5ff4699e7a47606043b539eb8c6331a8 + checksum: 8d14acc14d99b4b8bf36c00da368f6d597bd9ae3344aa7048f83f0f701b0463fa7c7bf2e50c3e4382fdbcfd1e4187b3452a0f0888b0f3ae8fad975591f7bdb94 languageName: node linkType: hard @@ -11955,10 +12875,10 @@ __metadata: languageName: node linkType: hard -"@types/babel__preset-env@npm:^7": - version: 7.9.2 - resolution: "@types/babel__preset-env@npm:7.9.2" - checksum: a905ed92a3f602384966153e74a94790425e98af54e392a7fcfb5c5ded2f2a58c49a9fa64a0cb506fbffb8169ad25b56ea87983c812a4fb880f0716668c8c085 +"@types/babel__preset-env@npm:^7.9.4": + version: 7.9.4 + resolution: "@types/babel__preset-env@npm:7.9.4" + checksum: a4580b541d4fe7bdf9ecb9695cb90827f96c75e5c807e6fcf6cbca3beeb9106019dc322b2d08de03025d57c6f3f1431d80eb3ea6d9416e90bc8ee15460efa27d languageName: node linkType: hard @@ -11981,29 +12901,29 @@ __metadata: languageName: node linkType: hard -"@types/bad-words@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/bad-words@npm:3.0.1" - checksum: c700fadd2bafef153812137220466ca3148425228915ddb6e7e80bc339fa983d2ddef098cacf00196fbd7467181ae5b9747d8fd383fc5ed17f8bf5e62e89d425 +"@types/bad-words@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/bad-words@npm:3.0.2" + checksum: aa40d10364b73deb5617c0b53d5a782841ddd173e6cc68bc41d48c2c95c63ac81d23e2cabeb3d686cb7d655512353ac1866135203305b820d4c60859635ba9d3 languageName: node linkType: hard -"@types/bcrypt@npm:^5.0.0": - version: 5.0.0 - resolution: "@types/bcrypt@npm:5.0.0" +"@types/bcrypt@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/bcrypt@npm:5.0.1" dependencies: "@types/node": "*" - checksum: 063c32c7a519d64768dfc0169a319b8244d6a6cb50a355c93992b3c5fee1dbc236526a1111f0e7bb25abc8b0473e5f40a5edfeb8b33cad2a6ea35aa2d7d7db14 + checksum: 2419ad2e7601b2c306ce2bd8bd8d911770f1abdea780efd4e61e9329b757e47c80fbd73fc52a925a371de47247ce92f04d11bdf24b8b44754ea0ba18d06d2202 languageName: node linkType: hard -"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.2": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" +"@types/body-parser@npm:*, @types/body-parser@npm:^1.19.4": + version: 1.19.4 + resolution: "@types/body-parser@npm:1.19.4" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 10accc30773319bd49af7d12d2cd5faf9a0293ea4764345297f26ba6ef31d5caa7609da7619584d6c61279e09b89d3ab13d28c5cb644807c5d9c722ae1454778 languageName: node linkType: hard @@ -12016,55 +12936,55 @@ __metadata: languageName: node linkType: hard -"@types/busboy@npm:^1.5.0": - version: 1.5.0 - resolution: "@types/busboy@npm:1.5.0" +"@types/busboy@npm:^1.5.2": + version: 1.5.2 + resolution: "@types/busboy@npm:1.5.2" dependencies: "@types/node": "*" - checksum: ffa7bf25c0395f6927526b7d97e70cd2df789e4ca0d231e41855fb08542fa236891ce457d83cc50cac6e5cef6be092ab80597070dcf1413f736462690a23e987 + checksum: d2cfa334e06ce0fbeb31bdac7b4ba051b85e508f4f46d016e55488a717c626e19285f0e2fae40d0183d0f676dd162ab9216613799f83d40430e1996fba4bfb2f languageName: node linkType: hard -"@types/chai-as-promised@npm:^7.1.5": - version: 7.1.5 - resolution: "@types/chai-as-promised@npm:7.1.5" +"@types/chai-as-promised@npm:^7.1.7": + version: 7.1.7 + resolution: "@types/chai-as-promised@npm:7.1.7" dependencies: "@types/chai": "*" - checksum: 7c1345c6e32513d52d8e562ec173c23161648d6b792046525f18803a9932d7b3ad3dca8f0181e3c529ec42b106099f174e34edeb184d61dc93e32c98b5132fd4 + checksum: 59199afbd91289588648e263d7f32f7d72fa9c0075f3c17b1e760e10fdc1a310c2170a392b0d17d96cfff2c51daca72839eed6d80142f9230c9784b8e08ba676 languageName: node linkType: hard -"@types/chai-datetime@npm:0.0.37": - version: 0.0.37 - resolution: "@types/chai-datetime@npm:0.0.37" +"@types/chai-datetime@npm:0.0.38": + version: 0.0.38 + resolution: "@types/chai-datetime@npm:0.0.38" dependencies: "@types/chai": "*" - checksum: c55cb13f7359f670849d0f313517d4c3f1f5ff4e82851b9643a0aeda426666e40a43b99518c02c877bc533c6180196f68fc48e077f37487e8b71f3a4b1855272 + checksum: 2c0269e91a282ef71fe5603a94b6df4c3b784e3ded25f380ed91c0d91c26d08ac33da6bde903bc9bddfec4636455378c26810947a989ef87fe37078213e350ca languageName: node linkType: hard -"@types/chai-dom@npm:0.0.13": - version: 0.0.13 - resolution: "@types/chai-dom@npm:0.0.13" +"@types/chai-dom@npm:1.11.2": + version: 1.11.2 + resolution: "@types/chai-dom@npm:1.11.2" dependencies: "@types/chai": "*" - checksum: 94820d5d086eb339af62c74c17f79640b86b1f70818e366bff943826b5d28400a4a97f1b8740ae7727f93ebe9887bc9b5a3ae4aab4a5be420f8cdb4bd5eaef0e + checksum: d59a90bf2b497797178d3a5bd17f242caaf6ee098563142fdc765a6c12786f94bc0a9b8e4023de37ef8c803198ce9562823651610b02c80f1e21a29f2ece80fd languageName: node linkType: hard -"@types/chai-spies@npm:~1.0.3": - version: 1.0.3 - resolution: "@types/chai-spies@npm:1.0.3" +"@types/chai-spies@npm:~1.0.5": + version: 1.0.5 + resolution: "@types/chai-spies@npm:1.0.5" dependencies: "@types/chai": "*" - checksum: f88b1a021c1f6c37259adf4268b00401431633027995725a49c44658b0fedf7ec09aa4e26e59fdf6564df0767a0b105b26a4a9c8a7c6acaf9ba417b06a4c9c70 + checksum: d8009e0e4bf78fdce4a6824d43a2e206ddc0c07e3869f5d55ed7a7476c5623f77d0a5f444148ce7a0b9d9f47592fe3f0c6652952e6a0f514d8603cbb2e587cd4 languageName: node linkType: hard -"@types/chai@npm:*, @types/chai@npm:^4.3.5": - version: 4.3.5 - resolution: "@types/chai@npm:4.3.5" - checksum: c8f26a88c6b5b53a3275c7f5ff8f107028e3cbb9ff26795fff5f3d9dea07106a54ce9e2dce5e40347f7c4cc35657900aaf0c83934a25a1ae12e61e0f5516e431 +"@types/chai@npm:*, @types/chai@npm:^4.3.9": + version: 4.3.9 + resolution: "@types/chai@npm:4.3.9" + checksum: 2300a2c7abd4cb590349927a759b3d0172211a69f363db06e585faf7874a47f125ef3b364cce4f6190e3668147587fc11164c791c9560cf9bce8478fb7019610 languageName: node linkType: hard @@ -12077,30 +12997,21 @@ __metadata: languageName: node linkType: hard -"@types/chart.js@npm:^2.9.37": - version: 2.9.37 - resolution: "@types/chart.js@npm:2.9.37" +"@types/chart.js@npm:^2.9.39": + version: 2.9.39 + resolution: "@types/chart.js@npm:2.9.39" dependencies: moment: ^2.10.2 - checksum: 5626a8cc3b410c9f2668ee7efd5b1b408f7de814608f83f9fdb349f59e3c7f5eb7199e73b41e6634c24b4ccb8d3846b290264df8d4224d184f63b095f82cfb94 + checksum: c19cab03143db9cabc9c7277b77a974634baa9a9554dc95a7d2996091ac88ca9d98718e701446932a4cf0b8f3c2862ad0d3f232e1deb6a9bdf72d9ef5342582d languageName: node linkType: hard -"@types/clipboard@npm:^2.0.7": - version: 2.0.7 - resolution: "@types/clipboard@npm:2.0.7" - dependencies: - clipboard: "*" - checksum: 9ab127a8a60a72fab044ae634da4d766fdf0242c06feca5c1b22f128e7cbebafc7dc89fce5e9e4251c5a93f35a608f71d0e9d251d9591d03f667703801c8a914 - languageName: node - linkType: hard - -"@types/codemirror@npm:^5.60.8": - version: 5.60.8 - resolution: "@types/codemirror@npm:5.60.8" +"@types/codemirror@npm:^5.60.12": + version: 5.60.12 + resolution: "@types/codemirror@npm:5.60.12" dependencies: "@types/tern": "*" - checksum: bc3a63eab0308b3ef5ed2ca22afb7f1c0b8acde6477e1d569df7e93f3fe4f78754d28a3e081c72931259fe1bf906a319b54bcdeba74600b989e5558d32478496 + checksum: dff22f32ea42ccd3f9bfcf408631f94a11ffb4614ff4fa8cc55adf7da6e7ba96650533b8dd27d037242747bdaa85141e93520f84409db7bc394862a174a10e1e languageName: node linkType: hard @@ -12123,19 +13034,19 @@ __metadata: languageName: node linkType: hard -"@types/cookie-parser@npm:^1.4.3": - version: 1.4.3 - resolution: "@types/cookie-parser@npm:1.4.3" +"@types/cookie-parser@npm:^1.4.5": + version: 1.4.5 + resolution: "@types/cookie-parser@npm:1.4.5" dependencies: "@types/express": "*" - checksum: f390f3af1b1711190dee2c2ecd9af33af81fbde8d81ee820dadb6fe1e0d80c3faba40af37c6ed36fb88b04b64870f6a021f7e9edceecd17c42fe22abe0af5005 + checksum: 45855721706d6a57bb0441db11fb59db407414ea83a0000a0df80d19230447cc3bcc43c436397bfb8998ec78db222265fa8083456b00c5b5054a0c03d06f0086 languageName: node linkType: hard -"@types/cookie@npm:^0.5.1": - version: 0.5.1 - resolution: "@types/cookie@npm:0.5.1" - checksum: 9a8d60fc84797122bc399d6bd330fe5780dc7aab032321de705049ea925339f74658bfa418de483a625d51858770efef58df633ff2e20f1bdf7fbd74a52847e2 +"@types/cookie@npm:^0.5.3": + version: 0.5.3 + resolution: "@types/cookie@npm:0.5.3" + checksum: b785618f6b2fdceb6a20a17e1dfe99651b1e5c2c079f486de76dfb21b508f09d91913755e4a6dbdfe628882ea32466bb2e9318b114ce34efa5e624356494fcab languageName: node linkType: hard @@ -12146,35 +13057,116 @@ __metadata: languageName: node linkType: hard -"@types/cors@npm:^2.8.13": - version: 2.8.13 - resolution: "@types/cors@npm:2.8.13" +"@types/cors@npm:^2.8.15": + version: 2.8.15 + resolution: "@types/cors@npm:2.8.15" dependencies: "@types/node": "*" - checksum: 7ef197ea19d2e5bf1313b8416baa6f3fd6dd887fd70191da1f804f557395357dafd8bc8bed0ac60686923406489262a7c8a525b55748f7b2b8afa686700de907 + checksum: ef7b0aba4c6a4c1fe9d459bd471ebaa891a75319682c9248daa17720003d1d0d2c59de4bdb6868630596ade9b7c3c949e652d6141b14c6fe4387ffcc520d0f3f languageName: node linkType: hard -"@types/crypto-js@npm:~4.1.1": - version: 4.1.1 - resolution: "@types/crypto-js@npm:4.1.1" - checksum: ea3d6a67b69f88baeb6af96004395903d2367a41bd5cd86306da23a44dd96589749495da50974a9b01bb5163c500764c8a33706831eade036bddae016417e3ea +"@types/crypto-js@npm:~4.1.3": + version: 4.1.3 + resolution: "@types/crypto-js@npm:4.1.3" + checksum: 4489854579c1b90b77da881fc980e3f05ab1e9c68b18ae580fedbb7b0fb40d531fda7bdc05f1b3bd5d4218c1d97c2f821bbac57eb3d7d9e505ce5a2c5b034166 languageName: node linkType: hard -"@types/cssom@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cssom@npm:0.4.1" - checksum: 0f44f5ff27f5dfadfb89c8bd00f8d588dc1aaa77ec05ffa3ab732929683aef842f55a6c52c9a75586a28987f009b45f6ea5f63dbc34660f6bb98650eea7f59e9 +"@types/cssom@npm:^0.4.2": + version: 0.4.2 + resolution: "@types/cssom@npm:0.4.2" + checksum: 4bcc54245b8c09c832c21465f60af412a5c2446ae5c17ab1a874dd87a9488e43951f8027594cc0eaf99d4e9a7c061882f017552a13f0a94ac25db9ac92fea837 languageName: node linkType: hard -"@types/debug@npm:^4.1.8": - version: 4.1.8 - resolution: "@types/debug@npm:4.1.8" +"@types/d3-color@npm:^2.0.0": + version: 2.0.6 + resolution: "@types/d3-color@npm:2.0.6" + checksum: 0b8394204345424f8a38f7b185bcf1346080be040bceebd5ca912ffdb9072a7f89d42d82713dcbd3341eb820f1430f03353b55ed02bb3385f4fd7942fbba22a9 + languageName: node + linkType: hard + +"@types/d3-delaunay@npm:^5.3.0": + version: 5.3.4 + resolution: "@types/d3-delaunay@npm:5.3.4" + checksum: d4568c19a7d2566b6bd49351f15f755809aff69e24939df50e4ad1a5e4363c6c65cd365c4978e90dd44d393fd8b52f1b99ce9960e8f2205e6a03e539f74e1905 + languageName: node + linkType: hard + +"@types/d3-format@npm:^1.4.1": + version: 1.4.5 + resolution: "@types/d3-format@npm:1.4.5" + checksum: f284da718785080cc3ee598c3585285c04585e4dc57631aca1051bda43bd6348e8256399b5f8a4f3af99809acedde3a74cd41aebdd4ce4c714f7cc554552e29b + languageName: node + linkType: hard + +"@types/d3-path@npm:^2": + version: 2.0.4 + resolution: "@types/d3-path@npm:2.0.4" + checksum: 054005eeef4420a1d2867509e25da419521086b9d2aa22b45095b77604cfef1b8208742063cac3bfd82e4ff8b0214d4c64bf5f0e08fa4c7919114d30af4fdf9d + languageName: node + linkType: hard + +"@types/d3-scale-chromatic@npm:^2.0.0": + version: 2.0.4 + resolution: "@types/d3-scale-chromatic@npm:2.0.4" + checksum: d598c0bc45463275fceeb07983969007cd67f2083ba814bd14949ababff4e458398f20b0cf2229df355a81c657effe14be4469f89c75157563d792c62c560e94 + languageName: node + linkType: hard + +"@types/d3-scale@npm:^3.2.3": + version: 3.3.5 + resolution: "@types/d3-scale@npm:3.3.5" + dependencies: + "@types/d3-time": ^2 + checksum: e6ffe97c3022c857a88f73775930bd577fa55460f65eaf68038cd39d1b5d8e4a9941440b5ac8d382568463f04ca68d6b7c3e596f4ec6575c388db17305ca1524 + languageName: node + linkType: hard + +"@types/d3-shape@npm:^2.0.0": + version: 2.1.7 + resolution: "@types/d3-shape@npm:2.1.7" + dependencies: + "@types/d3-path": ^2 + checksum: c83f53a016e1ccfaa6104458b73ae2b1c87de0e4ddf8c43a11ceba87652965273a4b33e49d552be34f7d04b24fc380f21a1958f86ab1fd863da78e957e88af34 + languageName: node + linkType: hard + +"@types/d3-time-format@npm:^2.3.1": + version: 2.3.4 + resolution: "@types/d3-time-format@npm:2.3.4" + checksum: 5351ee0bcd5d181dfc120b5652802ae4cd8f8def60b9e3638a83464456d376e8fce7a6c50e2b4d7f186fb8a31aa28fda9b8d3e7b3c816941da71b66938e4fb9f + languageName: node + linkType: hard + +"@types/d3-time-format@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/d3-time-format@npm:3.0.4" + checksum: d2aa42854b833342d0536927deae533eb2302232ee253cf271ee9f935784b61eb9605ab706fbcba72b83564ffce88c02fd437f72bc068779ed9166a5de019637 + languageName: node + linkType: hard + +"@types/d3-time@npm:^1.1.1": + version: 1.1.4 + resolution: "@types/d3-time@npm:1.1.4" + checksum: a794a2e05365de5bd4b139d7ff94f0d9eeb362116677f1edadb1aa08d5ddb93c4e50ace092f8fa9d7358efab5073770654ac6d294a2a39ca5106c0a55f38c22e + languageName: node + linkType: hard + +"@types/d3-time@npm:^2": + version: 2.1.4 + resolution: "@types/d3-time@npm:2.1.4" + checksum: e5898c5520a536ea65b18d003d6d89e2def04c23ad15977240fe27558e8cc7ea5d0c362850090d5850d5fcd788cc6c6b16802c6826f932456aeebe9e2ddbce8a + languageName: node + linkType: hard + +"@types/debug@npm:^4.1.10": + version: 4.1.10 + resolution: "@types/debug@npm:4.1.10" dependencies: "@types/ms": "*" - checksum: a9a9bb40a199e9724aa944e139a7659173a9b274798ea7efbc277cb084bc37d32fc4c00877c3496fac4fed70a23243d284adb75c00b5fdabb38a22154d18e5df + checksum: 938f79c5b610f851da9c67ecd8641a09b33ce9cb38fe4c9f4d20ee743d6bccb5d8e9a833a4cd23e0684a316622af67a0634fa706baea5a01f5219961d1976314 languageName: node linkType: hard @@ -12187,17 +13179,17 @@ __metadata: languageName: node linkType: hard -"@types/ejson@npm:^2.2.0": - version: 2.2.0 - resolution: "@types/ejson@npm:2.2.0" - checksum: 0cbc610c58a60847822353782d133f7a3cf362223d58f6a2b6ce0ae6e1f22885dc8f2a6ca7676df2556ed631e74c5a4880575704b964fdef89d216dc69ac0ad6 +"@types/ejson@npm:^2.2.1": + version: 2.2.1 + resolution: "@types/ejson@npm:2.2.1" + checksum: 8a0e6e9d50a9b33cdb645e7fdaca5fccb5a0687be0918eaeb06c9c7f21bb8b5757881de77c9d19d84bf16e6949c10b23d098954990aef7bd26257d471f4c008f languageName: node linkType: hard -"@types/emojione@npm:^2.2.6": - version: 2.2.6 - resolution: "@types/emojione@npm:2.2.6" - checksum: 5a049b57ea99eb88359b257256cdb74f048f8cfddc58a7ea9a50ba5d937f9414025c0616205b67f63512fcbbba44471901209d8f3c7fb5a9741fb6d3038eb864 +"@types/emojione@npm:^2.2.8": + version: 2.2.8 + resolution: "@types/emojione@npm:2.2.8" + checksum: 3342fd3fbcbc7e7429c7a23330f559d0f41f4fcba5a699035fddb53efba8c7c5ed3af54024011643aa338792d8fd963768766877bc115e093bef193a391abb05 languageName: node linkType: hard @@ -12211,13 +13203,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:*, @types/eslint@npm:~8.44.0": - version: 8.44.0 - resolution: "@types/eslint@npm:8.44.0" +"@types/eslint@npm:*, @types/eslint@npm:~8.44.6": + version: 8.44.6 + resolution: "@types/eslint@npm:8.44.6" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 + checksum: ed8de582ab3dbd7ec0bf97d41f4f3de28dd8a37fc48bc423e1c406bbb70d1fd8c4175ba17ad6495ef9ef99a43df71421277b7a2a0355097489c4c4cf6bb266ff languageName: node linkType: hard @@ -12256,29 +13248,31 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.17, @types/express@npm:^4.17.8, @types/express@npm:^4.7.0": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" +"@types/express@npm:*, @types/express@npm:^4.16.1, @types/express@npm:^4.17.13, @types/express@npm:^4.17.20, @types/express@npm:^4.17.8, @types/express@npm:^4.7.0": + version: 4.17.20 + resolution: "@types/express@npm:4.17.20" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + checksum: bf8a97d283128e5129f9ccabbeef728ff3f0484465e0ae74a304bd0588fa6cb715ae68845650caba9a641944b7791ba125d02ddbd47a7e62aaefdd036570c6c5 languageName: node linkType: hard -"@types/fibers@npm:^3.1.1": - version: 3.1.1 - resolution: "@types/fibers@npm:3.1.1" - checksum: 3bcc53c92dcaabf77cf31274c06ba615a59d21730bdb47214f64d7bf356ab31712f1d9c79707e50d2c9d2f8cda8cca4f7e4c20ddf272b07397d20fb196dbc400 +"@types/fibers@npm:^3.1.3": + version: 3.1.3 + resolution: "@types/fibers@npm:3.1.3" + checksum: c4511eecea1c4e73a4b4310ff5152bb43477dfbd7c19ea8614de5ce6d604c6bd629b4552bdbc06fbd593215c684d06aee4e6d8e6681b4ab019f2b8a03838de79 languageName: node linkType: hard -"@types/gc-stats@npm:^1": - version: 1.4.1 - resolution: "@types/gc-stats@npm:1.4.1" - checksum: 07c08e5452f96e3afbaba259ec0f684f1172b0e1bdb466d8606bc9af0428399bf334b57944ef2762d61be122892619aabab11ff63cd07f2dfc7dd436118d04b6 +"@types/gc-stats@npm:^1.4.2": + version: 1.4.2 + resolution: "@types/gc-stats@npm:1.4.2" + dependencies: + "@types/node": "*" + checksum: 4039f699b497595c3ac30f221f72d798e12a764093ab5df05cec25cd501fe806005daec10c25737d2b08449772bc318ac720f01fe73d13fdb33168429e25483f languageName: node linkType: hard @@ -12292,10 +13286,10 @@ __metadata: languageName: node linkType: hard -"@types/google-libphonenumber@npm:^7.4.23": - version: 7.4.23 - resolution: "@types/google-libphonenumber@npm:7.4.23" - checksum: 6c46f980fcff49befbddc165dea466cd2b444bf12a2a110767c6a656164cbfc09cbc84e1d2142b275def443246704115eddaf040668caee623676b1e37bb90bc +"@types/google-libphonenumber@npm:^7.4.29": + version: 7.4.29 + resolution: "@types/google-libphonenumber@npm:7.4.29" + checksum: 63b1d03ab6dcd877c1249251d73c54777f6b6cbd13f6b3107c8fcef70d19f8e3a768555942735318da86fa6c50ea0dcfc82d521d4defc9e9dfc1e67b4746ab96 languageName: node linkType: hard @@ -12308,10 +13302,10 @@ __metadata: languageName: node linkType: hard -"@types/gravatar@npm:^1.8.3": - version: 1.8.3 - resolution: "@types/gravatar@npm:1.8.3" - checksum: 7d05ab0b0fae62c6932bbb952b863e67a96385dd428a4cef161518e5e5176788194db34ca0815ce28a41779e472ea3d6ca21fedd0f00d77e62b016b59117bf81 +"@types/gravatar@npm:^1.8.5": + version: 1.8.5 + resolution: "@types/gravatar@npm:1.8.5" + checksum: a4a5e9010e5f2caff27f360cd4e0acf4e3276be3fdf8cc4a38baed8b9ca14d187b6b5c1d30d4d3abe326b0aecf30d1b47111ea543c8f6caf8bce9a8bb147c090 languageName: node linkType: hard @@ -12364,21 +13358,21 @@ __metadata: languageName: node linkType: hard -"@types/i18next-sprintf-postprocessor@npm:^0.2.0": - version: 0.2.0 - resolution: "@types/i18next-sprintf-postprocessor@npm:0.2.0" +"@types/i18next-sprintf-postprocessor@npm:^0.2.2": + version: 0.2.2 + resolution: "@types/i18next-sprintf-postprocessor@npm:0.2.2" dependencies: i18next: ">=17.0.11" - checksum: be1203358724c253a402f08043ba5900661849ee0ae103c5a9928f07b17e0ff1558fe22219a10d1a28a915af5564337135ee91572c6ae7f2a427bb67291e6800 + checksum: 1029c5f896e453534a128013f9ee8a0873a2e03b82a18a530842d06618c3dd1b1f3adf0491efa3f7efd86d19c61b23af60df5c0f36306ed298a20d6d895db95e languageName: node linkType: hard -"@types/imap@npm:^0.8.37": - version: 0.8.37 - resolution: "@types/imap@npm:0.8.37" +"@types/imap@npm:^0.8.39": + version: 0.8.39 + resolution: "@types/imap@npm:0.8.39" dependencies: "@types/node": "*" - checksum: 39af91e5ed0fe3b6f261a735f5af29de2ac325bddefbaa0067fcd1f51c9aa6d9d7c50eb0843091bca1faf14158085709c16315acddd6222d56e4557519abfba6 + checksum: 403a0810dc24f035d1762d9ebc1cf548448bdbe565ab6062d2a1d1be2afd4f8ef1483723d4077c0e0e2312a39a27f393a513a40515589149c0617aa984946ae5 languageName: node linkType: hard @@ -12432,13 +13426,23 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:~29.5.3": - version: 29.5.3 - resolution: "@types/jest@npm:29.5.3" +"@types/jest@npm:*, @types/jest@npm:~29.5.7": + version: 29.5.7 + resolution: "@types/jest@npm:29.5.7" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: e36bb92e0b9e5ea7d6f8832baa42f087fc1697f6cd30ec309a07ea4c268e06ec460f1f0cfd2581daf5eff5763475190ec1ad8ac6520c49ccfe4f5c0a48bfa676 + checksum: e28624ccb0ef1255a03fbbb4b5bc3e5cbcdc450d39e0739985ff679b124198f808c38c8c3e67859c6efc0e848196deeb8cfed028e12a821c511dfc1112a2d6e9 + languageName: node + linkType: hard + +"@types/jest@npm:~29.5.0": + version: 29.5.10 + resolution: "@types/jest@npm:29.5.10" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: ef385905787db528de9b6beb2688865c0bb276e64256ed60b9a1a6ffc0b75737456cb5e27e952a3241c5845b6a1da487470010dd30f3ca59c8581624c564a823 languageName: node linkType: hard @@ -12451,19 +13455,19 @@ __metadata: languageName: node linkType: hard -"@types/js-yaml@npm:^4.0.5": - version: 4.0.5 - resolution: "@types/js-yaml@npm:4.0.5" - checksum: 7dcac8c50fec31643cc9d6444b5503239a861414cdfaa7ae9a38bc22597c4d850c4b8cec3d82d73b3fbca408348ce223b0408d598b32e094470dfffc6d486b4d +"@types/js-yaml@npm:^4.0.8": + version: 4.0.8 + resolution: "@types/js-yaml@npm:4.0.8" + checksum: a5a77a5a1eac7e7fb667156c251c2b947ca4ddfdda570726369dd50bd5b2b1d0da2d0fb4273d1b10aa1782406d7b3da8923d957df4fb89dbfa1db06f43297de2 languageName: node linkType: hard -"@types/jsdom-global@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/jsdom-global@npm:3.0.4" +"@types/jsdom-global@npm:^3.0.6": + version: 3.0.6 + resolution: "@types/jsdom-global@npm:3.0.6" dependencies: "@types/jsdom": "*" - checksum: c4da8432609686961a4336b8adfe882cd844a5c8cb0213d12c8d2a69d8602a73ef0f175e9ed7d45ab75b833c8551147eb21015efe1b9505872326f1ea9d7ec91 + checksum: cb216d588d6abc583615706bbc8beab6265d7afec8e51cadea06f84dd5ba4508e583c500556b2c273d7569c80af9cd68dce19ab6042cd881567aa0fe10261cd1 languageName: node linkType: hard @@ -12503,10 +13507,19 @@ __metadata: languageName: node linkType: hard -"@types/jsrsasign@npm:^10.5.8": - version: 10.5.8 - resolution: "@types/jsrsasign@npm:10.5.8" - checksum: ef53cee635ab31ae60b41d050266e16949be84b9b6781eb7585acc9094bc6e1f8c9aff4f19221ee1c587ecf3134a6b551800989d2add6f28f9176a248c89a57d +"@types/jsonwebtoken@npm:^8.3.7": + version: 8.5.9 + resolution: "@types/jsonwebtoken@npm:8.5.9" + dependencies: + "@types/node": "*" + checksum: 33815ab02d1371b423118316b7706d2f2ec03eeee5e1494be72da50425d2384e5e0a09ea193f7a5ab4b4f6a9c5847147305f50e965f3d927a95bdf8adb471b2a + languageName: node + linkType: hard + +"@types/jsrsasign@npm:^10.5.11": + version: 10.5.11 + resolution: "@types/jsrsasign@npm:10.5.11" + checksum: c18b52af99ffb831fd84738356a49e94407e732f0a88f0f6db1e1fd55c06a47d2bab23a9e17b3b21af50fbf5f4d115e13fbe2796357204b18072929bd7b4bd5c languageName: node linkType: hard @@ -12517,10 +13530,10 @@ __metadata: languageName: node linkType: hard -"@types/katex@npm:~0.16.0": - version: 0.16.0 - resolution: "@types/katex@npm:0.16.0" - checksum: f93ceb2496621d18a28252264c0b7f5b0bdf125f9dc92d1adfbd9bf00942cd2918de336fae628d3929e615aaf84b7adb1781711c4e4605664be0827b1013ec14 +"@types/katex@npm:~0.16.5": + version: 0.16.5 + resolution: "@types/katex@npm:0.16.5" + checksum: a1ce22cd87acd9b32891931f2bc4355c3540cc0a423e161a2e5b040d3e50812cb85ce1fd09f23d42324b19f9da30ded6b1807114f215624f670d79bb46c47cc8 languageName: node linkType: hard @@ -12533,10 +13546,10 @@ __metadata: languageName: node linkType: hard -"@types/later@npm:^1.2.7": - version: 1.2.7 - resolution: "@types/later@npm:1.2.7" - checksum: 247f10e3e39bf50d78cdeb95f854e73b8378fdb2de542a0b632d892377098b438c2596dd99657d2ca0ca9370b07a2c112b29e5fbde636c91e4292f9a82b04572 +"@types/later@npm:^1.2.8": + version: 1.2.8 + resolution: "@types/later@npm:1.2.8" + checksum: b89b391e6dc6721955b04c01b81a3e38b4ac3d4f40ebcf35bc34d694c46a81c387c028760b3fc1441b9852c46298dfd562708f61504aba65983d2484b99d6420 languageName: node linkType: hard @@ -12549,45 +13562,45 @@ __metadata: languageName: node linkType: hard -"@types/less@npm:~3.0.3": - version: 3.0.3 - resolution: "@types/less@npm:3.0.3" - checksum: 389ce4c843fb88484ffbe4e3b63da0db1cea3e594c57086a5e642431f031f569819b4a210ae4ca109207d2307daa7e48e0e00315892fa7582748e0f434e62881 +"@types/less@npm:~3.0.5": + version: 3.0.5 + resolution: "@types/less@npm:3.0.5" + checksum: 72d04c7877a63ef8a49e22a2aaf2e595aec41b4fcbbb48603e4d3a3d1e2d903edea6654db00bba52148ea4101a904e866b410599088b41935aa4c0733d25ef3c languageName: node linkType: hard -"@types/lodash.debounce@npm:^4.0.7": - version: 4.0.7 - resolution: "@types/lodash.debounce@npm:4.0.7" +"@types/lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "@types/lodash.debounce@npm:4.0.8" dependencies: "@types/lodash": "*" - checksum: e873b2d77f89010876baba3437ef826b17221b98948e00b5590828334a481dea1c8f9d28543210e564adc53199584f42c3cb171f8b6c3614fefc0b4e0888679c + checksum: 63f195cb053ca390135a9aca62bb60fa149ca81838519871506b60760ff4113333709becb8e4147707eaa3d916dab7eff66b0588caf4ce508cabda9bee9c5b60 languageName: node linkType: hard -"@types/lodash.get@npm:^4.4.7": - version: 4.4.7 - resolution: "@types/lodash.get@npm:4.4.7" +"@types/lodash.get@npm:^4.4.8": + version: 4.4.8 + resolution: "@types/lodash.get@npm:4.4.8" dependencies: "@types/lodash": "*" - checksum: 0dbf1960606e4707c34e8ffbe97ffaad0e47fc5df7a6e24ea6e4fe5838d2468aa13360f38815c77b06e3c9932631ae15662b4139036a69ee16aeb54827a21405 + checksum: fea09c12f098e5cbdc16510e8319a7f0dd4d0af49a5e6622ae4f0dcd4893f1b2c44a5d22f452d73443f50b85c8461f3fe2370c19b8d9051686265bbb0aae0ffa languageName: node linkType: hard -"@types/lodash@npm:*, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.195": - version: 4.14.195 - resolution: "@types/lodash@npm:4.14.195" - checksum: 39b75ca635b3fa943d17d3d3aabc750babe4c8212485a4df166fe0516e39288e14b0c60afc6e21913cc0e5a84734633c71e617e2bd14eaa1cf51b8d7799c432e +"@types/lodash@npm:*, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.200": + version: 4.14.200 + resolution: "@types/lodash@npm:4.14.200" + checksum: 6471f8bb5da692a6ecf03a8da4935bfbc341e67ee9bcb4f5730bfacff0c367232548f0a01e8ac5ea18c6fe78fb085d502494e33ccb47a7ee87cbdee03b47d00d languageName: node linkType: hard -"@types/mailparser@npm:^3.4.0": - version: 3.4.0 - resolution: "@types/mailparser@npm:3.4.0" +"@types/mailparser@npm:^3.4.3": + version: 3.4.3 + resolution: "@types/mailparser@npm:3.4.3" dependencies: "@types/node": "*" iconv-lite: ^0.6.3 - checksum: 05232ba3579b09224e5335848da27817a4cac8cc0eb622202904b62851fd61bbab7b5ca90016531e40098641351d84c2355f10cd9c9fa718da4ea2cb0e637bd0 + checksum: 9374b713311b523b66429a7b509e90229dd001029e87d901ab6c756e1856eb2a8427012c016ad70ac45b39056eba1334e568f85ce9f329f5dd147986a897b691 languageName: node linkType: hard @@ -12607,26 +13620,27 @@ __metadata: languageName: node linkType: hard -"@types/meteor-collection-hooks@npm:^0.8.6": - version: 0.8.6 - resolution: "@types/meteor-collection-hooks@npm:0.8.6" +"@types/meteor-collection-hooks@npm:^0.8.8": + version: 0.8.8 + resolution: "@types/meteor-collection-hooks@npm:0.8.8" dependencies: meteor-typings: ^1.3.1 - checksum: 620f6315dba4457dcacb0656ebdabfe2997b39be8757b87cd883e11aa77a573c27abbb0682b75c5d284ccc2be372b377d17c22a09d465ba2d59e3e62ca298ccf + checksum: bf0afc8531c836f3f7ead4aa0f8be3f69257af7a62397924a50533a20837b21b16c307777bb4fe52dc2e26753ba7269d0df6133ba6f1dad27d4075fea38a05f9 languageName: node linkType: hard -"@types/meteor@npm:^2.9.2": - version: 2.9.2 - resolution: "@types/meteor@npm:2.9.2" +"@types/meteor@npm:^2.9.5": + version: 2.9.5 + resolution: "@types/meteor@npm:2.9.5" dependencies: "@types/connect": "*" "@types/jquery": "*" + "@types/node": "*" "@types/nodemailer": "*" "@types/react": "*" "@types/underscore": "*" mongodb: ^4.3.1 - checksum: 6395578e5d5f139aad8dfd0f70cb489dd70984b78ed2ab791bfabc59c70f94196cdb3cfc40659da0498ae1962f135782067579e5c320341c9a1a331553329f56 + checksum: e16d072fe0f0ddaf2a8ac6b442580126c6d38e9e2ac36d72551d401a9a86c1dfa42e17b28ac28842b43ed0106b1c47126348332b3fcca3c86ef0d266c1201da9 languageName: node linkType: hard @@ -12711,26 +13725,28 @@ __metadata: languageName: node linkType: hard -"@types/node-gcm@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/node-gcm@npm:1.0.1" - checksum: feaf8952ae0029075fef79b5a6397fbccb19caa6580bc9e15ab20f47fa122f4be2241dde72bb5884ec87b4a8a5d33a4e9e4c219a6e83cf906bf7d93f373f4f0e +"@types/node-gcm@npm:^1.0.3": + version: 1.0.3 + resolution: "@types/node-gcm@npm:1.0.3" + checksum: 232e3d401f381fe9312343efb920892a7aa2f63457e00608ff2c3f0d1bff4a3707affe9a9e484ffead39272cfba0d1791901b7e937420233455dd047d63a4587 languageName: node linkType: hard -"@types/node-rsa@npm:^1.1.1": - version: 1.1.1 - resolution: "@types/node-rsa@npm:1.1.1" +"@types/node-rsa@npm:^1.1.3": + version: 1.1.3 + resolution: "@types/node-rsa@npm:1.1.3" dependencies: "@types/node": "*" - checksum: dee0c318618991f115b6e757c54980324c3b2f7dfec8137dcb31e8e88955e7c048d5e89e1e3a572148697783f323dbf9af5738ac5bbe9069666663ad3737284d + checksum: 03606729a96722623e316b1728d45ba452e008e01e886127d1d964221119dd4196be724ec062fc81be5beb28ce8e5fcc9c55109275cdae60545ddc293b89e77d languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.0.0, @types/node@npm:>=8.9.0": - version: 17.0.40 - resolution: "@types/node@npm:17.0.40" - checksum: e3b2fe876672fbe4be84ce17773944eb2f5eaba50e2c6c0536bdf6d4972ed6488581580581f154183fdc8f2d56fa42a42e3d6e83b9b71ee25adea16a84765e92 +"@types/node@npm:*, @types/node@npm:>=12, @types/node@npm:>=12.0.0, @types/node@npm:>=18.0.0, @types/node@npm:>=8.9.0": + version: 20.8.4 + resolution: "@types/node@npm:20.8.4" + dependencies: + undici-types: ~5.25.1 + checksum: 2106b9ef9750297cac68249428d7067c4d22c26908854165b70a164e34e900f4c34bb9bf3887c9391206b500d3e87171d03b1846e25788925236a0354390d278 languageName: node linkType: hard @@ -12741,26 +13757,26 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0, @types/node@npm:^16.18.36": - version: 16.18.36 - resolution: "@types/node@npm:16.18.36" - checksum: a9d138fa1269079c60daad6984713dc0b713983f8b34a83edbc6d7957b2e38beab9b2598c9fe99f19d073e20bc212a18aaf82eabdc23ef64dce7d2089a9aab2a +"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0, @types/node@npm:^16.18.60": + version: 16.18.60 + resolution: "@types/node@npm:16.18.60" + checksum: aa0c81c3f20e663584bf17a5968e54c419277af7982ef41f9d83edd1b7ab4c8af2583a3c8a9e1cf659c6307e6f787e1be20522855121371f5a46d1d54f8a70e3 languageName: node linkType: hard -"@types/node@npm:^14.0.26, @types/node@npm:^14.14.37, @types/node@npm:^14.18.51": - version: 14.18.51 - resolution: "@types/node@npm:14.18.51" - checksum: 0960a31d2ac605763fe79c8edcee3cb48257d345ce417c019d84ff5d8cd92dd0937674814ab3f169346b4259c29f640556006bcb2c54cfb3e63fa0cf728d320e +"@types/node@npm:^14.0.26, @types/node@npm:^14.14.37, @types/node@npm:^14.18.63": + version: 14.18.63 + resolution: "@types/node@npm:14.18.63" + checksum: be909061a54931778c71c49dc562586c32f909c4b6197e3d71e6dac726d8bd9fccb9f599c0df99f52742b68153712b5097c0f00cac4e279fa894b0ea6719a8fd languageName: node linkType: hard -"@types/nodemailer@npm:*, @types/nodemailer@npm:^6.4.8": - version: 6.4.8 - resolution: "@types/nodemailer@npm:6.4.8" +"@types/nodemailer@npm:*, @types/nodemailer@npm:^6.4.13": + version: 6.4.13 + resolution: "@types/nodemailer@npm:6.4.13" dependencies: "@types/node": "*" - checksum: 3cc9b6a0e54f25a1b36124df413964ff5a69e8dc4558c5dfc06818917313a50f4dbfe31fc9190e4270d07a0f8678474da24a2eae42f907933ea81d983b4772d4 + checksum: fd27d57d5801aaa7594d3bab748aedb1addc0c3a8ff9a21ea7675eec0e7e99cc477d05264b757b97691612fcfab37e52ded6c0725a700a90ad24fc7829dcc641 languageName: node linkType: hard @@ -12778,19 +13794,19 @@ __metadata: languageName: node linkType: hard -"@types/oauth2-server@npm:^3.0.13": - version: 3.0.13 - resolution: "@types/oauth2-server@npm:3.0.13" +"@types/oauth2-server@npm:^3.0.15": + version: 3.0.15 + resolution: "@types/oauth2-server@npm:3.0.15" dependencies: "@types/express": "*" - checksum: 126ce8a99a50b515801891212c20a928bd447ea634956aef0073ff704ac19b79ed8800567f3aa433f234bf2ee54b498211e3e23e864c34d211c76ea0662fa3e0 + checksum: b6c73ec0ba3a83e7a9cc1bf0e75fd640a76bcf57742642775abf950d851478a686e3f54ad8e24a09772e1dd89ed953742418c76ebb7df12b97b68f1cb94dae80 languageName: node linkType: hard -"@types/object-path@npm:^0.11.1": - version: 0.11.1 - resolution: "@types/object-path@npm:0.11.1" - checksum: 007e819d1d9dc830491b60023b1502ef1e421416d9953d6fefcda7d06eb91548eef8ee30073a9cfb6a834ac977042f6e1a761cde2d6a7973b06ddca753be91e3 +"@types/object-path@npm:^0.11.3": + version: 0.11.3 + resolution: "@types/object-path@npm:0.11.3" + checksum: 9c2f1ec11d9d15df1682ab1483c0f51cac3ff8c3a951662a50d15fd48824fc43a052041503d0761790a29a4100e33989eb519889948c3592d0bf6bde59d3ec79 languageName: node linkType: hard @@ -12822,35 +13838,28 @@ __metadata: languageName: node linkType: hard -"@types/parseurl@npm:^1.3.1": - version: 1.3.1 - resolution: "@types/parseurl@npm:1.3.1" +"@types/parseurl@npm:^1.3.2": + version: 1.3.2 + resolution: "@types/parseurl@npm:1.3.2" dependencies: "@types/node": "*" - checksum: e2d6fd6ad3259a70239cee48de496bc5e5d074a2c52199227e7414d889b8df05c039d2cbde8198e05493f8d64fffb7de1fa98e7228ed3e3d149f6f51d31c8e9e + checksum: bfe0ad3222a957a1d8d21a5378a61a3ce21f0ce45ddfdd98fc727207b4bd3caf590d2a448c39d08774949e485a5f5f08429f6025a6b0123456a8a7fb9270ddb2 languageName: node linkType: hard -"@types/photoswipe@npm:^4.1.2": - version: 4.1.2 - resolution: "@types/photoswipe@npm:4.1.2" - checksum: 58f9b85171b5d24a70dea8b7cd68eaaef29159f05130f2284320ef438874c538f00e81763d4025d79fb03366180cff12e01c4a40d04a0c823ca4df656ee8b912 - languageName: node - linkType: hard - -"@types/polka@npm:^0.5.4": - version: 0.5.4 - resolution: "@types/polka@npm:0.5.4" +"@types/polka@npm:^0.5.6": + version: 0.5.6 + resolution: "@types/polka@npm:0.5.6" dependencies: "@types/express": "*" "@types/express-serve-static-core": "*" "@types/node": "*" "@types/trouter": "*" - checksum: 8027a6cf6989d63ad01346c031698885586f3b800746bc35c84ab66f981e452cc58f8770fec703509cacf615f450c7010eb5221cef47a75e9494cdc42df8f8b3 + checksum: e956629526782b722fe134a93e159774d13d58a66796f5b6f763b04cd5c426439a8556962e1da8e8a61574ed1ad6239ffbef28cd8c03b4f8828a9a4b03189dde languageName: node linkType: hard -"@types/prettier@npm:^2.1.5, @types/prettier@npm:^2.6.3": +"@types/prettier@npm:^2.6.3": version: 2.6.3 resolution: "@types/prettier@npm:2.6.3" checksum: e1836699ca189fff6d2a73dc22e028b6a6f693ed1180d5998ac29fa197caf8f85aa92cb38db642e4a370e616b451cb5722ad2395dab11c78e025a1455f37d1f0 @@ -12864,10 +13873,17 @@ __metadata: languageName: node linkType: hard -"@types/prometheus-gc-stats@npm:^0.6.2": - version: 0.6.2 - resolution: "@types/prometheus-gc-stats@npm:0.6.2" - checksum: 403b3dbd792b83e592376e2002260cf57fb18f98c8b8528a24dc65e545cb8d0e9bf9941dc28edfa397b670b9a7336913da991005ef0278611209dde9b51406db +"@types/prometheus-gc-stats@npm:^0.6.3": + version: 0.6.3 + resolution: "@types/prometheus-gc-stats@npm:0.6.3" + checksum: b8ad00f21c2d7f19819b0d82b778f4919847e44f1f74a570fb52386fa7c5250af3a5e2eef5b8aa69cbf7fd8cc68f31f91bd7a002ce5b3722bb971da31af543a0 + languageName: node + linkType: hard + +"@types/promise.allsettled@npm:^1.0.3": + version: 1.0.4 + resolution: "@types/promise.allsettled@npm:1.0.4" + checksum: 239fd638f8d96153759c68af486cbe643f1025f05a32a6a3f66471090b8aaf04c4e88bc345f6170d3870f9d47ee262967640cdf9f776ae4a3e53b26c98e90523 languageName: node linkType: hard @@ -12878,26 +13894,33 @@ __metadata: languageName: node linkType: hard -"@types/proxy-from-env@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/proxy-from-env@npm:1.0.1" +"@types/prop-types@npm:^15.7.2": + version: 15.7.11 + resolution: "@types/prop-types@npm:15.7.11" + checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + languageName: node + linkType: hard + +"@types/proxy-from-env@npm:^1.0.3": + version: 1.0.3 + resolution: "@types/proxy-from-env@npm:1.0.3" dependencies: "@types/node": "*" - checksum: 72d04675fc7107d4a1d4a2ca56773d0caf23bdd48fa45b96b72b199f33f54854164b994c45f549214c51227f8bb9ae4e189e48d74a4a46b668fd4210bf97f8c0 + checksum: 3661687ae4bd90b9c41e504d3e3124b1ccd7d39d5877a7930fc3630989e37bde4e6b9055ea719d4b85c400a872bee02336ee5e187380f075cec021a4aebced44 languageName: node linkType: hard -"@types/proxyquire@npm:^1.3.28": - version: 1.3.28 - resolution: "@types/proxyquire@npm:1.3.28" - checksum: 9f0267b4516c2686a2e99a6d4dbd2ed660133180aad775a4000f3e103d8b2fe6b1bfe5b36003edf7adfb02542aed6c2fa6049fc217daea73ebced2942a762f27 +"@types/proxyquire@npm:^1.3.30": + version: 1.3.30 + resolution: "@types/proxyquire@npm:1.3.30" + checksum: e247d0afdb59aae942313112ca6429b0cbe410b0a858796c63e16ea945b3a7686f0660a03c685d79f10ed807051f645a763e13aa72d3725aeea74fd40901fdad languageName: node linkType: hard -"@types/psl@npm:^1.1.0": - version: 1.1.0 - resolution: "@types/psl@npm:1.1.0" - checksum: 648a4a40827fb101a05616b9c448b04d40c467db9f09e08099274759fd5e032e7d276013296679765c7d7359f43f0479094c1d8b6a56a8f9445b84b5a9af1263 +"@types/psl@npm:^1.1.2": + version: 1.1.2 + resolution: "@types/psl@npm:1.1.2" + checksum: fc0a7ae56ca53157035226d964f5a37749187804c07787d25a3f8e0235130c277b52d027139d1a7058d7826014a8019d68d46e2719b0404ac8545d39d41fc43a languageName: node linkType: hard @@ -12922,21 +13945,21 @@ __metadata: languageName: node linkType: hard -"@types/react-beautiful-dnd@npm:^13.1.4": - version: 13.1.4 - resolution: "@types/react-beautiful-dnd@npm:13.1.4" +"@types/react-beautiful-dnd@npm:^13.1.6": + version: 13.1.6 + resolution: "@types/react-beautiful-dnd@npm:13.1.6" dependencies: "@types/react": "*" - checksum: 76220f1031721e73f712cf0021de6a3cf4049260ec29996cd587876ebd6ed01b9c31d8efb5cf230eb4d2b6259525ffe0f3054667732d30c79df37e49f9398c5e + checksum: 437c315cac4455fd0085150d5d163330e523e965193f642f45edf34eb56098e68a6f956d90ecb11abfcb03ce34177e5445c1489da46353ee5a6a6306414fb936 languageName: node linkType: hard -"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:~17.0.20": - version: 17.0.20 - resolution: "@types/react-dom@npm:17.0.20" +"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:~17.0.22": + version: 17.0.22 + resolution: "@types/react-dom@npm:17.0.22" dependencies: "@types/react": ^17 - checksum: 525439fb14a033fc5dbe74711ecc50ec82273a528df9656594066a6219401e975101dafffd15d9a1a57a9442d52ea0c92eaacae09554dde27cd792e773f67467 + checksum: 3c24331c0a2211370968befaad107598ee4f796c08e9b0de0b0126ee598a7c51f7bf4e0e7d9a76522a3b60d91f091d46131d136bcbe49aeb6ec3b8480dff03f9 languageName: node linkType: hard @@ -12949,6 +13972,15 @@ __metadata: languageName: node linkType: hard +"@types/react-lifecycles-compat@npm:^3.0.1": + version: 3.0.4 + resolution: "@types/react-lifecycles-compat@npm:3.0.4" + dependencies: + "@types/react": "*" + checksum: 504665a1a83be43ab43cbd3d19fd94d0de6634543f06351cce80c844628048650f2cf063048e5dc39effdf0053565ae60a04427e79d094714d6aeb84d5c9643e + languageName: node + linkType: hard + "@types/react-redux@npm:^7.1.20": version: 7.1.25 resolution: "@types/react-redux@npm:7.1.25" @@ -12961,14 +13993,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:~17.0.62": - version: 17.0.62 - resolution: "@types/react@npm:17.0.62" +"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:~17.0.69": + version: 17.0.69 + resolution: "@types/react@npm:17.0.69" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 428a5aff44824ef504e9a9259b5894fe44a5db1c344b536990f07e132900ff5b34cbef0be77a84f30f37be1f88fc8b56dce328f568de8d65de3bfe414c05b2e1 + checksum: b83d4ec968b712b2b1a444c614b1ef3e59879c6911bc4001158de5de49b80b6a20fc4859353244f0171b94845d4c85a6379071445242ff23bbbc9b0ff24577d7 languageName: node linkType: hard @@ -12997,19 +14029,19 @@ __metadata: languageName: node linkType: hard -"@types/rewire@npm:^2.5.28": - version: 2.5.28 - resolution: "@types/rewire@npm:2.5.28" - checksum: c416a0f30b68c3d7aa7d67fa1297506d7ae890f831363f5e7a2ca704e0d3e2ec564efe1ce1f20a31f4f6408b3dc76a0f6ed79048ef4b7cc38905db31aeaf55df +"@types/rewire@npm:^2.5.29": + version: 2.5.29 + resolution: "@types/rewire@npm:2.5.29" + checksum: 2ad2f1134fe7c350fc88f0a9cc17eb49377f1a61776cde10b62bae0f5956dedd97adbb8da0e3ca8ddfb7034699a89fe2f9dc31af35f11727c4b38c8a089877c3 languageName: node linkType: hard -"@types/sanitize-html@npm:^2.9.0": - version: 2.9.0 - resolution: "@types/sanitize-html@npm:2.9.0" +"@types/sanitize-html@npm:^2.9.3": + version: 2.9.3 + resolution: "@types/sanitize-html@npm:2.9.3" dependencies: htmlparser2: ^8.0.0 - checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 + checksum: 882a39ec767e0c5fd4402108db4b8e4f85ff555cf490ad8c7340d9c58c57c3ffefa33c0d248d5e67047df6f744ca60e125da5485efc18ac450783f3900178373 languageName: node linkType: hard @@ -13020,17 +14052,10 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^6.0.0": - version: 6.2.3 - resolution: "@types/semver@npm:6.2.3" - checksum: 83c86d7005b229df9c4c0d6d13825b839a01932895504596140aea19e2b88f63ac27ab1575347451b50eedb63f72309e845ce1a0ca78360c4f719bbb38371594 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.10, @types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 +"@types/semver@npm:^7.3.10, @types/semver@npm:^7.3.12, @types/semver@npm:^7.5.0": + version: 7.5.4 + resolution: "@types/semver@npm:7.5.4" + checksum: 120c0189f6fec5f2d12d0d71ac8a4cfa952dc17fa3d842e8afddb82bba8828a4052f8799c1653e2b47ae1977435f38e8985658fde971905ce5afb8e23ee97ecf languageName: node linkType: hard @@ -13072,12 +14097,12 @@ __metadata: languageName: node linkType: hard -"@types/sinon@npm:^10.0.15": - version: 10.0.15 - resolution: "@types/sinon@npm:10.0.15" +"@types/sinon@npm:^10.0.20": + version: 10.0.20 + resolution: "@types/sinon@npm:10.0.20" dependencies: "@types/sinonjs__fake-timers": "*" - checksum: cec6d7d9d5582ca3ac851b029d5d90451bfe6d376164253792a6eb6ddcd609a0411a7fac9ed92e1879e7d3ec091d2ea2e8dbb4f6140a1065439b81dc20cafa7c + checksum: 7322771345c202b90057f8112e0d34b7339e5ae1827fb1bfe385fc9e38ed6a2f18b4c66e88d27d98c775f7f74fb1167c0c14f61ca64155786534541e6c6eb05f languageName: node linkType: hard @@ -13111,12 +14136,12 @@ __metadata: languageName: node linkType: hard -"@types/speakeasy@npm:^2.0.7": - version: 2.0.7 - resolution: "@types/speakeasy@npm:2.0.7" +"@types/speakeasy@npm:^2.0.9": + version: 2.0.9 + resolution: "@types/speakeasy@npm:2.0.9" dependencies: "@types/node": "*" - checksum: 30152d950ea23654060ef596ea459935a9ea80ba4d9803b13fc9b02c7a27a7b5c96742f2cb00db51b19ba0e13ef9a16c1fd977042f61c9019b10c4191e2f1b97 + checksum: 4f3d2217f96625c481f9220a5d16a776c7003d9025fafe728f91f07ba815ac2233db4df85cf4a721b5e042a478f793eee6e4e54c397288f3a39e3f04aa8375ac languageName: node linkType: hard @@ -13136,10 +14161,10 @@ __metadata: languageName: node linkType: hard -"@types/strict-uri-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "@types/strict-uri-encode@npm:2.0.0" - checksum: e37b6e39fc1440d30bb5f114b3c56a4ecc5db1b7bb1f705bcf607d0eb9e8798953ccaa3792b35c97e74fe61fcc0ff80982d963c22bba056a0745098d4a5c6699 +"@types/strict-uri-encode@npm:^2.0.1": + version: 2.0.1 + resolution: "@types/strict-uri-encode@npm:2.0.1" + checksum: 63d62f43d20583428d112f6a9de5a444f31f8e314a8c57b9a59523f99ae3152e41e2e39ff0fb0404171135402d2226aba21a5db64de0d0d385ec8c11d5a0f4ce languageName: node linkType: hard @@ -13162,12 +14187,19 @@ __metadata: languageName: node linkType: hard -"@types/supertest@npm:^2.0.12": - version: 2.0.12 - resolution: "@types/supertest@npm:2.0.12" +"@types/supertest@npm:^2.0.15": + version: 2.0.15 + resolution: "@types/supertest@npm:2.0.15" dependencies: "@types/superagent": "*" - checksum: f0e2b44f86bec2f708d6a3d0cb209055b487922040773049b0f8c6b557af52d4b5fa904e17dfaa4ce6e610172206bbec7b62420d158fa57b6ffc2de37b1730d3 + checksum: 89c1983662f0ab20969b3a6c44344397fd222d0f78b282619aabbe817f7c88a64210fd2b8b8f075ea22a27084e30ebc287bc5105619cbbf9af7f008e77f6eb93 + languageName: node + linkType: hard + +"@types/supports-color@npm:~7.2.0": + version: 7.2.1 + resolution: "@types/supports-color@npm:7.2.1" + checksum: abf7d9348deadf5386cf5faec062a4132e647a179584f52cace87435248f520be73c58ac28618cf5684e6b0ed6bb635d5a975cc71ff613af7db2d5648557ef45 languageName: node linkType: hard @@ -13187,29 +14219,19 @@ __metadata: languageName: node linkType: hard -"@types/terser-webpack-plugin@npm:~4.2.2": - version: 4.2.2 - resolution: "@types/terser-webpack-plugin@npm:4.2.2" - dependencies: - "@types/webpack": ^4 - terser: ^4.6.13 - checksum: 9e31abd59cacd8d60e3e16b65317b4bba56b66c564c089956b63aee27f0a00367c10f734151ebb4a7f6285ba1c600165a56fa2ba4ec83faa67aec6a5e4eb8e49 - languageName: node - linkType: hard - -"@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.6": - version: 5.14.6 - resolution: "@types/testing-library__jest-dom@npm:5.14.6" +"@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.9": + version: 5.14.9 + resolution: "@types/testing-library__jest-dom@npm:5.14.9" dependencies: "@types/jest": "*" - checksum: 92f81cefeacba3b5c06d4b3fbea0341fe2bcaa6e425c026ae262de39f1148c2588cf3003112aa4ac0880c3972ffb77641a863f3be71518d1d8080402c944e326 + checksum: d364494fc2545316292e88861146146af1e3818792ca63b62a63758b2f737669b687f4aaddfcfbcb7d0e1ed7890a9bd05de23ff97f277d5e68de574497a9ee72 languageName: node linkType: hard -"@types/textarea-caret@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/textarea-caret@npm:3.0.1" - checksum: 18ff4275f0411187aebf4f475e318f5c62a87c056d3ff280b86e18fca6bf2c9bfab9ea885135f210131df230fc761b9f560b66dd8d3d2ebb161610f4ffbf3541 +"@types/textarea-caret@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/textarea-caret@npm:3.0.2" + checksum: 6989477fa7be544cb84ffbb3302d5c4c2632e7900e0fcc12adf9bd78f4d0ebbf38db9392cb39c8fa791aba935013e1b14aeb1c222f328a67de6202f945331e73 languageName: node linkType: hard @@ -13234,10 +14256,17 @@ __metadata: languageName: node linkType: hard -"@types/ua-parser-js@npm:^0.7.36": - version: 0.7.36 - resolution: "@types/ua-parser-js@npm:0.7.36" - checksum: 8c24d4dc12ed1b8b98195838093391c358c81bf75e9cae0ecec8f7824b441e069daaa17b974a3e257172caddb671439f0c0b44bf43bfcf409b7a574a25aab948 +"@types/tsscmp@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/tsscmp@npm:1.0.0" + checksum: 019825388505048db08fa26f41e29f2ca6ea94f7fa4567e5fd7903f49cadac9aa0f2771e9d6e9e17cf241ec0db74308f99de78bbe9062d5b7673bd4e27036621 + languageName: node + linkType: hard + +"@types/ua-parser-js@npm:^0.7.38": + version: 0.7.38 + resolution: "@types/ua-parser-js@npm:0.7.38" + checksum: 8a44887f7c782ed4c59c4d9cb254674f2ff41d8f653da0c2bd6d4ace79cc3de1ce5648b77f906e337fb97328e1114583e54c3b8882d194e1b8cb281f407a1ef7 languageName: node linkType: hard @@ -13264,17 +14293,17 @@ __metadata: languageName: node linkType: hard -"@types/use-subscription@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/use-subscription@npm:1.0.0" - checksum: 47fff868682692ecda7110bd04ba4c5b1324854c0bcccc765606a42d4bd9be475207413c8829a883b98e7edd801100df53876da0ff89ac21a8f964e440636ef2 +"@types/use-subscription@npm:^1.0.1": + version: 1.0.1 + resolution: "@types/use-subscription@npm:1.0.1" + checksum: f9e3535d40dbcd606e7ef306120c52a78b9da7a94ebe0b56af8f8326984588b2db12fbc841e2b2d719728810816afa9c7d64b40a849048186a4308e2f3ff0339 languageName: node linkType: hard -"@types/use-sync-external-store@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/use-sync-external-store@npm:0.0.3" - checksum: 161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e +"@types/use-sync-external-store@npm:^0.0.5": + version: 0.0.5 + resolution: "@types/use-sync-external-store@npm:0.0.5" + checksum: 96a22fa059d8a6d0fe0b03e5157eb22f599ab1cc58b9441617dec4be6d8586260fcf9041912ab90e92d9c6ea6dfec5c758bae6418552aa687fc7e0bb904e68bc languageName: node linkType: hard @@ -13292,14 +14321,14 @@ __metadata: languageName: node linkType: hard -"@types/webpack-bundle-analyzer@npm:^4": - version: 4.6.0 - resolution: "@types/webpack-bundle-analyzer@npm:4.6.0" +"@types/webpack-bundle-analyzer@npm:^4.6.2": + version: 4.6.2 + resolution: "@types/webpack-bundle-analyzer@npm:4.6.2" dependencies: "@types/node": "*" tapable: ^2.2.0 webpack: ^5 - checksum: 1cd5baa621a1dbe820bacf981d6e48f3423b733fb5e33c1356347e73d5e3e880ae6ebacf8f43d9e47e135d3ed2653ec5e40e12c6ce187f2eb3f548d9c949f6aa + checksum: 2f798e0c6a4aac9da84f56c4600c8fafbac7cc2316b0a0b3e35cab46f5b0d045c29b8c9803c64f03756faa941ff7344920e16b45fe46a322ae3be52f4c8dee76 languageName: node linkType: hard @@ -13330,7 +14359,7 @@ __metadata: languageName: node linkType: hard -"@types/webpack@npm:^4, @types/webpack@npm:^4.41.26, @types/webpack@npm:^4.41.8, @types/webpack@npm:~4.41.33": +"@types/webpack@npm:^4.41.26, @types/webpack@npm:^4.41.8": version: 4.41.33 resolution: "@types/webpack@npm:4.41.33" dependencies: @@ -13344,6 +14373,17 @@ __metadata: languageName: node linkType: hard +"@types/webpack@npm:^5.28.4": + version: 5.28.4 + resolution: "@types/webpack@npm:5.28.4" + dependencies: + "@types/node": "*" + tapable: ^2.2.0 + webpack: ^5 + checksum: 7a08e31096a05c77bb49b3830f85f2e340090fa2b19dbe4681c7eab92e49db85bdbbe7b374df7d7aa38549922ff3252f43a00d4c5c2f9fe0c2a198cdb5ddde7e + languageName: node + linkType: hard + "@types/whatwg-fetch@npm:~0.0.33": version: 0.0.33 resolution: "@types/whatwg-fetch@npm:0.0.33" @@ -13370,7 +14410,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^7.2.5": +"@types/ws@npm:^7.2.5, @types/ws@npm:^7.4.7": version: 7.4.7 resolution: "@types/ws@npm:7.4.7" dependencies: @@ -13379,31 +14419,31 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.1, @types/ws@npm:^8.5.5": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" +"@types/ws@npm:^8.5.1, @types/ws@npm:^8.5.5, @types/ws@npm:^8.5.8": + version: 8.5.8 + resolution: "@types/ws@npm:8.5.8" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: 4ad30de842834d4dd8e6e1476470752709d4165352a3a36780f23f4fdb686d4ac8ca5e16a0e0622940ddace910b856ff8a0baa2e24e41d204fb7a6a02ab2172b languageName: node linkType: hard -"@types/xml-crypto@npm:~1.4.2": - version: 1.4.2 - resolution: "@types/xml-crypto@npm:1.4.2" +"@types/xml-crypto@npm:~1.4.4": + version: 1.4.4 + resolution: "@types/xml-crypto@npm:1.4.4" dependencies: "@types/node": "*" xpath: 0.0.27 - checksum: 8fe8fc709ba070c46249800105301a533eb95e1a7a696986e4ac753aed1d238a826bce2b1e0d2548559e03f4e57bee27e26df69417766814bc0dd6a9bf2a1763 + checksum: c19616b531b26d7f3fafee6165d7be42969bfa2ef7184f501c489c80515d483425fb97e55ae816d91cf2f92e765e81f0a7cfc97c5dedb46f829edb677b154a55 languageName: node linkType: hard -"@types/xml-encryption@npm:~1.2.1": - version: 1.2.1 - resolution: "@types/xml-encryption@npm:1.2.1" +"@types/xml-encryption@npm:~1.2.3": + version: 1.2.3 + resolution: "@types/xml-encryption@npm:1.2.3" dependencies: "@types/node": "*" - checksum: abfc6d779e1674c268258296e9c03b307cb80383c5d598c0cda1ad75dc901b8d4104b5818990086b08bac199dbe7374706913a29c58cf614a741847f912854f1 + checksum: 1f678c5cb7378702dd1bfbbe1ec3b4dd62d7b8350c225866df109d60c8c7c4e39b20d32193ead175b1c68944ce22ffcae470685371e6257bf0bfe45f7f366aec languageName: node linkType: hard @@ -13933,36 +14973,36 @@ __metadata: languageName: node linkType: hard -"@webpack-cli/configtest@npm:^1.2.0": - version: 1.2.0 - resolution: "@webpack-cli/configtest@npm:1.2.0" +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" peerDependencies: - webpack: 4.x.x || 5.x.x - webpack-cli: 4.x.x - checksum: a2726cd9ec601d2b57e5fc15e0ebf5200a8892065e735911269ac2038e62be4bfc176ea1f88c2c46ff09b4d05d4c10ae045e87b3679372483d47da625a327e28 + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 languageName: node linkType: hard -"@webpack-cli/info@npm:^1.5.0": - version: 1.5.0 - resolution: "@webpack-cli/info@npm:1.5.0" - dependencies: - envinfo: ^7.7.3 +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" peerDependencies: - webpack-cli: 4.x.x - checksum: 7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e languageName: node linkType: hard -"@webpack-cli/serve@npm:^1.7.0": - version: 1.7.0 - resolution: "@webpack-cli/serve@npm:1.7.0" +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" peerDependencies: - webpack-cli: 4.x.x + webpack: 5.x.x + webpack-cli: 5.x.x peerDependenciesMeta: webpack-dev-server: optional: true - checksum: d475e8effa23eb7ff9a48b14d4de425989fd82f906ce71c210921cc3852327c22873be00c35e181a25a6bd03d424ae2b83e7f3b3f410ac7ee31b128ab4ac7713 + checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 languageName: node linkType: hard @@ -13973,10 +15013,10 @@ __metadata: languageName: node linkType: hard -"@xmldom/xmldom@npm:^0.8.5, @xmldom/xmldom@npm:^0.8.8": - version: 0.8.8 - resolution: "@xmldom/xmldom@npm:0.8.8" - checksum: 5f5fc0482fcc599f62e3009516932a265e00f1bb2093fe2c76f3f8d9bfebdd13246f48d4132c9b301c7a573f0fa8712e56aa747dce75b179c2b73f1dde7b5f42 +"@xmldom/xmldom@npm:^0.8.10, @xmldom/xmldom@npm:^0.8.5": + version: 0.8.10 + resolution: "@xmldom/xmldom@npm:0.8.10" + checksum: 4c136aec31fb3b49aaa53b6fcbfe524d02a1dc0d8e17ee35bd3bf35e9ce1344560481cd1efd086ad1a4821541482528672306d5e37cdbd187f33d7fadd3e2cf0 languageName: node linkType: hard @@ -14008,7 +15048,7 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:1": +"abbrev@npm:1, abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 @@ -14764,6 +15804,13 @@ __metadata: languageName: node linkType: hard +"array-timsort@npm:^1.0.3": + version: 1.0.3 + resolution: "array-timsort@npm:1.0.3" + checksum: fd4b5b0911214bdc8b5699ed10d309685551b518b3819c611c967cff59b87aee01cf591a10e36a3f14dbff696984bd6682b845f6fdbf1217195e910f241a4f78 + languageName: node + linkType: hard + "array-union@npm:^1.0.1, array-union@npm:^1.0.2": version: 1.0.2 resolution: "array-union@npm:1.0.2" @@ -14825,16 +15872,16 @@ __metadata: languageName: node linkType: hard -"array.prototype.map@npm:^1.0.4": - version: 1.0.4 - resolution: "array.prototype.map@npm:1.0.4" +"array.prototype.map@npm:^1.0.5": + version: 1.0.6 + resolution: "array.prototype.map@npm:1.0.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 es-array-method-boxes-properly: ^1.0.0 is-string: ^1.0.7 - checksum: 08c8065ae9e60585c1262e54556da2340cd140dc799d790843c1f4ad3a3f458e9866d147c8ff0308741e8316904313f682803ca15c179f65cb2f5b993fa71a82 + checksum: dfba063cdfb5faba9ee32d5836dc23f3963c2bf7c7ea7d745ee0a96bacf663cbb32ab0bf17d8f65ac6e8c91a162efdea8edbc8b36aed9d17687ce482ba60d91f languageName: node linkType: hard @@ -14851,6 +15898,21 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -15201,20 +16263,27 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.0.3, babel-jest@npm:^29.5.0, babel-jest@npm:^29.6.1": - version: 29.6.1 - resolution: "babel-jest@npm:29.6.1" +"b4a@npm:^1.6.4": + version: 1.6.4 + resolution: "b4a@npm:1.6.4" + checksum: 81b086f9af1f8845fbef4476307236bda3d660c158c201db976f19cdce05f41f93110ab6b12fd7a2696602a490cc43d5410ee36a56d6eef93afb0d6ca69ac3b2 + languageName: node + linkType: hard + +"babel-jest@npm:^29.0.3, babel-jest@npm:^29.5.0, babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" dependencies: - "@jest/transform": ^29.6.1 + "@jest/transform": ^29.7.0 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.5.0 + babel-preset-jest: ^29.6.3 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: bc46cfba468edde91f34a8292501d4448a39fab72d80d7d95f4349feb114fa21becb01def007d6166de7933ab9633bf5b5e1b72ba6ffeaa991f7abf014a2f61d + checksum: ee6f8e0495afee07cac5e4ee167be705c711a8cc8a737e05a587a131fdae2b3c8f9aa55dfd4d9c03009ac2d27f2de63d8ba96d3e8460da4d00e8af19ef9a83f7 languageName: node linkType: hard @@ -15248,6 +16317,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:~9.1.2": + version: 9.1.3 + resolution: "babel-loader@npm:9.1.3" + dependencies: + find-cache-dir: ^4.0.0 + schema-utils: ^4.0.0 + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28 + languageName: node + linkType: hard + "babel-plugin-add-react-displayname@npm:^0.0.5": version: 0.0.5 resolution: "babel-plugin-add-react-displayname@npm:0.0.5" @@ -15296,15 +16378,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-plugin-jest-hoist@npm:29.5.0" +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + checksum: 51250f22815a7318f17214a9d44650ba89551e6d4f47a2dc259128428324b52f5a73979d010cefd921fd5a720d8c1d55ad74ff601cd94c7bd44d5f6292fde2d1 languageName: node linkType: hard @@ -15326,6 +16408,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.3.3": + version: 0.3.3 + resolution: "babel-plugin-polyfill-corejs2@npm:0.3.3" + dependencies: + "@babel/compat-data": ^7.17.7 + "@babel/helper-define-polyfill-provider": ^0.3.3 + semver: ^6.1.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7db3044993f3dddb3cc3d407bc82e640964a3bfe22de05d90e1f8f7a5cb71460011ab136d3c03c6c1ba428359ebf635688cd6205e28d0469bba221985f5c6179 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.5": version: 0.4.5 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.5" @@ -15351,6 +16446,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.6.0": + version: 0.6.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.6.0" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.3.3 + core-js-compat: ^3.25.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 470bb8c59f7c0912bd77fe1b5a2e72f349b3f65bbdee1d60d6eb7e1f4a085c6f24b2dd5ab4ac6c2df6444a96b070ef6790eccc9edb6a2668c60d33133bfb62c6 + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.8.3": version: 0.8.3 resolution: "babel-plugin-polyfill-corejs3@npm:0.8.3" @@ -15363,6 +16470,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.4.1": + version: 0.4.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.4.1" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.3.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ab0355efbad17d29492503230387679dfb780b63b25408990d2e4cf421012dae61d6199ddc309f4d2409ce4e9d3002d187702700dd8f4f8770ebbba651ed066c + languageName: node + linkType: hard + "babel-plugin-polyfill-regenerator@npm:^0.5.2": version: 0.5.2 resolution: "babel-plugin-polyfill-regenerator@npm:0.5.2" @@ -15418,15 +16536,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-preset-jest@npm:29.5.0" +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" dependencies: - babel-plugin-jest-hoist: ^29.5.0 + babel-plugin-jest-hoist: ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + checksum: aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb languageName: node linkType: hard @@ -15733,7 +16851,7 @@ __metadata: languageName: node linkType: hard -"bl@npm:^4.0.3": +"bl@npm:^4.0.3, bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: @@ -15804,21 +16922,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.19.2": - version: 1.19.2 - resolution: "body-parser@npm:1.19.2" +"body-parser@npm:1.20.1": + version: 1.20.1 + resolution: "body-parser@npm:1.20.1" dependencies: bytes: 3.1.2 content-type: ~1.0.4 debug: 2.6.9 - depd: ~1.1.2 - http-errors: 1.8.1 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 iconv-lite: 0.4.24 - on-finished: ~2.3.0 - qs: 6.9.7 - raw-body: 2.4.3 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 type-is: ~1.6.18 - checksum: 7f777ea65670e2622ca4a785b5dcb2a68451b3bb8d4d0f41091d307d56b640dba588a9ae04d85dda2cdd5e42788266a783528d5417e5643720fd611fd52522e7 + unpipe: 1.0.0 + checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 languageName: node linkType: hard @@ -16110,6 +17230,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.22.1": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" + dependencies: + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 + bin: + browserslist: cli.js + checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 + languageName: node + linkType: hard + "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -16603,6 +17737,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001565 + resolution: "caniuse-lite@npm:1.0.30001565" + checksum: 7621f358d0e1158557430a111ca5506008ae0b2c796039ef53aeebf4e2ba15e5241cb89def21ea3a633b6a609273085835b44a522165d871fa44067cdf29cccd + languageName: node + linkType: hard + "capital-case@npm:^1.0.4": version: 1.0.4 resolution: "capital-case@npm:1.0.4" @@ -16702,18 +17843,18 @@ __metadata: languageName: node linkType: hard -"chai@npm:>1.9.0, chai@npm:^4.3.7": - version: 4.3.7 - resolution: "chai@npm:4.3.7" +"chai@npm:>1.9.0, chai@npm:^4.3.10": + version: 4.3.10 + resolution: "chai@npm:4.3.10" dependencies: assertion-error: ^1.1.0 - check-error: ^1.0.2 - deep-eql: ^4.1.2 - get-func-name: ^2.0.0 - loupe: ^2.3.1 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 pathval: ^1.1.1 - type-detect: ^4.0.5 - checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c + type-detect: ^4.0.8 + checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d languageName: node linkType: hard @@ -16769,7 +17910,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -16874,10 +18015,12 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.2": - version: 1.0.2 - resolution: "check-error@npm:1.0.2" - checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e +"check-error@npm:^1.0.2, check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: ^2.0.2 + checksum: e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 languageName: node linkType: hard @@ -17070,6 +18213,22 @@ __metadata: languageName: node linkType: hard +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: ^3.1.0 + checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c + languageName: node + linkType: hard + "cli-table3@npm:^0.6.1": version: 0.6.1 resolution: "cli-table3@npm:0.6.1" @@ -17099,6 +18258,13 @@ __metadata: languageName: node linkType: hard +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 + languageName: node + linkType: hard + "clipboard-polyfill@npm:^3.0.3": version: 3.0.3 resolution: "clipboard-polyfill@npm:3.0.3" @@ -17106,17 +18272,6 @@ __metadata: languageName: node linkType: hard -"clipboard@npm:*, clipboard@npm:^2.0.11": - version: 2.0.11 - resolution: "clipboard@npm:2.0.11" - dependencies: - good-listener: ^1.2.2 - select: ^1.1.2 - tiny-emitter: ^2.0.0 - checksum: 413055a6038e43898e0e895216b58ed54fbf386f091cb00188875ef35b186cefbd258acdf4cb4b0ac87cbc00de936f41b45dde9fe1fd1a57f7babb28363b8748 - languageName: node - linkType: hard - "clipboardy@npm:1.2.3": version: 1.2.3 resolution: "clipboardy@npm:1.2.3" @@ -17273,10 +18428,10 @@ __metadata: languageName: node linkType: hard -"codemirror@npm:^5.65.13": - version: 5.65.13 - resolution: "codemirror@npm:5.65.13" - checksum: 47060461edaebecd03b3fba4e73a30cdccc0c51ce3a3a05bafae3c9cafd682101383e94d77d54081eaf1ae18da5b74343e98343c637c52cea409956469039098 +"codemirror@npm:^5.65.15": + version: 5.65.15 + resolution: "codemirror@npm:5.65.15" + checksum: 30e0cff9bfb2265b94fa6766e13975cb71db228e114d6d8cdcc160b495e32b0ff921ac09959715e3fef30a48c5a9d0655ffd0ff6c5fe7024656add438bb2b058 languageName: node linkType: hard @@ -17451,6 +18606,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^10.0.0, commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + "commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -17472,7 +18634,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^7.0.0, commander@npm:^7.2.0": +"commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc @@ -17493,6 +18655,19 @@ __metadata: languageName: node linkType: hard +"comment-json@npm:^4.2.3": + version: 4.2.3 + resolution: "comment-json@npm:4.2.3" + dependencies: + array-timsort: ^1.0.3 + core-util-is: ^1.0.3 + esprima: ^4.0.1 + has-own-prop: ^2.0.0 + repeat-string: ^1.6.1 + checksum: 7f8d26266b0d49de9661f6365cbcc373fee4f4d0f422a203dfb17ad8f3d84c5be5ded444874935a197cd03cff297c53fe48910256cb4171cb2e52a3e6b9d317c + languageName: node + linkType: hard + "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" @@ -17739,14 +18914,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.4.2": - version: 0.4.2 - resolution: "cookie@npm:0.4.2" - checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b - languageName: node - linkType: hard - -"cookie@npm:^0.5.0": +"cookie@npm:0.5.0, cookie@npm:^0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 @@ -17790,6 +18958,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.25.1": + version: 3.33.3 + resolution: "core-js-compat@npm:3.33.3" + dependencies: + browserslist: ^4.22.1 + checksum: cb121e83f0f5f18b2b75428cdfb19524936a18459f1e0358f9124c8ff8b75d6a5901495cb996560cfde3a416103973f78eb5947777bb8b2fd877cdf84471465d + languageName: node + linkType: hard + "core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.8.1": version: 3.31.1 resolution: "core-js-compat@npm:3.31.1" @@ -17827,7 +19004,7 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:~1.0.0": +"core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 @@ -17976,6 +19153,23 @@ __metadata: languageName: node linkType: hard +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-config: ^29.7.0 + jest-util: ^29.7.0 + prompts: ^2.0.1 + bin: + create-jest: bin/create-jest.js + checksum: 1427d49458adcd88547ef6fa39041e1fe9033a661293aa8d2c3aa1b4967cb5bf4f0c00436c7a61816558f28ba2ba81a94d5c962e8022ea9a883978fc8e1f2945 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -18536,13 +19730,20 @@ __metadata: languageName: node linkType: hard -"d3-color@npm:1 - 2, d3-color@npm:^2.0.0": +"d3-color@npm:1 - 2": version: 2.0.0 resolution: "d3-color@npm:2.0.0" checksum: b887354aa383937abd04fbffed3e26e5d6a788472cd3737fb10735930e427763e69fe93398663bccf88c0b53ee3e638ac6fcf0c02226b00ed9e4327c2dfbf3dc languageName: node linkType: hard +"d3-color@npm:1 - 3, d3-color@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b + languageName: node + linkType: hard + "d3-delaunay@npm:^5.3.0": version: 5.3.0 resolution: "d3-delaunay@npm:5.3.0" @@ -18566,7 +19767,7 @@ __metadata: languageName: node linkType: hard -"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2, d3-interpolate@npm:^2.0.1": +"d3-interpolate@npm:1 - 2, d3-interpolate@npm:1.2.0 - 2": version: 2.0.1 resolution: "d3-interpolate@npm:2.0.1" dependencies: @@ -18575,6 +19776,15 @@ __metadata: languageName: node linkType: hard +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b + languageName: node + linkType: hard + "d3-path@npm:1": version: 1.0.9 resolution: "d3-path@npm:1.0.9" @@ -18592,6 +19802,16 @@ __metadata: languageName: node linkType: hard +"d3-scale-chromatic@npm:^3.0.0": + version: 3.0.0 + resolution: "d3-scale-chromatic@npm:3.0.0" + dependencies: + d3-color: 1 - 3 + d3-interpolate: 1 - 3 + checksum: a8ce4cb0267a17b28ebbb929f5e3071d985908a9c13b6fcaa2a198e1e018f275804d691c5794b970df0049725b7944f32297b31603d235af6414004f0c7f82c0 + languageName: node + linkType: hard + "d3-scale@npm:^3.2.3": version: 3.3.0 resolution: "d3-scale@npm:3.3.0" @@ -18916,7 +20136,19 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.1.2": +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + languageName: node + linkType: hard + +"deep-eql@npm:^4.1.3": version: 4.1.3 resolution: "deep-eql@npm:4.1.3" dependencies: @@ -19012,6 +20244,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.0.1": + version: 1.1.0 + resolution: "define-data-property@npm:1.1.0" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: 7ad4ee84cca8ad427a4831f5693526804b62ce9dfd4efac77214e95a4382aed930072251d4075dc8dc9fc949a353ed51f19f5285a84a788ba9216cc51472a093 + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -19083,13 +20326,6 @@ __metadata: languageName: node linkType: hard -"delegate@npm:^3.1.2": - version: 3.2.0 - resolution: "delegate@npm:3.2.0" - checksum: d943058fe05897228b158cbd1bab05164df28c8f54127873231d6b03b0a5acc1b3ee1f98ac70ccc9b79cd84aa47118a7de111fee2923753491583905069da27d - languageName: node - linkType: hard - "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -19142,13 +20378,6 @@ __metadata: languageName: node linkType: hard -"destroy@npm:~1.0.4": - version: 1.0.4 - resolution: "destroy@npm:1.0.4" - checksum: da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03 - languageName: node - linkType: hard - "desvg-loader@npm:^0.1.0": version: 0.1.0 resolution: "desvg-loader@npm:0.1.0" @@ -19183,10 +20412,10 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": - version: 2.0.1 - resolution: "detect-libc@npm:2.0.1" - checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 +"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.2": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d languageName: node linkType: hard @@ -19257,10 +20486,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.4.3": - version: 29.4.3 - resolution: "diff-sequences@npm:29.4.3" - checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa languageName: node linkType: hard @@ -19628,6 +20857,13 @@ __metadata: languageName: node linkType: hard +"drange@npm:^1.0.2": + version: 1.1.1 + resolution: "drange@npm:1.1.1" + checksum: 7e6ed639f9ab4d826e79717e2b0685a7ab02ecd39dac6483305dcc43ea2a27dc78b538e10adaba35c086efab216ef1f53f22bc402abfd0d29454b1c5f48fecd1 + languageName: node + linkType: hard + "duplexer2@npm:~0.0.2": version: 0.0.2 resolution: "duplexer2@npm:0.0.2" @@ -19715,6 +20951,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.535": + version: 1.4.597 + resolution: "electron-to-chromium@npm:1.4.597" + checksum: 3dc5d6a6f1dcdda3251a2d112f418a5e4924fcc2320cff68f82a73be6fcd68895637b04c0086e2ea8d2c83dd126d62112777a0dda9f1cd45d5596ec3a6b2a6f5 + languageName: node + linkType: hard + "element-closest-polyfill@npm:^1.0.6": version: 1.0.6 resolution: "element-closest-polyfill@npm:1.0.6" @@ -19905,7 +21148,7 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.15.0": +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.15.0": version: 5.15.0 resolution: "enhanced-resolve@npm:5.15.0" dependencies: @@ -20023,35 +21266,50 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.4": - version: 1.20.4 - resolution: "es-abstract@npm:1.20.4" +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": + version: 1.22.2 + resolution: "es-abstract@npm:1.22.2" dependencies: + array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.2 + available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.3 + function.prototype.name: ^1.1.6 + get-intrinsic: ^1.2.1 get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 has: ^1.0.3 has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 has-symbols: ^1.0.3 - internal-slot: ^1.0.3 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 is-callable: ^1.2.7 is-negative-zero: ^2.0.2 is-regex: ^1.1.4 is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 + is-typed-array: ^1.1.12 is-weakref: ^1.0.2 - object-inspect: ^1.12.2 + object-inspect: ^1.12.3 object-keys: ^1.1.1 object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 + regexp.prototype.flags: ^1.5.1 + safe-array-concat: ^1.0.1 safe-regex-test: ^1.0.0 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 + string.prototype.trim: ^1.2.8 + string.prototype.trimend: ^1.0.7 + string.prototype.trimstart: ^1.0.7 + typed-array-buffer: ^1.0.0 + typed-array-byte-length: ^1.0.0 + typed-array-byte-offset: ^1.0.0 + typed-array-length: ^1.0.4 unbox-primitive: ^1.0.2 - checksum: 89297cc785c31aedf961a603d5a07ed16471e435d3a1b6d070b54f157cf48454b95cda2ac55e4b86ff4fe3276e835fcffd2771578e6fa634337da49b26826141 + which-typed-array: ^1.1.11 + checksum: cc70e592d360d7d729859013dee7a610c6b27ed8630df0547c16b0d16d9fe6505a70ee14d1af08d970fdd132b3f88c9ca7815ce72c9011608abf8ab0e55fc515 languageName: node linkType: hard @@ -20086,6 +21344,17 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -20357,13 +21626,13 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:~27.2.2": - version: 27.2.2 - resolution: "eslint-plugin-jest@npm:27.2.2" +"eslint-plugin-jest@npm:~27.2.3": + version: 27.2.3 + resolution: "eslint-plugin-jest@npm:27.2.3" dependencies: "@typescript-eslint/utils": ^5.10.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 + "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 eslint: ^7.0.0 || ^8.0.0 jest: "*" peerDependenciesMeta: @@ -20371,7 +21640,7 @@ __metadata: optional: true jest: optional: true - checksum: 98b63252d985f5dedf36ce9587dd4a0d24daf71ca8a997258343402c0d33ddd5070502378dafd9ac7fc0ef2e0d557b5c77f18e09ad73c71a52de8061db88293f + checksum: 4c7e07f52f17749ac6fd0ff5fcd5ce30b88983ba31eeee322e4d48859f55eaa112f06172e586ad2031c00ff28bb2dfdc3d35c83895251b9c0e860fa47dfc5ff4 languageName: node linkType: hard @@ -20384,16 +21653,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-playwright@npm:~0.15.0": - version: 0.15.0 - resolution: "eslint-plugin-playwright@npm:0.15.0" +"eslint-plugin-playwright@npm:~0.15.3": + version: 0.15.3 + resolution: "eslint-plugin-playwright@npm:0.15.3" peerDependencies: eslint: ">=7" eslint-plugin-jest: ">=25" peerDependenciesMeta: eslint-plugin-jest: optional: true - checksum: fe772ee1f611802f70310cd02d2048f64b244644fcb00b47e935aac8cfab800612b122fe50deb3e1ea6bde1d1d635a745f3574cc316fcccbeaaa278be9c2e20f + checksum: 5dff7f1d8346dac41980197ce24f2629f09acc44b612c38a6859cb31d5dc29caa4d9a09fec0b10443bae7ebc4b79d4c926dca284707bae729469016ce9f1dbfc languageName: node linkType: hard @@ -20421,12 +21690,12 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-refresh@npm:^0.4.1": - version: 0.4.1 - resolution: "eslint-plugin-react-refresh@npm:0.4.1" +"eslint-plugin-react-refresh@npm:^0.4.4": + version: 0.4.4 + resolution: "eslint-plugin-react-refresh@npm:0.4.4" peerDependencies: eslint: ">=7" - checksum: 932f982797ef54a87e20039c32739c1a6df8355165d17ba851620b4690632432f511605e20c30e6abdb4c58d2bd926e96347f9253db724dcf3dae92bd1258d1d + checksum: 6b93f43cef5f69c18751db3267ce6cc7cb88f07061df28fc12401be56d93f37134f2a794c760f51cd5f84c5e81d81b003ef761ca76e7674646808b82884aa356 languageName: node linkType: hard @@ -20455,9 +21724,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:~0.6.12": - version: 0.6.12 - resolution: "eslint-plugin-storybook@npm:0.6.12" +"eslint-plugin-storybook@npm:~0.6.15": + version: 0.6.15 + resolution: "eslint-plugin-storybook@npm:0.6.15" dependencies: "@storybook/csf": ^0.0.1 "@typescript-eslint/utils": ^5.45.0 @@ -20465,18 +21734,18 @@ __metadata: ts-dedent: ^2.2.0 peerDependencies: eslint: ">=6" - checksum: 8e0e160c71216019c291a5a03b797b5359076067d16ea03b3dec63594093d45398f028d15c47eb89f2ddb6e8db18cc7e376b02d921dacc4fb31bbc8da46363c8 + checksum: e2c4d7be3e695c88d7194c363fba8ac644b36583bf9d608aa59dcd53cc5e422f7828611ee49c7934639ce827c0206d33fa94b3ea452ffbd2c8e7254ed90bc412 languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^5.11.0, eslint-plugin-testing-library@npm:~5.11.0": - version: 5.11.0 - resolution: "eslint-plugin-testing-library@npm:5.11.0" +"eslint-plugin-testing-library@npm:^5.11.1, eslint-plugin-testing-library@npm:~5.11.1": + version: 5.11.1 + resolution: "eslint-plugin-testing-library@npm:5.11.1" dependencies: "@typescript-eslint/utils": ^5.58.0 peerDependencies: eslint: ^7.5.0 || ^8.0.0 - checksum: 7f19d3dedd7788b411ca3d9045de682feb26025b9c26d97d4e2f0bf62f5eaa276147d946bd5d0cd967b822e546a954330fdb7ef80485301264f646143f011a02 + checksum: 9f3fc68ef9f13016a4381b33ab5dbffcc189e5de3eaeba184bcf7d2771faa7f54e59c04b652162fb1c0f83fb52428dd909db5450a25508b94be59eba69fcc990 languageName: node linkType: hard @@ -20991,17 +22260,23 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.6.1": - version: 29.6.1 - resolution: "expect@npm:29.6.1" +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" dependencies: - "@jest/expect-utils": ^29.6.1 - "@types/node": "*" - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 - checksum: 4e712e52c90f6c54e748fd2876be33c43ada6a59088ddf6a1acb08b18b3b97b3a672124684abe32599986d2f2a438d5afad148837ee06ea386d2a4bf0348de78 + "@jest/expect-utils": ^29.7.0 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 + checksum: 9257f10288e149b81254a0fda8ffe8d54a7061cd61d7515779998b012579d2b8c22354b0eb901daf0145f347403da582f75f359f4810c007182ad3fb318b5c0c + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 languageName: node linkType: hard @@ -21021,41 +22296,42 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.2, express@npm:^4.17.3": - version: 4.17.3 - resolution: "express@npm:4.17.3" +"express@npm:^4.16.4, express@npm:^4.17.1, express@npm:^4.17.2, express@npm:^4.17.3": + version: 4.18.2 + resolution: "express@npm:4.18.2" dependencies: accepts: ~1.3.8 array-flatten: 1.1.1 - body-parser: 1.19.2 + body-parser: 1.20.1 content-disposition: 0.5.4 content-type: ~1.0.4 - cookie: 0.4.2 + cookie: 0.5.0 cookie-signature: 1.0.6 debug: 2.6.9 - depd: ~1.1.2 + depd: 2.0.0 encodeurl: ~1.0.2 escape-html: ~1.0.3 etag: ~1.8.1 - finalhandler: ~1.1.2 + finalhandler: 1.2.0 fresh: 0.5.2 + http-errors: 2.0.0 merge-descriptors: 1.0.1 methods: ~1.1.2 - on-finished: ~2.3.0 + on-finished: 2.4.1 parseurl: ~1.3.3 path-to-regexp: 0.1.7 proxy-addr: ~2.0.7 - qs: 6.9.7 + qs: 6.11.0 range-parser: ~1.2.1 safe-buffer: 5.2.1 - send: 0.17.2 - serve-static: 1.14.2 + send: 0.18.0 + serve-static: 1.15.0 setprototypeof: 1.2.0 - statuses: ~1.5.0 + statuses: 2.0.1 type-is: ~1.6.18 utils-merge: 1.0.1 vary: ~1.1.2 - checksum: 967e53b74a37eafdf9789b9938c8df86102928b4985b1ad5e385c709deeab405a364de95ca744bc2cc5d05b5d9cc1efc69ae2ae17688a462038648d5a924bfad + checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 languageName: node linkType: hard @@ -21173,6 +22449,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.1.0, fast-fifo@npm:^1.2.0": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 + languageName: node + linkType: hard + "fast-glob@npm:^2.2.6": version: 2.2.7 resolution: "fast-glob@npm:2.2.7" @@ -21280,6 +22563,17 @@ __metadata: languageName: node linkType: hard +"fast-xml-parser@npm:^4.2.4": + version: 4.3.2 + resolution: "fast-xml-parser@npm:4.3.2" + dependencies: + strnum: ^1.0.5 + bin: + fxparser: src/cli/cli.js + checksum: d507ce2efa5fd13d0a5ba28bd76dd68f2fc30ad8748357c37b70f360d19417866d79e35a688af067d5bceaaa796033fa985206aef9692f7a421e1326b6e73309 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.12": version: 1.0.12 resolution: "fastest-levenshtein@npm:1.0.12" @@ -21287,7 +22581,7 @@ __metadata: languageName: node linkType: hard -"fastest-validator@npm:^1.16.0": +"fastest-validator@npm:^1.17.0": version: 1.17.0 resolution: "fastest-validator@npm:1.17.0" checksum: 0a6240f6dc7b544b3aadf9367410ecd64590dbfe505e6a24c339df954dd216f3a714d64a224abeef531d0a40dc348efe6cdbf59372d28954ac450cc0b212e0ec @@ -21383,6 +22677,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -21589,7 +22892,7 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.1.2, finalhandler@npm:~1.1.2": +"finalhandler@npm:1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" dependencies: @@ -21604,6 +22907,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:1.2.0": + version: 1.2.0 + resolution: "finalhandler@npm:1.2.0" + dependencies: + debug: 2.6.9 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + on-finished: 2.4.1 + parseurl: ~1.3.3 + statuses: 2.0.1 + unpipe: ~1.0.0 + checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + languageName: node + linkType: hard + "find-cache-dir@npm:^2.0.0, find-cache-dir@npm:^2.1.0": version: 2.1.0 resolution: "find-cache-dir@npm:2.1.0" @@ -21626,6 +22944,16 @@ __metadata: languageName: node linkType: hard +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" + dependencies: + common-path-prefix: ^3.0.0 + pkg-dir: ^7.0.0 + checksum: 52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f + languageName: node + linkType: hard + "find-up@npm:5.0.0, find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -21665,6 +22993,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: ^7.1.0 + path-exists: ^5.0.0 + checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 + languageName: node + linkType: hard + "find-versions@npm:^3.0.0": version: 3.2.0 resolution: "find-versions@npm:3.2.0" @@ -22107,7 +23445,7 @@ __metadata: "fsevents@patch:fsevents@2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@^2.1.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>": version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7" + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=df0bf1" dependencies: node-gyp: latest conditions: os=darwin @@ -22116,7 +23454,7 @@ __metadata: "fsevents@patch:fsevents@^1.2.7#~builtin<compat/fsevents>": version: 1.2.13 - resolution: "fsevents@patch:fsevents@npm%3A1.2.13#~builtin<compat/fsevents>::version=1.2.13&hash=18f3a7" + resolution: "fsevents@patch:fsevents@npm%3A1.2.13#~builtin<compat/fsevents>::version=1.2.13&hash=d11327" dependencies: bindings: ^1.5.0 nan: ^2.12.1 @@ -22141,15 +23479,22 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.0, function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.0, function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 languageName: node linkType: hard @@ -22160,7 +23505,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -22279,10 +23624,10 @@ __metadata: languageName: node linkType: hard -"generate-password@npm:^1.7.0": - version: 1.7.0 - resolution: "generate-password@npm:1.7.0" - checksum: c0d13e9a9c72d84adc4365a0c0dbd28463f2da1975b4ec83f34a126b95122551274755db641418e5aa11c8d94c1d216c8da8314f38e56e05378e1a43792f4614 +"generate-password@npm:^1.7.1": + version: 1.7.1 + resolution: "generate-password@npm:1.7.1" + checksum: 76ab72dcf13ae174e4e069b32b94d7c2613c6e83db1c00ffad17a480a80875b28c4ed8f0767b143f7103b0742afb45a10549e6ef2f72c0a994979e77b8e95b86 languageName: node linkType: hard @@ -22314,10 +23659,10 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.0": - version: 2.0.0 - resolution: "get-func-name@npm:2.0.0" - checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b languageName: node linkType: hard @@ -22687,12 +24032,12 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.0": - version: 1.0.2 - resolution: "globalthis@npm:1.0.2" +"globalthis@npm:^1.0.0, globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" dependencies: define-properties: ^1.1.3 - checksum: 5a5f3c7ab94708260a98106b35946b74bb57f6b2013e39668dc9e8770b80a3418103b63a2b4aa01c31af15fdf6a2940398ffc0a408573c34c2304f928895adff + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 languageName: node linkType: hard @@ -22776,15 +24121,6 @@ __metadata: languageName: node linkType: hard -"good-listener@npm:^1.2.2": - version: 1.2.2 - resolution: "good-listener@npm:1.2.2" - dependencies: - delegate: ^3.1.2 - checksum: f39fb82c4e41524f56104cfd2d7aef1a88e72f3f75139115fbdf98cc7d844e0c1b39218b2e83438c6188727bf904ed78c7f0f2feff67b32833bc3af7f0202b33 - languageName: node - linkType: hard - "google-auth-library@npm:^8.0.1, google-auth-library@npm:^8.0.2": version: 8.7.0 resolution: "google-auth-library@npm:8.7.0" @@ -22802,10 +24138,10 @@ __metadata: languageName: node linkType: hard -"google-libphonenumber@npm:^3.2.32": - version: 3.2.32 - resolution: "google-libphonenumber@npm:3.2.32" - checksum: 6f6e033df053759758c37a3ca76e83d2026933d900ffb24349040767561f81e4c2faa88a01b023019528f4f560d4a878c2c635b6e604c9d3111f801eb514c959 +"google-libphonenumber@npm:^3.2.33": + version: 3.2.33 + resolution: "google-libphonenumber@npm:3.2.33" + checksum: d029c19c7278ac9acb446028c2e304df16341732905a0cf8a105ab595cb19c01456fd57d76e48a3220038044d8ce361edc539eea2bfd924ea36fb28178cf7dbe languageName: node linkType: hard @@ -23076,6 +24412,13 @@ __metadata: languageName: node linkType: hard +"has-own-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "has-own-prop@npm:2.0.0" + checksum: ca6336e85ead2295c9603880cbc199e2d3ff7eaea0e9035d68fbc79892e9cf681abc62c0909520f112c671dad9961be2173b21dff951358cc98425c560e789e0 + languageName: node + linkType: hard + "has-property-descriptors@npm:^1.0.0": version: 1.0.0 resolution: "has-property-descriptors@npm:1.0.0" @@ -23210,6 +24553,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + languageName: node + linkType: hard + "hast-to-hyperscript@npm:^9.0.0": version: 9.0.1 resolution: "hast-to-hyperscript@npm:9.0.1" @@ -23582,7 +24934,7 @@ __metadata: languageName: node linkType: hard -"html-webpack-plugin@npm:^4.0.0, html-webpack-plugin@npm:^4.4.1": +"html-webpack-plugin@npm:^4.0.0": version: 4.5.2 resolution: "html-webpack-plugin@npm:4.5.2" dependencies: @@ -23601,7 +24953,7 @@ __metadata: languageName: node linkType: hard -"html-webpack-plugin@npm:^5.0.0": +"html-webpack-plugin@npm:^5.0.0, html-webpack-plugin@npm:^5.5.3": version: 5.5.3 resolution: "html-webpack-plugin@npm:5.5.3" dependencies: @@ -23680,19 +25032,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:1.8.1": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.1 - checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 - languageName: node - linkType: hard - "http-errors@npm:2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -23871,15 +25210,6 @@ __metadata: languageName: node linkType: hard -"husky@npm:^7.0.4": - version: 7.0.4 - resolution: "husky@npm:7.0.4" - bin: - husky: lib/bin.js - checksum: c6ec4af63da2c9522da8674a20ad9b48362cc92704896cc8a58c6a2a39d797feb2b806f93fbd83a6d653fbdceb2c3b6e0b602c6b2e8565206ffc2882ef7db9e9 - languageName: node - linkType: hard - "hyperquest@npm:~2.0.0": version: 2.0.0 resolution: "hyperquest@npm:2.0.0" @@ -23913,12 +25243,12 @@ __metadata: languageName: node linkType: hard -"i18next@npm:>=17.0.11, i18next@npm:~23.4.5": - version: 23.4.5 - resolution: "i18next@npm:23.4.5" +"i18next@npm:>=17.0.11, i18next@npm:~23.4.9": + version: 23.4.9 + resolution: "i18next@npm:23.4.9" dependencies: "@babel/runtime": ^7.22.5 - checksum: b39a1edc19fc6fb34df4fd95581e2b86dd5d8c8345e3409a3366df606a72b62f25ee31a82fb9b0e22161cd856408989c91b74ee737b0cce00d547e6d371a14f5 + checksum: 46ac2415dc817c0e25e1c5e64332249825cd63b5fb9a5d42e3a2329d4ecd098c0f15a243f56b53e03db02e2e9931ca9bb4447370b2436f9ad6556de40ce981cf languageName: node linkType: hard @@ -24376,7 +25706,30 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4": +"inquirer@npm:^8.2.5": + version: 8.2.6 + resolution: "inquirer@npm:8.2.6" + dependencies: + ansi-escapes: ^4.2.1 + chalk: ^4.1.1 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + external-editor: ^3.0.3 + figures: ^3.0.0 + lodash: ^4.17.21 + mute-stream: 0.0.8 + ora: ^5.4.1 + run-async: ^2.4.0 + rxjs: ^7.5.5 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + wrap-ansi: ^6.0.1 + checksum: 387ffb0a513559cc7414eb42c57556a60e302f820d6960e89d376d092e257a919961cd485a1b4de693dbb5c0de8bc58320bfd6247dfd827a873aa82a4215a240 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": version: 1.0.5 resolution: "internal-slot@npm:1.0.5" dependencies: @@ -24408,6 +25761,13 @@ __metadata: languageName: node linkType: hard +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + languageName: node + linkType: hard + "intl-messageformat@npm:^10.1.0": version: 10.1.4 resolution: "intl-messageformat@npm:10.1.4" @@ -24489,10 +25849,10 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": - version: 2.0.1 - resolution: "ipaddr.js@npm:2.0.1" - checksum: dd194a394a843d470f88d17191b0948f383ed1c8e320813f850c336a0fcb5e9215d97ec26ca35ab4fbbd31392c8b3467f3e8344628029ed3710b2ff6b5d1034e +"ipaddr.js@npm:^2.0.1, ipaddr.js@npm:^2.1.0": + version: 2.1.0 + resolution: "ipaddr.js@npm:2.1.0" + checksum: 807a054f2bd720c4d97ee479d6c9e865c233bea21f139fb8dabd5a35c4226d2621c42e07b4ad94ff3f82add926a607d8d9d37c625ad0319f0e08f9f2bd1968e2 languageName: node linkType: hard @@ -24694,6 +26054,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + "is-cwebp-readable@npm:^3.0.0": version: 3.0.0 resolution: "is-cwebp-readable@npm:3.0.0" @@ -24785,6 +26154,13 @@ __metadata: languageName: node linkType: hard +"is-electron@npm:2.2.2": + version: 2.2.2 + resolution: "is-electron@npm:2.2.2" + checksum: de5aa8bd8d72c96675b8d0f93fab4cc21f62be5440f65bc05c61338ca27bd851a64200f31f1bf9facbaa01b3dbfed7997b2186741d84b93b63e0aff1db6a9494 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -24912,6 +26288,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + languageName: node + linkType: hard + "is-jpg@npm:^2.0.0": version: 2.0.0 resolution: "is-jpg@npm:2.0.0" @@ -25215,7 +26598,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3": +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": version: 1.1.12 resolution: "is-typed-array@npm:1.1.12" dependencies: @@ -25448,7 +26831,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": +"istanbul-lib-instrument@npm:^5.0.4": version: 5.1.0 resolution: "istanbul-lib-instrument@npm:5.1.0" dependencies: @@ -25461,6 +26844,19 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.1 + resolution: "istanbul-lib-instrument@npm:6.0.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^7.5.4 + checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + languageName: node + linkType: hard + "istanbul-lib-processinfo@npm:^2.0.2": version: 2.0.3 resolution: "istanbul-lib-processinfo@npm:2.0.3" @@ -25547,59 +26943,59 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-changed-files@npm:29.5.0" +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" dependencies: execa: ^5.0.0 + jest-util: ^29.7.0 p-limit: ^3.1.0 - checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + checksum: 963e203893c396c5dfc75e00a49426688efea7361b0f0e040035809cecd2d46b3c01c02be2d9e8d38b1138357d2de7719ea5b5be21f66c10f2e9685a5a73bb99 languageName: node linkType: hard -"jest-circus@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-circus@npm:29.6.1" +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/expect": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/expect": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 - dedent: ^0.7.0 + dedent: ^1.0.0 is-generator-fn: ^2.0.0 - jest-each: ^29.6.1 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-runtime: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 + jest-each: ^29.7.0 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-runtime: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 p-limit: ^3.1.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 pure-rand: ^6.0.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: f3e39a74b601929448df92037f0599978d4d7a4b8f636f64e8020533d2d2b2f669d6729c80c6efed69341ca26753e5061e9787a0acd6c70af2127a94375ebb76 + checksum: 349437148924a5a109c9b8aad6d393a9591b4dac1918fc97d81b7fc515bc905af9918495055071404af1fab4e48e4b04ac3593477b1d5dcf48c4e71b527c70a7 languageName: node linkType: hard -"jest-cli@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-cli@npm:29.6.1" +"jest-cli@npm:^29.5.0, jest-cli@npm:^29.6.4": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" dependencies: - "@jest/core": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/core": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 chalk: ^4.0.0 + create-jest: ^29.7.0 exit: ^0.1.2 - graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 - prompts: ^2.0.1 + jest-config: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 yargs: ^17.3.1 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -25608,34 +27004,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: f5854ffea977b9a12520ea71f8d0cc8a626cbb93d7e1e6eea18a2a1f2b25f70f1b6b08a89f11b4dc7dd36a1776a9ac2cf8ec5c7998086f913ee690c06c07c949 + checksum: 664901277a3f5007ea4870632ed6e7889db9da35b2434e7cb488443e6bf5513889b344b7fddf15112135495b9875892b156faeb2d7391ddb9e2a849dcb7b6c36 languageName: node linkType: hard -"jest-config@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-config@npm:29.6.1" +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.6.1 - "@jest/types": ^29.6.1 - babel-jest: ^29.6.1 + "@jest/test-sequencer": ^29.7.0 + "@jest/types": ^29.6.3 + babel-jest: ^29.7.0 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^29.6.1 - jest-environment-node: ^29.6.1 - jest-get-type: ^29.4.3 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-runner: ^29.6.1 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 + jest-circus: ^29.7.0 + jest-environment-node: ^29.7.0 + jest-get-type: ^29.6.3 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-runner: ^29.7.0 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -25646,7 +27042,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 3a30afeb28cc5658ef9cd95f2551ab8a29641bb6d377eb239cba8e7522eb4611c9a98cdcf173d87f5ad7b5e1ad242c3cd5434a260107bd3c7e8305d05023e05c + checksum: 4cabf8f894c180cac80b7df1038912a3fc88f96f2622de33832f4b3314f83e22b08fb751da570c0ab2b7988f21604bdabade95e3c0c041068ac578c085cf7dff languageName: node linkType: hard @@ -25662,72 +27058,72 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^29.6.1": - version: 29.6.2 - resolution: "jest-diff@npm:29.6.2" +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" dependencies: chalk: ^4.0.0 - diff-sequences: ^29.4.3 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.2 - checksum: 0effd66a0c23f8c139ebf7ca99ed30b479b86fff66f19ad4869f130aaf7ae6a24ca1533f697b7e4930cbe2ddffc85387723fcca673501c653fb77a38f538e959 + diff-sequences: ^29.6.3 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: 08e24a9dd43bfba1ef07a6374e5af138f53137b79ec3d5cc71a2303515335898888fa5409959172e1e05de966c9e714368d15e8994b0af7441f0721ee8e1bb77 languageName: node linkType: hard -"jest-docblock@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-docblock@npm:29.4.3" +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" dependencies: detect-newline: ^3.0.0 - checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + checksum: 66390c3e9451f8d96c5da62f577a1dad701180cfa9b071c5025acab2f94d7a3efc2515cfa1654ebe707213241541ce9c5530232cdc8017c91ed64eea1bd3b192 languageName: node linkType: hard -"jest-each@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-each@npm:29.6.1" +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 chalk: ^4.0.0 - jest-get-type: ^29.4.3 - jest-util: ^29.6.1 - pretty-format: ^29.6.1 - checksum: 9d2ea7ed5326ee8c22523b22c66c85fe73754ea39f9b389881956508ee441392c61072a5fbf673e39beddd31d011bb94acae3edc77053ba4f9aa5c060114a5c8 + jest-get-type: ^29.6.3 + jest-util: ^29.7.0 + pretty-format: ^29.7.0 + checksum: e88f99f0184000fc8813f2a0aa79e29deeb63700a3b9b7928b8a418d7d93cd24933608591dbbdea732b473eb2021c72991b5cc51a17966842841c6e28e6f691c languageName: node linkType: hard -"jest-environment-jsdom@npm:~29.6.1": - version: 29.6.1 - resolution: "jest-environment-jsdom@npm:29.6.1" +"jest-environment-jsdom@npm:~29.6.4": + version: 29.6.4 + resolution: "jest-environment-jsdom@npm:29.6.4" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.6.4 + "@jest/fake-timers": ^29.6.4 + "@jest/types": ^29.6.3 "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^29.6.1 - jest-util: ^29.6.1 + jest-mock: ^29.6.3 + jest-util: ^29.6.3 jsdom: ^20.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: e8a9bff00a011235b004699f34bc85b18fdac82049513410cbf2dc1c2dd332bc1b4f108976412df1d29f2fa8bf0360aaf84eb0f5b4db1db2fb7fc7155dc14be7 + checksum: 2afe105f12d7d93ca56e2e6f67ab07ada3dd3da0516d1198f254930683ab9feb2b8c14417baaca53544eed88fd7fb5744f0dbce2e100269746187317ce0347df languageName: node linkType: hard -"jest-environment-node@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-environment-node@npm:29.6.1" +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-mock: ^29.6.1 - jest-util: ^29.6.1 - checksum: a50287e1ff29d131646bd09acc3222ac6ea0ad61e86bf73851d318ef2be0633a421b8558c4a15ddc67e0ffcfc32da7f6a0d8a2ddbfa85453837899dec88d256c + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + checksum: 501a9966292cbe0ca3f40057a37587cb6def25e1e0c5e39ac6c650fe78d3c70a2428304341d084ac0cced5041483acef41c477abac47e9a290d5545fd2f15646 languageName: node linkType: hard @@ -25748,10 +27144,10 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-get-type@npm:29.4.3" - checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 languageName: node linkType: hard @@ -25780,65 +27176,65 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-haste-map@npm:29.6.1" +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 graceful-fs: ^4.2.9 - jest-regex-util: ^29.4.3 - jest-util: ^29.6.1 - jest-worker: ^29.6.1 + jest-regex-util: ^29.6.3 + jest-util: ^29.7.0 + jest-worker: ^29.7.0 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: 7c74d5a0f6aafa9f4e60fae7949d4774770c0243fb529c24f2f4c81229db479fa318dc8b81e8d226865aef1d600af10bd8404dd208e802318434b46f75d5d869 + checksum: c2c8f2d3e792a963940fbdfa563ce14ef9e14d4d86da645b96d3cd346b8d35c5ce0b992ee08593939b5f718cf0a1f5a90011a056548a1dbf58397d4356786f01 languageName: node linkType: hard -"jest-leak-detector@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-leak-detector@npm:29.6.1" +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" dependencies: - jest-get-type: ^29.4.3 - pretty-format: ^29.6.1 - checksum: 5122d40c248effaede4c9ee3a99046a3f30088fef7bfc4af534678b432455161399357af46deb6423de7e05c6597920d6ee8cd570e26048886a90d541334f8c8 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 languageName: node linkType: hard -"jest-matcher-utils@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-matcher-utils@npm:29.6.1" +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" dependencies: chalk: ^4.0.0 - jest-diff: ^29.6.1 - jest-get-type: ^29.4.3 - pretty-format: ^29.6.1 - checksum: d2efa6aed6e4820758b732b9fefd315c7fa4508ee690da656e1c5ac4c1a0f4cee5b04c9719ee1fda9aeb883b4209186c145089ced521e715b9fa70afdfa4a9c6 + jest-diff: ^29.7.0 + jest-get-type: ^29.6.3 + pretty-format: ^29.7.0 + checksum: d7259e5f995d915e8a37a8fd494cb7d6af24cd2a287b200f831717ba0d015190375f9f5dc35393b8ba2aae9b2ebd60984635269c7f8cff7d85b077543b7744cd languageName: node linkType: hard -"jest-message-util@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-message-util@npm:29.6.1" +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 3e7cb2ff087fe72255292e151d24e4fbb4cd6134885c0a67a4b302f233fe4110bf7580b176f427f05ad7550eb878ed94237209785d09d659a7d171ffa59c068f + checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 languageName: node linkType: hard @@ -25852,14 +27248,14 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-mock@npm:29.6.1" +"jest-mock@npm:^29.6.3, jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" - jest-util: ^29.6.1 - checksum: 5e902f1a7eba1eb1a64eb6c19947fe1316834359d9869d0e2644d8979b9cad0465885dc4c9909c471888cddeea835c938cec6263d386d3d1aad720fc74e52ea1 + jest-util: ^29.7.0 + checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 languageName: node linkType: hard @@ -25882,96 +27278,96 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-regex-util@npm:29.4.3" - checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-resolve-dependencies@npm:29.6.1" +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" dependencies: - jest-regex-util: ^29.4.3 - jest-snapshot: ^29.6.1 - checksum: cee0a0fe53fd4531492a526b6ccd32377baad1eff6e6c124f04e9dc920219fd23fd39be88bb9551ee68d5fe92a3af627b423c9bc65a2aa0ac8a223c0e74dbbbb + jest-regex-util: ^29.6.3 + jest-snapshot: ^29.7.0 + checksum: aeb75d8150aaae60ca2bb345a0d198f23496494677cd6aefa26fc005faf354061f073982175daaf32b4b9d86b26ca928586344516e3e6969aa614cb13b883984 languageName: node linkType: hard -"jest-resolve@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-resolve@npm:29.6.1" +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 + jest-haste-map: ^29.7.0 jest-pnp-resolver: ^1.2.2 - jest-util: ^29.6.1 - jest-validate: ^29.6.1 + jest-util: ^29.7.0 + jest-validate: ^29.7.0 resolve: ^1.20.0 resolve.exports: ^2.0.0 slash: ^3.0.0 - checksum: 9ce979a0f4a751bea58caea76415112df2a3f4d58e294019872244728aadd001f0ec20c873a3c805dd8f7c762143b3c14d00f87d124ed87c9981fbf8723090ef + checksum: 0ca218e10731aa17920526ec39deaec59ab9b966237905ffc4545444481112cd422f01581230eceb7e82d86f44a543d520a71391ec66e1b4ef1a578bd5c73487 languageName: node linkType: hard -"jest-runner@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-runner@npm:29.6.1" +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" dependencies: - "@jest/console": ^29.6.1 - "@jest/environment": ^29.6.1 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/console": ^29.7.0 + "@jest/environment": ^29.7.0 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.13.1 graceful-fs: ^4.2.9 - jest-docblock: ^29.4.3 - jest-environment-node: ^29.6.1 - jest-haste-map: ^29.6.1 - jest-leak-detector: ^29.6.1 - jest-message-util: ^29.6.1 - jest-resolve: ^29.6.1 - jest-runtime: ^29.6.1 - jest-util: ^29.6.1 - jest-watcher: ^29.6.1 - jest-worker: ^29.6.1 + jest-docblock: ^29.7.0 + jest-environment-node: ^29.7.0 + jest-haste-map: ^29.7.0 + jest-leak-detector: ^29.7.0 + jest-message-util: ^29.7.0 + jest-resolve: ^29.7.0 + jest-runtime: ^29.7.0 + jest-util: ^29.7.0 + jest-watcher: ^29.7.0 + jest-worker: ^29.7.0 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 0e4dbda26669ae31fee32f8a62b3119bba510f2d17a098d6157b48a73ed2fc9842405bf893f3045c12b3632c7c0e3399fb22684b18ab5566aff4905b26c79a9a + checksum: f0405778ea64812bf9b5c50b598850d94ccf95d7ba21f090c64827b41decd680ee19fcbb494007cdd7f5d0d8906bfc9eceddd8fa583e753e736ecd462d4682fb languageName: node linkType: hard -"jest-runtime@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-runtime@npm:29.6.1" +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.1 - "@jest/fake-timers": ^29.6.1 - "@jest/globals": ^29.6.1 - "@jest/source-map": ^29.6.0 - "@jest/test-result": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/globals": ^29.7.0 + "@jest/source-map": ^29.6.3 + "@jest/test-result": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^29.6.1 - jest-message-util: ^29.6.1 - jest-mock: ^29.6.1 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.6.1 - jest-snapshot: ^29.6.1 - jest-util: ^29.6.1 + jest-haste-map: ^29.7.0 + jest-message-util: ^29.7.0 + jest-mock: ^29.7.0 + jest-regex-util: ^29.6.3 + jest-resolve: ^29.7.0 + jest-snapshot: ^29.7.0 + jest-util: ^29.7.0 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 7c360c9694467d996f3d6d914fefa0e7bda554adda8c2b9fba31546dba663d71a64eda103ff68120a2422f3c16db8f0bc2c445923fe8fb934f37e53ef74fb429 + checksum: d19f113d013e80691e07047f68e1e3448ef024ff2c6b586ce4f90cd7d4c62a2cd1d460110491019719f3c59bfebe16f0e201ed005ef9f80e2cf798c374eed54e languageName: node linkType: hard @@ -25985,32 +27381,31 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-snapshot@npm:29.6.1" +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.6.1 - "@jest/transform": ^29.6.1 - "@jest/types": ^29.6.1 - "@types/prettier": ^2.1.5 + "@jest/expect-utils": ^29.7.0 + "@jest/transform": ^29.7.0 + "@jest/types": ^29.6.3 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^29.6.1 + expect: ^29.7.0 graceful-fs: ^4.2.9 - jest-diff: ^29.6.1 - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.6.1 - jest-message-util: ^29.6.1 - jest-util: ^29.6.1 + jest-diff: ^29.7.0 + jest-get-type: ^29.6.3 + jest-matcher-utils: ^29.7.0 + jest-message-util: ^29.7.0 + jest-util: ^29.7.0 natural-compare: ^1.4.0 - pretty-format: ^29.6.1 + pretty-format: ^29.7.0 semver: ^7.5.3 - checksum: e8f69d1fd4a29d354d4dca9eb2a22674b300f8ef509e4f1e75337c880414a00d2bdc9d3849a6855dbb5a76bfbe74603f33435378a3877e69f0838e4cc2244350 + checksum: 86821c3ad0b6899521ce75ee1ae7b01b17e6dfeff9166f2cf17f012e0c5d8c798f30f9e4f8f7f5bed01ea7b55a6bc159f5eda778311162cbfa48785447c237ad languageName: node linkType: hard @@ -26028,47 +27423,47 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-util@npm:29.6.1" +"jest-util@npm:^29.0.0, jest-util@npm:^29.6.3, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: fc553556c1350c443449cadaba5fb9d604628e8b5ceb6ceaf4e7e08975b24277d0a14bf2e0f956024e03c23e556fcb074659423422a06fbedf2ab52978697ac7 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard -"jest-validate@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-validate@npm:29.6.1" +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^29.4.3 + jest-get-type: ^29.6.3 leven: ^3.1.0 - pretty-format: ^29.6.1 - checksum: d2491f3f33d9bbc2dcaaa6acbff26f257b59c5eeceb65a52a9c1cec2f679b836ec2a4658b7004c0ef9d90cd0d9bd664e41d5ed6900f932bea742dd8e6b85e7f1 + pretty-format: ^29.7.0 + checksum: 191fcdc980f8a0de4dbdd879fa276435d00eb157a48683af7b3b1b98b0f7d9de7ffe12689b617779097ff1ed77601b9f7126b0871bba4f776e222c40f62e9dae languageName: node linkType: hard -"jest-watcher@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-watcher@npm:29.6.1" +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" dependencies: - "@jest/test-result": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/test-result": ^29.7.0 + "@jest/types": ^29.6.3 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.13.1 - jest-util: ^29.6.1 + jest-util: ^29.7.0 string-length: ^4.0.1 - checksum: 69bd5a602284fdce6eba5486c5c57aca6b511d91cb0907c34c104d6dd931e18ce67baa7f8e280fa473e5d81ea3e7b9e7d94f712c37ab0b3b8cc2aec30676955d + checksum: 67e6e7fe695416deff96b93a14a561a6db69389a0667e9489f24485bb85e5b54e12f3b2ba511ec0b777eca1e727235b073e3ebcdd473d68888650489f88df92f languageName: node linkType: hard @@ -26104,26 +27499,26 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-worker@npm:29.6.1" +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" dependencies: "@types/node": "*" - jest-util: ^29.6.1 + jest-util: ^29.7.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 0af309ea4db17c4c47e84a9246f907960a15577683c005fdeafc8f3c06bc455136f95a6f28fa2a3e924b767eb4dacd9b40915a7707305f88586f099af3ac27a8 + checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 languageName: node linkType: hard -"jest@npm:~29.6.1": - version: 29.6.1 - resolution: "jest@npm:29.6.1" +"jest@npm:~29.5.0": + version: 29.5.0 + resolution: "jest@npm:29.5.0" dependencies: - "@jest/core": ^29.6.1 - "@jest/types": ^29.6.1 + "@jest/core": ^29.5.0 + "@jest/types": ^29.5.0 import-local: ^3.0.2 - jest-cli: ^29.6.1 + jest-cli: ^29.5.0 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -26131,7 +27526,26 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 7b8c0ca72f483e00ec19dcf9549f9a9af8ae468ab62925b148d714b58eb52d5fea9a082625193bc833d2d9b64cf65a11f3d37857636c5551af05c10aec4ce71b + checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 + languageName: node + linkType: hard + +"jest@npm:~29.6.4": + version: 29.6.4 + resolution: "jest@npm:29.6.4" + dependencies: + "@jest/core": ^29.6.4 + "@jest/types": ^29.6.3 + import-local: ^3.0.2 + jest-cli: ^29.6.4 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: ba28ca7a86d029bcd742bb254c0c8d0119c1e002ddae128ff6409ebabc0b29c36f69dbf3fdd326aff16e7b2500c9a918bbc6a9a5db4d966e035127242239439f languageName: node linkType: hard @@ -26156,13 +27570,6 @@ __metadata: languageName: node linkType: hard -"jquery@npm:^3.6.0": - version: 3.6.0 - resolution: "jquery@npm:3.6.0" - checksum: 8fd5fef4aa48fd374ec716dd1c1df1af407814a228e15c1260ca140de3a697c2a77c30c54ff1d238b6a3ab4ddc445ddeef9adce6c6d28e4869d85eb9d3951c0e - languageName: node - linkType: hard - "js-git@npm:^0.7.8": version: 0.7.8 resolution: "js-git@npm:0.7.8" @@ -26535,6 +27942,24 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^9.0.0": + version: 9.0.2 + resolution: "jsonwebtoken@npm:9.0.2" + dependencies: + jws: ^3.2.2 + lodash.includes: ^4.3.0 + lodash.isboolean: ^3.0.3 + lodash.isinteger: ^4.0.4 + lodash.isnumber: ^3.0.3 + lodash.isplainobject: ^4.0.6 + lodash.isstring: ^4.0.1 + lodash.once: ^4.0.0 + ms: ^2.1.1 + semver: ^7.5.4 + checksum: fc739a6a8b33f1974f9772dca7f8493ca8df4cc31c5a09dcfdb7cff77447dcf22f4236fb2774ef3fe50df0abeb8e1c6f4c41eba82f500a804ab101e2fbc9d61a + languageName: node + linkType: hard + "jsprim@npm:^1.2.2": version: 1.4.2 resolution: "jsprim@npm:1.4.2" @@ -26635,14 +28060,14 @@ __metadata: languageName: node linkType: hard -"katex@npm:^0.16.7, katex@npm:~0.16.7": - version: 0.16.7 - resolution: "katex@npm:0.16.7" +"katex@npm:~0.16.9": + version: 0.16.9 + resolution: "katex@npm:0.16.9" dependencies: commander: ^8.3.0 bin: katex: cli.js - checksum: 6c3f61e28820ecba074a149d17be6d731d8a950cdd7826851e16f2b0f3627c4119acd8c6e4fb86950063c4e99a6e478720ea6cca3dc82e59bbca81001ee00b70 + checksum: 861194dfd4d86505e657f688fb73048d46ac498edafce71199502a35b03c0ecc35ba930c631be79c4a09d90a0d23476673cd52f6bc367c7a161854d64005fa95 languageName: node linkType: hard @@ -27092,6 +28517,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: ^6.0.0 + checksum: c1b653bdf29beaecb3d307dfb7c44d98a2a98a02ebe353c9ad055d1ac45d6ed4e1142563d222df9b9efebc2bcb7d4c792b507fad9e7150a04c29530b7db570f8 + languageName: node + linkType: hard + "lodash.clonedeep@npm:^4.5.0": version: 4.5.0 resolution: "lodash.clonedeep@npm:4.5.0" @@ -27120,6 +28554,13 @@ __metadata: languageName: node linkType: hard +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + languageName: node + linkType: hard + "lodash.flatten@npm:^4.4.0": version: 4.4.0 resolution: "lodash.flatten@npm:4.4.0" @@ -27148,6 +28589,13 @@ __metadata: languageName: node linkType: hard +"lodash.invokemap@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.invokemap@npm:4.6.0" + checksum: 646ceebbefbcb6da301f8c2868254680fd0bcdc6ada470495d9ae49c9c32938829c1b38a38c95d0258409a9655f85db404b16e648381c7450b7ed3d9c52d8808 + languageName: node + linkType: hard + "lodash.isboolean@npm:^3.0.3": version: 3.0.3 resolution: "lodash.isboolean@npm:3.0.3" @@ -27211,6 +28659,13 @@ __metadata: languageName: node linkType: hard +"lodash.pullall@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.pullall@npm:4.2.0" + checksum: 7a5fbaedf186ec197ce1e0b9ba1d88a89773ebaf6a8291c7d273838cac59cb3b339cf36ef00e94172862ee84d2304c38face161846f08f5581d0553dcbdcd090 + languageName: node + linkType: hard + "lodash.sortby@npm:^4.7.0": version: 4.7.0 resolution: "lodash.sortby@npm:4.7.0" @@ -27253,6 +28708,13 @@ __metadata: languageName: node linkType: hard +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: 659264545a95726d1493123345aad8cbf56e17810fa9a0b029852c6d42bc80517696af09d99b23bef1845d10d95e01b8b4a1da578f22aeba7a30d3e0022a4938 + languageName: node + linkType: hard + "lodash.without@npm:^4.4.0": version: 4.4.0 resolution: "lodash.without@npm:4.4.0" @@ -27281,7 +28743,7 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:4.1.0": +"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -27364,12 +28826,12 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^2.3.1": - version: 2.3.4 - resolution: "loupe@npm:2.3.4" +"loupe@npm:^2.3.6": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" dependencies: - get-func-name: ^2.0.0 - checksum: 5af91db61aa18530f1749a64735ee194ac263e65e9f4d1562bf3036c591f1baa948289c193e0e34c7b5e2c1b75d3c1dc4fce87f5edb3cee10b0c0df46bc9ffb3 + get-func-name: ^2.0.1 + checksum: 96c058ec7167598e238bb7fb9def2f9339215e97d6685d9c1e3e4bdb33d14600e11fe7a812cf0c003dfb73ca2df374f146280b2287cae9e8d989e9d7a69a203b languageName: node linkType: hard @@ -28144,7 +29606,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -28600,15 +30062,15 @@ __metadata: languageName: node linkType: hard -"moleculer@npm:^0.14.29": - version: 0.14.29 - resolution: "moleculer@npm:0.14.29" +"moleculer@npm:^0.14.31": + version: 0.14.31 + resolution: "moleculer@npm:0.14.31" dependencies: args: ^5.0.3 eventemitter2: ^6.4.9 - fastest-validator: ^1.16.0 + fastest-validator: ^1.17.0 glob: ^7.2.0 - ipaddr.js: ^2.0.1 + ipaddr.js: ^2.1.0 kleur: ^4.1.5 lodash: ^4.17.21 lru-cache: ^6.0.0 @@ -28685,7 +30147,7 @@ __metadata: bin: moleculer-runner: bin/moleculer-runner.js moleculer-runner-esm: bin/moleculer-runner.mjs - checksum: b04d1012dcf86136e1bfc1930a0acfde028295cc5220ae0ed8f4d23236cf63fa3417f01f1f82cd11d1661aebd32d4834bffe052dbe6d89d514acde1d9a107eff + checksum: 4d6d05f98e2174b708de8c946901a4a3a1de411505f43909216a9d2ff93820e6eec7edd44b45c99ab04c6c312304a63a346288e181fead48558763fb4ec69c24 languageName: node linkType: hard @@ -28746,7 +30208,7 @@ __metadata: "mongodb@patch:mongodb@npm:4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch::locator=rocket.chat%40workspace%3A.": version: 4.17.1 - resolution: "mongodb@patch:mongodb@npm%3A4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch::version=4.17.1&hash=f5fa42&locator=rocket.chat%40workspace%3A." + resolution: "mongodb@patch:mongodb@npm%3A4.17.1#.yarn/patches/mongodb-npm-4.17.1-a2fe811ff1.patch::version=4.17.1&hash=ed42e6&locator=rocket.chat%40workspace%3A." dependencies: "@aws-sdk/credential-providers": ^3.186.0 "@mongodb-js/saslprep": ^1.1.0 @@ -28869,7 +30331,7 @@ __metadata: languageName: node linkType: hard -"mute-stream@npm:~0.0.4": +"mute-stream@npm:0.0.8, mute-stream@npm:~0.0.4": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 @@ -29126,12 +30588,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^5.0.0": - version: 5.0.0 - resolution: "node-addon-api@npm:5.0.0" +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" dependencies: node-gyp: latest - checksum: 7c5e2043ac37f6108784d94ed73a44ae6d3e68eb968de60680922fc6bc3d17fa69448c0feb4e0c9d3f4c74a0324822e566a8340a56916d9d6f23cb3e85620334 + checksum: 3a539510e677cfa3a833aca5397300e36141aca064cdc487554f2017110709a03a95da937e98c2a14ec3c626af7b2d1b6dabe629a481f9883143d0d5bff07bf2 languageName: node linkType: hard @@ -29222,6 +30684,27 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:^9.4.1": + version: 9.4.1 + resolution: "node-gyp@npm:9.4.1" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 8576c439e9e925ab50679f87b7dfa7aa6739e42822e2ad4e26c36341c0ba7163fdf5a946f0a67a476d2f24662bc40d6c97bd9e79ced4321506738e6b760a1577 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 9.0.0 resolution: "node-gyp@npm:9.0.0" @@ -29316,6 +30799,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.13": + version: 2.0.13 + resolution: "node-releases@npm:2.0.13" + checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 + languageName: node + linkType: hard + "node-rsa@npm:^1.1.1": version: 1.1.1 resolution: "node-rsa@npm:1.1.1" @@ -29362,6 +30852,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + "normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.3.4, normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -29495,7 +30996,7 @@ __metadata: languageName: node linkType: hard -"npm-run-all@npm:^4.1.5": +"npm-run-all@npm:^4.1.5, npm-run-all@npm:~4.1.5": version: 4.1.5 resolution: "npm-run-all@npm:4.1.5" dependencies: @@ -29709,10 +31210,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db languageName: node linkType: hard @@ -30006,6 +31507,23 @@ __metadata: languageName: node linkType: hard +"ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: ^4.1.0 + chalk: ^4.1.0 + cli-cursor: ^3.1.0 + cli-spinners: ^2.5.0 + is-interactive: ^1.0.0 + is-unicode-supported: ^0.1.0 + log-symbols: ^4.1.0 + strip-ansi: ^6.0.0 + wcwidth: ^1.0.1 + checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + languageName: node + linkType: hard + "os-browserify@npm:^0.3.0": version: 0.3.0 resolution: "os-browserify@npm:0.3.0" @@ -30217,6 +31735,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: ^4.0.0 + checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 + languageName: node + linkType: hard + "p-map-series@npm:^1.0.0": version: 1.0.0 resolution: "p-map-series@npm:1.0.0" @@ -30607,6 +32134,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -30799,13 +32333,6 @@ __metadata: languageName: node linkType: hard -"photoswipe@npm:^4.1.3": - version: 4.1.3 - resolution: "photoswipe@npm:4.1.3" - checksum: 2eecc188d81642832cd5086e3954a6b5546b70651b6a76752625d9ff7b5e63ede9347316edc8110d7dba90acf55d2e8b2e917f454ed46c2594b09084c383aa37 - languageName: node - linkType: hard - "picocolors@npm:^0.2.1": version: 0.2.1 resolution: "picocolors@npm:0.2.1" @@ -30996,22 +32523,47 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.37.1": - version: 1.37.1 - resolution: "playwright-core@npm:1.37.1" +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: ^6.3.0 + checksum: 94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03 + languageName: node + linkType: hard + +"playwright-core@npm:1.40.1": + version: 1.40.1 + resolution: "playwright-core@npm:1.40.1" bin: playwright-core: cli.js - checksum: 69f818da2230057584140d5b3af7778a4f4a822b5b18d133abfc5d259128becb943c343a2ddf6b0635277a69f28983e83e2bc3fce23595ececb1e410475b6368 + checksum: 84d92fb9b86e3c225b16b6886bf858eb5059b4e60fa1205ff23336e56a06dcb2eac62650992dede72f406c8e70a7b6a5303e511f9b4bc0b85022ede356a01ee0 languageName: node linkType: hard -"playwright-qase-reporter@npm:^1.2.0-alpha.3": - version: 1.2.0-alpha.3 - resolution: "playwright-qase-reporter@npm:1.2.0-alpha.3" +"playwright-qase-reporter@npm:^1.2.1": + version: 1.2.1 + resolution: "playwright-qase-reporter@npm:1.2.1" dependencies: + chalk: ^4.1.0 form-data: ^3.0.0 - qaseio: ^2.0.1 - checksum: 6c1960dbb49928c9d5b77eeb955c2a674cf28d97141d7406354b908688f0983c8da0c7d0b2d620bb39411a99663803055a5359812726982ad4e53c7c54fd8c84 + qaseio: ^2.0.2 + checksum: 8b4d2f5902a8d655b781e9dd6898d5d2f25739033f1fda2b600b07ac3fc7680f9a1ee917a969b7315f4f05211e36f1a6699155f9ead05a435afa695932bde9fa + languageName: node + linkType: hard + +"playwright@npm:1.40.1": + version: 1.40.1 + resolution: "playwright@npm:1.40.1" + dependencies: + fsevents: 2.3.2 + playwright-core: 1.40.1 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 9e36791c1b4a649c104aa365fdd9d049924eeb518c5967c0e921aa38b9b00994aa6ee54784d6c2af194b3b494b6f69772673081ef53c6c4a4b2065af9955c4ba languageName: node linkType: hard @@ -31738,12 +33290,12 @@ __metadata: languageName: node linkType: hard -"postcss-scss@npm:^4.0.6": - version: 4.0.6 - resolution: "postcss-scss@npm:4.0.6" +"postcss-scss@npm:^4.0.9": + version: 4.0.9 + resolution: "postcss-scss@npm:4.0.9" peerDependencies: - postcss: ^8.4.19 - checksum: 133a1cba31e2e167f4e841e66ec6a798eaf44c7911f9182ade0b5b1e71a8198814aa390b8c9d5db6b01358115232e5b15b1a4f8c5198acfccfb1f3fdbd328cdf + postcss: ^8.4.29 + checksum: dc358bafc23d52ed3a9a29333808825deba213042be74ece6eae7a61c692f67d0e6691fa7005367b013c01c79562fbb9ef2fe4c0485075233931bd90715f5132 languageName: node linkType: hard @@ -31880,14 +33432,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.15, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:~8.4.24": - version: 8.4.24 - resolution: "postcss@npm:8.4.24" +"postcss@npm:^8.2.15, postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.23, postcss@npm:~8.4.31": + version: 8.4.31 + resolution: "postcss@npm:8.4.31" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea languageName: node linkType: hard @@ -31916,7 +33468,7 @@ __metadata: "preact@patch:preact@npm:10.15.1#.yarn/patches/preact-npm-10.15.1-bd458de913.patch::locator=rocket.chat%40workspace%3A.": version: 10.15.1 - resolution: "preact@patch:preact@npm%3A10.15.1#.yarn/patches/preact-npm-10.15.1-bd458de913.patch::version=10.15.1&hash=6e6d0e&locator=rocket.chat%40workspace%3A." + resolution: "preact@patch:preact@npm%3A10.15.1#.yarn/patches/preact-npm-10.15.1-bd458de913.patch::version=10.15.1&hash=cf52e4&locator=rocket.chat%40workspace%3A." checksum: 6258efa196625543b88cb02ca1fe4eb3e2867be82bc58209cd8f0dce5aefc3a7da0df4ca440c26731fed9085c780e8b6b265183dd2a16ad66216d8a6480868b7 languageName: node linkType: hard @@ -32067,14 +33619,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.6.1, pretty-format@npm:^29.6.2": - version: 29.6.2 - resolution: "pretty-format@npm:29.6.2" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: a0f972a44f959023c0df9cdfe9eed7540264d7f7ddf74667db8a5294444d5aa153fd47d20327df10ae86964e2ceec10e46ea06b1a5c9c12e02348b78c952c9fc + checksum: 032c1602383e71e9c0c02a01bbd25d6759d60e9c7cf21937dde8357aa753da348fcec5def5d1002c9678a8524d5fe099ad98861286550ef44de8808cc61e43b6 languageName: node linkType: hard @@ -32146,7 +33698,7 @@ __metadata: languageName: node linkType: hard -"prom-client@npm:^14.0.0, prom-client@npm:^14.0.1": +"prom-client@npm:^14.0.0": version: 14.0.1 resolution: "prom-client@npm:14.0.1" dependencies: @@ -32155,18 +33707,27 @@ __metadata: languageName: node linkType: hard -"prometheus-gc-stats@npm:^0.6.4": - version: 0.6.4 - resolution: "prometheus-gc-stats@npm:0.6.4" +"prom-client@npm:^14.2.0": + version: 14.2.0 + resolution: "prom-client@npm:14.2.0" + dependencies: + tdigest: ^0.1.1 + checksum: d4c04e57616c72643dd02862d0d4bde09cf8869a19d0aef5e7b785e6e27d02439b66cdc165e3492f62d579fa91579183820870cc757a09b99399d2d02f46b9f1 + languageName: node + linkType: hard + +"prometheus-gc-stats@npm:^0.6.5": + version: 0.6.5 + resolution: "prometheus-gc-stats@npm:0.6.5" dependencies: gc-stats: ^1.4.0 optional: ^0.1.3 peerDependencies: - prom-client: ">= 10 <= 12" + prom-client: ">= 10 <= 14" dependenciesMeta: gc-stats: optional: true - checksum: 1e632cd0b9ad893b5ee1c3df0b5a3af27a69f2b0c821714d793dcf30de04489c9e207ad5e2ee062b61fc76681a1dbeab268cf31388fc55575501052115d0c410 + checksum: a0a83745937b581e6c5afbe95e6aaef6ca004cf25d35d05f7300e6db26bf37486802b14f972e02f7b332fcf3bcfe4c792d05383d004985d480b8b9450e04f8b8 languageName: node linkType: hard @@ -32194,17 +33755,17 @@ __metadata: languageName: node linkType: hard -"promise.allsettled@npm:^1.0.0": - version: 1.0.5 - resolution: "promise.allsettled@npm:1.0.5" +"promise.allsettled@npm:^1.0.0, promise.allsettled@npm:^1.0.2": + version: 1.0.7 + resolution: "promise.allsettled@npm:1.0.7" dependencies: - array.prototype.map: ^1.0.4 + array.prototype.map: ^1.0.5 call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - get-intrinsic: ^1.1.1 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 iterate-value: ^1.0.2 - checksum: 92775552d3a3487ed924852e5de00a217a202cefc833e8cc169283fe4f7dbe09953505b0c7471b2681e09aa7d064bdbd07b978d44ff536f712e4dcd7c9faba35 + checksum: 96186392286e5ab9aef1a1a725c061c8cf268b6cf141f151daa3834bb8e1680f3b159af6536ce59cf80d4a6a5ad1d8371d05759980cc6c90d58800ddb0a7c119 languageName: node linkType: hard @@ -32443,13 +34004,13 @@ __metadata: languageName: node linkType: hard -"qaseio@npm:^2.0.1": - version: 2.0.1 - resolution: "qaseio@npm:2.0.1" +"qaseio@npm:^2.0.2": + version: 2.0.2 + resolution: "qaseio@npm:2.0.2" dependencies: axios: ^0.25.0 form-data: ^3.0.0 - checksum: 3542f968c05294615a42bc1f57c92a4d7073055466bc2588876de09d6bcd7f7af8b4180db2c04ef01cc4e9c3326c7405c78500e6c83de9d3bb23b12f95246d79 + checksum: 33a0307f2daaf614d719c7c049e50b3aabf1cb783c93355e42ece5a254fac3e68741b4decf9dca0553a48decf8967610cabe058ea135ea8d7bf93f160a6e3902 languageName: node linkType: hard @@ -32469,13 +34030,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.9.7": - version: 6.9.7 - resolution: "qs@npm:6.9.7" - checksum: 5bbd263332ccf320a1f36d04a2019a5834dc20bcb736431eaccde2a39dcba03fb26d2fd00174f5d7bc26aaad1cad86124b18440883ac042ea2a0fca6170c1bf1 - languageName: node - linkType: hard - "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -32550,6 +34104,13 @@ __metadata: languageName: node linkType: hard +"queue-tick@npm:^1.0.1": + version: 1.0.1 + resolution: "queue-tick@npm:1.0.1" + checksum: 57c3292814b297f87f792fbeb99ce982813e4e54d7a8bdff65cf53d5c084113913289d4a48ec8bbc964927a74b847554f9f4579df43c969a6c8e0f026457ad01 + languageName: node + linkType: hard + "queue@npm:6.0.2, queue@npm:^6.0.1": version: 6.0.2 resolution: "queue@npm:6.0.2" @@ -32627,6 +34188,16 @@ __metadata: languageName: node linkType: hard +"randexp@npm:^0.5.3": + version: 0.5.3 + resolution: "randexp@npm:0.5.3" + dependencies: + drange: ^1.0.2 + ret: ^0.2.0 + checksum: 9a4011b4b012debea545fc379a18208876fffc1179d2ac211351caf7626a3956efc4bc41e329bc5b241a671553eda58e0703933a9bcfdf90dde501ba1a2cf40a + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -32733,19 +34304,19 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.4.3": - version: 2.4.3 - resolution: "raw-body@npm:2.4.3" +"raw-body@npm:2.5.1": + version: 2.5.1 + resolution: "raw-body@npm:2.5.1" dependencies: bytes: 3.1.2 - http-errors: 1.8.1 + http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - checksum: d2961fa3c71c9c22dc2c3fd60ff377bf36dfed7d7a748f2b25d585934a3e9df565bb9aa5bc2e3a716ea941f4bc2a6ddc795c8b0cf7219fb071029b59b1985394 + checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e languageName: node linkType: hard -"raw-body@npm:2.5.2, raw-body@npm:^2.2.0": +"raw-body@npm:2.5.2, raw-body@npm:^2.2.0, raw-body@npm:^2.3.3": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -32769,7 +34340,7 @@ __metadata: languageName: node linkType: hard -"rc-scrollbars@npm:^1.1.5, rc-scrollbars@npm:^1.1.6": +"rc-scrollbars@npm:^1.1.6": version: 1.1.6 resolution: "rc-scrollbars@npm:1.1.6" dependencies: @@ -32988,9 +34559,9 @@ __metadata: languageName: node linkType: hard -"react-i18next@npm:~13.2.1": - version: 13.2.1 - resolution: "react-i18next@npm:13.2.1" +"react-i18next@npm:~13.2.2": + version: 13.2.2 + resolution: "react-i18next@npm:13.2.2" dependencies: "@babel/runtime": ^7.22.5 html-parse-stringify: ^3.0.1 @@ -33002,7 +34573,7 @@ __metadata: optional: true react-native: optional: true - checksum: aa3bd7b0f9f3d794e756a7fe087471c20c13dc2fbf5e53400403a356973d87a1b76f0204720081914bd06cb94d92bf987ebbf33c3de3c67a0cc9b32dde8972f1 + checksum: 2b85bfb347af1a00add1c02901025706f7d2037fade4e8aa08159287ddf012e8cf35626eb9f5c578b9d1c24c065c69f2ad4b5a3087fb5cdbea540f8bc18c0f59 languageName: node linkType: hard @@ -33521,12 +35092,12 @@ __metadata: languageName: node linkType: hard -"rechoir@npm:^0.7.0": - version: 0.7.1 - resolution: "rechoir@npm:0.7.1" +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" dependencies: - resolve: ^1.9.0 - checksum: 2a04aab4e28c05fcd6ee6768446bc8b859d8f108e71fc7f5bcbc5ef25e53330ce2c11d10f82a24591a2df4c49c4f61feabe1fd11f844c66feedd4cd7bb61146a + resolve: ^1.20.0 + checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 languageName: node linkType: hard @@ -33657,14 +35228,14 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0": - version: 1.5.0 - resolution: "regexp.prototype.flags@npm:1.5.0" +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: call-bind: ^1.0.2 define-properties: ^1.2.0 - functions-have-names: ^1.2.3 - checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 + set-function-name: ^2.0.0 + checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 languageName: node linkType: hard @@ -34070,7 +35641,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.11.1, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1, resolve@npm:^1.3.2, resolve@npm:^1.9.0": +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.11.1, resolve@npm:^1.12.0, resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1, resolve@npm:^1.3.2": version: 1.22.2 resolution: "resolve@npm:1.22.2" dependencies: @@ -34083,6 +35654,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.22.2": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.4": version: 2.0.0-next.4 resolution: "resolve@npm:2.0.0-next.4" @@ -34096,9 +35680,9 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.11.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.3.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.9.0#~builtin<compat/resolve>": +"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.11.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.3.2#~builtin<compat/resolve>": version: 1.22.2 - resolution: "resolve@patch:resolve@npm%3A1.22.2#~builtin<compat/resolve>::version=1.22.2&hash=07638b" + resolution: "resolve@patch:resolve@npm%3A1.22.2#~builtin<compat/resolve>::version=1.22.2&hash=c3c19d" dependencies: is-core-module: ^2.11.0 path-parse: ^1.0.7 @@ -34109,9 +35693,22 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@^1.22.2#~builtin<compat/resolve>": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin<compat/resolve>::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + "resolve@patch:resolve@^2.0.0-next.4#~builtin<compat/resolve>": version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin<compat/resolve>::version=2.0.0-next.4&hash=07638b" + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin<compat/resolve>::version=2.0.0-next.4&hash=c3c19d" dependencies: is-core-module: ^2.9.0 path-parse: ^1.0.7 @@ -34141,6 +35738,16 @@ __metadata: languageName: node linkType: hard +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: ^5.1.0 + signal-exit: ^3.0.2 + checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + languageName: node + linkType: hard + "restructure@npm:^3.0.0": version: 3.0.0 resolution: "restructure@npm:3.0.0" @@ -34148,6 +35755,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:^0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 + languageName: node + linkType: hard + "ret@npm:~0.1.10": version: 0.1.15 resolution: "ret@npm:0.1.15" @@ -34227,7 +35841,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2, rimraf@npm:~3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -34252,11 +35866,11 @@ __metadata: version: 0.0.0-use.local resolution: "rocket.chat@workspace:." dependencies: - "@changesets/cli": ^2.26.1 - "@types/chart.js": ^2.9.37 - "@types/js-yaml": ^4.0.5 - husky: ^7.0.4 - turbo: ~1.10.15 + "@changesets/cli": ^2.26.2 + "@types/chart.js": ^2.9.39 + "@types/js-yaml": ^4.0.8 + node-gyp: ^9.4.1 + turbo: ~1.10.16 languageName: unknown linkType: soft @@ -34264,24 +35878,24 @@ __metadata: version: 0.0.0-use.local resolution: "rocketchat-services@workspace:apps/meteor/ee/server/services" dependencies: - "@rocket.chat/apps-engine": 1.41.0-alpha.290 + "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/emitter": next - "@rocket.chat/icons": ^0.32.0 - "@rocket.chat/message-parser": next + "@rocket.chat/emitter": ~0.31.25 + "@rocket.chat/icons": ~0.32.0 + "@rocket.chat/message-parser": ~0.31.27 "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@rocket.chat/string-helpers": next - "@rocket.chat/ui-kit": ^0.32.1 - "@types/cookie": ^0.5.1 - "@types/cookie-parser": ^1.4.3 - "@types/ejson": ^2.2.0 - "@types/express": ^4.17.17 - "@types/fibers": ^3.1.1 - "@types/node": ^14.18.51 - "@types/ws": ^8.5.5 + "@rocket.chat/string-helpers": ~0.31.25 + "@rocket.chat/ui-kit": "workspace:~" + "@types/cookie": ^0.5.3 + "@types/cookie-parser": ^1.4.5 + "@types/ejson": ^2.2.1 + "@types/express": ^4.17.20 + "@types/fibers": ^3.1.3 + "@types/node": ^14.18.63 + "@types/ws": ^8.5.8 ajv: ^8.11.0 bcrypt: ^5.0.1 body-parser: ^1.20.2 @@ -34294,7 +35908,7 @@ __metadata: fibers: ^5.0.3 jaeger-client: ^3.19.0 mem: ^8.1.1 - moleculer: ^0.14.29 + moleculer: ^0.14.31 mongodb: ^4.17.1 nats: ^2.6.1 npm-run-all: ^4.1.5 @@ -34304,15 +35918,15 @@ __metadata: sodium-native: ^3.3.0 sodium-plus: ^0.9.0 ts-node: ^10.9.1 - typescript: ~5.2.2 + typescript: ~5.3.2 uuid: ^8.3.2 ws: ^8.8.1 languageName: unknown linkType: soft "rollup@npm:^3.2.5, rollup@npm:^3.21.0": - version: 3.23.0 - resolution: "rollup@npm:3.23.0" + version: 3.28.1 + resolution: "rollup@npm:3.28.1" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -34320,7 +35934,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 0721065cf725c5611815be61d2b01f20b4d0027e17035f6e76384d38396b56cf6ed21a3db78eb004d9db4d24c8a6a19da4563b4ff96b5dd36f0a0f7a3baf85e8 + checksum: 1fcab0929c16130218447c76c19b56ccc0e677110552462297e3679188fc70185a6ec418cef8ce138ec9fb78fd5188537a3f5d28762788e8c88b12a7fb8ba0fb languageName: node linkType: hard @@ -34338,7 +35952,7 @@ __metadata: languageName: node linkType: hard -"run-async@npm:^2.2.0": +"run-async@npm:^2.2.0, run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 @@ -34379,6 +35993,27 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.5.5": + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: ^2.1.0 + checksum: de4b53db1063e618ec2eca0f7965d9137cabe98cf6be9272efe6c86b47c17b987383df8574861bcced18ebd590764125a901d5506082be84a8b8e364bf05f119 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.1": version: 5.1.1 resolution: "safe-buffer@npm:5.1.1" @@ -34674,13 +36309,6 @@ __metadata: languageName: node linkType: hard -"select@npm:^1.1.2": - version: 1.1.2 - resolution: "select@npm:1.1.2" - checksum: 4346151e94f226ea6131e44e68e6d837f3fdee64831b756dd657cc0b02f4cb5107f867cb34a1d1216ab7737d0bf0645d44546afb030bbd8d64e891f5e4c4814e - languageName: node - linkType: hard - "selfsigned@npm:^2.1.1": version: 2.1.1 resolution: "selfsigned@npm:2.1.1" @@ -34747,23 +36375,23 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.x, semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3": - version: 7.5.3 - resolution: "semver@npm:7.5.3" - dependencies: - lru-cache: ^6.0.0 +"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: semver: bin/semver.js - checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.2, semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" +"semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -34785,24 +36413,24 @@ __metadata: languageName: node linkType: hard -"send@npm:0.17.2": - version: 0.17.2 - resolution: "send@npm:0.17.2" +"send@npm:0.18.0": + version: 0.18.0 + resolution: "send@npm:0.18.0" dependencies: debug: 2.6.9 - depd: ~1.1.2 - destroy: ~1.0.4 + depd: 2.0.0 + destroy: 1.2.0 encodeurl: ~1.0.2 escape-html: ~1.0.3 etag: ~1.8.1 fresh: 0.5.2 - http-errors: 1.8.1 + http-errors: 2.0.0 mime: 1.6.0 ms: 2.1.3 - on-finished: ~2.3.0 + on-finished: 2.4.1 range-parser: ~1.2.1 - statuses: ~1.5.0 - checksum: c28f36deb4ccba9b8d6e6a1e472b8e7c40a1f51575bdf8f67303568cc9e71131faa3adc36fdb72611616ccad1584358bbe4c3ebf419e663ecc5de868ad3d3f03 + statuses: 2.0.1 + checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 languageName: node linkType: hard @@ -34897,15 +36525,15 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.14.2": - version: 1.14.2 - resolution: "serve-static@npm:1.14.2" +"serve-static@npm:1.15.0": + version: 1.15.0 + resolution: "serve-static@npm:1.15.0" dependencies: encodeurl: ~1.0.2 escape-html: ~1.0.3 parseurl: ~1.3.3 - send: 0.17.2 - checksum: d97f3183b1dfcd8ce9c0e37e18e87fd31147ed6c8ee0b2c3a089d795e44ee851ca5061db01574f806d54f4e4b70bc694d9ca64578653514e04a28cbc97a1de05 + send: 0.18.0 + checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d languageName: node linkType: hard @@ -34935,6 +36563,17 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.0": + version: 2.0.1 + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: ^1.0.1 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.0 + checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 + languageName: node + linkType: hard + "set-value@npm:^2.0.0, set-value@npm:^2.0.1": version: 2.0.1 resolution: "set-value@npm:2.0.1" @@ -34996,20 +36635,20 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.30.7": - version: 0.30.7 - resolution: "sharp@npm:0.30.7" +"sharp@npm:^0.32.6": + version: 0.32.6 + resolution: "sharp@npm:0.32.6" dependencies: color: ^4.2.3 - detect-libc: ^2.0.1 - node-addon-api: ^5.0.0 + detect-libc: ^2.0.2 + node-addon-api: ^6.1.0 node-gyp: latest prebuild-install: ^7.1.1 - semver: ^7.3.7 + semver: ^7.5.4 simple-get: ^4.0.1 - tar-fs: ^2.1.1 + tar-fs: ^3.0.4 tunnel-agent: ^0.6.0 - checksum: bbc63ca3c7ea8a5bff32cd77022cfea30e25a03f5bd031e935924bf6cf0e11e3388e8b0e22b3137bf8816aa73407f1e4fbeb190f3a35605c27ffca9f32b91601 + checksum: 0cca1d16b1920800c0e22d27bc6305f4c67c9ebe44f67daceb30bf645ae39e7fb7dfbd7f5d6cd9f9eebfddd87ac3f7e2695f4eb906d19b7a775286238e6a29fc languageName: node linkType: hard @@ -35147,14 +36786,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" +"sirv@npm:^2.0.3": + version: 2.0.3 + resolution: "sirv@npm:2.0.3" dependencies: "@polka/url": ^1.0.0-next.20 mrmime: ^1.0.0 - totalist: ^1.0.0 - checksum: c943cfc61baf85f05f125451796212ec35d4377af4da90ae8ec1fa23e6d7b0b4d9c74a8fbf65af83c94e669e88a09dc6451ba99154235eead4393c10dda5b07c + totalist: ^3.0.0 + checksum: e2dfd4c97735a6ad6d842d0eec2cd9e3919ff0e46f0d228248c5753ad4b70b832711e77e1259c031c439cdb08303cc54d923685c92b0e890145cc733af7c5568 languageName: node linkType: hard @@ -35678,6 +37317,13 @@ __metadata: languageName: node linkType: hard +"ssr-window@npm:^4.0.2": + version: 4.0.2 + resolution: "ssr-window@npm:4.0.2" + checksum: df182600927f4f3225224cf8c02338ea637c9750519505bbfb9a9236741a2a7ec088386fb948bca7b447b8303d9109e7dc7672e3de041c79ac2a0e03665af7d2 + languageName: node + linkType: hard + "ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -35761,7 +37407,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:1.5.0, statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0": +"statuses@npm:1.5.0, statuses@npm:>= 1.4.0 < 2, statuses@npm:~1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c @@ -35934,6 +37580,16 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.15.0": + version: 2.15.5 + resolution: "streamx@npm:2.15.5" + dependencies: + fast-fifo: ^1.1.0 + queue-tick: ^1.0.1 + checksum: 52e0ec94026d67c9e2e2e1090f05e5b138c2f2822462d9a8ef4a4805625a31d103e55ea5267fcd9bfe041374926424e42aec2dda28a85cb9de42c2a16d416d94 + languageName: node + linkType: hard + "strict-uri-encode@npm:^1.0.0": version: 1.1.0 resolution: "strict-uri-encode@npm:1.1.0" @@ -36113,25 +37769,36 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 languageName: node linkType: hard @@ -36446,8 +38113,8 @@ __metadata: linkType: hard "sucrase@npm:^3.20.3": - version: 3.32.0 - resolution: "sucrase@npm:3.32.0" + version: 3.34.0 + resolution: "sucrase@npm:3.34.0" dependencies: "@jridgewell/gen-mapping": ^0.3.2 commander: ^4.0.0 @@ -36459,7 +38126,7 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 79f760aef513adcf22b882d43100296a8afa7f307acef3e8803304b763484cf138a3e2cebc498a6791110ab20c7b8deba097f6ce82f812ca8f1723e3440e5c95 + checksum: 61860063bdf6103413698e13247a3074d25843e91170825a9752e4af7668ffadd331b6e99e92fc32ee5b3c484ee134936f926fa9039d5711fafff29d017a2110 languageName: node linkType: hard @@ -36526,7 +38193,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0, supports-color@npm:~7.2.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: @@ -36624,6 +38291,15 @@ __metadata: languageName: node linkType: hard +"swiper@npm:^9.3.2": + version: 9.3.2 + resolution: "swiper@npm:9.3.2" + dependencies: + ssr-window: ^4.0.2 + checksum: 9ccb6a0ef67d71ac780d7d1f3b2c2daf6f1846d3df8810aff6dcb8501c87b7769540a869cdd83eb902e5278396e5379cb32d9ed397234f7700ef55f0209f4592 + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -36698,6 +38374,17 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^3.0.4": + version: 3.0.4 + resolution: "tar-fs@npm:3.0.4" + dependencies: + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^3.1.5 + checksum: dcf4054f9e92ca0efe61c2b3f612914fb259a47900aa908a63106513a6d006c899b426ada53eb88d9dbbf089b5724c8e90b96a2c4ca6171845fa14203d734e30 + languageName: node + linkType: hard + "tar-stream@npm:^1.5.2, tar-stream@npm:^1.6.2": version: 1.6.2 resolution: "tar-stream@npm:1.6.2" @@ -36726,6 +38413,17 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^3.1.5": + version: 3.1.6 + resolution: "tar-stream@npm:3.1.6" + dependencies: + b4a: ^1.6.4 + fast-fifo: ^1.2.0 + streamx: ^2.15.0 + checksum: f3627f918581976e954ff03cb8d370551053796b82564f8c7ca8fac84c48e4d042026d0854fc222171a34ff9c682b72fae91be9c9b0a112d4c54f9e4f443e9c5 + languageName: node + linkType: hard + "tar@npm:^4": version: 4.4.19 resolution: "tar@npm:4.4.19" @@ -36919,7 +38617,7 @@ __metadata: languageName: node linkType: hard -"terser@npm:^4.1.2, terser@npm:^4.6.13, terser@npm:^4.6.3": +"terser@npm:^4.1.2, terser@npm:^4.6.3": version: 4.8.1 resolution: "terser@npm:4.8.1" dependencies: @@ -37082,13 +38780,6 @@ __metadata: languageName: node linkType: hard -"tiny-emitter@npm:^2.0.0": - version: 2.1.0 - resolution: "tiny-emitter@npm:2.1.0" - checksum: fbcfb5145751a0e3b109507a828eb6d6d4501352ab7bb33eccef46e22e9d9ad3953158870a6966a59e57ab7c3f9cfac7cab8521db4de6a5e757012f4677df2dd - languageName: node - linkType: hard - "tiny-events@npm:^1.0.1": version: 1.0.1 resolution: "tiny-events@npm:1.0.1" @@ -37263,10 +38954,10 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a languageName: node linkType: hard @@ -37416,7 +39107,7 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.1.1": +"ts-jest@npm:^29.1.1, ts-jest@npm:~29.1.1": version: 29.1.1 resolution: "ts-jest@npm:29.1.1" dependencies: @@ -37449,40 +39140,22 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:~29.0.5": - version: 29.0.5 - resolution: "ts-jest@npm:29.0.5" +"ts-loader@npm:~9.4.2": + version: 9.4.4 + resolution: "ts-loader@npm:9.4.4" dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^29.0.0 - json5: ^2.2.3 - lodash.memoize: 4.x - make-error: 1.x - semver: 7.x - yargs-parser: ^21.0.1 + chalk: ^4.1.0 + enhanced-resolve: ^5.0.0 + micromatch: ^4.0.0 + semver: ^7.3.4 peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 - typescript: ">=4.3" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 + typescript: "*" + webpack: ^5.0.0 + checksum: 8e5e6b839b0edfa40d2156c880d88ccab58226894ea5978221bc48c7db3215e2e856bfd0093f148e925a2befc42d6c94cafa9a994a7da274541efaa916012b63 languageName: node linkType: hard -"ts-node@npm:^10.9.1": +"ts-node@npm:^10.9.1, ts-node@npm:~10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -37520,6 +39193,23 @@ __metadata: languageName: node linkType: hard +"ts-patch@npm:~3.0.2": + version: 3.0.2 + resolution: "ts-patch@npm:3.0.2" + dependencies: + chalk: ^4.1.2 + global-prefix: ^3.0.0 + minimist: ^1.2.8 + resolve: ^1.22.2 + semver: ^7.3.8 + strip-ansi: ^6.0.1 + bin: + ts-patch: bin/ts-patch.js + tspc: bin/tspc.js + checksum: 09cdc54bf517b11d4b0de64515e9a0d7e71e238d6065b3c02a04280dc2683143cd810a9065046228571af0865a7d876a4a852ff9a909cb2cae8fe33b41e4eb81 + languageName: node + linkType: hard + "ts-pnp@npm:^1.1.6": version: 1.2.0 resolution: "ts-pnp@npm:1.2.0" @@ -37570,6 +39260,13 @@ __metadata: languageName: node linkType: hard +"tsscmp@npm:^1.0.6": + version: 1.0.6 + resolution: "tsscmp@npm:1.0.6" + checksum: 1512384def36bccc9125cabbd4c3b0e68608d7ee08127ceaa0b84a71797263f1a01c7f82fa69be8a3bd3c1396e2965d2f7b52d581d3a5eeaf3967fbc52e3b3bf + languageName: node + linkType: hard + "tsup@npm:^6.7.0": version: 6.7.0 resolution: "tsup@npm:6.7.0" @@ -37671,58 +39368,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-darwin-64@npm:1.10.15" +"turbo-darwin-64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-darwin-64@npm:1.10.16" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-darwin-arm64@npm:1.10.15" +"turbo-darwin-arm64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-darwin-arm64@npm:1.10.16" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-linux-64@npm:1.10.15" +"turbo-linux-64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-linux-64@npm:1.10.16" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-linux-arm64@npm:1.10.15" +"turbo-linux-arm64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-linux-arm64@npm:1.10.16" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-windows-64@npm:1.10.15" +"turbo-windows-64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-windows-64@npm:1.10.16" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.10.15": - version: 1.10.15 - resolution: "turbo-windows-arm64@npm:1.10.15" +"turbo-windows-arm64@npm:1.10.16": + version: 1.10.16 + resolution: "turbo-windows-arm64@npm:1.10.16" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"turbo@npm:~1.10.15": - version: 1.10.15 - resolution: "turbo@npm:1.10.15" +"turbo@npm:~1.10.16": + version: 1.10.16 + resolution: "turbo@npm:1.10.16" dependencies: - turbo-darwin-64: 1.10.15 - turbo-darwin-arm64: 1.10.15 - turbo-linux-64: 1.10.15 - turbo-linux-arm64: 1.10.15 - turbo-windows-64: 1.10.15 - turbo-windows-arm64: 1.10.15 + turbo-darwin-64: 1.10.16 + turbo-darwin-arm64: 1.10.16 + turbo-linux-64: 1.10.16 + turbo-linux-arm64: 1.10.16 + turbo-windows-64: 1.10.16 + turbo-windows-arm64: 1.10.16 dependenciesMeta: turbo-darwin-64: optional: true @@ -37738,7 +39435,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: b494c8bf79355874919e76ee0e4a0a53616e0ae5c7126eb1add50e67d4cd1e445ed9aecf99cb6d81c592b7a43ba91cd7dbf30df70410a44cecedba8b5126095d + checksum: 69d1892593449b264e0bd48b851317a743016ab62cf470e7293b2cc3781240e863c48232c89f65a5a4ce97eb791ca550b201593449350da073db07703a19cfa5 languageName: node linkType: hard @@ -37829,7 +39526,7 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.5, type-detect@npm:^4.0.8": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -37909,6 +39606,53 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -37925,50 +39669,62 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2, typescript@npm:~5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" +"typescript@npm:^5.3.2, typescript@npm:~5.3.2": + version: 5.3.2 + resolution: "typescript@npm:5.3.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + checksum: d92534dda639eb825db013203404c1fabca8ac630564283c9e7dc9e64fd9c9346c2de95ecebdf3e6e8c1c32941bca1cfe0da37877611feb9daf8feeaea58d230 languageName: node linkType: hard -"typescript@npm:~5.1.6": - version: 5.1.6 - resolution: "typescript@npm:5.1.6" +"typescript@patch:typescript@^5.3.2#~builtin<compat/typescript>, typescript@patch:typescript@~5.3.2#~builtin<compat/typescript>": + version: 5.3.2 + resolution: "typescript@patch:typescript@npm%3A5.3.2#~builtin<compat/typescript>::version=5.3.2&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 + checksum: c034461079fbfde3cb584ddee52afccb15b6e32a0ce186d0b2719968786f7ca73e1b07f71fac4163088790b16811c6ccf79680de190664ef66ff0ba9c1fe4a23 languageName: node linkType: hard -"typescript@patch:typescript@^5.2.2#~builtin<compat/typescript>, typescript@patch:typescript@~5.2.2#~builtin<compat/typescript>": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin<compat/typescript>::version=5.2.2&hash=f456af" +"typia@npm:5.3.3, typia@npm:^5.3.3": + version: 5.3.3 + resolution: "typia@npm:5.3.3" + dependencies: + commander: ^10.0.0 + comment-json: ^4.2.3 + inquirer: ^8.2.5 + randexp: ^0.5.3 + peerDependencies: + typescript: ">=4.8.0 <5.4.0" bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + typia: lib/executable/typia.js + checksum: 6e6c9f4c1382deda6ee91fb42f0adbfa57c5b73541a2e411474108d1deac9dd2f590fbbe48399c0357064a6298b5ab17324aa521195cf8e470057171ce868a64 languageName: node linkType: hard -"typescript@patch:typescript@~5.1.6#~builtin<compat/typescript>": - version: 5.1.6 - resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin<compat/typescript>::version=5.1.6&hash=f456af" +"typia@patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch::locator=rocket.chat%40workspace%3A.": + version: 5.3.3 + resolution: "typia@patch:typia@npm%3A5.3.3#./.yarn/patches/typia-npm-5.3.3-21d3e18463.patch::version=5.3.3&hash=777cd5&locator=rocket.chat%40workspace%3A." + dependencies: + commander: ^10.0.0 + comment-json: ^4.2.3 + inquirer: ^8.2.5 + randexp: ^0.5.3 + peerDependencies: + typescript: ">=4.8.0 <5.4.0" bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606 + typia: lib/executable/typia.js + checksum: 256a670f6d3265135090a493c9519cd97466444188766ce9f4e434d2bfe29ec88c3a4ac3ac39938921e116873694ac526136957cbed5710109525d4d0d2425da languageName: node linkType: hard -"ua-parser-js@npm:^1.0.35": - version: 1.0.35 - resolution: "ua-parser-js@npm:1.0.35" - checksum: 02370d38a0c8b586f2503d1c3bbba5cbc0b97d407282f9023201a99e4c03eae4357a2800fdf50cf80d73ec25c0b0cc5bfbaa03975b0add4043d6e4c86712c9c1 +"ua-parser-js@npm:^1.0.37": + version: 1.0.37 + resolution: "ua-parser-js@npm:1.0.37" + checksum: 4d481c720d523366d7762dc8a46a1b58967d979aacf786f9ceceb1cd767de069f64a4bdffb63956294f1c0696eb465ddb950f28ba90571709e33521b4bd75e07 languageName: node linkType: hard @@ -38031,6 +39787,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.25.1": + version: 5.25.3 + resolution: "undici-types@npm:5.25.3" + checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -38370,6 +40133,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + languageName: node + linkType: hard + "update-check@npm:1.5.2": version: 1.5.2 resolution: "update-check@npm:1.5.2" @@ -38745,7 +40522,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.0.1, uuid@npm:^3.2.1, uuid@npm:^3.3.2, uuid@npm:^3.4.0": +"uuid@npm:^3.0.1, uuid@npm:^3.2.1, uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" bin: @@ -38763,7 +40540,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.0.0, uuid@npm:^8.3.2": +"uuid@npm:^8.0.0, uuid@npm:^8.3.2, uuid@npm:~8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -38772,12 +40549,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" +"uuid@npm:^9.0.0, uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" bin: uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 languageName: node linkType: hard @@ -39126,14 +40903,14 @@ __metadata: languageName: node linkType: hard -"webdav@npm:^4.11.2": - version: 4.11.2 - resolution: "webdav@npm:4.11.2" +"webdav@npm:^4.11.3": + version: 4.11.3 + resolution: "webdav@npm:4.11.3" dependencies: axios: ^0.27.2 base-64: ^1.0.0 byte-length: ^1.0.2 - fast-xml-parser: ^3.19.0 + fast-xml-parser: ^4.2.4 he: ^1.2.0 hot-patcher: ^1.0.0 layerr: ^0.1.2 @@ -39143,7 +40920,7 @@ __metadata: path-posix: ^1.0.0 url-join: ^4.0.1 url-parse: ^1.5.10 - checksum: 6fe040b43e350cb15febf688d8eabe45dbe3c74922c94a3730d63911139def435de7f410439e4e1eac6b46d545b6a3631808cc773647b04e6e41731f8ad5f011 + checksum: e5bfc66149088cd857c23a3a549650d7483dd5615cf1c4b6251a5b290a4ad8fef4975bfd99fca2d5842a0eaadc056bc0044e37893e0ad5447e6ce2e2dbd81da5 languageName: node linkType: hard @@ -39182,56 +40959,62 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:^4.9.0": - version: 4.9.0 - resolution: "webpack-bundle-analyzer@npm:4.9.0" +"webpack-bundle-analyzer@npm:^4.9.1": + version: 4.9.1 + resolution: "webpack-bundle-analyzer@npm:4.9.1" dependencies: "@discoveryjs/json-ext": 0.5.7 acorn: ^8.0.4 acorn-walk: ^8.0.0 - chalk: ^4.1.0 commander: ^7.2.0 + escape-string-regexp: ^4.0.0 gzip-size: ^6.0.0 - lodash: ^4.17.20 + is-plain-object: ^5.0.0 + lodash.debounce: ^4.0.8 + lodash.escape: ^4.0.1 + lodash.flatten: ^4.4.0 + lodash.invokemap: ^4.6.0 + lodash.pullall: ^4.2.0 + lodash.uniqby: ^4.7.0 opener: ^1.5.2 - sirv: ^1.0.7 + picocolors: ^1.0.0 + sirv: ^2.0.3 ws: ^7.3.1 bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: e439aea4e88e18bfdc16eb69782c1bb17b2e581905a5cfa8d34058dc6677f6e202f896189268e58b49fa14ae12f5ef4c25cdca9f98f3de7e6699ac62def2f0af + checksum: 7e891c28d5a903242893e55ecc714fa01d7ad6bedade143235c07091b235915349812fa048968462781d59187507962f38b6c61ed7d25fb836ba0ac0ee919a39 languageName: node linkType: hard -"webpack-cli@npm:~4.10.0": - version: 4.10.0 - resolution: "webpack-cli@npm:4.10.0" +"webpack-cli@npm:^5.1.4": + version: 5.1.4 + resolution: "webpack-cli@npm:5.1.4" dependencies: "@discoveryjs/json-ext": ^0.5.0 - "@webpack-cli/configtest": ^1.2.0 - "@webpack-cli/info": ^1.5.0 - "@webpack-cli/serve": ^1.7.0 + "@webpack-cli/configtest": ^2.1.1 + "@webpack-cli/info": ^2.0.2 + "@webpack-cli/serve": ^2.0.5 colorette: ^2.0.14 - commander: ^7.0.0 + commander: ^10.0.1 cross-spawn: ^7.0.3 + envinfo: ^7.7.3 fastest-levenshtein: ^1.0.12 import-local: ^3.0.2 - interpret: ^2.2.0 - rechoir: ^0.7.0 + interpret: ^3.1.1 + rechoir: ^0.8.0 webpack-merge: ^5.7.3 peerDependencies: - webpack: 4.x.x || 5.x.x + webpack: 5.x.x peerDependenciesMeta: "@webpack-cli/generators": optional: true - "@webpack-cli/migrate": - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: optional: true bin: webpack-cli: bin/cli.js - checksum: 2ff5355ac348e6b40f2630a203b981728834dca96d6d621be96249764b2d0fc01dd54edfcc37f02214d02935de2cf0eefd6ce689d970d154ef493f01ba922390 + checksum: 3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 languageName: node linkType: hard @@ -39449,7 +41232,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:4, webpack@npm:~4.46.0": +"webpack@npm:4": version: 4.46.0 resolution: "webpack@npm:4.46.0" dependencies: @@ -39487,9 +41270,9 @@ __metadata: languageName: node linkType: hard -"webpack@npm:>=4.0.0 <6.0.0, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.9.0": - version: 5.88.2 - resolution: "webpack@npm:5.88.2" +"webpack@npm:>=4.0.0 <6.0.0, webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5, webpack@npm:^5.89.0, webpack@npm:^5.9.0": + version: 5.89.0 + resolution: "webpack@npm:5.89.0" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^1.0.0 @@ -39520,7 +41303,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 79476a782da31a21f6dd38fbbd06b68da93baf6a62f0d08ca99222367f3b8668f5a1f2086b7bb78e23172e31fa6df6fa7ab09b25e827866c4fc4dc2b30443ce2 + checksum: 43fe0dbc30e168a685ef5a86759d5016a705f6563b39a240aa00826a80637d4a3deeb8062e709d6a4b05c63e796278244c84b04174704dc4a37bedb0f565c5ed languageName: node linkType: hard @@ -39560,10 +41343,10 @@ __metadata: languageName: node linkType: hard -"whatwg-fetch@npm:^3.6.2": - version: 3.6.2 - resolution: "whatwg-fetch@npm:3.6.2" - checksum: ee976b7249e7791edb0d0a62cd806b29006ad7ec3a3d89145921ad8c00a3a67e4be8f3fb3ec6bc7b58498724fd568d11aeeeea1f7827e7e1e5eae6c8a275afed +"whatwg-fetch@npm:^3.6.19": + version: 3.6.19 + resolution: "whatwg-fetch@npm:3.6.19" + checksum: 2896bc9ca867ea514392c73e2a272f65d5c4916248fe0837a9df5b1b92f247047bc76cf7c29c28a01ac6c5fb4314021d2718958c8a08292a96d56f72b2f56806 languageName: node linkType: hard @@ -39830,7 +41613,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.2.0": +"wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" dependencies: @@ -39912,7 +41695,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.0.0, ws@npm:^7.3.1, ws@npm:^7.4.6": +"ws@npm:^7.0.0, ws@npm:^7.3.1, ws@npm:^7.4.6, ws@npm:^7.5.3": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: