diff --git a/.github/update.log b/.github/update.log index 24ff16824d..eb719bef3c 100644 --- a/.github/update.log +++ b/.github/update.log @@ -790,3 +790,4 @@ Update On Mon Oct 7 20:33:33 CEST 2024 Update On Tue Oct 8 20:36:30 CEST 2024 Update On Wed Oct 9 20:34:31 CEST 2024 Update On Thu Oct 10 20:36:48 CEST 2024 +Update On Fri Oct 11 20:34:02 CEST 2024 diff --git a/clash-meta/component/updater/update_geo.go b/clash-meta/component/updater/update_geo.go index b5dc967787..bba0dabd2e 100644 --- a/clash-meta/component/updater/update_geo.go +++ b/clash-meta/component/updater/update_geo.go @@ -229,20 +229,22 @@ func UpdateGeoDatabases() error { } func getUpdateTime() (err error, time time.Time) { - var fileInfo os.FileInfo - if geodata.GeodataMode() { - fileInfo, err = os.Stat(C.Path.GeoIP()) - if err != nil { - return err, time - } - } else { - fileInfo, err = os.Stat(C.Path.MMDB()) - if err != nil { - return err, time + filesToCheck := []string{ + C.Path.GeoIP(), + C.Path.MMDB(), + C.Path.ASN(), + C.Path.GeoSite(), + } + + for _, file := range filesToCheck { + var fileInfo os.FileInfo + fileInfo, err = os.Stat(file) + if err == nil { + return nil, fileInfo.ModTime() } } - return nil, fileInfo.ModTime() + return } func RegisterGeoUpdater() { diff --git a/clash-meta/tunnel/tunnel.go b/clash-meta/tunnel/tunnel.go index 5c136eb24e..b1b4add5ee 100644 --- a/clash-meta/tunnel/tunnel.go +++ b/clash-meta/tunnel/tunnel.go @@ -625,7 +625,7 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { // normal check for process uid, path, err := P.FindProcessName(metadata.NetWork.String(), metadata.SrcIP, int(metadata.SrcPort)) if err != nil { - log.Debugln("[Process] find process %s error: %v", metadata.String(), err) + log.Debugln("[Process] find process error for %s: %v", metadata.String(), err) } else { metadata.Process = filepath.Base(path) metadata.ProcessPath = path @@ -639,7 +639,7 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { // check package names pkg, err := P.FindPackageName(metadata) if err != nil { - log.Debugln("[Process] find process %s error: %v", metadata.String(), err) + log.Debugln("[Process] find process error for %s: %v", metadata.String(), err) } else { metadata.Process = pkg } diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index 395ead4b9b..fc01e1e436 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -5898,9 +5898,9 @@ checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" [[package]] name = "redb" -version = "2.1.3" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4760ad04a88ef77075ba86ba9ea79b919e6bab29c1764c5747237cd6eaedcaa" +checksum = "074373f3e7e5d27d8741d19512232adb47be8622d3daef3a45bcae72050c3d2a" dependencies = [ "libc", ] diff --git a/clash-nyanpasu/backend/tauri/src/config/profile/item/remote.rs b/clash-nyanpasu/backend/tauri/src/config/profile/item/remote.rs index bd0fc5777f..7fd832ba30 100644 --- a/clash-nyanpasu/backend/tauri/src/config/profile/item/remote.rs +++ b/clash-nyanpasu/backend/tauri/src/config/profile/item/remote.rs @@ -362,6 +362,10 @@ impl RemoteProfileBuilder { pub async fn build_no_blocking(&mut self) -> Result { self.validate()?; + if self.shared.get_uid().is_none() { + self.shared + .uid(super::utils::generate_uid(&ProfileItemType::Remote)); + } self.shared.r#type(ProfileItemType::Remote); let url = self.url.take().unwrap(); let options = self diff --git a/clash-nyanpasu/backend/tauri/src/config/profile/item/shared.rs b/clash-nyanpasu/backend/tauri/src/config/profile/item/shared.rs index f8117056cb..c3ae3caa86 100644 --- a/clash-nyanpasu/backend/tauri/src/config/profile/item/shared.rs +++ b/clash-nyanpasu/backend/tauri/src/config/profile/item/shared.rs @@ -18,7 +18,7 @@ pub trait ProfileFileIo { } #[derive(Default, Debug, Clone, Deserialize, Serialize, Builder, BuilderUpdate)] -#[builder(derive(serde::Serialize, serde::Deserialize))] +#[builder(derive(serde::Serialize, serde::Deserialize), build_fn(skip))] #[builder_update(patch_fn = "apply", getter)] pub struct ProfileShared { #[builder(default = "self.default_uid()?")] @@ -104,6 +104,37 @@ impl ProfileSharedBuilder { pub fn is_file_none(&self) -> bool { self.file.is_none() } + + pub fn build(&self) -> Result { + let mut builder = self.clone(); + if builder.uid.is_none() { + builder.uid = Some(builder.default_uid()?); + } + if builder.name.is_none() { + builder.name = Some(builder.default_name()?); + } + if builder.file.is_none() { + builder.file = Some(builder.default_files()?); + } + + Ok(ProfileShared { + uid: builder.uid.unwrap(), + r#type: match builder.r#type { + Some(ref kind) => kind.clone(), + None => { + return Err(ProfileSharedBuilderError::UninitializedField( + "type is required", + )) + } + }, + name: builder.name.unwrap(), + file: builder.file.unwrap(), + desc: builder.desc.clone().unwrap_or_default(), + updated: builder + .updated + .unwrap_or_else(|| chrono::Local::now().timestamp() as usize), + }) + } } impl ProfileShared { diff --git a/clash-nyanpasu/backend/tauri/src/core/migration/units/unit_160.rs b/clash-nyanpasu/backend/tauri/src/core/migration/units/unit_160.rs index be0c2cec12..84dbc95e45 100644 --- a/clash-nyanpasu/backend/tauri/src/core/migration/units/unit_160.rs +++ b/clash-nyanpasu/backend/tauri/src/core/migration/units/unit_160.rs @@ -1,15 +1,23 @@ use std::borrow::Cow; use once_cell::sync::Lazy; -use serde_yaml::Mapping; +use serde_yaml::{ + value::{Tag, TaggedValue}, + Mapping, +}; use crate::{ config::RUNTIME_CONFIG, core::migration::{DynMigration, Migration}, }; -pub static UNITS: Lazy> = - Lazy::new(|| vec![MigrateAppHomeDir.into(), MigrateProxiesSelectorMode.into()]); +pub static UNITS: Lazy> = Lazy::new(|| { + vec![ + MigrateAppHomeDir.into(), + MigrateProxiesSelectorMode.into(), + MigrateScriptProfileType.into(), + ] +}); pub static VERSION: Lazy = Lazy::new(|| semver::Version::parse("1.6.0").unwrap()); @@ -252,3 +260,91 @@ impl<'a> Migration<'a> for MigrateProxiesSelectorMode { Ok(()) } } + +#[derive(Debug, Clone)] +pub struct MigrateScriptProfileType; + +impl<'a> Migration<'a> for MigrateScriptProfileType { + fn version(&self) -> &'a semver::Version { + &VERSION + } + + fn name(&self) -> Cow<'a, str> { + Cow::Borrowed("Migrate Script Profile Type") + } + + fn migrate(&self) -> std::io::Result<()> { + let profiles_path = crate::utils::dirs::profiles_path() + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e.to_string()))?; + if !profiles_path.exists() { + println!("Profiles dir not found, skipping migration"); + return Ok(()); + } + let profiles = std::fs::read_to_string(&profiles_path)?; + let mut profiles: Mapping = serde_yaml::from_str(&profiles) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; + let items = profiles + .get_mut("items") + .and_then(|items| items.as_sequence_mut()); + if let Some(items) = items { + for item in items { + if let Some(item) = item.as_mapping_mut() + && item + .get("type") + .is_some_and(|ty| ty.as_str().is_some_and(|ty| ty == "script")) + { + item.insert( + "type".into(), + serde_yaml::Value::Tagged(Box::new(TaggedValue { + tag: Tag::new("script"), + value: serde_yaml::Value::String("javascript".to_string()), + })), + ); + } + } + let profiles = serde_yaml::to_string(&profiles) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; + std::fs::write(profiles_path, profiles)?; + } + + Ok(()) + } + + fn discard(&self) -> std::io::Result<()> { + let profiles_path = crate::utils::dirs::profiles_path() + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e.to_string()))?; + if !profiles_path.exists() { + println!("Profiles dir not found, skipping migration"); + return Ok(()); + } + let profiles = std::fs::read_to_string(&profiles_path)?; + let mut profiles: Mapping = serde_yaml::from_str(&profiles) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; + let items = profiles + .get_mut("items") + .and_then(|items| items.as_sequence_mut()); + if let Some(items) = items { + for item in items { + if let Some(item) = item.as_mapping_mut() + && item.get("type").is_some_and(|ty| { + if let serde_yaml::Value::Tagged(ty) = ty { + ty.tag == Tag::new("script") + } else { + false + } + }) + { + item.insert( + "type".into(), + serde_yaml::Value::String("script".to_string()), + ); + } + } + let profiles = serde_yaml::to_string(&profiles) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; + std::fs::write(profiles_path, profiles)?; + } + + Ok(()) + } +} diff --git a/clash-nyanpasu/backend/tauri/src/enhance/utils.rs b/clash-nyanpasu/backend/tauri/src/enhance/utils.rs index e21e9081a4..e4afa50e3f 100644 --- a/clash-nyanpasu/backend/tauri/src/enhance/utils.rs +++ b/clash-nyanpasu/backend/tauri/src/enhance/utils.rs @@ -4,7 +4,7 @@ use serde_yaml::Mapping; use crate::config::profile::{item_type::ProfileUid, profiles::Profiles}; -use super::{use_keys, use_merge, ChainItem, ChainTypeWrapper, RunnerManager}; +use super::{use_merge, ChainItem, ChainTypeWrapper, RunnerManager}; use parking_lot::Mutex; use std::{borrow::Borrow, sync::Arc}; @@ -94,14 +94,12 @@ pub async fn process_chain( nodes: &[ChainItem], ) -> (Mapping, IndexMap) { let mut result_map = IndexMap::new(); - let mut exists_keys = vec![]; let mut script_runner = RunnerManager::new(); for item in nodes.iter() { match &item.data { ChainTypeWrapper::Merge(merge) => { let mut logs = vec![]; - exists_keys.extend(use_keys(merge)); let (res, process_logs) = use_merge(merge, config.to_owned()); config = res.unwrap(); logs.extend(process_logs); @@ -116,7 +114,7 @@ pub async fn process_chain( // TODO: 修改日记 level 格式? match res { Ok(res_config) => { - exists_keys.extend(use_keys(&res_config)); + config = res_config; } Err(err) => logs.error(err.to_string()), } diff --git a/clash-nyanpasu/backend/tauri/src/ipc.rs b/clash-nyanpasu/backend/tauri/src/ipc.rs index e7b17423bc..5fcc41e6e1 100644 --- a/clash-nyanpasu/backend/tauri/src/ipc.rs +++ b/clash-nyanpasu/backend/tauri/src/ipc.rs @@ -106,7 +106,8 @@ pub async fn create_profile(item: Mapping, file_data: Option) -> Result .get("type") .and_then(|kind| serde_yaml::from_value::(kind.clone()).ok()) .ok_or(anyhow!("the type field is null"))?; - let item = serde_yaml::to_value(item).map_err(|e| e.to_string())?; + let item = serde_yaml::Value::Mapping(item); + tracing::trace!("create profile: {kind:?} with {item:?}"); let profile: Profile = match kind { ProfileItemType::Local => { let item: LocalProfileBuilder = (serde_yaml::from_value(item))?; @@ -133,6 +134,7 @@ pub async fn create_profile(item: Mapping, file_data: Option) -> Result .into() } }; + tracing::info!("created new profile: {:#?}", profile); if let Some(file_data) = file_data && !file_data.is_empty() && kind != ProfileItemType::Remote @@ -343,8 +345,7 @@ pub async fn url_delay_test(url: &str, expected_status: u16) -> Result Result { - (crate::utils::net::get_ipsb_asn().await)?; - Ok(Mapping::new()) + Ok(crate::utils::net::get_ipsb_asn().await?) } #[tauri::command] diff --git a/clash-nyanpasu/frontend/interface/src/openapi/geoip/ipsb.ts b/clash-nyanpasu/frontend/interface/src/openapi/geoip/ipsb.ts index 4c1c2bca1e..3e4ab45e52 100644 --- a/clash-nyanpasu/frontend/interface/src/openapi/geoip/ipsb.ts +++ b/clash-nyanpasu/frontend/interface/src/openapi/geoip/ipsb.ts @@ -1,4 +1,4 @@ -import useSWR from "swr"; +import useSWR, { SWRConfiguration } from "swr"; import { getIpsbASN } from "@/service"; export interface IPSBResponse { @@ -16,6 +16,6 @@ export interface IPSBResponse { country_code: string; } -export const useIPSB = () => { - return useSWR("https://api.ip.sb/geoip", () => getIpsbASN()); +export const useIPSB = (config?: SWRConfiguration) => { + return useSWR("https://api.ip.sb/geoip", () => getIpsbASN(), config); }; diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 813d9f1b9d..5669ec4d6e 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -71,11 +71,13 @@ "@types/validator": "13.12.2", "@vitejs/plugin-react": "4.3.2", "@vitejs/plugin-react-swc": "3.7.1", + "change-case": "5.4.4", "clsx": "2.1.1", + "filesize": "10.1.6", "meta-json-schema": "1.18.9", "monaco-yaml": "5.2.2", "nanoid": "5.0.7", - "sass": "1.79.4", + "sass": "1.79.5", "shiki": "1.22.0", "tailwindcss-textshadow": "2.1.3", "unplugin-auto-import": "0.18.3", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connection-detail-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connection-detail-dialog.tsx new file mode 100644 index 0000000000..d9e7f063f4 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connection-detail-dialog.tsx @@ -0,0 +1,95 @@ +import { sentenceCase } from "change-case"; +import dayjs from "dayjs"; +import { filesize } from "filesize"; +import * as React from "react"; +import { Tooltip } from "@mui/material"; +import { Connection } from "@nyanpasu/interface"; +import { BaseDialog, BaseDialogProps, cn } from "@nyanpasu/ui"; + +export type ConnectionDetailDialogProps = { item?: Connection.Item } & Omit< + BaseDialogProps, + "title" +>; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const formatValue = (key: string, value: any): React.ReactElement => { + if (Array.isArray(value)) { + return {value.join(" / ")}; + } + key = key.toLowerCase(); + if (key.includes("speed")) { + return {filesize(value)}/s; + } + + if (key.includes("download") || key.includes("upload")) { + return {filesize(value)}; + } + + if (key.includes("port") || key.includes("id") || key.includes("ip")) { + return {value}; + } + + const date = dayjs(value); + + if (date.isValid()) { + return ( + + {date.fromNow()} + + ); + } + + return value; +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const Row = ({ label, value }: { label: string; value: any }) => { + const key = label.toLowerCase(); + return ( + <> +
{sentenceCase(label)}
+
+ {formatValue(key, value)} +
+ + ); +}; + +export default function ConnectionDetailDialog({ + item, + ...others +}: ConnectionDetailDialogProps) { + if (!item) return null; + + return ( + +
+ {Object.entries(item) + .filter(([key, value]) => key !== "metadata" && !!value) + .map(([key, value]) => ( + + ))} + +

+ Meta Info +

+ + {Object.entries(item.metadata) + .filter(([, value]) => !!value) + .map(([key, value]) => ( + + ))} +
+
+ ); +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-column-filter.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-column-filter.tsx new file mode 100644 index 0000000000..b6afa181a1 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-column-filter.tsx @@ -0,0 +1,242 @@ +import { useLockFn } from "ahooks"; +import { snakeCase } from "change-case"; +import dayjs from "dayjs"; +import { AnimatePresence, Reorder, useDragControls } from "framer-motion"; +import { useAtom } from "jotai"; +import { type MRT_ColumnDef } from "material-react-table"; +import { useMemo } from "react"; +import { useTranslation } from "react-i18next"; +import { connectionTableColumnsAtom } from "@/store"; +import parseTraffic from "@/utils/parse-traffic"; +import { Cancel, Menu } from "@mui/icons-material"; +import { Checkbox, IconButton } from "@mui/material"; +import { useClash } from "@nyanpasu/interface"; +import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui"; +import { TableConnection } from "./connections-table"; + +export const useColumns = (): Array> => { + const { t } = useTranslation(); + const { deleteConnections } = useClash(); + const closeConnect = useLockFn(async (id?: string) => { + await deleteConnections(id); + }); + + return useMemo( + () => + ( + [ + { + header: "Actions", + size: 60, + enableSorting: false, + enableGlobalFilter: false, + enableResizing: false, + accessorFn: ({ id }) => ( +
+ closeConnect(id)} + > + + +
+ ), + }, + { + header: "Host", + size: 240, + accessorFn: ({ metadata }) => + metadata.host || metadata.destinationIP, + }, + { + header: "Process", + size: 140, + accessorFn: ({ metadata }) => metadata.process, + }, + { + header: "Downloaded", + size: 88, + accessorFn: ({ download }) => parseTraffic(download).join(" "), + sortingFn: (rowA, rowB) => + rowA.original.download - rowB.original.download, + }, + { + header: "Uploaded", + size: 88, + accessorFn: ({ upload }) => parseTraffic(upload).join(" "), + sortingFn: (rowA, rowB) => + rowA.original.upload - rowB.original.upload, + }, + { + header: "DL Speed", + size: 88, + accessorFn: ({ downloadSpeed }) => + parseTraffic(downloadSpeed).join(" ") + "/s", + sortingFn: (rowA, rowB) => + (rowA.original.downloadSpeed || 0) - + (rowB.original.downloadSpeed || 0), + }, + { + header: "UL Speed", + size: 88, + accessorFn: ({ uploadSpeed }) => + parseTraffic(uploadSpeed).join(" ") + "/s", + sortingFn: (rowA, rowB) => + (rowA.original.uploadSpeed || 0) - + (rowB.original.uploadSpeed || 0), + }, + { + header: "Chains", + size: 360, + accessorFn: ({ chains }) => [...chains].reverse().join(" / "), + }, + { + header: "Rules", + size: 200, + accessorFn: ({ rule, rulePayload }) => + rulePayload ? `${rule} (${rulePayload})` : rule, + }, + { + header: "Time", + size: 120, + accessorFn: ({ start }) => dayjs(start).fromNow(), + sortingFn: (rowA, rowB) => + dayjs(rowA.original.start).diff(rowB.original.start), + }, + { + header: "Source", + size: 200, + accessorFn: ({ metadata: { sourceIP, sourcePort } }) => + `${sourceIP}:${sourcePort}`, + }, + { + header: "Destination", + size: 200, + accessorFn: ({ metadata: { destinationIP, destinationPort } }) => + `${destinationIP}:${destinationPort}`, + }, + { + header: "Destination ASN", + size: 200, + accessorFn: ({ metadata: { destinationIPASN } }) => + `${destinationIPASN}`, + }, + { + header: "Type", + size: 160, + accessorFn: ({ metadata }) => + `${metadata.type} (${metadata.network})`, + }, + ] satisfies Array> + ).map( + (column) => + ({ + ...column, + id: snakeCase(column.header), + header: t(column.header), + }) satisfies MRT_ColumnDef, + ), + [closeConnect, t], + ); +}; + +export type ConnectionColumnFilterDialogProps = {} & Omit< + BaseDialogProps, + "title" +>; + +function ColItem({ + column, + checked, + onChange, + value, +}: { + column: MRT_ColumnDef; + checked: boolean; + onChange: (e: React.ChangeEvent) => void; + value: [string, boolean]; +}) { + const controls = useDragControls(); + return ( + +
+ + {column.header} +
+
+ controls.start(e)}> + + +
+
+ ); +} + +export default function ConnectionColumnFilterDialog( + props: ConnectionColumnFilterDialogProps, +) { + const columns = useColumns(); + const [filteredCols, setFilteredCols] = useAtom(connectionTableColumnsAtom); + const sortedCols = useMemo( + () => + columns + .filter((o) => o.id !== "actions") + .sort((a, b) => { + const aIndex = filteredCols.findIndex((o) => o[0] === a.id); + const bIndex = filteredCols.findIndex((o) => o[0] === b.id); + if (aIndex === -1 && bIndex === -1) { + return 0; + } + if (aIndex === -1) { + return 1; + } + if (bIndex === -1) { + return -1; + } + return aIndex - bIndex; + }), + [columns, filteredCols], + ); + + const latestFilteredCols = sortedCols.map((column) => [ + column.id, + filteredCols.find((o) => o[0] === column.id)?.[1] ?? true, + ]) as Array<[string, boolean]>; + + return ( + +
+ + + {sortedCols.map((column, index) => ( + o[0] === column.id)?.[1] ?? true + } + onChange={(e) => { + console.log(e.target.checked); + const newCols = [...filteredCols]; + newCols[index] = [newCols[index][0], e.target.checked]; + console.log(newCols); + setFilteredCols(newCols); + }} + value={latestFilteredCols[index]} + /> + ))} + + +
+
+ ); +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx index ea8ad7b8ff..04240dd4f4 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-table.tsx @@ -1,18 +1,21 @@ -import { useLockFn } from "ahooks"; -import dayjs from "dayjs"; +import { useAtomValue } from "jotai"; +import { cloneDeep } from "lodash-es"; import { MaterialReactTable, useMaterialReactTable, - type MRT_ColumnDef, } from "material-react-table"; -import { useDeferredValue, useMemo, useRef } from "react"; +import { MRT_Localization_EN } from "material-react-table/locales/en"; +import { MRT_Localization_RU } from "material-react-table/locales/ru"; +import { MRT_Localization_ZH_HANS } from "material-react-table/locales/zh-Hans"; +import { lazy, useDeferredValue, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; +import { connectionTableColumnsAtom } from "@/store"; import { containsSearchTerm } from "@/utils"; -import parseTraffic from "@/utils/parse-traffic"; -import Cancel from "@mui/icons-material/Cancel"; -import { IconButton } from "@mui/material"; -import { Connection, useClash, useClashWS } from "@nyanpasu/interface"; +import { Connection, useClashWS } from "@nyanpasu/interface"; import ContentDisplay from "../base/content-display"; +import { useColumns } from "./connections-column-filter"; + +const ConnectionDetailDialog = lazy(() => import("./connection-detail-dialog")); export type TableConnection = Connection.Item & { downloadSpeed?: number; @@ -24,25 +27,17 @@ export interface TableMessage extends Omit { } export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => { - const { t } = useTranslation(); - - const { deleteConnections } = useClash(); - - const closeConnect = useLockFn(async (id?: string) => { - await deleteConnections(id); - }); + const { t, i18n } = useTranslation(); const { connections: { latestMessage }, } = useClashWS(); - const historyMessage = useRef(undefined); + const historyMessage = useRef(null); const connectionsMessage = useMemo(() => { if (!latestMessage?.data) return; - const result = JSON.parse(latestMessage.data) as Connection.Response; - const updatedConnections: TableConnection[] = []; const filteredConnections = searchTerm @@ -79,105 +74,77 @@ export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => { }, [latestMessage?.data, searchTerm]); const deferredTableData = useDeferredValue(connectionsMessage?.connections); - const columns: MRT_ColumnDef[] = [ - { - header: t("Actions"), - size: 80, - enableSorting: false, - enableGlobalFilter: false, - accessorFn: ({ id }) => ( -
- closeConnect(id)} - > - - -
- ), - }, - { - header: t("Host"), - size: 240, - accessorFn: ({ metadata }) => metadata.host || metadata.destinationIP, - }, - { - header: t("Process"), - size: 140, - accessorFn: ({ metadata }) => metadata.process, - }, - { - header: t("Downloaded"), - size: 88, - accessorFn: ({ download }) => parseTraffic(download).join(" "), - sortingFn: (rowA, rowB) => - rowB.original.download - rowA.original.download, - }, - { - header: t("Uploaded"), - size: 88, - accessorFn: ({ upload }) => parseTraffic(upload).join(" "), - sortingFn: (rowA, rowB) => rowB.original.upload - rowA.original.upload, - }, - { - header: t("DL Speed"), - size: 88, - accessorFn: ({ downloadSpeed }) => - parseTraffic(downloadSpeed).join(" ") + "/s", - sortingFn: (rowA, rowB) => - (rowA.original.downloadSpeed || 0) - (rowB.original.downloadSpeed || 0), - }, - { - header: t("UL Speed"), - size: 88, - accessorFn: ({ uploadSpeed }) => - parseTraffic(uploadSpeed).join(" ") + "/s", - sortingFn: (rowA, rowB) => - (rowA.original.uploadSpeed || 0) - (rowB.original.uploadSpeed || 0), - }, - { - header: t("Chains"), - size: 360, - accessorFn: ({ chains }) => [...chains].reverse().join(" / "), - }, - { - header: t("Rule"), - size: 200, - accessorFn: ({ rule, rulePayload }) => - rulePayload ? `${rule} (${rulePayload})` : rule, - }, - { - header: t("Time"), - size: 120, - accessorFn: ({ start }) => dayjs(start).fromNow(), - sortingFn: (rowA, rowB) => - dayjs(rowB.original.start).diff(rowA.original.start), - }, - { - header: t("Source"), - size: 200, - accessorFn: ({ metadata: { sourceIP, sourcePort } }) => - `${sourceIP}:${sourcePort}`, - }, - { - header: t("Destination"), - size: 200, - accessorFn: ({ metadata: { destinationIP, destinationPort } }) => - `${destinationIP}:${destinationPort}`, - }, - { - header: t("Type"), - size: 160, - accessorFn: ({ metadata }) => `${metadata.type} (${metadata.network})`, - }, - ]; + const locale = useMemo(() => { + switch (i18n.language) { + case "zh": + return MRT_Localization_ZH_HANS; + case "ru": + return MRT_Localization_RU; + case "en": + default: + return MRT_Localization_EN; + } + }, [i18n.language]); + + const columns = useColumns(); + const tableColsOrder = useAtomValue(connectionTableColumnsAtom); + const filteredColumns = useMemo( + () => + columns + .filter( + (column) => + tableColsOrder.find((o) => o[0] === column.id)?.[1] ?? true, + ) + .sort((a, b) => { + const aIndex = tableColsOrder.findIndex((o) => o[0] === a.id); + const bIndex = tableColsOrder.findIndex((o) => o[0] === b.id); + if (aIndex === -1 && bIndex === -1) { + return 0; + } + if (aIndex === -1) { + return 1; + } + if (bIndex === -1) { + return -1; + } + return aIndex - bIndex; + }), + [columns, tableColsOrder], + ); + const columnOrder = useMemo( + () => filteredColumns.map((column) => column.id) as string[], + [filteredColumns], + ); + + const columnVisibility = useMemo(() => { + return filteredColumns.reduce( + (acc, column) => { + acc[column.id as string] = + tableColsOrder.find((o) => o[0] === column.id)?.[1] ?? true; + return acc; + }, + {} as Record, + ); + }, [filteredColumns, tableColsOrder]); + + const [connectionDetailDialogOpen, setConnectionDetailDialogOpen] = + useState(false); + const [connectioNDetailDialogItem, setConnectionDetailDialogItem] = useState< + Connection.Item | undefined + >(undefined); const table = useMaterialReactTable({ - columns, + columns: filteredColumns, data: deferredTableData ?? [], initialState: { density: "compact", + columnPinning: { + left: ["actions"], + }, + }, + state: { + columnOrder, + columnVisibility, }, defaultDisplayColumn: { enableResizing: true, @@ -193,6 +160,19 @@ export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => { sx: { minHeight: "100%" }, className: "!absolute !h-full !w-full", }, + muiTableBodyRowProps({ row }) { + return { + onClick() { + const id = row.original.id; + const item = connectionsMessage?.connections.find((o) => o.id === id); + if (item) { + setConnectionDetailDialogItem(cloneDeep(item)); + setConnectionDetailDialogOpen(true); + } + }, + }; + }, + localization: locale, enableRowVirtualization: true, enableColumnVirtualization: true, rowVirtualizerOptions: { overscan: 5 }, @@ -200,11 +180,18 @@ export const ConnectionsTable = ({ searchTerm }: { searchTerm?: string }) => { }); return connectionsMessage?.connections.length ? ( - + <> + setConnectionDetailDialogOpen(false)} + /> + + ) : ( ); }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-total.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-total.tsx new file mode 100644 index 0000000000..30b417cd5f --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/connections/connections-total.tsx @@ -0,0 +1,104 @@ +import { filesize } from "filesize"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { Download, Upload } from "@mui/icons-material"; +import { darken, lighten, Paper } from "@mui/material"; +import { Connection, useClashWS } from "@nyanpasu/interface"; + +export default function ConnectionTotal() { + const { + connections: { latestMessage }, + } = useClashWS(); + const [downloadHighlight, setDownloadHighlight] = useState(false); + const [uploadHighlight, setUploadHighlight] = useState(false); + + const downloadHighlightTimerRef = useRef(null); + const uploadHighlightTimerRef = useRef(null); + + const result = useMemo(() => { + if (!latestMessage?.data) return null; + return JSON.parse(latestMessage.data) as Connection.Response; + }, [latestMessage]); + + useEffect(() => { + if (result?.downloadTotal && result?.downloadTotal > 0) { + setDownloadHighlight(true); + if (downloadHighlightTimerRef.current) { + clearTimeout(downloadHighlightTimerRef.current); + } + downloadHighlightTimerRef.current = window.setTimeout(() => { + setDownloadHighlight(false); + }, 300); + } + }, [result?.downloadTotal]); + + useEffect(() => { + if (result?.uploadTotal && result?.uploadTotal > 0) { + setUploadHighlight(true); + if (uploadHighlightTimerRef.current) { + clearTimeout(uploadHighlightTimerRef.current); + } + uploadHighlightTimerRef.current = window.setTimeout(() => { + setUploadHighlight(false); + }, 300); + } + }, [result?.uploadTotal]); + + if (!result) { + return null; + } + + return ( +
+ + ({ + color: darken( + theme.palette.primary.main, + downloadHighlight ? 0.9 : 0.3, + ), + ...theme.applyStyles("dark", { + color: lighten( + theme.palette.primary.main, + downloadHighlight ? 0.2 : 0.9, + ), + }), + }), + ]} + />{" "} + + {filesize(result.downloadTotal, { pad: true })} + + + + ({ + color: darken( + theme.palette.primary.main, + uploadHighlight ? 0.9 : 0.3, + ), + ...theme.applyStyles("dark", { + color: lighten( + theme.palette.primary.main, + downloadHighlight ? 0.2 : 0.9, + ), + }), + }), + ]} + />{" "} + + {filesize(result.uploadTotal, { pad: true })} + + +
+ ); +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx index 8302e2e7eb..a6180f6901 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx @@ -1,6 +1,7 @@ import countryCodeEmoji from "country-code-emoji"; import { useAtomValue } from "jotai"; import { useState } from "react"; +import { mutate } from "swr"; import { atomIsDrawer } from "@/store"; import { Visibility, VisibilityOff } from "@mui/icons-material"; import { LoadingButton } from "@mui/lab"; @@ -48,7 +49,9 @@ export const IPASNPanel = ({ refreshCount }: { refreshCount: number }) => { {data ? ( <> - + {data.country_code && ( + + )}
diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx index 47596600cb..8e4275df5d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx @@ -1,6 +1,7 @@ import { useDebounceEffect } from "ahooks"; import { useAtomValue } from "jotai"; import { RefObject, useEffect, useRef } from "react"; +import { useTranslation } from "react-i18next"; import { Virtualizer, VListHandle } from "virtua"; import ContentDisplay from "../base/content-display"; import LogItem from "./log-item"; @@ -11,6 +12,8 @@ export const LogList = ({ }: { scrollRef: RefObject; }) => { + const { t } = useTranslation(); + const logData = useAtomValue(atomLogList); const virtualizerRef = useRef(null); @@ -59,6 +62,6 @@ export const LogList = ({ })} ) : ( - + ); }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx index 11e5d5fffa..b888a33955 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx @@ -19,6 +19,7 @@ import { } from "react-hook-form-mui"; import { useTranslation } from "react-i18next"; import { useLatest } from "react-use"; +import { formatError } from "@/utils"; import { message } from "@/utils/notification"; import { Divider, InputAdornment } from "@mui/material"; import { Profile, useClash } from "@nyanpasu/interface"; @@ -151,6 +152,11 @@ export const ProfileDialog = ({ setTimeout(() => reset(), 300); onClose(); + } catch (err) { + message("Failed to save profile: \n" + formatError(err), { + kind: "error", + }); + console.error(err); } finally { } }); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-page.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-page.tsx index 8403fbe964..84ac399874 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-page.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/rules/rule-page.tsx @@ -1,10 +1,13 @@ import { useAtomValue } from "jotai"; +import { useTranslation } from "react-i18next"; import { Virtualizer } from "virtua"; import ContentDisplay from "../base/content-display"; import { atomRulePage } from "./modules/store"; import RuleItem from "./rule-item"; export const RulePage = () => { + const { t } = useTranslation(); + const rule = useAtomValue(atomRulePage); return rule?.data?.length ? ( @@ -14,7 +17,7 @@ export const RulePage = () => { })} ) : ( - + ); }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/hooks/theme.ts b/clash-nyanpasu/frontend/nyanpasu/src/hooks/theme.ts index 1c018be994..628fd9522a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/hooks/theme.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/hooks/theme.ts @@ -7,8 +7,8 @@ export const useColorForDelay = (delay: number): string => { "-1": palette.text.primary, "0": palette.text.secondary, "1": palette.text.secondary, - "100": palette.success.main, - "500": palette.warning.main, + "500": palette.success.main, + "2000": palette.warning.main, "10000": palette.error.main, }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-store.ts b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-store.ts index 16dfdb5b76..4ce5490daf 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-store.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-store.ts @@ -24,7 +24,10 @@ export function useNyanpasuStorageSubscribers() { let unlisten: UnlistenFn | null = null; listen<[string, string | null]>("storage_value_changed", (event) => { const [key, value] = event.payload; - dispatchStorageValueChanged(key, value); + dispatchStorageValueChanged( + key, + typeof value === "string" ? JSON.parse(value) : value, + ); }).then((fn) => { unlisten = fn; }); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/locales/en.json b/clash-nyanpasu/frontend/nyanpasu/src/locales/en.json index 7c1703069f..94f46d99e6 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/locales/en.json +++ b/clash-nyanpasu/frontend/nyanpasu/src/locales/en.json @@ -13,7 +13,10 @@ "Total": "Total", "Memory": "Memory", "Active Connections": "Active Connections", + "Rules": "Rules", + "No Rules": "No Rules", "Logs": "Logs", + "No Logs": "No Logs", "Clear": "Clear", "Proxies": "Proxies", "Proxy Groups": "Proxy Groups", @@ -83,7 +86,7 @@ "Update Interval": "Update Interval", "Use System Proxy": "Use System Proxy", "Use Clash Proxy": "Use Clash Proxy", - "No Connection": "No Connection", + "No Connections": "No Connections", "Tray Icons": "Tray Icons", "Set": "Set", "Edit": "Edit", @@ -96,7 +99,7 @@ "Nyanpasu Setting": "Nyanpasu Setting", "Allow Lan": "Allow Lan", "IPv6": "IPv6", - "Tun Stack": "Tun Stack", + "Tun Stack": "TUN Stack", "Log Level": "Log Level", "Clash Port": "Clash Port", "Mixed Port": "Mixed Port", @@ -104,7 +107,7 @@ "After restart to take effect": "After restart to take effect", "External": "External", "Clash Core": "Clash Core", - "Tun Mode": "Tun Mode", + "Tun Mode": "TUN Mode", "System Service": "System Service", "Service Mode": "Service Mode", "Initiating Behavior": "Initiating Behavior", @@ -173,9 +176,9 @@ "toggle_system_proxy": "Toggle System Proxy", "enable_system_proxy": "Enable System Proxy", "disable_system_proxy": "Disable System Proxy", - "toggle_tun_mode": "Toggle Tun Mode", - "enable_tun_mode": "Enable Tun Mode", - "disable_tun_mode": "Disable Tun Mode", + "toggle_tun_mode": "Toggle TUN Mode", + "enable_tun_mode": "Enable TUN Mode", + "disable_tun_mode": "Disable TUN Mode", "App Log Level": "App Log Level", "Auto Close Connections": "Auto Close Connections", "Enable Clash Fields Filter": "Enable Clash Fields Filter", @@ -203,7 +206,7 @@ "Lighten up Animation Effects": "Lighten up Animation Effects", "Subscription": "Subscription", "FetchError": "Failed to fetch {{content}} due to network issue. Please check your network connection and try again later.", - "tun": "Tun", + "tun": "TUN", "normal": "Normal", "system_proxy": "System Proxy", "Proxy takeover Status": "Proxy takeover Status", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/locales/ru.json b/clash-nyanpasu/frontend/nyanpasu/src/locales/ru.json index d8ebb7521d..932c8dfa09 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/locales/ru.json +++ b/clash-nyanpasu/frontend/nyanpasu/src/locales/ru.json @@ -67,7 +67,7 @@ "Nyanpasu Setting": "Настройки Nyanpasu", "Allow Lan": "Разрешить локальную сеть", "IPv6": "IPv6", - "Tun Stack": "Tun куча", + "Tun Stack": "Туннель куча", "Log Level": "Уровень логов", "Clash Port": "Clash порт", "Mixed Port": "Смешанный порт", @@ -158,7 +158,7 @@ "Subscription": "подписка", "FetchError": "Из-за проблем с сетью содержимое {{content}} невозможно получить. Пожалуйста, проверьте сетевое соединение или повторите попытку позже.", - "tun": "Tun", + "tun": "Туннель", "normal": "Обычный", "system_proxy": "Системный прокси", "Subscription Expires In": "Подписка истекает через {{time}}", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/locales/zh.json b/clash-nyanpasu/frontend/nyanpasu/src/locales/zh.json index 33ab042db6..be3d9633a6 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/locales/zh.json +++ b/clash-nyanpasu/frontend/nyanpasu/src/locales/zh.json @@ -13,11 +13,14 @@ "Total": "总量", "Memory": "内存占用", "Active Connections": "活动连接", + "Rules": "规则", + "No Rules": "无规则", "Logs": "日志", + "No Logs": "无日志", "Clear": "清除", "Proxies": "代理", "Proxy Groups": "代理组", - "rules": "规则", + "rule": "规则", "global": "全局", "direct": "直连", "script": "脚本", @@ -83,7 +86,7 @@ "Update Interval": "更新间隔", "Use System Proxy": "使用系统代理更新", "Use Clash Proxy": "使用 Clash 代理更新", - "No Connection": "无连接", + "No Connections": "无连接", "Tray Icons": "托盘图标", "Set": "设置", "Edit": "编辑", @@ -96,7 +99,7 @@ "Nyanpasu Setting": "Nyanpasu 设置", "Allow Lan": "局域网连接", "IPv6": "IPv6", - "Tun Stack": "Tun 堆栈", + "Tun Stack": "TUN 堆栈", "Log Level": "日志等级", "Clash Port": "Clash 端口", "Mixed Port": "端口设置", @@ -104,7 +107,7 @@ "After restart to take effect": "重启后生效", "External": "外部控制", "Clash Core": "Clash 内核", - "Tun Mode": "Tun 模式", + "Tun Mode": "TUN 模式", "System Service": "系统服务", "Service Mode": "服务模式", "Initiating Behavior": "启动行为", @@ -173,9 +176,9 @@ "toggle_system_proxy": "切换系统代理", "enable_system_proxy": "开启系统代理", "disable_system_proxy": "关闭系统代理", - "toggle_tun_mode": "切换 Tun 模式", - "enable_tun_mode": "开启 Tun 模式", - "disable_tun_mode": "关闭 Tun 模式", + "toggle_tun_mode": "切换 TUN 模式", + "enable_tun_mode": "开启 TUN 模式", + "disable_tun_mode": "关闭 TUN 模式", "App Log Level": "App 日志等级", "Auto Close Connections": "自动关闭连接", "Enable Clash Fields Filter": "开启 Clash 字段过滤", @@ -203,7 +206,7 @@ "Lighten up Animation Effects": "减轻动画效果", "Subscription": "订阅", "FetchError": "由于网络问题,无法获取{{content}}内容。请检查网络连接或稍后再试。", - "tun": "Tun", + "tun": "TUN", "normal": "默认", "system_proxy": "系统代理", "Proxy takeover Status": "代理接管状态", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx index 04f236e041..19af922308 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/connections.tsx @@ -1,8 +1,10 @@ import { useThrottle } from "ahooks"; -import { lazy, useDeferredValue, useEffect, useState } from "react"; +import { lazy, Suspense, useDeferredValue, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { SearchTermCtx } from "@/components/connections/connection-search-term"; import HeaderSearch from "@/components/connections/header-search"; +import { FilterAlt } from "@mui/icons-material"; +import { IconButton } from "@mui/material"; import { BasePage } from "@nyanpasu/ui"; import { createFileRoute, useBlocker } from "@tanstack/react-router"; @@ -10,6 +12,14 @@ const Component = lazy( () => import("@/components/connections/connection-page"), ); +const ColumnFilterDialog = lazy( + () => import("@/components/connections/connections-column-filter"), +); + +const ConnectionTotal = lazy( + () => import("@/components/connections/connections-total"), +); + export const Route = createFileRoute("/connections")({ component: Connections, }); @@ -17,6 +27,8 @@ export const Route = createFileRoute("/connections")({ function Connections() { const { t } = useTranslation(); + const [openColumnFilter, setOpenColumnFilter] = useState(false); + const [searchTerm, setSearchTerm] = useState(); const throttledSearchTerm = useThrottle(searchTerm, { wait: 150 }); @@ -39,11 +51,23 @@ function Connections() { title={t("Connections")} full header={ -
- setSearchTerm(e.target.value)} - /> +
+ +
+ + setOpenColumnFilter(false)} + /> + + setSearchTerm(e.target.value)} + /> + setOpenColumnFilter(true)}> + + +
} > diff --git a/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts b/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts index 87c14e182d..be2ba5e085 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts @@ -1,7 +1,8 @@ import { atom } from "jotai"; -import { atomWithStorage } from "jotai/utils"; +import { atomWithStorage, createJSONStorage } from "jotai/utils"; import { SortType } from "@/components/proxies/utils"; import { FileRouteTypes } from "@/routeTree.gen"; +import { NyanpasuStorage } from "@/services/storage"; import { LogMessage } from "@nyanpasu/interface"; const atomWithLocalStorage = (key: string, initialValue: T) => { @@ -81,4 +82,27 @@ export const atomConnectionSetting = atom({ layout: "table", }); +// TODO: generate default columns based on COLUMNS +export const connectionTableColumnsAtom = atomWithStorage< + Array<[string, boolean]> +>( + "connections_table_columns", + [ + "host", + "process", + "downloaded", + "uploaded", + "dl_speed", + "ul_speed", + "chains", + "rules", + "time", + "source", + "destination", + "destination_asn", + "type", + ].map((key) => [key, true]), + createJSONStorage(() => NyanpasuStorage), +); + // export const themeSchemeAtom = atom(null); diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index 280a1c2207..4cedc8b289 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -42,7 +42,7 @@ "@types/d3-interpolate-path": "2.0.3", "clsx": "2.1.1", "d3-interpolate-path": "2.3.0", - "sass": "1.79.4", + "sass": "1.79.5", "tailwind-merge": "2.5.3", "typescript-plugin-css-modules": "5.1.0", "vite-plugin-dts": "4.2.3" diff --git a/clash-nyanpasu/locales/zh.json b/clash-nyanpasu/locales/zh.json index 21c40c6779..2cd6b30da1 100644 --- a/clash-nyanpasu/locales/zh.json +++ b/clash-nyanpasu/locales/zh.json @@ -30,7 +30,7 @@ "rule_mode": "规则模式", "script_mode": "脚本模式", "system_proxy": "系统代理", - "tun_mode": "Tun 模式" + "tun_mode": "TUN 模式" }, "dialog": { "panic": "请将此问题汇报到 GitHub 问题追踪器", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 0a90fcb731..8a95cae38a 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -166,16 +166,16 @@ importers: version: 2.0.2 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-d5bba18b-20241009) + version: 3.8.1(react@19.0.0-rc-70fb1363-20241010) ofetch: specifier: 1.4.1 version: 1.4.1 react: specifier: rc - version: 19.0.0-rc-d5bba18b-20241009 + version: 19.0.0-rc-70fb1363-20241010 swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-d5bba18b-20241009) + version: 2.2.5(react@19.0.0-rc-70fb1363-20241010) devDependencies: '@types/react': specifier: npm:types-react@rc @@ -185,16 +185,16 @@ importers: dependencies: '@dnd-kit/core': specifier: 6.1.0 - version: 6.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 6.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@dnd-kit/sortable': specifier: 8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@dnd-kit/utilities': specifier: 3.2.2 - version: 3.2.2(react@19.0.0-rc-d5bba18b-20241009) + version: 3.2.2(react@19.0.0-rc-70fb1363-20241010) '@emotion/styled': specifier: 11.13.0 - version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -203,13 +203,13 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.3 - version: 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.11 - version: 6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.3 - version: 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -218,7 +218,7 @@ importers: version: link:../ui '@tanstack/router-zod-adapter': specifier: 1.64.0 - version: 1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(zod@3.23.8) + version: 1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(zod@3.23.8) '@tauri-apps/api': specifier: 2.0.2 version: 2.0.2 @@ -227,10 +227,10 @@ importers: version: 7.0.15 ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-d5bba18b-20241009) + version: 3.8.1(react@19.0.0-rc-70fb1363-20241010) allotment: specifier: 1.20.2 - version: 1.20.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 1.20.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) country-code-emoji: specifier: 2.3.0 version: 2.3.0 @@ -239,61 +239,61 @@ importers: version: 1.11.13 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) i18next: specifier: 23.15.2 version: 23.15.2 jotai: specifier: 2.10.0 - version: 2.10.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 2.10.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) json-schema: specifier: 0.4.0 version: 0.4.0 material-react-table: specifier: 3.0.1 - version: 3.0.1(ovqoyajvpzpekwen6rl62twhqa) + version: 3.0.1(ombjbe2ewfkwshsyouqsxidnca) monaco-editor: specifier: 0.52.0 version: 0.52.0 mui-color-input: specifier: 4.0.1 - version: 4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) react: specifier: rc - version: 19.0.0-rc-d5bba18b-20241009 + version: 19.0.0-rc-70fb1363-20241010 react-dom: specifier: rc - version: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + version: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-d5bba18b-20241009) + version: 4.0.13(react@19.0.0-rc-70fb1363-20241010) react-fast-marquee: specifier: 1.6.5 - version: 1.6.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 1.6.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) react-hook-form-mui: specifier: 7.3.0 - version: 7.3.0(qoogzuwhq3vy3np32vork6f6ie) + version: 7.3.0(vpbenpyleqdjzxgsojkpqxpcri) react-i18next: specifier: 15.0.2 - version: 15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) react-markdown: specifier: 9.0.1 - version: 9.0.1(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 9.0.1(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) react-router-dom: specifier: 6.26.2 - version: 6.26.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 6.26.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) react-split-grid: specifier: 1.0.4 - version: 1.0.4(react@19.0.0-rc-d5bba18b-20241009) + version: 1.0.4(react@19.0.0-rc-70fb1363-20241010) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 17.5.1(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) swr: specifier: 2.2.5 - version: 2.2.5(react@19.0.0-rc-d5bba18b-20241009) + version: 2.2.5(react@19.0.0-rc-70fb1363-20241010) virtua: specifier: 0.35.0 - version: 0.35.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 0.35.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) vite-bundle-visualizer: specifier: 1.2.1 version: 1.2.1(rollup@4.21.0) @@ -306,22 +306,22 @@ importers: version: 11.12.0 '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@iconify/json': specifier: 2.2.258 version: 2.2.258 '@monaco-editor/react': specifier: 4.6.0 - version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@tanstack/react-router': specifier: 1.64.0 - version: 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@tanstack/router-devtools': specifier: 1.64.0 - version: 1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(csstype@3.1.3)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(csstype@3.1.3)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@tanstack/router-plugin': specifier: 1.64.0 - version: 1.64.0(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0))(webpack-sources@3.2.3) + version: 1.64.0(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0))(webpack-sources@3.2.3) '@tauri-apps/plugin-clipboard-manager': specifier: 2.0.0 version: 2.0.0 @@ -357,13 +357,19 @@ importers: version: 13.12.2 '@vitejs/plugin-react': specifier: 4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) '@vitejs/plugin-react-swc': specifier: 3.7.1 - version: 3.7.1(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 3.7.1(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) + change-case: + specifier: 5.4.4 + version: 5.4.4 clsx: specifier: 2.1.1 version: 2.1.1 + filesize: + specifier: 10.1.6 + version: 10.1.6 meta-json-schema: specifier: 1.18.9 version: 1.18.9 @@ -374,8 +380,8 @@ importers: specifier: 5.0.7 version: 5.0.7 sass: - specifier: 1.79.4 - version: 1.79.4 + specifier: 1.79.5 + version: 1.79.5 shiki: specifier: 1.22.0 version: 1.22.0 @@ -393,16 +399,16 @@ importers: version: 13.12.0 vite: specifier: 5.4.8 - version: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + version: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) vite-plugin-sass-dts: specifier: 1.3.29 - version: 1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) zod: specifier: 3.23.8 version: 3.23.8 @@ -414,19 +420,19 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 6.1.3 - version: 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 6.0.0-beta.11 - version: 6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/material': specifier: 6.1.3 - version: 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@radix-ui/react-portal': specifier: 1.1.2 - version: 1.1.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 1.1.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@radix-ui/react-scroll-area': specifier: 1.2.0 - version: 1.2.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 1.2.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@tauri-apps/api': specifier: 2.0.2 version: 2.0.2 @@ -438,41 +444,41 @@ importers: version: types-react@19.0.0-rc.1 '@vitejs/plugin-react': specifier: 4.3.2 - version: 4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) ahooks: specifier: 3.8.1 - version: 3.8.1(react@19.0.0-rc-d5bba18b-20241009) + version: 3.8.1(react@19.0.0-rc-70fb1363-20241010) d3: specifier: 7.9.0 version: 7.9.0 framer-motion: specifier: 12.0.0-alpha.1 - version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) react: specifier: rc - version: 19.0.0-rc-d5bba18b-20241009 + version: 19.0.0-rc-70fb1363-20241010 react-dom: specifier: rc - version: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + version: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) react-error-boundary: specifier: 4.0.13 - version: 4.0.13(react@19.0.0-rc-d5bba18b-20241009) + version: 4.0.13(react@19.0.0-rc-70fb1363-20241010) react-i18next: specifier: 15.0.2 - version: 15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) react-use: specifier: 17.5.1 - version: 17.5.1(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + version: 17.5.1(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) vite: specifier: 5.4.8 - version: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + version: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) devDependencies: '@emotion/react': specifier: 11.13.3 - version: 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + version: 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/d3-interpolate-path': specifier: 2.0.3 version: 2.0.3 @@ -483,8 +489,8 @@ importers: specifier: 2.3.0 version: 2.3.0 sass: - specifier: 1.79.4 - version: 1.79.4 + specifier: 1.79.5 + version: 1.79.5 tailwind-merge: specifier: 2.5.3 version: 2.5.3 @@ -493,7 +499,7 @@ importers: version: 5.1.0(typescript@5.6.3) vite-plugin-dts: specifier: 4.2.3 - version: 4.2.3(@types/node@22.7.5)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)) + version: 4.2.3(@types/node@22.7.5)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)) scripts: dependencies: @@ -943,8 +949,8 @@ packages: '@dnd-kit/core@6.1.0': resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: npm:react@rc + react-dom: npm:react-dom@rc '@dnd-kit/sortable@8.0.0': resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} @@ -983,7 +989,7 @@ packages: resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} peerDependencies: '@types/react': '*' - react: '>=16.8.0' + react: npm:react@rc peerDependenciesMeta: '@types/react': optional: true @@ -1636,8 +1642,8 @@ packages: moment: ^2.29.4 moment-hijri: ^2.1.2 moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + react: npm:react@rc + react-dom: npm:react-dom@rc peerDependenciesMeta: '@emotion/react': optional: true @@ -1822,6 +1828,87 @@ packages: resolution: {integrity: sha512-sPHCyi9uZuCs1gg0yF53FFocM+GsiiBEhQQV/itGzzQ8gjyv2GMJ1YvgdDY4lC0ePZeiV3juEw4GbS6w1VHhRw==} engines: {node: '>= 18'} + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1897,8 +1984,8 @@ packages: peerDependencies: '@types/react': npm:types-react@rc '@types/react-dom': npm:types-react-dom@rc - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: npm:react@rc + react-dom: npm:react-dom@rc peerDependenciesMeta: '@types/react': optional: true @@ -1940,7 +2027,7 @@ packages: resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: '@types/react': npm:types-react@rc - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react: npm:react@rc peerDependenciesMeta: '@types/react': optional: true @@ -1982,46 +2069,55 @@ packages: resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.21.0': resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.21.0': resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.21.0': resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.21.0': resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.21.0': resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.21.0': resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.21.0': resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.21.0': resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} @@ -2178,24 +2274,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.7.26': resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.7.26': resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.7.26': resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.7.26': resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} @@ -2352,24 +2452,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.0.2': resolution: {integrity: sha512-1xi2SreGVlpAL68MCsDUY63rdItUdPZreXIAcOVqvUehcJRYOa1XGSBhrV0YXRgZeh0AtKC19z6PRzcv4rosZA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tauri-apps/cli-linux-x64-gnu@2.0.2': resolution: {integrity: sha512-WVjwYzPWFqZVg1fx6KSU5w47Q0VbMyaCp34qs5EcS8EIU0/RnofdzqUoOYqvgGVgNgoz7Pj5dXK2SkS8BHXMmA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.0.2': resolution: {integrity: sha512-h5miE2mctgaQNn/BbG9o1pnJcrx+VGBi2A6JFqGu934lFgSV5+s28M8Gc8AF2JgFH4hQV4IuMkeSw8Chu5Dodg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.0.2': resolution: {integrity: sha512-2b8oO0+dYonahG5PfA/zoq0zlafLclfmXgqoWDZ++UiPtQHJNpNeEQ8GWbSFKGHQ494Jo6jHvazOojGRE1kqAg==} @@ -3084,6 +3188,9 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -3585,6 +3692,11 @@ packages: destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -4081,8 +4193,8 @@ packages: resolution: {integrity: sha512-WpMrDfk6I5Q4T/7+LEjQOVbAD5Yb/cGbbV+LLllFEg+dHi8XZ7QecJ9aYS9bn12cWuF7gGy+uqskyAkGTWHs3w==} peerDependencies: '@emotion/is-prop-valid': '*' - react: ^18.0.0 - react-dom: ^18.0.0 + react: npm:react@rc + react-dom: npm:react-dom@rc peerDependenciesMeta: '@emotion/is-prop-valid': optional: true @@ -5235,6 +5347,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -5809,10 +5924,10 @@ packages: resolution: {integrity: sha512-FqHzVpsWddE5j0BtvjPiPGYiXWDat5EQWGl2oG8xVQs2zJ1KH0zHcu5a7ZdGVgKJWGvYl731J0/k/oOtFSiWfg==} hasBin: true - react-dom@19.0.0-rc-d5bba18b-20241009: - resolution: {integrity: sha512-cYtIXF073LqcDuRhDlJ2LQ/sdrGSPXqtynihzgw8y76fyV1YRO1CKXKhx1yukaglNlKrDK//b7g8cWjh51PsxA==} + react-dom@19.0.0-rc-70fb1363-20241010: + resolution: {integrity: sha512-PaaERM9P1hi2eoCXS3kWQyWLNd1rnJh5ydB1Rv1JRDvF0OoNCW1vGrzaCuLoBfO1VSQmEf5GxVbpPTAiKSh7/Q==} peerDependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-error-boundary@4.0.13: resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} @@ -5914,8 +6029,8 @@ packages: react: '*' react-dom: '*' - react@19.0.0-rc-d5bba18b-20241009: - resolution: {integrity: sha512-yuShauu0yDnoNEgieM/6TrnqkHc4lwcApMftkgpQe1fKFKjD/dhjK1ZINs97T3ZvN4LlWXOK6RCI/UO9fytPEQ==} + react@19.0.0-rc-70fb1363-20241010: + resolution: {integrity: sha512-qH/j0hVO5s1XtFVsG4Gk8HLdcvtwxmeXZMOVDESsOPNrzXuqllxlrSW5II9cJwMfoqQ/szy3s8ZV/53Ispk5Sg==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -6206,16 +6321,16 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - sass@1.79.4: - resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==} + sass@1.79.5: + resolution: {integrity: sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==} engines: {node: '>=14.0.0'} hasBin: true sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - scheduler@0.25.0-rc-d5bba18b-20241009: - resolution: {integrity: sha512-OfmbWwuu6c3bJK2B1Q5R+uuQWIB9Ogb2Rc8v31USMaURIyM38nQ/AVkQ3D0gXp9Yfc0wKVycFOxIhVf4P1c7Vg==} + scheduler@0.25.0-rc-70fb1363-20241010: + resolution: {integrity: sha512-MfJfgwgsuOP0YXaWNKTbEs9q7kpt7cdn4UDOLk+Br4osRAYJ9WZjUZmTtIcbSzYyZ+pC9CGpvo7c6lD4i7qOhA==} screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} @@ -7740,29 +7855,29 @@ snapshots: '@ctrl/tinycolor@4.1.0': {} - '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-d5bba18b-20241009)': + '@dnd-kit/accessibility@3.1.0(react@19.0.0-rc-70fb1363-20241010)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 tslib: 2.7.0 - '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-d5bba18b-20241009) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-d5bba18b-20241009) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@dnd-kit/accessibility': 3.1.0(react@19.0.0-rc-70fb1363-20241010) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-70fb1363-20241010) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) tslib: 2.7.0 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) - '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-d5bba18b-20241009) - react: 19.0.0-rc-d5bba18b-20241009 + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) + '@dnd-kit/utilities': 3.2.2(react@19.0.0-rc-70fb1363-20241010) + react: 19.0.0-rc-70fb1363-20241010 tslib: 2.7.0 - '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-d5bba18b-20241009)': + '@dnd-kit/utilities@3.2.2(react@19.0.0-rc-70fb1363-20241010)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 tslib: 2.7.0 '@dual-bundle/import-meta-resolve@4.1.0': {} @@ -7811,17 +7926,17 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.12.0 '@emotion/cache': 11.13.1 '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-d5bba18b-20241009) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-70fb1363-20241010) '@emotion/utils': 1.4.0 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -7851,16 +7966,16 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/babel-plugin': 11.12.0 '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-d5bba18b-20241009) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0-rc-70fb1363-20241010) '@emotion/utils': 1.4.0 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -7868,9 +7983,9 @@ snapshots: '@emotion/unitless@0.9.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-d5bba18b-20241009)': + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0-rc-70fb1363-20241010)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 '@emotion/utils@1.4.0': {} @@ -8053,11 +8168,11 @@ snapshots: '@floating-ui/core': 1.6.1 '@floating-ui/utils': 0.2.2 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@floating-ui/dom': 1.6.5 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) '@floating-ui/utils@0.2.2': {} @@ -8183,105 +8298,105 @@ snapshots: monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) monaco-editor: 0.52.0 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - '@mui/base@5.0.0-beta.58(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/base@5.0.0-beta.58(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) '@mui/types': 7.2.18(types-react@19.0.0-rc.1) - '@mui/utils': 6.0.0-rc.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 6.0.0-rc.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 '@mui/core-downloads-tracker@6.1.3': {} - '@mui/icons-material@6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/icons-material@6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/lab@6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/lab@6.0.0-beta.11(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/system': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/types': 7.2.18(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/core-downloads-tracker': 6.1.3 - '@mui/system': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/system': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@mui/types': 7.2.18(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/private-theming@5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/utils': 5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/private-theming@6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/private-theming@6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/utils': 6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)': + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) - '@mui/styled-engine@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)': + '@mui/styled-engine@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.13.1 @@ -8289,99 +8404,99 @@ snapshots: '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) - '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/system@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/private-theming': 5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009) + '@mui/private-theming': 5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010) '@mui/types': 7.2.18(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 - '@mui/system@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/system@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/private-theming': 6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/styled-engine': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009) + '@mui/private-theming': 6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/styled-engine': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010) '@mui/types': 7.2.18(types-react@19.0.0-rc.1) - '@mui/utils': 6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/utils': 6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/react': types-react@19.0.0-rc.1 '@mui/types@7.2.18(types-react@19.0.0-rc.1)': optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/utils@5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.18(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@6.0.0-rc.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/utils@6.0.0-rc.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.18(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.12 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/utils@6.1.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/utils@6.1.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 '@mui/types': 7.2.18(types-react@19.0.0-rc.1) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-is: 18.3.1 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@mui/x-date-pickers@7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.25.6 - '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/utils': 5.16.6(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/base': 5.0.0-beta.58(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/system': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/utils': 5.16.6(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@types/react-transition-group': 4.4.11 clsx: 2.1.1 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) - react-transition-group: 4.4.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) + react-transition-group: 4.4.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) dayjs: 1.11.13 transitivePeerDependencies: - '@types/react' @@ -8601,6 +8716,62 @@ snapshots: '@octokit/webhooks-methods': 5.1.0 aggregate-error: 5.0.0 + '@parcel/watcher-android-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-x64@2.4.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.4.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.4.1': + optional: true + + '@parcel/watcher-win32-arm64@2.4.1': + optional: true + + '@parcel/watcher-win32-ia32@2.4.1': + optional: true + + '@parcel/watcher-win32-x64@2.4.1': + optional: true + + '@parcel/watcher@2.4.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -8612,82 +8783,82 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-compose-refs@1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-context@1.1.1(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-context@1.1.1(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-direction@1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-portal@1.1.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-portal@1.1.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-presence@1.1.1(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-presence@1.1.1(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-primitive@2.0.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@radix-ui/react-slot': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-scroll-area@1.2.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-scroll-area@1.2.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-presence': 1.1.1(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-context': 1.1.1(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-direction': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-presence': 1.1.1(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-primitive': 2.0.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-callback-ref': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@radix-ui/react-use-layout-effect': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-slot@1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 + '@radix-ui/react-compose-refs': 1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-callback-ref@1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1)': + '@radix-ui/react-use-layout-effect@1.1.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1)': dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -8952,43 +9123,43 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@tanstack/history': 1.61.1 - '@tanstack/react-store': 0.5.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@tanstack/react-store': 0.5.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 optionalDependencies: '@tanstack/router-generator': 1.64.0 - '@tanstack/react-store@0.5.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@tanstack/react-store@0.5.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@tanstack/store': 0.5.5 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) - use-sync-external-store: 1.2.2(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) + use-sync-external-store: 1.2.2(react@19.0.0-rc-70fb1363-20241010) - '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@tanstack/react-table@8.20.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@tanstack/table-core': 8.20.5 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@tanstack/react-virtual@3.10.6(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: '@tanstack/virtual-core': 3.10.6 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - '@tanstack/router-devtools@1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(csstype@3.1.3)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)': + '@tanstack/router-devtools@1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(csstype@3.1.3)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)': dependencies: - '@tanstack/react-router': 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + '@tanstack/react-router': 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) clsx: 2.1.1 goober: 2.1.14(csstype@3.1.3) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) transitivePeerDependencies: - csstype @@ -8999,7 +9170,7 @@ snapshots: tsx: 4.19.1 zod: 3.23.8 - '@tanstack/router-plugin@1.64.0(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0))(webpack-sources@3.2.3)': + '@tanstack/router-plugin@1.64.0(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0))(webpack-sources@3.2.3)': dependencies: '@babel/core': 7.25.7 '@babel/generator': 7.25.7 @@ -9020,14 +9191,14 @@ snapshots: unplugin: 1.14.1(webpack-sources@3.2.3) zod: 3.23.8 optionalDependencies: - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - supports-color - webpack-sources - '@tanstack/router-zod-adapter@1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009))(zod@3.23.8)': + '@tanstack/router-zod-adapter@1.64.0(@tanstack/react-router@1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010))(zod@3.23.8)': dependencies: - '@tanstack/react-router': 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + '@tanstack/react-router': 1.64.0(@tanstack/router-generator@1.64.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) zod: 3.23.8 '@tanstack/store@0.5.5': {} @@ -9476,21 +9647,21 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.1(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0))': + '@vitejs/plugin-react-swc@3.7.1(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0))': dependencies: '@swc/core': 1.7.26 - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.25.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.25.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -9580,14 +9751,14 @@ snapshots: clean-stack: 5.2.0 indent-string: 5.0.0 - ahooks@3.8.1(react@19.0.0-rc-d5bba18b-20241009): + ahooks@3.8.1(react@19.0.0-rc-70fb1363-20241010): dependencies: '@babel/runtime': 7.25.6 dayjs: 1.11.13 intersection-observer: 0.12.2 js-cookie: 3.0.5 lodash: 4.17.21 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 @@ -9629,16 +9800,16 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - allotment@1.20.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + allotment@1.20.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: classnames: 2.5.1 eventemitter3: 5.0.1 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 lodash.isequal: 4.5.0 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) - use-resize-observer: 9.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) + use-resize-observer: 9.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) ansi-align@2.0.0: dependencies: @@ -9924,6 +10095,8 @@ snapshots: chalk@5.3.0: {} + change-case@5.4.4: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -10414,6 +10587,8 @@ snapshots: destr@2.0.3: {} + detect-libc@1.0.3: {} + detect-node@2.1.0: optional: true @@ -11105,13 +11280,13 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + framer-motion@12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 1.3.0 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) fs-extra@11.2.0: dependencies: @@ -11725,10 +11900,10 @@ snapshots: jju@1.4.0: {} - jotai@2.10.0(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1): + jotai@2.10.0(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1): optionalDependencies: '@types/react': types-react@19.0.0-rc.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 js-cookie@2.2.1: {} @@ -11977,19 +12152,19 @@ snapshots: escape-string-regexp: 4.0.0 optional: true - material-react-table@3.0.1(ovqoyajvpzpekwen6rl62twhqa): + material-react-table@3.0.1(ombjbe2ewfkwshsyouqsxidnca): dependencies: - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/icons-material': 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) - '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) + '@tanstack/react-table': 8.20.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) + '@tanstack/react-virtual': 3.10.6(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) highlight-words: 1.2.2 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) mathml-tag-names@2.1.3: {} @@ -12322,14 +12497,14 @@ snapshots: muggle-string@0.4.1: {} - mui-color-input@4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1): + mui-color-input@4.0.1(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1): dependencies: '@ctrl/tinycolor': 4.1.0 - '@emotion/react': 11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + '@emotion/react': 11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: '@types/react': types-react@19.0.0-rc.1 @@ -12339,15 +12514,15 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-css@5.6.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + nano-css@5.6.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 7.0.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 stylis: 4.3.2 @@ -12371,6 +12546,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.7.0 + node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} node-emoji@1.11.0: @@ -12885,50 +13062,50 @@ snapshots: - supports-color - utf-8-validate - react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009): + react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010): dependencies: - react: 19.0.0-rc-d5bba18b-20241009 - scheduler: 0.25.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 + scheduler: 0.25.0-rc-70fb1363-20241010 - react-error-boundary@4.0.13(react@19.0.0-rc-d5bba18b-20241009): + react-error-boundary@4.0.13(react@19.0.0-rc-70fb1363-20241010): dependencies: '@babel/runtime': 7.25.6 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 react-fast-compare@3.2.2: {} - react-fast-marquee@1.6.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + react-fast-marquee@1.6.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - react-hook-form-mui@7.3.0(qoogzuwhq3vy3np32vork6f6ie): + react-hook-form-mui@7.3.0(vpbenpyleqdjzxgsojkpqxpcri): dependencies: - '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - react: 19.0.0-rc-d5bba18b-20241009 - react-hook-form: 7.52.1(react@19.0.0-rc-d5bba18b-20241009) + '@mui/material': 6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + react: 19.0.0-rc-70fb1363-20241010 + react-hook-form: 7.52.1(react@19.0.0-rc-70fb1363-20241010) optionalDependencies: - '@mui/icons-material': 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) - '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1) + '@mui/icons-material': 6.1.3(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) + '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@mui/material@6.1.3(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1) - react-hook-form@7.52.1(react@19.0.0-rc-d5bba18b-20241009): + react-hook-form@7.52.1(react@19.0.0-rc-70fb1363-20241010): dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 - react-i18next@15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + react-i18next@15.0.2(i18next@23.15.2)(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@babel/runtime': 7.25.6 html-parse-stringify: 3.0.1 i18next: 23.15.2 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 optionalDependencies: - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) react-is@16.13.1: {} react-is@18.3.1: {} - react-markdown@9.0.1(react@19.0.0-rc-d5bba18b-20241009)(types-react@19.0.0-rc.1): + react-markdown@9.0.1(react@19.0.0-rc-70fb1363-20241010)(types-react@19.0.0-rc.1): dependencies: '@types/hast': 3.0.4 '@types/react': types-react@19.0.0-rc.1 @@ -12936,7 +13113,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.0 html-url-attributes: 3.0.0 mdast-util-to-hast: 13.1.0 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 remark-parse: 11.0.0 remark-rehype: 11.1.0 unified: 11.0.4 @@ -12947,39 +13124,39 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.26.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + react-router-dom@6.26.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@remix-run/router': 1.19.2 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) - react-router: 6.26.2(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) + react-router: 6.26.2(react@19.0.0-rc-70fb1363-20241010) - react-router@6.26.2(react@19.0.0-rc-d5bba18b-20241009): + react-router@6.26.2(react@19.0.0-rc-70fb1363-20241010): dependencies: '@remix-run/router': 1.19.2 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 - react-split-grid@1.0.4(react@19.0.0-rc-d5bba18b-20241009): + react-split-grid@1.0.4(react@19.0.0-rc-70fb1363-20241010): dependencies: prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 split-grid: 1.0.11 - react-transition-group@4.4.5(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + react-transition-group@4.4.5(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@babel/runtime': 7.25.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - react-universal-interface@0.6.2(react@19.0.0-rc-d5bba18b-20241009)(tslib@2.7.0): + react-universal-interface@0.6.2(react@19.0.0-rc-70fb1363-20241010)(tslib@2.7.0): dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 tslib: 2.7.0 - react-use@17.5.1(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + react-use@17.5.1(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -12987,10 +13164,10 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009) - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) - react-universal-interface: 0.6.2(react@19.0.0-rc-d5bba18b-20241009)(tslib@2.7.0) + nano-css: 5.6.2(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) + react-universal-interface: 0.6.2(react@19.0.0-rc-70fb1363-20241010)(tslib@2.7.0) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 @@ -12998,7 +13175,7 @@ snapshots: ts-easing: 0.2.0 tslib: 2.7.0 - react@19.0.0-rc-d5bba18b-20241009: {} + react@19.0.0-rc-70fb1363-20241010: {} read-cache@1.0.0: dependencies: @@ -13286,15 +13463,16 @@ snapshots: sass-embedded-win32-ia32: 1.78.0 sass-embedded-win32-x64: 1.78.0 - sass@1.79.4: + sass@1.79.5: dependencies: + '@parcel/watcher': 2.4.1 chokidar: 4.0.0 immutable: 4.3.5 source-map-js: 1.2.1 sax@1.3.0: {} - scheduler@0.25.0-rc-d5bba18b-20241009: {} + scheduler@0.25.0-rc-70fb1363-20241010: {} screenfull@5.2.0: {} @@ -13700,11 +13878,11 @@ snapshots: svg-tags@1.0.0: {} - swr@2.2.5(react@19.0.0-rc-d5bba18b-20241009): + swr@2.2.5(react@19.0.0-rc-70fb1363-20241010): dependencies: client-only: 0.0.1 - react: 19.0.0-rc-d5bba18b-20241009 - use-sync-external-store: 1.2.2(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + use-sync-external-store: 1.2.2(react@19.0.0-rc-70fb1363-20241010) synckit@0.9.1: dependencies: @@ -13959,7 +14137,7 @@ snapshots: postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) postcss-modules-scope: 3.2.0(postcss@8.4.47) reserved-words: 0.1.2 - sass: 1.79.4 + sass: 1.79.5 source-map-js: 1.2.1 stylus: 0.62.0 tsconfig-paths: 4.2.0 @@ -14141,15 +14319,15 @@ snapshots: dependencies: prepend-http: 1.0.4 - use-resize-observer@9.1.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + use-resize-observer@9.1.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): dependencies: '@juggle/resize-observer': 3.4.0 - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) - use-sync-external-store@1.2.2(react@19.0.0-rc-d5bba18b-20241009): + use-sync-external-store@1.2.2(react@19.0.0-rc-70fb1363-20241010): dependencies: - react: 19.0.0-rc-d5bba18b-20241009 + react: 19.0.0-rc-70fb1363-20241010 utf-8-validate@5.0.10: dependencies: @@ -14172,10 +14350,10 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - virtua@0.35.0(react-dom@19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009))(react@19.0.0-rc-d5bba18b-20241009): + virtua@0.35.0(react-dom@19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010))(react@19.0.0-rc-70fb1363-20241010): optionalDependencies: - react: 19.0.0-rc-d5bba18b-20241009 - react-dom: 19.0.0-rc-d5bba18b-20241009(react@19.0.0-rc-d5bba18b-20241009) + react: 19.0.0-rc-70fb1363-20241010 + react-dom: 19.0.0-rc-70fb1363-20241010(react@19.0.0-rc-70fb1363-20241010) vite-bundle-visualizer@1.2.1(rollup@4.21.0): dependencies: @@ -14187,7 +14365,7 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.2.3(@types/node@22.7.5)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)): + vite-plugin-dts@4.2.3(@types/node@22.7.5)(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@22.7.5) '@rollup/pluginutils': 5.1.0(rollup@4.21.0) @@ -14200,43 +14378,43 @@ snapshots: magic-string: 0.30.11 typescript: 5.6.3 optionalDependencies: - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-sass-dts@1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.29(postcss@8.4.47)(prettier@3.3.3)(sass-embedded@1.78.0)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)): dependencies: postcss: 8.4.47 postcss-js: 4.0.1(postcss@8.4.47) prettier: 3.3.3 sass-embedded: 1.78.0 - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.21.0) '@svgr/core': 8.1.0(typescript@5.6.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0)): + vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.6.3) optionalDependencies: - vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0) + vite: 5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.4)(stylus@0.62.0): + vite@5.4.8(@types/node@22.7.5)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.79.5)(stylus@0.62.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -14245,7 +14423,7 @@ snapshots: '@types/node': 22.7.5 fsevents: 2.3.3 less: 4.2.0 - sass: 1.79.4 + sass: 1.79.5 sass-embedded: 1.78.0 stylus: 0.62.0 diff --git a/clash-verge-rev/src-tauri/template/clash-verge.desktop b/clash-verge-rev/src-tauri/template/clash-verge.desktop index 330637412a..965448edbc 100644 --- a/clash-verge-rev/src-tauri/template/clash-verge.desktop +++ b/clash-verge-rev/src-tauri/template/clash-verge.desktop @@ -2,8 +2,9 @@ Categories={{{categories}}} Comment={{{comment}}} Exec={{{exec}}} %u +StartupWMClass={{{exec}}} Icon={{{icon}}} Name={{{name}}} Terminal=false Type=Application -MimeType=x-scheme-handler/clash; \ No newline at end of file +MimeType=x-scheme-handler/clash; diff --git a/gost/Dockerfile b/gost/Dockerfile index 1e27c6ec30..3a434c9e51 100644 --- a/gost/Dockerfile +++ b/gost/Dockerfile @@ -1,14 +1,24 @@ -FROM golang:1.22-alpine AS builder +FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0 AS xx -RUN apk add --no-cache musl-dev git gcc +FROM --platform=$BUILDPLATFORM golang:1.23-alpine3.20 AS builder -ADD . /src +COPY --from=xx / / -WORKDIR /src +ARG TARGETPLATFORM + +RUN xx-info env ENV CGO_ENABLED=0 -RUN cd cmd/gost && go env && go build +ENV XX_VERIFY_STATIC=1 + +WORKDIR /app + +COPY . . + +RUN cd cmd/gost && \ + xx-go build && \ + xx-verify gost FROM alpine:3.20 @@ -17,6 +27,6 @@ RUN apk add --no-cache iptables WORKDIR /bin/ -COPY --from=builder /src/cmd/gost/gost . +COPY --from=builder /app/cmd/gost/gost . -ENTRYPOINT ["/bin/gost"] +ENTRYPOINT ["/bin/gost"] \ No newline at end of file diff --git a/lede/target/linux/generic/pending-6.6/750-net-phy-aquantia-fix-setting-active_low-bit.patch b/lede/target/linux/generic/pending-6.6/750-net-phy-aquantia-fix-setting-active_low-bit.patch new file mode 100644 index 0000000000..6072e02fd4 --- /dev/null +++ b/lede/target/linux/generic/pending-6.6/750-net-phy-aquantia-fix-setting-active_low-bit.patch @@ -0,0 +1,55 @@ +From patchwork Tue Sep 17 13:49:40 2024 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13806176 +X-Patchwork-Delegate: kuba@kernel.org +Date: Tue, 17 Sep 2024 14:49:40 +0100 +From: Daniel Golle +To: Andrew Lunn , Heiner Kallweit , + Russell King , + "David S. Miller" , + Eric Dumazet , + Jakub Kicinski , Paolo Abeni , + Daniel Golle , + Christian Marangi , + Bartosz Golaszewski , + Robert Marko , + Russell King , netdev@vger.kernel.org, + linux-kernel@vger.kernel.org +Subject: [PATCH net 1/2] net: phy: aquantia: fix setting active_low bit +Message-ID: + +Precedence: bulk +X-Mailing-List: netdev@vger.kernel.org +List-Id: +List-Subscribe: +List-Unsubscribe: +MIME-Version: 1.0 +Content-Disposition: inline +X-Patchwork-Delegate: kuba@kernel.org + +phy_modify_mmd was used wrongly in aqr_phy_led_active_low_set() resulting +in a no-op instead of setting the VEND1_GLOBAL_LED_DRIVE_VDD bit. +Correctly set VEND1_GLOBAL_LED_DRIVE_VDD bit. + +Fixes: 61578f679378 ("net: phy: aquantia: add support for PHY LEDs") +Signed-off-by: Daniel Golle +Reviewed-by: Russell King (Oracle) +--- + drivers/net/phy/aquantia/aquantia_leds.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/net/phy/aquantia/aquantia_leds.c ++++ b/drivers/net/phy/aquantia/aquantia_leds.c +@@ -120,7 +120,8 @@ int aqr_phy_led_hw_control_set(struct ph + int aqr_phy_led_active_low_set(struct phy_device *phydev, int index, bool enable) + { + return phy_modify_mmd(phydev, MDIO_MMD_VEND1, AQR_LED_DRIVE(index), +- VEND1_GLOBAL_LED_DRIVE_VDD, enable); ++ VEND1_GLOBAL_LED_DRIVE_VDD, ++ enable ? VEND1_GLOBAL_LED_DRIVE_VDD : 0); + } + + int aqr_phy_led_polarity_set(struct phy_device *phydev, int index, unsigned long modes) diff --git a/lede/target/linux/generic/pending-6.6/751-net-phy-aquantia-fix-applying-active_low-bit-after-reset.patch b/lede/target/linux/generic/pending-6.6/751-net-phy-aquantia-fix-applying-active_low-bit-after-reset.patch new file mode 100644 index 0000000000..5c3494ae33 --- /dev/null +++ b/lede/target/linux/generic/pending-6.6/751-net-phy-aquantia-fix-applying-active_low-bit-after-reset.patch @@ -0,0 +1,72 @@ +From patchwork Tue Sep 17 13:49:55 2024 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Daniel Golle +X-Patchwork-Id: 13806177 +X-Patchwork-Delegate: kuba@kernel.org +Date: Tue, 17 Sep 2024 14:49:55 +0100 +From: Daniel Golle +To: Andrew Lunn , Heiner Kallweit , + Russell King , + "David S. Miller" , + Eric Dumazet , + Jakub Kicinski , Paolo Abeni , + Daniel Golle , + Christian Marangi , + Bartosz Golaszewski , + Robert Marko , + Russell King , netdev@vger.kernel.org, + linux-kernel@vger.kernel.org +Subject: [PATCH net 2/2] net: phy: aquantia: fix applying active_low bit + after reset +Message-ID: + <9b1f0cd91f4cda54c8be56b4fe780480baf4aa0f.1726580902.git.daniel@makrotopia.org> +References: + +Precedence: bulk +X-Mailing-List: netdev@vger.kernel.org +List-Id: +List-Subscribe: +List-Unsubscribe: +MIME-Version: 1.0 +Content-Disposition: inline +In-Reply-To: + +X-Patchwork-Delegate: kuba@kernel.org + +for_each_set_bit was used wrongly in aqr107_config_init() when iterating +over LEDs. Drop misleading 'index' variable and call +aqr_phy_led_active_low_set() for each set bit representing an LED which +is driven by VDD instead of GND pin. + +Fixes: 61578f679378 ("net: phy: aquantia: add support for PHY LEDs") +Signed-off-by: Daniel Golle +Reviewed-by: Russell King (Oracle) +--- + drivers/net/phy/aquantia/aquantia_main.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/net/phy/aquantia/aquantia_main.c ++++ b/drivers/net/phy/aquantia/aquantia_main.c +@@ -501,7 +501,7 @@ static int aqr107_config_init(struct phy + { + struct aqr107_priv *priv = phydev->priv; + u32 led_active_low; +- int ret, index = 0; ++ int ret; + + /* Check that the PHY interface type is compatible */ + if (phydev->interface != PHY_INTERFACE_MODE_SGMII && +@@ -537,10 +537,9 @@ static int aqr107_config_init(struct phy + + /* Restore LED polarity state after reset */ + for_each_set_bit(led_active_low, &priv->leds_active_low, AQR_MAX_LEDS) { +- ret = aqr_phy_led_active_low_set(phydev, index, led_active_low); ++ ret = aqr_phy_led_active_low_set(phydev, led_active_low, true); + if (ret) + return ret; +- index++; + } + + return 0; diff --git a/mihomo/component/updater/update_geo.go b/mihomo/component/updater/update_geo.go index b5dc967787..bba0dabd2e 100644 --- a/mihomo/component/updater/update_geo.go +++ b/mihomo/component/updater/update_geo.go @@ -229,20 +229,22 @@ func UpdateGeoDatabases() error { } func getUpdateTime() (err error, time time.Time) { - var fileInfo os.FileInfo - if geodata.GeodataMode() { - fileInfo, err = os.Stat(C.Path.GeoIP()) - if err != nil { - return err, time - } - } else { - fileInfo, err = os.Stat(C.Path.MMDB()) - if err != nil { - return err, time + filesToCheck := []string{ + C.Path.GeoIP(), + C.Path.MMDB(), + C.Path.ASN(), + C.Path.GeoSite(), + } + + for _, file := range filesToCheck { + var fileInfo os.FileInfo + fileInfo, err = os.Stat(file) + if err == nil { + return nil, fileInfo.ModTime() } } - return nil, fileInfo.ModTime() + return } func RegisterGeoUpdater() { diff --git a/mihomo/tunnel/tunnel.go b/mihomo/tunnel/tunnel.go index 5c136eb24e..b1b4add5ee 100644 --- a/mihomo/tunnel/tunnel.go +++ b/mihomo/tunnel/tunnel.go @@ -625,7 +625,7 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { // normal check for process uid, path, err := P.FindProcessName(metadata.NetWork.String(), metadata.SrcIP, int(metadata.SrcPort)) if err != nil { - log.Debugln("[Process] find process %s error: %v", metadata.String(), err) + log.Debugln("[Process] find process error for %s: %v", metadata.String(), err) } else { metadata.Process = filepath.Base(path) metadata.ProcessPath = path @@ -639,7 +639,7 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { // check package names pkg, err := P.FindPackageName(metadata) if err != nil { - log.Debugln("[Process] find process %s error: %v", metadata.String(), err) + log.Debugln("[Process] find process error for %s: %v", metadata.String(), err) } else { metadata.Process = pkg } diff --git a/openwrt-packages/alist/Makefile b/openwrt-packages/alist/Makefile index 064e148dee..efb12b5ffe 100644 --- a/openwrt-packages/alist/Makefile +++ b/openwrt-packages/alist/Makefile @@ -7,13 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=alist -PKG_VERSION:=3.37.4 -PKG_WEB_VERSION:=3.37.1 +PKG_VERSION:=3.38.0 +PKG_WEB_VERSION:=3.38.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/alist-org/alist/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=0f2c54aba7ddcfd7df3e959ce40709bbd88bf4eb9b0436079db879c8eb25b51b +PKG_HASH:=bc8983900786afdc2ac3d4a60d5e71a1e5db0c2c63f00190c728974ee266ce12 PKG_LICENSE:=GPL-3.0 PKG_LICENSE_FILE:=LICENSE @@ -23,7 +23,7 @@ define Download/$(PKG_NAME)-web FILE:=$(PKG_NAME)-web-$(PKG_WEB_VERSION).tar.gz URL_FILE:=dist.tar.gz URL:=https://github.com/alist-org/alist-web/releases/download/$(PKG_WEB_VERSION)/ - HASH:=0ca1fceb5291c59d5b5dcc0f3e871eac96485d39abce8495f1eb510cc12bccf6 + HASH:=8c76d6863bc77e0b5da1cbae10b6cec2b3332fcb4e41f055747f4cc5ab04c06a endef PKG_BUILD_DEPENDS:=golang/host diff --git a/openwrt-packages/gost/Makefile b/openwrt-packages/gost/Makefile index e513d21666..c997c53bbf 100644 --- a/openwrt-packages/gost/Makefile +++ b/openwrt-packages/gost/Makefile @@ -5,12 +5,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gost -PKG_VERSION:=2.11.5 +PKG_VERSION:=2.12.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/ginuerzh/gost/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=dab48b785f4d2df6c2f5619a4b9a2ac6e8b708f667a4d89c7d08df67ad7c5ca7 +PKG_HASH:=ed575807b0490411670556d4471338f418c326bb1ffe25f52977735012851765 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua index a45de6af7c..9765793d60 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua @@ -160,6 +160,9 @@ if has_xray then o.default = "10-20" o:depends("fragment", true) + o = s_xray:option(Flag, "noise", translate("Noise"), translate("UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.")) + o.default = 0 + o = s_xray:option(Flag, "sniffing_override_dest", translate("Override the connection destination address"), translate("Override the connection destination address with the sniffed domain.")) o.default = 0 @@ -177,6 +180,42 @@ if has_xray then o = s_xray:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)")) o.datatype = "uinteger" + + s_xray_noise = m:section(TypedSection, "xray_noise_packets", translate("Xray Noise Packets"),"" .. translate("To send noise packets, select \"Noise\" in Xray Settings.") .. "") + s_xray_noise.template = "cbi/tblsection" + s_xray_noise.sortable = true + s_xray_noise.anonymous = true + s_xray_noise.addremove = true + + s_xray_noise.create = function(e, t) + TypedSection.create(e, api.gen_short_uuid()) + end + + s_xray_noise.remove = function(self, section) + for k, v in pairs(self.children) do + v.rmempty = true + v.validate = nil + end + TypedSection.remove(self, section) + end + + o = s_xray_noise:option(Flag, "enabled", translate("Enable")) + o.default = 1 + o.rmempty = false + + o = s_xray_noise:option(ListValue, "type", translate("Type")) + o:value("rand", "rand") + o:value("str", "str") + o:value("base64", "base64") + + o = s_xray_noise:option(Value, "packet", translate("Packet")) + o.datatype = "minlength(1)" + o.rmempty = false + + o = s_xray_noise:option(Value, "delay", translate("Delay (ms)")) + o.datatype = "or(uinteger,portrange)" + o.rmempty = false + end if has_singbox then diff --git a/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua index 42bdf2c3cf..e80dc92b51 100644 --- a/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/small/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -18,6 +18,20 @@ local function get_new_port() return new_port end +local function get_noise_packets() + local noises = {} + uci:foreach(appname, "xray_noise_packets", function(n) + local noise = (n.enabled == "1") and { + type = n.type, + packet = n.packet, + delay = string.find(n.delay, "-") and n.delay or tonumber(n.delay) + } or nil + table.insert(noises, noise) + end) + if #noises == 0 then noises = nil end + return noises +end + local function get_domain_excluded() local path = string.format("/usr/share/%s/domains_excluded", appname) local content = fs.readfile(path) @@ -44,10 +58,12 @@ function gen_outbound(flag, node, tag, proxy_table) local proxy = 0 local proxy_tag = "nil" local fragment = nil + local noise = nil if proxy_table ~= nil and type(proxy_table) == "table" then proxy = proxy_table.proxy or 0 proxy_tag = proxy_table.tag or "nil" fragment = proxy_table.fragment or nil + noise = proxy_table.noise or nil end if node.type == "Xray" then @@ -132,7 +148,7 @@ function gen_outbound(flag, node, tag, proxy_table) mark = 255, tcpMptcp = (node.tcpMptcp == "1") and true or nil, tcpNoDelay = (node.tcpNoDelay == "1") and true or nil, - dialerProxy = fragment and "fragment" or nil + dialerProxy = (fragment or noise) and "dialerproxy" or nil }, network = node.transport, security = node.stream_security, @@ -679,7 +695,7 @@ function gen_config(var) end if is_new_blc_node then local blc_node = uci:get_all(appname, blc_node_id) - local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) valid_nodes[#valid_nodes + 1] = blc_node_tag @@ -698,7 +714,7 @@ function gen_config(var) if is_new_node then local fallback_node = uci:get_all(appname, fallback_node_id) if fallback_node.protocol ~= "_balancing" then - local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) else @@ -863,10 +879,17 @@ function gen_config(var) if xray_settings.fragment == "1" and not proxy_table.tag then proxy_table.fragment = true end + if xray_settings.noise == "1" and not proxy_table.tag then + proxy_table.noise = true + end local outbound = gen_outbound(flag, _node, rule_name, proxy_table) if outbound then set_outbound_detour(_node, outbound, outbounds, rule_name) - table.insert(outbounds, outbound) + if rule_name == "default" then + table.insert(outbounds, 1, outbound) + else + table.insert(outbounds, outbound) + end rule_outboundTag = rule_name end end @@ -1054,7 +1077,7 @@ function gen_config(var) sys.call("touch /tmp/etc/passwall2/iface/" .. node.iface) end else - local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.fragment == "1" or nil }) if outbound then local default_outTag = set_outbound_detour(node, outbound, outbounds) table.insert(outbounds, outbound) @@ -1421,17 +1444,18 @@ function gen_config(var) } } - if xray_settings.fragment == "1" then + if xray_settings.fragment == "1" or xray_settings.noise == "1" then table.insert(outbounds, { protocol = "freedom", - tag = "fragment", + tag = "dialerproxy", settings = { domainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= "") and direct_dns_query_strategy or "UseIP", - fragment = { + fragment = (xray_settings.fragment == "1") and { packets = (xray_settings.fragment_packets and xray_settings.fragment_packets ~= "") and xray_settings.fragment_packets, length = (xray_settings.fragment_length and xray_settings.fragment_length ~= "") and xray_settings.fragment_length, interval = (xray_settings.fragment_interval and xray_settings.fragment_interval ~= "") and xray_settings.fragment_interval - } + } or nil, + noises = (xray_settings.noise == "1") and get_noise_packets() or nil }, streamSettings = { sockopt = { diff --git a/small/luci-app-passwall2/po/zh-cn/passwall2.po b/small/luci-app-passwall2/po/zh-cn/passwall2.po index 856af5b392..6f70bcee20 100644 --- a/small/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/small/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1516,6 +1516,24 @@ msgstr "分片间隔" msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" +msgid "Noise" +msgstr "噪声" + +msgid "UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions." +msgstr "UDP 噪声,在某些情况下可以绕过一些针对 UDP 协议的限制。" + +msgid "To send noise packets, select \"Noise\" in Xray Settings." +msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" + +msgid "Xray Noise Packets" +msgstr "Xray 噪声数据包" + +msgid "Packet" +msgstr "数据包" + +msgid "Delay (ms)" +msgstr "延迟(ms)" + msgid "If is domain name, The requested domain name will be resolved to IP before connect." msgstr "如果是域名,域名将在请求发出之前解析为 IP。" diff --git a/small/luci-app-ssr-plus/Makefile b/small/luci-app-ssr-plus/Makefile index 7ea5e11e3f..d07f167d83 100644 --- a/small/luci-app-ssr-plus/Makefile +++ b/small/luci-app-ssr-plus/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ssr-plus PKG_VERSION:=188 -PKG_RELEASE:=6 +PKG_RELEASE:=7 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY \ @@ -133,7 +133,7 @@ endchoice config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG bool "Include ChinaDNS-NG" - default y + default n config PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS bool "Include MosDNS" diff --git a/small/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/small/luci-app-ssr-plus/root/etc/init.d/shadowsocksr index 9d22e62aa7..b1570aaafd 100755 --- a/small/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +++ b/small/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -1177,6 +1177,8 @@ reset() { add_list shadowsocksr.@access_control[0].wan_fw_ips=91.108.4.0/22 add_list shadowsocksr.@access_control[0].wan_fw_ips=91.108.56.0/22 add_list shadowsocksr.@access_control[0].wan_fw_ips=109.239.140.0/24 + add_list shadowsocksr.@access_control[0].wan_fw_ips=8.8.8.8 + add_list shadowsocksr.@access_control[0].wan_fw_ips=1.1.1.1 add_list shadowsocksr.@access_control[0].Interface='lan' add shadowsocksr socks5_proxy set shadowsocksr.@socks5_proxy[0].server='nil' diff --git a/v2rayn/v2rayN/ServiceLib/Enums/EMsgCommand.cs b/v2rayn/v2rayN/ServiceLib/Enums/EMsgCommand.cs new file mode 100644 index 0000000000..31d7556f14 --- /dev/null +++ b/v2rayn/v2rayN/ServiceLib/Enums/EMsgCommand.cs @@ -0,0 +1,10 @@ +namespace ServiceLib.Enums +{ + public enum EMsgCommand + { + ClearMsg, + SendMsgView, + SendSnackMsg, + RefreshProfiles + } +} \ No newline at end of file diff --git a/v2rayn/v2rayN/ServiceLib/Global.cs b/v2rayn/v2rayN/ServiceLib/Global.cs index 56ccaa381f..d39955dd5c 100644 --- a/v2rayn/v2rayN/ServiceLib/Global.cs +++ b/v2rayn/v2rayN/ServiceLib/Global.cs @@ -68,11 +68,6 @@ public const string GrpcGunMode = "gun"; public const string GrpcMultiMode = "multi"; public const int MaxPort = 65536; - public const string CommandClearMsg = "CommandClearMsg"; - public const string CommandSendMsgView = "CommandSendMsgView"; - public const string CommandSendSnackMsg = "CommandSendSnackMsg"; - public const string CommandStopSpeedTest = "CommandStopSpeedTest"; - public const string CommandRefreshProfiles = "CommandRefreshProfiles"; public const string DelayUnit = ""; public const string SpeedUnit = ""; public const int MinFontSize = 10; diff --git a/v2rayn/v2rayN/ServiceLib/Handler/NoticeHandler.cs b/v2rayn/v2rayN/ServiceLib/Handler/NoticeHandler.cs index 2a8aff683c..948fc81cec 100644 --- a/v2rayn/v2rayN/ServiceLib/Handler/NoticeHandler.cs +++ b/v2rayn/v2rayN/ServiceLib/Handler/NoticeHandler.cs @@ -13,7 +13,7 @@ namespace ServiceLib.Handler { return; } - MessageBus.Current.SendMessage(content, Global.CommandSendSnackMsg); + MessageBus.Current.SendMessage(content, EMsgCommand.SendSnackMsg.ToString()); } public void SendMessage(string? content) @@ -22,7 +22,7 @@ namespace ServiceLib.Handler { return; } - MessageBus.Current.SendMessage(content, Global.CommandSendMsgView); + MessageBus.Current.SendMessage(content, EMsgCommand.SendMsgView.ToString()); } public void SendMessageEx(string? content) diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index f88f0e99eb..ea8db5e2e5 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -150,7 +150,7 @@ namespace ServiceLib.ViewModels _updateView = updateView; _isAdministrator = isAdministrator; - MessageBus.Current.Listen(Global.CommandRefreshProfiles).Subscribe(async x => await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null)); + MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(async x => await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null)); SelectedRouting = new(); SelectedServer = new(); @@ -453,7 +453,7 @@ namespace ServiceLib.ViewModels private void RefreshServers() { - MessageBus.Current.SendMessage("", Global.CommandRefreshProfiles); + MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); } public void RefreshServersBiz() diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs index 8a329939a3..1c9b5ce597 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs @@ -24,7 +24,7 @@ namespace ServiceLib.ViewModels _config = AppHandler.Instance.Config; _updateView = updateView; - MessageBus.Current.Listen(Global.CommandSendMsgView).Subscribe(async x => await AppendQueueMsg(x)); + MessageBus.Current.Listen(EMsgCommand.SendMsgView.ToString()).Subscribe(async x => await AppendQueueMsg(x)); MsgFilter = _config.msgUIItem.mainMsgFilter ?? string.Empty; AutoRefresh = _config.msgUIItem.autoRefresh ?? true; diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index a8160c7f6e..fc121d93b6 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -101,7 +101,7 @@ namespace ServiceLib.ViewModels _updateView = updateView; - MessageBus.Current.Listen(Global.CommandRefreshProfiles).Subscribe(async x => await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null)); + MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(async x => await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null)); SelectedProfile = new(); SelectedSub = new(); @@ -345,7 +345,7 @@ namespace ServiceLib.ViewModels public void RefreshServers() { - MessageBus.Current.SendMessage("", Global.CommandRefreshProfiles); + MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); } public void RefreshServersBiz() @@ -582,7 +582,7 @@ namespace ServiceLib.ViewModels } else { - SetDefaultServer(indexId); + await SetDefaultServer(indexId); } } diff --git a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml index edfa18e6dd..d8503ed2f2 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml @@ -33,6 +33,10 @@ ToolTipText="v2rayN Desktop"> + + + + diff --git a/v2rayn/v2rayN/v2rayN.Desktop/ViewModels/AppViewModel.cs b/v2rayn/v2rayN/v2rayN.Desktop/ViewModels/AppViewModel.cs index c7726c2507..db9e11f5b1 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/ViewModels/AppViewModel.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/ViewModels/AppViewModel.cs @@ -9,6 +9,9 @@ namespace v2rayN.Desktop.ViewModels { public class AppViewModel : MyReactiveObject { + public ReactiveCommand SystemProxyClearCmd { get; } + public ReactiveCommand SystemProxySetCmd { get; } + public ReactiveCommand SystemProxyNothingCmd { get; } public ReactiveCommand AddServerViaClipboardCmd { get; } public ReactiveCommand SubUpdateCmd { get; } public ReactiveCommand SubUpdateViaProxyCmd { get; } @@ -18,33 +21,78 @@ namespace v2rayN.Desktop.ViewModels { _config = AppHandler.Instance.Config; - AddServerViaClipboardCmd = ReactiveCommand.Create(() => + SystemProxyClearCmd = ReactiveCommand.CreateFromTask(async () => { - if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + await SetListenerType(ESysProxyType.ForcedClear); + }); + SystemProxySetCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.ForcedChange); + }); + SystemProxyNothingCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.Unchanged); + }); + + AddServerViaClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaClipboard(); + }); + + SubUpdateCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(false); + }); + SubUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(true); + }); + + ExitCmd = ReactiveCommand.CreateFromTask(async () => + { + await Exit(); + }); + } + + private async Task SetListenerType(ESysProxyType type) + { + if (_config.systemProxyItem.sysProxyType == type) + { + return; + } + + var service = Locator.Current.GetService(); + if (service != null) await service.SetListenerType(type); + } + + private async Task AddServerViaClipboard() + { + if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + if (desktop.MainWindow != null) { - var clipboardData = AvaUtils.GetClipboardData(desktop.MainWindow).Result; - Locator.Current.GetService()?.AddServerViaClipboardAsync(clipboardData); + var clipboardData = await AvaUtils.GetClipboardData(desktop.MainWindow); + var service = Locator.Current.GetService(); + if (service != null) await service.AddServerViaClipboardAsync(clipboardData); } - }); + } + } - SubUpdateCmd = ReactiveCommand.Create(() => - { - Locator.Current.GetService()?.UpdateSubscriptionProcess("", false); - }); - SubUpdateViaProxyCmd = ReactiveCommand.Create(() => - { - Locator.Current.GetService()?.UpdateSubscriptionProcess("", true); - }); + private async Task UpdateSubscriptionProcess(bool blProxy) + { + var service = Locator.Current.GetService(); + if (service != null) await service.UpdateSubscriptionProcess("", blProxy); + } - ExitCmd = ReactiveCommand.Create(() => + private async Task Exit() + { + if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - Locator.Current.GetService()?.MyAppExitAsync(false); + var service = Locator.Current.GetService(); + if (service != null) await service.MyAppExitAsync(false); - desktop.Shutdown(); - } - }); + desktop.Shutdown(); + } } } } \ No newline at end of file diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs index b4ccc9d27f..c41bfdb36d 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs @@ -41,7 +41,7 @@ namespace v2rayN.Desktop.Views menuBackupAndRestore.Click += MenuBackupAndRestore_Click; var IsAdministrator = Utils.IsAdministrator(); - MessageBus.Current.Listen(Global.CommandSendSnackMsg).Subscribe(x => DelegateSnackMsg(x)); + MessageBus.Current.Listen(EMsgCommand.SendSnackMsg.ToString()).Subscribe(x => DelegateSnackMsg(x)); ViewModel = new MainWindowViewModel(IsAdministrator, UpdateViewHandler); Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml b/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml index b864c639a9..90dbf965bb 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml @@ -92,6 +92,9 @@ HeadersVisibility="Column" IsReadOnly="True" ItemsSource="{Binding RoutingItems}"> + + + diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml.cs index 76fbac61d2..159eb4e24d 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml.cs @@ -82,12 +82,7 @@ namespace v2rayN.Desktop.Views } private void RoutingSettingWindow_KeyDown(object? sender, KeyEventArgs e) - { - if (ViewModel?.enableRoutingBasic ?? false) - { - return; - } - + { if (e.KeyModifiers == KeyModifiers.Control) { if (e.Key == Key.A) diff --git a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs index 8884635880..40936791a9 100644 --- a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -37,7 +37,7 @@ namespace v2rayN.Views menuBackupAndRestore.Click += MenuBackupAndRestore_Click; var IsAdministrator = Utils.IsAdministrator(); - MessageBus.Current.Listen(Global.CommandSendSnackMsg).Subscribe(x => DelegateSnackMsg(x)); + MessageBus.Current.Listen(EMsgCommand.SendSnackMsg.ToString()).Subscribe(x => DelegateSnackMsg(x)); ViewModel = new MainWindowViewModel(IsAdministrator, UpdateViewHandler); Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); diff --git a/xray-core/app/router/condition.go b/xray-core/app/router/condition.go index dc80637246..89da1adfee 100644 --- a/xray-core/app/router/condition.go +++ b/xray-core/app/router/condition.go @@ -202,7 +202,7 @@ func NewUserMatcher(users []string) *UserMatcher { for _, user := range users { if len(user) > 0 { if len(user) > 7 && strings.HasPrefix(user, "regexp:") { - if re, err := regexp.Compile(user[7:]); err != nil { + if re, err := regexp.Compile(user[7:]); err == nil { patternsCopy = append(patternsCopy, re) } // Items of users slice with an invalid regexp syntax are ignored. diff --git a/yass/.github/ISSUE_TEMPLATE/bug_report.md b/yass/.github/ISSUE_TEMPLATE/bug_report.md index 3b7d7ae3ae..ecba184226 100644 --- a/yass/.github/ISSUE_TEMPLATE/bug_report.md +++ b/yass/.github/ISSUE_TEMPLATE/bug_report.md @@ -43,3 +43,9 @@ It is advised to enable # Your yass debug log here ``` or share the debug log in [gist](https://gist.github.com/). + +#### yass coredump (optional) + +See [the guide](https://github.com/Chilledheart/yass/wiki/Debug-Guide#check-coredump) to enable coredump in your system. + +Attach your coredump file in the issue diff --git a/yass/README.md b/yass/README.md index 4516890cb8..8dabd3113e 100644 --- a/yass/README.md +++ b/yass/README.md @@ -130,6 +130,9 @@ See [ChatGPT capable caddy Server](https://github.com/Chilledheart/yass/wiki/Usa [Report here if you want to add new server-side optimization/cooperation][frs] +### Debug Guide +Start from wiki's [Guide](https://github.com/Chilledheart/yass/wiki/Debug-Guide) + ## Build Status [![Compiler Compatibility](https://github.com/Chilledheart/yass/actions/workflows/compiler.yml/badge.svg)](https://github.com/Chilledheart/yass/actions/workflows/compiler.yml) diff --git a/yass/src/cli/cli_connection.cpp b/yass/src/cli/cli_connection.cpp index b06343e2bc..73ae8ee999 100644 --- a/yass/src/cli/cli_connection.cpp +++ b/yass/src/cli/cli_connection.cpp @@ -790,6 +790,12 @@ void CliConnection::WriteHandshake() { if (closed_) { return; } + // mark eof + if (s5_reply_.status() != socks5::reply::request_granted) { + shutdown_ = true; + asio::error_code ec; + downlink_->shutdown(ec); + } ProcessSentData(ec, bytes_transferred); }); break; @@ -800,6 +806,12 @@ void CliConnection::WriteHandshake() { if (closed_) { return; } + // mark eof + if (s4_reply_.status() != socks4::reply::request_granted) { + shutdown_ = true; + asio::error_code ec; + downlink_->shutdown(ec); + } ProcessSentData(ec, bytes_transferred); }); break; @@ -1863,19 +1875,23 @@ void CliConnection::ProcessReceivedData(std::shared_ptr buf, asio::error_ break; case state_socks5_handshake: ec = PerformCmdOpsV5(&s5_request_, &s5_reply_); - if (ec) { - break; - } WriteHandshake(); - VLOG(2) << "Connection (client) " << connection_id() << " socks5 handshake finished: ec: " << ec; + if (ec) { + // ready to read eof after send handshake + ReadStream(true); + return; + } + VLOG(2) << "Connection (client) " << connection_id() << " socks5 handshake finished"; goto handle_stream; case state_socks4_handshake: ec = PerformCmdOpsV4(&s4_request_, &s4_reply_); - if (ec) { - break; - } WriteHandshake(); - VLOG(2) << "Connection (client) " << connection_id() << " socks4 handshake finished: ec:" << ec; + if (ec) { + // ready to read eof after send handshake + ReadStream(true); + return; + } + VLOG(2) << "Connection (client) " << connection_id() << " socks4 handshake finished"; goto handle_stream; case state_http_handshake: ec = PerformCmdOpsHttp(); @@ -1883,7 +1899,7 @@ void CliConnection::ProcessReceivedData(std::shared_ptr buf, asio::error_ break; } WriteHandshake(); - VLOG(2) << "Connection (client) " << connection_id() << " http handshake finished: ec: " << ec; + VLOG(2) << "Connection (client) " << connection_id() << " http handshake finished"; goto handle_stream; case state_stream: handle_stream: diff --git a/yass/src/net/stream.hpp b/yass/src/net/stream.hpp index 53a0ef2d6f..4426171a8f 100644 --- a/yass/src/net/stream.hpp +++ b/yass/src/net/stream.hpp @@ -124,6 +124,12 @@ class stream : public RefCountedThreadSafe { DCHECK(callback); user_connect_callback_ = std::move(callback); + if (port_ == 0u) { + closed_ = true; + on_async_connect_callback(asio::error::network_unreachable); + return; + } + if (!host_ips_.empty()) { auto host_ips = absl::StrSplit(host_ips_, ';'); for (const auto& host_ip : host_ips) { @@ -403,6 +409,15 @@ class stream : public RefCountedThreadSafe { } void on_resolve(Channel* channel) { + if (endpoint_.address().is_unspecified() || endpoint_.address().is_multicast()) { + if (!endpoints_.empty()) { + on_try_next_endpoint(channel); + return; + } + closed_ = true; + on_async_connect_callback(asio::error::network_unreachable); + return; + } asio::error_code ec; socket_.open(endpoint_.protocol(), ec); if (ec) { diff --git a/yass/third_party/boringssl/src/ssl/handoff.cc b/yass/third_party/boringssl/src/ssl/handoff.cc index e4e5d281fd..6f5c7e2502 100644 --- a/yass/third_party/boringssl/src/ssl/handoff.cc +++ b/yass/third_party/boringssl/src/ssl/handoff.cc @@ -423,16 +423,16 @@ bool SSL_serialize_handback(const SSL *ssl, CBB *out) { } else { return false; } - if (!CBB_add_asn1_octet_string(&seq, hs->client_traffic_secret_0().data(), - hs->client_traffic_secret_0().size()) || - !CBB_add_asn1_octet_string(&seq, hs->server_traffic_secret_0().data(), - hs->server_traffic_secret_0().size()) || - !CBB_add_asn1_octet_string(&seq, hs->client_handshake_secret().data(), - hs->client_handshake_secret().size()) || - !CBB_add_asn1_octet_string(&seq, hs->server_handshake_secret().data(), - hs->server_handshake_secret().size()) || - !CBB_add_asn1_octet_string(&seq, hs->secret().data(), - hs->secret().size()) || + if (!CBB_add_asn1_octet_string(&seq, hs->client_traffic_secret_0.data(), + hs->client_traffic_secret_0.size()) || + !CBB_add_asn1_octet_string(&seq, hs->server_traffic_secret_0.data(), + hs->server_traffic_secret_0.size()) || + !CBB_add_asn1_octet_string(&seq, hs->client_handshake_secret.data(), + hs->client_handshake_secret.size()) || + !CBB_add_asn1_octet_string(&seq, hs->server_handshake_secret.data(), + hs->server_handshake_secret.size()) || + !CBB_add_asn1_octet_string(&seq, hs->secret.data(), + hs->secret.size()) || !CBB_add_asn1_octet_string(&seq, s3->exporter_secret.data(), s3->exporter_secret.size()) || !CBB_add_asn1_bool(&seq, s3->used_hello_retry_request) || @@ -443,8 +443,8 @@ bool SSL_serialize_handback(const SSL *ssl, CBB *out) { return false; } if (early_data == early_data_accepted && - !CBB_add_asn1_octet_string(&seq, hs->early_traffic_secret().data(), - hs->early_traffic_secret().size())) { + !CBB_add_asn1_octet_string(&seq, hs->early_traffic_secret.data(), + hs->early_traffic_secret.size())) { return false; } @@ -698,18 +698,17 @@ bool SSL_apply_handback(SSL *ssl, Span handback) { return false; } if (type == handback_tls13) { - hs->ResizeSecrets(hs->transcript.DigestLen()); - if (!CopyExact(hs->client_traffic_secret_0(), &client_traffic_secret_0) || - !CopyExact(hs->server_traffic_secret_0(), &server_traffic_secret_0) || - !CopyExact(hs->client_handshake_secret(), &client_handshake_secret) || - !CopyExact(hs->server_handshake_secret(), &server_handshake_secret) || - !CopyExact(hs->secret(), &secret) || + if (!hs->client_traffic_secret_0.TryCopyFrom(client_traffic_secret_0) || + !hs->server_traffic_secret_0.TryCopyFrom(server_traffic_secret_0) || + !hs->client_handshake_secret.TryCopyFrom(client_handshake_secret) || + !hs->server_handshake_secret.TryCopyFrom(server_handshake_secret) || + !hs->secret.TryCopyFrom(secret) || !s3->exporter_secret.TryCopyFrom(exporter_secret)) { return false; } if (s3->early_data_accepted && - !CopyExact(hs->early_traffic_secret(), &early_traffic_secret)) { + !hs->early_traffic_secret.TryCopyFrom(early_traffic_secret)) { return false; } } @@ -741,7 +740,7 @@ bool SSL_apply_handback(SSL *ssl, Span handback) { // immediately after processing handback. if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal, hs->new_session.get(), - hs->server_traffic_secret_0())) { + hs->server_traffic_secret_0)) { return false; } break; diff --git a/yass/third_party/boringssl/src/ssl/handshake.cc b/yass/third_party/boringssl/src/ssl/handshake.cc index 6fe37cc187..7195d6695b 100644 --- a/yass/third_party/boringssl/src/ssl/handshake.cc +++ b/yass/third_party/boringssl/src/ssl/handshake.cc @@ -164,13 +164,6 @@ SSL_HANDSHAKE::~SSL_HANDSHAKE() { ssl->ctx->x509_method->hs_flush_cached_ca_names(this); } -void SSL_HANDSHAKE::ResizeSecrets(size_t hash_len) { - if (hash_len > SSL_MAX_MD_SIZE) { - abort(); - } - hash_len_ = hash_len; -} - bool SSL_HANDSHAKE::GetClientHello(SSLMessage *out_msg, SSL_CLIENT_HELLO *out_client_hello) { if (!ech_client_hello_buf.empty()) { diff --git a/yass/third_party/boringssl/src/ssl/handshake_client.cc b/yass/third_party/boringssl/src/ssl/handshake_client.cc index 3774787179..44ef210ad0 100644 --- a/yass/third_party/boringssl/src/ssl/handshake_client.cc +++ b/yass/third_party/boringssl/src/ssl/handshake_client.cc @@ -614,7 +614,7 @@ static enum ssl_hs_wait_t do_early_reverify_server_certificate(SSL_HANDSHAKE *hs !tls13_derive_early_secret(hs) || !tls13_set_traffic_key(hs->ssl, ssl_encryption_early_data, evp_aead_seal, hs->early_session.get(), - hs->early_traffic_secret())) { + hs->early_traffic_secret)) { return ssl_hs_error; } diff --git a/yass/third_party/boringssl/src/ssl/handshake_server.cc b/yass/third_party/boringssl/src/ssl/handshake_server.cc index 59531f7161..0eb037bef9 100644 --- a/yass/third_party/boringssl/src/ssl/handshake_server.cc +++ b/yass/third_party/boringssl/src/ssl/handshake_server.cc @@ -991,8 +991,7 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) { // Now that all parameters are known, initialize the handshake hash and hash // the ClientHello. - if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher) || - !ssl_hash_message(hs, msg)) { + if (!hs->transcript.InitHash(ssl_protocol_version(ssl), hs->new_cipher)) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } @@ -1003,6 +1002,11 @@ static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs) { hs->transcript.FreeBuffer(); } + if (!ssl_hash_message(hs, msg)) { + ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); + return ssl_hs_error; + } + ssl->method->next_message(ssl); hs->state = state12_send_server_hello; diff --git a/yass/third_party/boringssl/src/ssl/internal.h b/yass/third_party/boringssl/src/ssl/internal.h index 5e5d3fd5f0..fac6260557 100644 --- a/yass/third_party/boringssl/src/ssl/internal.h +++ b/yass/third_party/boringssl/src/ssl/internal.h @@ -1605,6 +1605,16 @@ enum ssl_key_usage_t { OPENSSL_EXPORT bool ssl_cert_check_key_usage(const CBS *in, enum ssl_key_usage_t bit); +// ssl_cert_extract_issuer parses the DER-encoded, X.509 certificate in |in| +// and extracts the issuer. On success it returns true and the DER encoded +// issuer is in |out_dn|, otherwise it returns false. +OPENSSL_EXPORT bool ssl_cert_extract_issuer(const CBS *in, CBS *out_dn); + +// ssl_cert_matches_issuer parses the DER-encoded, X.509 certificate in |in| +// and returns true if its issuer is an exact match for the DER encoded +// distinguished name in |dn| +bool ssl_cert_matches_issuer(const CBS *in, const CBS *dn); + // ssl_cert_parse_pubkey extracts the public key from the DER-encoded, X.509 // certificate in |in|. It returns an allocated |EVP_PKEY| or else returns // nullptr and pushes to the error queue. @@ -1891,6 +1901,10 @@ struct ssl_credential_st : public bssl::RefCounted { // returns one on success and zero on error. bool AppendIntermediateCert(bssl::UniquePtr cert); + // ChainContainsIssuer returns true if |dn| is a byte for byte match with the + // issuer of any certificate in |chain|, false otherwise. + bool ChainContainsIssuer(bssl::Span dn) const; + // type is the credential type and determines which other fields apply. bssl::SSLCredentialType type; @@ -2107,18 +2121,13 @@ struct SSL_HANDSHAKE { // |SSL_OP_NO_*| and |SSL_CTX_set_max_proto_version| APIs. uint16_t max_version = 0; - private: - size_t hash_len_ = 0; - uint8_t secret_[SSL_MAX_MD_SIZE] = {0}; - uint8_t early_traffic_secret_[SSL_MAX_MD_SIZE] = {0}; - uint8_t client_handshake_secret_[SSL_MAX_MD_SIZE] = {0}; - uint8_t server_handshake_secret_[SSL_MAX_MD_SIZE] = {0}; - uint8_t client_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0}; - uint8_t server_traffic_secret_0_[SSL_MAX_MD_SIZE] = {0}; - uint8_t expected_client_finished_[SSL_MAX_MD_SIZE] = {0}; - - public: - void ResizeSecrets(size_t hash_len); + InplaceVector secret; + InplaceVector early_traffic_secret; + InplaceVector client_handshake_secret; + InplaceVector server_handshake_secret; + InplaceVector client_traffic_secret_0; + InplaceVector server_traffic_secret_0; + InplaceVector expected_client_finished; // GetClientHello, on the server, returns either the normal ClientHello // message or the ClientHelloInner if it has been serialized to @@ -2131,29 +2140,6 @@ struct SSL_HANDSHAKE { // SSL_HANDSHAKE. bool GetClientHello(SSLMessage *out_msg, SSL_CLIENT_HELLO *out_client_hello); - Span secret() { return MakeSpan(secret_, hash_len_); } - Span secret() const { - return MakeConstSpan(secret_, hash_len_); - } - Span early_traffic_secret() { - return MakeSpan(early_traffic_secret_, hash_len_); - } - Span client_handshake_secret() { - return MakeSpan(client_handshake_secret_, hash_len_); - } - Span server_handshake_secret() { - return MakeSpan(server_handshake_secret_, hash_len_); - } - Span client_traffic_secret_0() { - return MakeSpan(client_traffic_secret_0_, hash_len_); - } - Span server_traffic_secret_0() { - return MakeSpan(server_traffic_secret_0_, hash_len_); - } - Span expected_client_finished() { - return MakeSpan(expected_client_finished_, hash_len_); - } - union { // sent is a bitset where the bits correspond to elements of kExtensions // in extensions.cc. Each bit is set if that extension was sent in a diff --git a/yass/third_party/boringssl/src/ssl/ssl_cert.cc b/yass/third_party/boringssl/src/ssl/ssl_cert.cc index bd0143e748..b6d2cb7be5 100644 --- a/yass/third_party/boringssl/src/ssl/ssl_cert.cc +++ b/yass/third_party/boringssl/src/ssl/ssl_cert.cc @@ -325,6 +325,38 @@ static bool ssl_cert_skip_to_spki(const CBS *in, CBS *out_tbs_cert) { return true; } +bool ssl_cert_extract_issuer(const CBS *in, CBS *out_dn) { + CBS buf = *in; + + CBS toplevel; + CBS cert; + if (!CBS_get_asn1(&buf, &toplevel, CBS_ASN1_SEQUENCE) || // + CBS_len(&buf) != 0 || // + !CBS_get_asn1(&toplevel, &cert, CBS_ASN1_SEQUENCE) || // + // version + !CBS_get_optional_asn1( + &cert, NULL, NULL, + CBS_ASN1_CONSTRUCTED | CBS_ASN1_CONTEXT_SPECIFIC | 0) || + // serialNumber + !CBS_get_asn1(&cert, NULL, CBS_ASN1_INTEGER) || + // signature algorithm + !CBS_get_asn1(&cert, NULL, CBS_ASN1_SEQUENCE) || + // issuer + !CBS_get_asn1_element(&cert, out_dn, CBS_ASN1_SEQUENCE)) { + return false; + } + return true; +} + +bool ssl_cert_matches_issuer(const CBS *in, const CBS *dn) { + CBS issuer; + + if (!ssl_cert_extract_issuer(in, &issuer)) { + return false; + } + return CBS_mem_equal(&issuer, CBS_data(dn), CBS_len(dn)); +} + UniquePtr ssl_cert_parse_pubkey(const CBS *in) { CBS buf = *in, tbs_cert; if (!ssl_cert_skip_to_spki(&buf, &tbs_cert)) { diff --git a/yass/third_party/boringssl/src/ssl/ssl_credential.cc b/yass/third_party/boringssl/src/ssl/ssl_credential.cc index 39c14de8c2..357d8f894c 100644 --- a/yass/third_party/boringssl/src/ssl/ssl_credential.cc +++ b/yass/third_party/boringssl/src/ssl/ssl_credential.cc @@ -213,6 +213,28 @@ void ssl_credential_st::ClearIntermediateCerts() { } } +bool ssl_credential_st::ChainContainsIssuer( + bssl::Span dn) const { + if (UsesX509()) { + // TODO(bbe) This is used for matching a chain by CA name for the CA extension. + // If we require a chain to be present, we could remove any remaining parts + // of the chain after the found issuer, on the assumption that the peer + // sending the CA extension has the issuer in their trust store and does not + // need us to waste bytes on the wire. + CBS dn_cbs; + CBS_init(&dn_cbs, dn.data(), dn.size()); + for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(chain.get()); i++) { + const CRYPTO_BUFFER *cert = sk_CRYPTO_BUFFER_value(chain.get(), i); + CBS cert_cbs; + CRYPTO_BUFFER_init_CBS(cert, &cert_cbs); + if (ssl_cert_matches_issuer(&cert_cbs, &dn_cbs)) { + return true; + } + } + } + return false; +} + bool ssl_credential_st::AppendIntermediateCert(UniquePtr cert) { if (!UsesX509()) { OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); diff --git a/yass/third_party/boringssl/src/ssl/ssl_test.cc b/yass/third_party/boringssl/src/ssl/ssl_test.cc index 4d74bfa95a..0056779c63 100644 --- a/yass/third_party/boringssl/src/ssl/ssl_test.cc +++ b/yass/third_party/boringssl/src/ssl/ssl_test.cc @@ -1824,6 +1824,22 @@ static bssl::UniquePtr GetChainTestIntermediateBuffer() { return BufferFromPEM(kCertPEM); } +static bssl::UniquePtr GetChainTestIntermediateIssuerBuffer() { + static const char kSubjectPEM[] = + "-----BEGIN SUBJECT-----\n" + "MBQxEjAQBgNVBAMMCUMgUm9vdCBDQQ==\n" + "-----END SUBJECT-----\n"; + return BufferFromPEM(kSubjectPEM); +} + +static bssl::UniquePtr GetChainTestUnmatchingIssuerBuffer() { + static const char kSubjectPEM[] = + "-----BEGIN SUBJECT-----\n" + "MBYxFDASBgNVBAMMC0RpZ2lOb3RBRm94\n" + "-----END SUBJECT-----\n"; + return BufferFromPEM(kSubjectPEM); +} + static bssl::UniquePtr GetChainTestIntermediate() { return X509FromBuffer(GetChainTestIntermediateBuffer()); } @@ -5159,13 +5175,19 @@ TEST(SSLTest, OverrideChainAndKey) { BuffersEqual(SSL_get0_peer_certificates(client.get()), {leaf2.get()})); } -TEST(SSLTest, OverrideCredentialChain) { +TEST(SSLTest, CredentialChains) { bssl::UniquePtr key = GetChainTestKey(); ASSERT_TRUE(key); bssl::UniquePtr leaf = GetChainTestCertificateBuffer(); ASSERT_TRUE(leaf); bssl::UniquePtr ca = GetChainTestIntermediateBuffer(); ASSERT_TRUE(ca); + bssl::UniquePtr ca_subject = + GetChainTestIntermediateIssuerBuffer(); + ASSERT_TRUE(ca_subject); + bssl::UniquePtr bogus_subject = + GetChainTestUnmatchingIssuerBuffer(); + ASSERT_TRUE(bogus_subject); std::vector chain = {leaf.get(), ca.get()}; std::vector wrong_chain = {leaf.get(), leaf.get(), @@ -5179,9 +5201,30 @@ TEST(SSLTest, OverrideCredentialChain) { // Configure one chain (including the leaf), then replace it with another. ASSERT_TRUE(SSL_CREDENTIAL_set1_cert_chain(cred.get(), wrong_chain.data(), wrong_chain.size())); + CBS ca_subject_cbs, ca_cbs; + CRYPTO_BUFFER_init_CBS(ca.get(), &ca_cbs); + ASSERT_TRUE(ssl_cert_extract_issuer(&ca_cbs, &ca_subject_cbs)); + bssl::UniquePtr subject_buf( + CRYPTO_BUFFER_new_from_CBS(&ca_subject_cbs, nullptr)); + EXPECT_EQ(Bytes(CRYPTO_BUFFER_data(ca_subject.get()), + CRYPTO_BUFFER_len(ca_subject.get())), + Bytes(CRYPTO_BUFFER_data(subject_buf.get()), + CRYPTO_BUFFER_len(subject_buf.get()))); +#if !defined(BORINGSSL_SHARED_LIBRARY) + ASSERT_FALSE(cred->ChainContainsIssuer( + MakeConstSpan(CRYPTO_BUFFER_data(subject_buf.get()), + CRYPTO_BUFFER_len(subject_buf.get())))); +#endif + ASSERT_TRUE( SSL_CREDENTIAL_set1_cert_chain(cred.get(), chain.data(), chain.size())); +#if !defined(BORINGSSL_SHARED_LIBRARY) + ASSERT_TRUE(cred->ChainContainsIssuer( + MakeConstSpan(CRYPTO_BUFFER_data(subject_buf.get()), + CRYPTO_BUFFER_len(subject_buf.get())))); +#endif + ASSERT_TRUE(SSL_CREDENTIAL_set1_private_key(cred.get(), key.get())); ASSERT_TRUE(SSL_CTX_add1_credential(ctx.get(), cred.get())); diff --git a/yass/third_party/boringssl/src/ssl/test/runner/cipher_suites.go b/yass/third_party/boringssl/src/ssl/test/runner/cipher_suites.go index 4702df6949..c43fc09989 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/cipher_suites.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/cipher_suites.go @@ -16,6 +16,7 @@ import ( "crypto/sha512" "crypto/x509" "hash" + "slices" "golang.org/x/crypto/chacha20poly1305" ) @@ -338,11 +339,9 @@ func ecdhePSKKA(version uint16) keyAgreement { // mutualCipherSuite returns a cipherSuite given a list of supported // ciphersuites and the id requested by the peer. -func mutualCipherSuite(have []uint16, want uint16) *cipherSuite { - for _, id := range have { - if id == want { - return cipherSuiteFromID(id) - } +func mutualCipherSuite(have []uint16, id uint16) *cipherSuite { + if slices.Contains(have, id) { + return cipherSuiteFromID(id) } return nil } diff --git a/yass/third_party/boringssl/src/ssl/test/runner/conn.go b/yass/third_party/boringssl/src/ssl/test/runner/conn.go index 92293028c0..c019645bdd 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/conn.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/conn.go @@ -337,13 +337,9 @@ func (hc *halfConn) incEpoch() { } } copy(hc.seq[2:], hc.nextSeq[:]) - for i := range hc.nextSeq { - hc.nextSeq[i] = 0 - } + clear(hc.nextSeq[:]) } else { - for i := range hc.seq { - hc.seq[i] = 0 - } + clear(hc.seq[:]) } } @@ -354,9 +350,7 @@ func (hc *halfConn) setEpoch(epoch uint16) { hc.seq[0] = byte(epoch >> 8) hc.seq[1] = byte(epoch) copy(hc.seq[2:], hc.nextSeq[:]) - for i := range hc.nextSeq { - hc.nextSeq[i] = 0 - } + clear(hc.nextSeq[:]) } func (hc *halfConn) sequenceNumberForOutput() []byte { @@ -653,9 +647,7 @@ func (hc *halfConn) encrypt(record, payload []byte, typ recordType, headerLen in record = append(record, byte(typ)) } padding := extendSlice(&record, hc.config.Bugs.RecordPadding) - for i := range padding { - padding[i] = 0 - } + clear(padding) } if hc.mac != nil { @@ -1430,7 +1422,7 @@ func (c *Conn) readHandshake() (any, error) { // The handshake message unmarshallers // expect to be able to keep references to data, // so pass in a fresh copy that won't be overwritten. - data = append([]byte(nil), data...) + data = slices.Clone(data) if data[0] == typeServerHello && len(data) >= 38 { vers := uint16(data[4])<<8 | uint16(data[5]) diff --git a/yass/third_party/boringssl/src/ssl/test/runner/deterministic.go b/yass/third_party/boringssl/src/ssl/test/runner/deterministic.go index 50ae47fcd4..6ce9b518ff 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/deterministic.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/deterministic.go @@ -28,9 +28,7 @@ type deterministicRand struct { } func (d *deterministicRand) Read(buf []byte) (int, error) { - for i := range buf { - buf[i] = 0 - } + clear(buf) var nonce [12]byte binary.LittleEndian.PutUint64(nonce[:8], d.numCalls) cipher, err := chacha20.NewUnauthenticatedCipher(deterministicRandKey, nonce[:]) diff --git a/yass/third_party/boringssl/src/ssl/test/runner/dtls.go b/yass/third_party/boringssl/src/ssl/test/runner/dtls.go index 5eef430d93..63bc8644f2 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/dtls.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/dtls.go @@ -21,6 +21,7 @@ import ( "fmt" "math/rand" "net" + "slices" ) func (c *Conn) readDTLS13RecordHeader(b []byte) (headerLen int, recordLen int, recTyp recordType, seq []byte, err error) { @@ -383,7 +384,7 @@ func (c *Conn) dtlsPackHandshake() error { records[i] = append(records[i], fragment...) } else { // The fragment will be appended to, so copy it. - records = append(records, append([]byte{}, fragment...)) + records = append(records, slices.Clone(fragment)) } } @@ -577,7 +578,7 @@ func (c *Conn) dtlsDoReadHandshake() ([]byte, error) { } // Start with the TLS handshake header, // without the DTLS bits. - c.handMsg = append([]byte{}, header[:4]...) + c.handMsg = slices.Clone(header[:4]) } else if fragN != c.handMsgLen { return nil, errors.New("dtls: bad handshake length") } diff --git a/yass/third_party/boringssl/src/ssl/test/runner/handshake_client.go b/yass/third_party/boringssl/src/ssl/test/runner/handshake_client.go index f968d091fb..827fa18f15 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/handshake_client.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/handshake_client.go @@ -18,6 +18,7 @@ import ( "io" "math/big" "net" + "slices" "time" "boringssl.googlesource.com/boringssl/ssl/test/runner/hpke" @@ -63,7 +64,7 @@ func mapClientHelloVersion(vers uint16, isDTLS bool) uint16 { // this function does not update internal handshake state, so the test must be // configured compatibly with |in|. func replaceClientHello(hello *clientHelloMsg, in []byte) (*clientHelloMsg, error) { - copied := append([]byte{}, in...) + copied := slices.Clone(in) newHello := new(clientHelloMsg) if !newHello.unmarshal(copied) { return nil, errors.New("tls: invalid ClientHello") @@ -197,9 +198,7 @@ func (c *Conn) clientHandshake() error { } if challengeLength <= len(hs.hello.random) { skip := len(hs.hello.random) - challengeLength - for i := 0; i < skip; i++ { - hs.hello.random[i] = 0 - } + clear(hs.hello.random[:skip]) hs.hello.v2Challenge = hs.hello.random[skip:] } else { hs.hello.v2Challenge = make([]byte, challengeLength) @@ -451,14 +450,9 @@ func chooseECHCipherSuite(echConfig *ECHConfig, config *Config) (HPKECipherSuite return HPKECipherSuite{}, false } - for _, wantSuite := range config.echCipherSuitePreferences() { - if config.Bugs.IgnoreECHConfigCipherPreferences { - return wantSuite, true - } - for _, cipherSuite := range echConfig.CipherSuites { - if cipherSuite == wantSuite { - return cipherSuite, true - } + for _, suite := range config.echCipherSuitePreferences() { + if config.Bugs.IgnoreECHConfigCipherPreferences || slices.Contains(echConfig.CipherSuites, suite) { + return suite, true } } return HPKECipherSuite{}, false @@ -691,20 +685,17 @@ func (hs *clientHandshakeState) createClientHello(innerHello *clientHelloMsg, ec possibleCipherSuites := c.config.cipherSuites() hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites)) -NextCipherSuite: for _, suiteID := range possibleCipherSuites { - for _, suite := range cipherSuites { - if suite.id != suiteID { - continue - } - // Don't advertise TLS 1.2-only cipher suites unless - // we're attempting TLS 1.2. - if maxVersion < VersionTLS12 && suite.flags&suiteTLS12 != 0 { - continue - } - hello.cipherSuites = append(hello.cipherSuites, suiteID) - continue NextCipherSuite + suite := cipherSuiteFromID(suiteID) + if suite == nil { + continue } + // Don't advertise TLS 1.2-only cipher suites unless + // we're attempting TLS 1.2. + if maxVersion < VersionTLS12 && suite.flags&suiteTLS12 != 0 { + continue + } + hello.cipherSuites = append(hello.cipherSuites, suiteID) } if c.config.Bugs.AdvertiseAllConfiguredCiphers { @@ -953,10 +944,8 @@ func (hs *clientHandshakeState) checkECHConfirmation(msg any, hello *clientHello offset = 4 + 2 + 32 - echAcceptConfirmationLength } - withZeros := append(make([]byte, 0, len(raw)), raw...) - for i := 0; i < echAcceptConfirmationLength; i++ { - withZeros[i+offset] = 0 - } + withZeros := slices.Clone(raw) + clear(withZeros[offset : offset+echAcceptConfirmationLength]) confirmation := finishedHash.echAcceptConfirmation(hello.random, label, withZeros) return bytes.Equal(confirmation, raw[offset:offset+echAcceptConfirmationLength]) @@ -1542,15 +1531,8 @@ func (hs *clientHandshakeState) applyHelloRetryRequest(helloRetryRequest *helloR helloRetryRequest.selectedGroup = c.config.Bugs.MisinterpretHelloRetryRequestCurve } if helloRetryRequest.hasSelectedGroup { - var hrrCurveFound bool group := helloRetryRequest.selectedGroup - for _, curveID := range hello.supportedCurves { - if group == curveID { - hrrCurveFound = true - break - } - } - if !hrrCurveFound || hs.keyShares[group] != nil { + if !slices.Contains(hello.supportedCurves, group) || hs.keyShares[group] != nil { c.sendAlert(alertHandshakeFailure) return errors.New("tls: received invalid HelloRetryRequest") } @@ -2408,10 +2390,8 @@ func clientSessionCacheKey(serverAddr net.Addr, config *Config) string { // indicating if the fallback case was reached. func mutualProtocol(protos, preferenceProtos []string) (string, bool) { for _, s := range preferenceProtos { - for _, c := range protos { - if s == c { - return s, false - } + if slices.Contains(protos, s) { + return s, false } } @@ -2421,9 +2401,7 @@ func mutualProtocol(protos, preferenceProtos []string) (string, bool) { // writeIntPadded writes x into b, padded up with leading zeros as // needed. func writeIntPadded(b []byte, x *big.Int) { - for i := range b { - b[i] = 0 - } + clear(b) xb := x.Bytes() copy(b[len(b)-len(xb):], xb) } diff --git a/yass/third_party/boringssl/src/ssl/test/runner/handshake_server.go b/yass/third_party/boringssl/src/ssl/test/runner/handshake_server.go index b3c1f989b4..2c210eb36e 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/handshake_server.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/handshake_server.go @@ -17,6 +17,7 @@ import ( "fmt" "io" "math/big" + "slices" "time" "boringssl.googlesource.com/boringssl/ssl/test/runner/hpke" @@ -302,7 +303,7 @@ func (hs *serverHandshakeState) readClientHello() error { panic("Could not map wire version") } - clientProtocol, ok := wireToVersion(c.clientVersion, c.isDTLS) + clientProtocol, clientProtocolOK := wireToVersion(c.clientVersion, c.isDTLS) if c.shouldSendHelloVerifyRequest() { // Per RFC 6347, the version field in HelloVerifyRequest SHOULD @@ -367,12 +368,8 @@ func (hs *serverHandshakeState) readClientHello() error { } } - if config.Bugs.FailIfPostQuantumOffered { - for _, offeredCurve := range hs.clientHello.supportedCurves { - if isPqGroup(offeredCurve) { - return errors.New("tls: post-quantum group was offered") - } - } + if config.Bugs.FailIfPostQuantumOffered && slices.ContainsFunc(hs.clientHello.supportedCurves, isPqGroup) { + return errors.New("tls: post-quantum group was offered") } if expected := config.Bugs.ExpectedKeyShares; expected != nil { @@ -388,17 +385,13 @@ func (hs *serverHandshakeState) readClientHello() error { } // Reject < 1.2 ClientHellos with signature_algorithms. - if ok && clientProtocol < VersionTLS12 && len(hs.clientHello.signatureAlgorithms) > 0 { + if clientProtocolOK && clientProtocol < VersionTLS12 && len(hs.clientHello.signatureAlgorithms) > 0 { return fmt.Errorf("tls: client included signature_algorithms before TLS 1.2") } // Check the client cipher list is consistent with the version. - if ok && clientProtocol < VersionTLS12 { - for _, id := range hs.clientHello.cipherSuites { - if isTLS12Cipher(id) { - return fmt.Errorf("tls: client offered TLS 1.2 cipher before TLS 1.2") - } - } + if clientProtocolOK && clientProtocol < VersionTLS12 && slices.ContainsFunc(hs.clientHello.cipherSuites, isTLS12Cipher) { + return fmt.Errorf("tls: client offered TLS 1.2 cipher before TLS 1.2") } if config.Bugs.MockQUICTransport != nil && len(hs.clientHello.sessionID) > 0 { @@ -422,14 +415,7 @@ func (hs *serverHandshakeState) readClientHello() error { return fmt.Errorf("tls: client offered unexpected PSK identities") } - var scsvFound bool - for _, cipherSuite := range hs.clientHello.cipherSuites { - if cipherSuite == fallbackSCSV { - scsvFound = true - break - } - } - + scsvFound := slices.Contains(hs.clientHello.cipherSuites, fallbackSCSV) if !scsvFound && config.Bugs.FailIfNotFallbackSCSV { return errors.New("tls: no fallback SCSV found when expected") } else if scsvFound && !config.Bugs.FailIfNotFallbackSCSV { @@ -617,14 +603,11 @@ func (hs *serverHandshakeState) doTLS13Handshake() error { supportedCurve := false var selectedCurve CurveID preferredCurves := config.curvePreferences() -Curves: for _, curve := range hs.clientHello.supportedCurves { - for _, supported := range preferredCurves { - if supported == curve { - supportedCurve = true - selectedCurve = curve - break Curves - } + if slices.Contains(preferredCurves, curve) { + supportedCurve = true + selectedCurve = curve + break } } @@ -1047,9 +1030,7 @@ ResendHelloRetryRequest: // Emit the ECH confirmation signal when requested. if hs.clientHello.echInner && !config.Bugs.OmitServerHelloECHConfirmation { randomSuffix := hs.hello.random[len(hs.hello.random)-echAcceptConfirmationLength:] - for i := range randomSuffix { - randomSuffix[i] = 0 - } + clear(randomSuffix) copy(randomSuffix, hs.finishedHash.echAcceptConfirmation(hs.clientHello.random, echAcceptConfirmationLabel, hs.hello.marshal())) hs.hello.raw = nil } @@ -1148,38 +1129,35 @@ ResendHelloRetryRequest: certMsgBytes := certMsg.marshal() sentCompressedCertMsg := false - FindCertCompressionAlg: - for candidate, alg := range c.config.CertCompressionAlgs { - for _, id := range hs.clientHello.compressedCertAlgs { - if id == candidate { - if expected := config.Bugs.ExpectedCompressedCert; expected != 0 && expected != id { - return fmt.Errorf("tls: expected to send compressed cert with alg %d, but picked %d", expected, id) - } - if config.Bugs.ExpectUncompressedCert { - return errors.New("tls: expected to send uncompressed cert") - } - - if override := config.Bugs.SendCertCompressionAlgID; override != 0 { - id = override - } - - uncompressed := certMsgBytes[4:] - uncompressedLen := uint32(len(uncompressed)) - if override := config.Bugs.SendCertUncompressedLength; override != 0 { - uncompressedLen = override - } - - compressedCertMsgBytes := (&compressedCertificateMsg{ - algID: id, - uncompressedLength: uncompressedLen, - compressed: alg.Compress(uncompressed), - }).marshal() - - hs.writeServerHash(compressedCertMsgBytes) - c.writeRecord(recordTypeHandshake, compressedCertMsgBytes) - sentCompressedCertMsg = true - break FindCertCompressionAlg + for id, alg := range c.config.CertCompressionAlgs { + if slices.Contains(hs.clientHello.compressedCertAlgs, id) { + if expected := config.Bugs.ExpectedCompressedCert; expected != 0 && expected != id { + return fmt.Errorf("tls: expected to send compressed cert with alg %d, but picked %d", expected, id) } + if config.Bugs.ExpectUncompressedCert { + return errors.New("tls: expected to send uncompressed cert") + } + + if override := config.Bugs.SendCertCompressionAlgID; override != 0 { + id = override + } + + uncompressed := certMsgBytes[4:] + uncompressedLen := uint32(len(uncompressed)) + if override := config.Bugs.SendCertUncompressedLength; override != 0 { + uncompressedLen = override + } + + compressedCertMsgBytes := (&compressedCertificateMsg{ + algID: id, + uncompressedLength: uncompressedLen, + compressed: alg.Compress(uncompressed), + }).marshal() + + hs.writeServerHash(compressedCertMsgBytes) + c.writeRecord(recordTypeHandshake, compressedCertMsgBytes) + sentCompressedCertMsg = true + break } } @@ -1497,16 +1475,8 @@ func (hs *serverHandshakeState) processClientHello() (isResume bool, err error) copy(hs.hello.random[len(hs.hello.random)-8:], downgradeJDK11) } - foundCompression := false // We only support null compression, so check that the client offered it. - for _, compression := range hs.clientHello.compressionMethods { - if compression == compressionNone { - foundCompression = true - break - } - } - - if !foundCompression { + if !slices.Contains(hs.clientHello.compressionMethods, compressionNone) { c.sendAlert(alertHandshakeFailure) return false, errors.New("tls: client does not support uncompressed connections") } @@ -1517,28 +1487,19 @@ func (hs *serverHandshakeState) processClientHello() (isResume bool, err error) supportedCurve := false preferredCurves := config.curvePreferences() -Curves: for _, curve := range hs.clientHello.supportedCurves { if isPqGroup(curve) && c.vers < VersionTLS13 { // Post-quantum is TLS 1.3 only. continue } - for _, supported := range preferredCurves { - if supported == curve { - supportedCurve = true - break Curves - } - } - } - - supportedPointFormat := false - for _, pointFormat := range hs.clientHello.supportedPoints { - if pointFormat == pointFormatUncompressed { - supportedPointFormat = true + if slices.Contains(preferredCurves, curve) { + supportedCurve = true break } } + + supportedPointFormat := slices.Contains(hs.clientHello.supportedPoints, pointFormatUncompressed) hs.ellipticOk = supportedCurve && supportedPointFormat _, hs.ecdsaOk = hs.cert.PrivateKey.(*ecdsa.PrivateKey) @@ -1646,18 +1607,8 @@ func (hs *serverHandshakeState) processClientExtensions(serverExtensions *server var alpsAllowed, alpsAllowedOld bool if c.vers >= VersionTLS13 { - for _, proto := range hs.clientHello.alpsProtocols { - if proto == c.clientProtocol { - alpsAllowed = true - break - } - } - for _, proto := range hs.clientHello.alpsProtocolsOld { - if proto == c.clientProtocol { - alpsAllowedOld = true - break - } - } + alpsAllowed = slices.Contains(hs.clientHello.alpsProtocols, c.clientProtocol) + alpsAllowedOld = slices.Contains(hs.clientHello.alpsProtocolsOld, c.clientProtocol) } if c.config.Bugs.AlwaysNegotiateApplicationSettingsBoth { @@ -1727,14 +1678,11 @@ func (hs *serverHandshakeState) processClientExtensions(serverExtensions *server } if hs.clientHello.srtpProtectionProfiles != nil { - SRTPLoop: - for _, p1 := range c.config.SRTPProtectionProfiles { - for _, p2 := range hs.clientHello.srtpProtectionProfiles { - if p1 == p2 { - serverExtensions.srtpProtectionProfile = p1 - c.srtpProtectionProfile = p1 - break SRTPLoop - } + for _, p := range c.config.SRTPProtectionProfiles { + if slices.Contains(hs.clientHello.srtpProtectionProfiles, p) { + serverExtensions.srtpProtectionProfile = p + c.srtpProtectionProfile = p + break } } } @@ -2422,53 +2370,34 @@ func (hs *serverHandshakeState) writeClientHash(msg []byte) { // tryCipherSuite returns a cipherSuite with the given id if that cipher suite // is acceptable to use. func (c *Conn) tryCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16, ellipticOk, ecdsaOk bool) *cipherSuite { - for _, supported := range supportedCipherSuites { - if id == supported { - var candidate *cipherSuite - - for _, s := range cipherSuites { - if s.id == id { - candidate = s - break - } - } - if candidate == nil { - continue - } - - // Don't select a ciphersuite which we can't - // support for this client. - if version >= VersionTLS13 || candidate.flags&suiteTLS13 != 0 { - if version < VersionTLS13 || candidate.flags&suiteTLS13 == 0 { - continue - } - return candidate - } - if (candidate.flags&suiteECDHE != 0) && !ellipticOk { - continue - } - if (candidate.flags&suiteECDSA != 0) != ecdsaOk { - continue - } - if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 { - continue - } - return candidate - } + candidate := mutualCipherSuite(supportedCipherSuites, id) + if candidate == nil { + return nil } - return nil + // Don't select a ciphersuite which we can't + // support for this client. + if version >= VersionTLS13 || candidate.flags&suiteTLS13 != 0 { + if version < VersionTLS13 || candidate.flags&suiteTLS13 == 0 { + return nil + } + return candidate + } + if (candidate.flags&suiteECDHE != 0) && !ellipticOk { + return nil + } + if (candidate.flags&suiteECDSA != 0) != ecdsaOk { + return nil + } + if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 { + return nil + } + return candidate } func isTLS12Cipher(id uint16) bool { - for _, cipher := range cipherSuites { - if cipher.id != id { - continue - } - return cipher.flags&suiteTLS12 != 0 - } - // Unknown cipher. - return false + cipher := cipherSuiteFromID(id) + return cipher != nil && cipher.flags&suiteTLS12 != 0 } func isGREASEValue(val uint16) bool { diff --git a/yass/third_party/boringssl/src/ssl/test/runner/key_agreement.go b/yass/third_party/boringssl/src/ssl/test/runner/key_agreement.go index acea236df6..5294702492 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/key_agreement.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/key_agreement.go @@ -728,19 +728,15 @@ type ecdheKeyAgreement struct { func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Credential, clientHello *clientHelloMsg, hello *serverHelloMsg, version uint16) (*serverKeyExchangeMsg, error) { var curveID CurveID preferredCurves := config.curvePreferences() - -NextCandidate: for _, candidate := range preferredCurves { if isPqGroup(candidate) && version < VersionTLS13 { // Post-quantum "groups" require TLS 1.3. continue } - for _, c := range clientHello.supportedCurves { - if candidate == c { - curveID = c - break NextCandidate - } + if slices.Contains(clientHello.supportedCurves, candidate) { + curveID = candidate + break } } diff --git a/yass/third_party/boringssl/src/ssl/test/runner/kyber/kyber.go b/yass/third_party/boringssl/src/ssl/test/runner/kyber/kyber.go index dd113f0b32..82c9dbdd3a 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/kyber/kyber.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/kyber/kyber.go @@ -18,14 +18,15 @@ package kyber import ( "crypto/subtle" - "golang.org/x/crypto/sha3" "io" + + "golang.org/x/crypto/sha3" ) -const( - CiphertextSize = 1088 - PublicKeySize = 1184 - PrivateKeySize = 2400 +const ( + CiphertextSize = 1088 + PublicKeySize = 1184 + PrivateKeySize = 2400 ) const ( @@ -104,9 +105,7 @@ func decompress(x uint16, bits int) uint16 { type scalar [degree]uint16 func (s *scalar) zero() { - for i := range s { - s[i] = 0 - } + clear(s[:]) } // This bit of Python will be referenced in some of the following comments: diff --git a/yass/third_party/boringssl/src/ssl/test/runner/packet_adapter.go b/yass/third_party/boringssl/src/ssl/test/runner/packet_adapter.go index a8da311bb1..42684fb0c5 100644 --- a/yass/third_party/boringssl/src/ssl/test/runner/packet_adapter.go +++ b/yass/third_party/boringssl/src/ssl/test/runner/packet_adapter.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "net" + "slices" "time" ) @@ -172,7 +173,7 @@ func (d *damageAdaptor) setDamage(damage bool) { func (d *damageAdaptor) Write(b []byte) (int, error) { if d.damage && len(b) > 0 { - b = append([]byte{}, b...) + b = slices.Clone(b) b[len(b)-1]++ } return d.Conn.Write(b) diff --git a/yass/third_party/boringssl/src/ssl/tls13_both.cc b/yass/third_party/boringssl/src/ssl/tls13_both.cc index f6d95478f6..4386a6f65a 100644 --- a/yass/third_party/boringssl/src/ssl/tls13_both.cc +++ b/yass/third_party/boringssl/src/ssl/tls13_both.cc @@ -367,7 +367,7 @@ bool tls13_process_finished(SSL_HANDSHAKE *hs, const SSLMessage &msg, Span verify_data; if (use_saved_value) { assert(ssl->server); - verify_data = hs->expected_client_finished(); + verify_data = hs->expected_client_finished; } else { size_t len; if (!tls13_finished_mac(hs, verify_data_buf, &len, !ssl->server)) { diff --git a/yass/third_party/boringssl/src/ssl/tls13_client.cc b/yass/third_party/boringssl/src/ssl/tls13_client.cc index 76f970c179..c3862412d3 100644 --- a/yass/third_party/boringssl/src/ssl/tls13_client.cc +++ b/yass/third_party/boringssl/src/ssl/tls13_client.cc @@ -93,7 +93,7 @@ static bool close_early_data(SSL_HANDSHAKE *hs, ssl_encryption_level_t level) { assert(level == ssl_encryption_handshake); if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal, hs->new_session.get(), - hs->client_handshake_secret())) { + hs->client_handshake_secret)) { return false; } } @@ -529,14 +529,14 @@ static enum ssl_hs_wait_t do_read_server_hello(SSL_HANDSHAKE *hs) { if (!hs->in_early_data || ssl->quic_method != nullptr) { if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal, hs->new_session.get(), - hs->client_handshake_secret())) { + hs->client_handshake_secret)) { return ssl_hs_error; } } if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open, hs->new_session.get(), - hs->server_handshake_secret())) { + hs->server_handshake_secret)) { return ssl_hs_error; } @@ -959,10 +959,10 @@ static enum ssl_hs_wait_t do_complete_second_flight(SSL_HANDSHAKE *hs) { // Derive the final keys and enable them. if (!tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal, hs->new_session.get(), - hs->client_traffic_secret_0()) || + hs->client_traffic_secret_0) || !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open, hs->new_session.get(), - hs->server_traffic_secret_0()) || + hs->server_traffic_secret_0) || !tls13_derive_resumption_secret(hs)) { return ssl_hs_error; } diff --git a/yass/third_party/boringssl/src/ssl/tls13_enc.cc b/yass/third_party/boringssl/src/ssl/tls13_enc.cc index f601b1a8c7..1e682f1e7b 100644 --- a/yass/third_party/boringssl/src/ssl/tls13_enc.cc +++ b/yass/third_party/boringssl/src/ssl/tls13_enc.cc @@ -41,9 +41,8 @@ static bool init_key_schedule(SSL_HANDSHAKE *hs, SSLTranscript *transcript, } // Initialize the secret to the zero key. - hs->ResizeSecrets(transcript->DigestLen()); - OPENSSL_memset(hs->secret().data(), 0, hs->secret().size()); - + hs->secret.clear(); + hs->secret.Resize(transcript->DigestLen()); return true; } @@ -51,11 +50,11 @@ static bool hkdf_extract_to_secret(SSL_HANDSHAKE *hs, const SSLTranscript &transcript, Span in) { size_t len; - if (!HKDF_extract(hs->secret().data(), &len, transcript.Digest(), in.data(), - in.size(), hs->secret().data(), hs->secret().size())) { + if (!HKDF_extract(hs->secret.data(), &len, transcript.Digest(), in.data(), + in.size(), hs->secret.data(), hs->secret.size())) { return false; } - assert(len == hs->secret().size()); + assert(len == hs->secret.size()); return true; } @@ -147,32 +146,34 @@ bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span in) { unsigned derive_context_len; return EVP_Digest(nullptr, 0, derive_context, &derive_context_len, hs->transcript.Digest(), nullptr) && - hkdf_expand_label(hs->secret(), hs->transcript.Digest(), hs->secret(), - label_to_span(kTLS13LabelDerived), + hkdf_expand_label(MakeSpan(hs->secret), hs->transcript.Digest(), + hs->secret, label_to_span(kTLS13LabelDerived), MakeConstSpan(derive_context, derive_context_len), SSL_is_dtls(hs->ssl)) && hkdf_extract_to_secret(hs, hs->transcript, in); } -// derive_secret_with_transcript derives a secret of length |out.size()| and -// writes the result in |out| with the given label, the current base secret, and -// the state of |transcript|. It returns true on success and false on error. -static bool derive_secret_with_transcript(const SSL_HANDSHAKE *hs, - Span out, - const SSLTranscript &transcript, - Span label) { +// derive_secret_with_transcript derives a secret of length +// |transcript.DigestLen()| and writes the result in |out| with the given label, +// the current base secret, and the state of |transcript|. It returns true on +// success and false on error. +static bool derive_secret_with_transcript( + const SSL_HANDSHAKE *hs, InplaceVector *out, + const SSLTranscript &transcript, Span label) { uint8_t context_hash[EVP_MAX_MD_SIZE]; size_t context_hash_len; if (!transcript.GetHash(context_hash, &context_hash_len)) { return false; } - return hkdf_expand_label(out, transcript.Digest(), hs->secret(), label, - MakeConstSpan(context_hash, context_hash_len), + out->ResizeMaybeUninit(transcript.DigestLen()); + return hkdf_expand_label(MakeSpan(*out), transcript.Digest(), hs->secret, + label, MakeConstSpan(context_hash, context_hash_len), SSL_is_dtls(hs->ssl)); } -static bool derive_secret(SSL_HANDSHAKE *hs, Span out, +static bool derive_secret(SSL_HANDSHAKE *hs, + InplaceVector *out, Span label) { return derive_secret_with_transcript(hs, out, hs->transcript, label); } @@ -276,10 +277,10 @@ bool tls13_derive_early_secret(SSL_HANDSHAKE *hs) { ? hs->inner_transcript : hs->transcript; if (!derive_secret_with_transcript( - hs, hs->early_traffic_secret(), transcript, + hs, &hs->early_traffic_secret, transcript, label_to_span(kTLS13LabelClientEarlyTraffic)) || !ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET", - hs->early_traffic_secret())) { + hs->early_traffic_secret)) { return false; } return true; @@ -287,14 +288,14 @@ bool tls13_derive_early_secret(SSL_HANDSHAKE *hs) { bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; - if (!derive_secret(hs, hs->client_handshake_secret(), + if (!derive_secret(hs, &hs->client_handshake_secret, label_to_span(kTLS13LabelClientHandshakeTraffic)) || !ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET", - hs->client_handshake_secret()) || - !derive_secret(hs, hs->server_handshake_secret(), + hs->client_handshake_secret) || + !derive_secret(hs, &hs->server_handshake_secret, label_to_span(kTLS13LabelServerHandshakeTraffic)) || !ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET", - hs->server_handshake_secret())) { + hs->server_handshake_secret)) { return false; } @@ -303,18 +304,15 @@ bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) { bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; - if (!derive_secret(hs, hs->client_traffic_secret_0(), + if (!derive_secret(hs, &hs->client_traffic_secret_0, label_to_span(kTLS13LabelClientApplicationTraffic)) || !ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0", - hs->client_traffic_secret_0()) || - !derive_secret(hs, hs->server_traffic_secret_0(), + hs->client_traffic_secret_0) || + !derive_secret(hs, &hs->server_traffic_secret_0, label_to_span(kTLS13LabelServerApplicationTraffic)) || !ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0", - hs->server_traffic_secret_0())) { - return false; - } - ssl->s3->exporter_secret.ResizeMaybeUninit(hs->transcript.DigestLen()); - if (!derive_secret(hs, MakeSpan(ssl->s3->exporter_secret), + hs->server_traffic_secret_0) || + !derive_secret(hs, &ssl->s3->exporter_secret, label_to_span(kTLS13LabelExporter)) || !ssl_log_secret(ssl, "EXPORTER_SECRET", ssl->s3->exporter_secret)) { return false; @@ -342,8 +340,7 @@ bool tls13_rotate_traffic_key(SSL *ssl, enum evp_aead_direction_t direction) { static const char kTLS13LabelResumption[] = "res master"; bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) { - hs->new_session->secret.ResizeMaybeUninit(hs->transcript.DigestLen()); - return derive_secret(hs, MakeSpan(hs->new_session->secret), + return derive_secret(hs, &hs->new_session->secret, label_to_span(kTLS13LabelResumption)); } @@ -372,7 +369,7 @@ static bool tls13_verify_data(uint8_t *out, size_t *out_len, bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, bool is_server) { Span traffic_secret = - is_server ? hs->server_handshake_secret() : hs->client_handshake_secret(); + is_server ? hs->server_handshake_secret : hs->client_handshake_secret; uint8_t context_hash[EVP_MAX_MD_SIZE]; size_t context_hash_len; diff --git a/yass/third_party/boringssl/src/ssl/tls13_server.cc b/yass/third_party/boringssl/src/ssl/tls13_server.cc index 655141fbb4..fcee108b61 100644 --- a/yass/third_party/boringssl/src/ssl/tls13_server.cc +++ b/yass/third_party/boringssl/src/ssl/tls13_server.cc @@ -852,7 +852,7 @@ static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs) { if (!tls13_derive_handshake_secrets(hs) || !tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_seal, hs->new_session.get(), - hs->server_handshake_secret())) { + hs->server_handshake_secret)) { return ssl_hs_error; } @@ -953,7 +953,7 @@ static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs) { !tls13_derive_application_secrets(hs) || !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_seal, hs->new_session.get(), - hs->server_traffic_secret_0())) { + hs->server_traffic_secret_0)) { return ssl_hs_error; } @@ -978,28 +978,27 @@ static enum ssl_hs_wait_t do_send_half_rtt_ticket(SSL_HANDSHAKE *hs) { } size_t finished_len; - if (!tls13_finished_mac(hs, hs->expected_client_finished().data(), + hs->expected_client_finished.Resize(hs->transcript.DigestLen()); + if (!tls13_finished_mac(hs, hs->expected_client_finished.data(), &finished_len, false /* client */)) { return ssl_hs_error; } - if (finished_len != hs->expected_client_finished().size()) { + if (finished_len != hs->expected_client_finished.size()) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return ssl_hs_error; } // Feed the predicted Finished into the transcript. This allows us to derive // the resumption secret early and send half-RTT tickets. - // - // TODO(davidben): This will need to be updated for DTLS 1.3. assert(!SSL_is_dtls(hs->ssl)); - assert(hs->expected_client_finished().size() <= 0xff); + assert(hs->expected_client_finished.size() <= 0xff); uint8_t header[4] = { SSL3_MT_FINISHED, 0, 0, - static_cast(hs->expected_client_finished().size())}; + static_cast(hs->expected_client_finished.size())}; bool unused_sent_tickets; if (!hs->transcript.Update(header) || - !hs->transcript.Update(hs->expected_client_finished()) || + !hs->transcript.Update(hs->expected_client_finished) || !tls13_derive_resumption_secret(hs) || !add_new_session_tickets(hs, &unused_sent_tickets)) { return ssl_hs_error; @@ -1021,7 +1020,7 @@ static enum ssl_hs_wait_t do_read_second_client_flight(SSL_HANDSHAKE *hs) { if (ssl->s3->early_data_accepted) { if (!tls13_set_traffic_key(ssl, ssl_encryption_early_data, evp_aead_open, hs->new_session.get(), - hs->early_traffic_secret())) { + hs->early_traffic_secret)) { return ssl_hs_error; } hs->can_early_write = true; @@ -1034,7 +1033,7 @@ static enum ssl_hs_wait_t do_read_second_client_flight(SSL_HANDSHAKE *hs) { if (!uses_end_of_early_data(ssl)) { if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open, hs->new_session.get(), - hs->client_handshake_secret())) { + hs->client_handshake_secret)) { return ssl_hs_error; } hs->tls13_state = state13_process_end_of_early_data; @@ -1070,7 +1069,7 @@ static enum ssl_hs_wait_t do_process_end_of_early_data(SSL_HANDSHAKE *hs) { } if (!tls13_set_traffic_key(ssl, ssl_encryption_handshake, evp_aead_open, hs->new_session.get(), - hs->client_handshake_secret())) { + hs->client_handshake_secret)) { return ssl_hs_error; } } @@ -1238,7 +1237,7 @@ static enum ssl_hs_wait_t do_read_client_finished(SSL_HANDSHAKE *hs) { // evp_aead_seal keys have already been switched. !tls13_set_traffic_key(ssl, ssl_encryption_application, evp_aead_open, hs->new_session.get(), - hs->client_traffic_secret_0())) { + hs->client_traffic_secret_0)) { return ssl_hs_error; } diff --git a/yass/third_party/libc++/CMakeLists.txt b/yass/third_party/libc++/CMakeLists.txt index 33ca78664a..94f37e9020 100644 --- a/yass/third_party/libc++/CMakeLists.txt +++ b/yass/third_party/libc++/CMakeLists.txt @@ -59,7 +59,7 @@ foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "-stdlib=libc++" "" ${CompilerFlag} "${${CompilerFlag}}") endforeach() -set(libcxx_CR "283f1aa1ad5758f7cb9778692a8b3c881ca25e6a") +set(libcxx_CR "6e4ed1972ba9bc35783750d3cde3310fdabc82c0") # Fixed libc++ configuration macros are in # buildtools/third_party/libc++/__config_site. This config only has defines # that vary depending on gn args, and non-define flags. diff --git a/yass/third_party/libc++/trunk/CMakeLists.txt b/yass/third_party/libc++/trunk/CMakeLists.txt index f1942e963c..75c926f543 100644 --- a/yass/third_party/libc++/trunk/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/CMakeLists.txt @@ -131,11 +131,7 @@ option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in") elseif(MINGW) - if (LIBCXX_ENABLE_SHARED) - set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-mingw.cfg.in") - else() - set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-static-mingw.cfg.in") - endif() + set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-mingw.cfg.in") elseif(WIN32) # clang-cl if (LIBCXX_ENABLE_SHARED) set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-clangcl.cfg.in") diff --git a/yass/third_party/libc++/trunk/cmake/caches/AIX.cmake b/yass/third_party/libc++/trunk/cmake/caches/AIX.cmake index 4ec78f9bbd..036fdfdae6 100644 --- a/yass/third_party/libc++/trunk/cmake/caches/AIX.cmake +++ b/yass/third_party/libc++/trunk/cmake/caches/AIX.cmake @@ -16,3 +16,10 @@ set(LIBCXX_CXX_ABI libcxxabi CACHE STRING "") set(LIBUNWIND_ENABLE_SHARED ON CACHE BOOL "") set(LIBUNWIND_ENABLE_STATIC OFF CACHE BOOL "") set(LIBCXX_ABI_DEFINES "_LIBCPP_ABI_IOS_ALLOW_ARBITRARY_FILL_VALUE" CACHE STRING "") + +# On AIX, both shared and static libraries are archived. As a result, both the static and the shared targets end +# up with a `.a` suffix, which conflict. To workaround that, we set a different output name for the static +# libraries, which we never actually build anyway. For more information, see https://gitlab.kitware.com/cmake/cmake/-/issues/19494. +set(LIBCXX_STATIC_OUTPUT_NAME "c++-static" CACHE STRING "") +set(LIBCXXABI_STATIC_OUTPUT_NAME "c++abi-static" CACHE STRING "") +set(LIBUNWIND_STATIC_OUTPUT_NAME "unwind-static" CACHE STRING "") diff --git a/yass/third_party/libc++/trunk/cmake/caches/Armv7M-picolibc.cmake b/yass/third_party/libc++/trunk/cmake/caches/Armv7M-picolibc.cmake index b5f9089308..0f8189b457 100644 --- a/yass/third_party/libc++/trunk/cmake/caches/Armv7M-picolibc.cmake +++ b/yass/third_party/libc++/trunk/cmake/caches/Armv7M-picolibc.cmake @@ -39,3 +39,14 @@ set(LIBUNWIND_IS_BAREMETAL ON CACHE BOOL "") set(LIBUNWIND_REMEMBER_HEAP_ALLOC ON CACHE BOOL "") set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") find_program(QEMU_SYSTEM_ARM qemu-system-arm REQUIRED) + +# On embedded platforms that don't support shared library targets, CMake implicitly changes shared +# library targets to be static library targets. This results in duplicate definitions of the static +# library targets even though we might not ever build the shared library target, which breaks the +# build. To work around this, we change the output name of the shared library target so that it +# can't conflict with the static library target. +# +# This is tracked by https://gitlab.kitware.com/cmake/cmake/-/issues/25759. +set(LIBCXX_SHARED_OUTPUT_NAME "c++-shared" CACHE STRING "") +set(LIBCXXABI_SHARED_OUTPUT_NAME "c++abi-shared" CACHE STRING "") +set(LIBUNWIND_SHARED_OUTPUT_NAME "unwind-shared" CACHE STRING "") diff --git a/yass/third_party/libc++/trunk/docs/ReleaseNotes/20.rst b/yass/third_party/libc++/trunk/docs/ReleaseNotes/20.rst index dcb1102d81..3a66aecaf5 100644 --- a/yass/third_party/libc++/trunk/docs/ReleaseNotes/20.rst +++ b/yass/third_party/libc++/trunk/docs/ReleaseNotes/20.rst @@ -78,6 +78,10 @@ Deprecations and Removals supported as an extension anymore, please migrate any code that uses e.g. ``std::vector`` to be standards conforming. +- Non-conforming member typedefs ``iterator`` and ``const_iterator`` of ``std::bitset`` are removed. Previously, they + were private but could cause ambiguity in name lookup. Code that expects such ambiguity will possibly not compile in + LLVM 20. + Upcoming Deprecations and Removals ---------------------------------- diff --git a/yass/third_party/libc++/trunk/docs/UserDocumentation.rst b/yass/third_party/libc++/trunk/docs/UserDocumentation.rst index f5e55994aa..1db437ce58 100644 --- a/yass/third_party/libc++/trunk/docs/UserDocumentation.rst +++ b/yass/third_party/libc++/trunk/docs/UserDocumentation.rst @@ -355,6 +355,35 @@ Third-party Integrations Libc++ provides integration with a few third-party tools. +Debugging libc++ internals in LLDB +---------------------------------- + +LLDB hides the implementation details of libc++ by default. + +E.g., when setting a breakpoint in a comparator passed to ``std::sort``, the +backtrace will read as + +.. code-block:: + + (lldb) thread backtrace + * thread #1, name = 'a.out', stop reason = breakpoint 3.1 + * frame #0: 0x000055555555520e a.out`my_comparator(a=1, b=8) at test-std-sort.cpp:6:3 + frame #7: 0x0000555555555615 a.out`void std::__1::sort[abi:ne200000], bool (*)(int, int)>(__first=(item = 8), __last=(item = 0), __comp=(a.out`my_less(int, int) at test-std-sort.cpp:5)) at sort.h:1003:3 + frame #8: 0x000055555555531a a.out`main at test-std-sort.cpp:24:3 + +Note how the caller of ``my_comparator`` is shown as ``std::sort``. Looking at +the frame numbers, we can see that frames #1 until #6 were hidden. Those frames +represent internal implementation details such as ``__sort4`` and similar +utility functions. + +To also show those implementation details, use ``thread backtrace -u``. +Alternatively, to disable those compact backtraces, use ``frame recognizer list`` +and ``frame recognizer disable`` on the "libc++ frame recognizer". + +Futhermore, stepping into libc++ functions is disabled by default. This is controlled via the +setting ``target.process.thread.step-avoid-regexp`` which defaults to ``^std::`` and can be +disabled using ``settings set target.process.thread.step-avoid-regexp ""``. + GDB Pretty printers for libc++ ------------------------------ diff --git a/yass/third_party/libc++/trunk/include/bitset b/yass/third_party/libc++/trunk/include/bitset index ce23d52216..f90ceaab81 100644 --- a/yass/third_party/libc++/trunk/include/bitset +++ b/yass/third_party/libc++/trunk/include/bitset @@ -187,8 +187,8 @@ protected: typedef __bit_reference<__bitset> reference; typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT; @@ -199,11 +199,11 @@ protected: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT { return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 iterator __make_iter(size_t __pos) _NOEXCEPT { - return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __iterator __make_iter(size_t __pos) _NOEXCEPT { + return __iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 const_iterator __make_iter(size_t __pos) const _NOEXCEPT { - return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __const_iterator __make_iter(size_t __pos) const _NOEXCEPT { + return __const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator&=(const __bitset& __v) _NOEXCEPT; @@ -335,8 +335,8 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __bitset<_N_words, _Siz template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long __bitset<_N_words, _Size>::to_ulong(false_type) const { - const_iterator __e = __make_iter(_Size); - const_iterator __i = std::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); + __const_iterator __e = __make_iter(_Size); + __const_iterator __i = std::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); if (__i != __e) __throw_overflow_error("bitset to_ulong overflow error"); @@ -352,8 +352,8 @@ __bitset<_N_words, _Size>::to_ulong(true_type) const { template _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 unsigned long long __bitset<_N_words, _Size>::to_ullong(false_type) const { - const_iterator __e = __make_iter(_Size); - const_iterator __i = std::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); + __const_iterator __e = __make_iter(_Size); + __const_iterator __i = std::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); if (__i != __e) __throw_overflow_error("bitset to_ullong overflow error"); @@ -449,8 +449,8 @@ protected: typedef __bit_reference<__bitset> reference; typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT; @@ -461,11 +461,11 @@ protected: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference __make_ref(size_t __pos) const _NOEXCEPT { return const_reference(&__first_, __storage_type(1) << __pos); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 iterator __make_iter(size_t __pos) _NOEXCEPT { - return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __iterator __make_iter(size_t __pos) _NOEXCEPT { + return __iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 const_iterator __make_iter(size_t __pos) const _NOEXCEPT { - return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __const_iterator __make_iter(size_t __pos) const _NOEXCEPT { + return __const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator&=(const __bitset& __v) _NOEXCEPT; @@ -564,8 +564,8 @@ protected: typedef __bit_reference<__bitset> reference; typedef __bit_const_reference<__bitset> const_reference; - typedef __bit_iterator<__bitset, false> iterator; - typedef __bit_iterator<__bitset, true> const_iterator; + typedef __bit_iterator<__bitset, false> __iterator; + typedef __bit_iterator<__bitset, true> __const_iterator; _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bitset() _NOEXCEPT; _LIBCPP_HIDE_FROM_ABI explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT; @@ -576,11 +576,11 @@ protected: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference __make_ref(size_t) const _NOEXCEPT { return const_reference(nullptr, 1); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 iterator __make_iter(size_t) _NOEXCEPT { - return iterator(nullptr, 0); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __iterator __make_iter(size_t) _NOEXCEPT { + return __iterator(nullptr, 0); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 const_iterator __make_iter(size_t) const _NOEXCEPT { - return const_iterator(nullptr, 0); + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 __const_iterator __make_iter(size_t) const _NOEXCEPT { + return __const_iterator(nullptr, 0); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator&=(const __bitset&) _NOEXCEPT {} diff --git a/yass/third_party/libc++/trunk/include/module.modulemap b/yass/third_party/libc++/trunk/include/module.modulemap index 22a1313498..3ea91274a9 100644 --- a/yass/third_party/libc++/trunk/include/module.modulemap +++ b/yass/third_party/libc++/trunk/include/module.modulemap @@ -73,9 +73,9 @@ module std_core [system] { module common_reference { header "__type_traits/common_reference.h" } module common_type { header "__type_traits/common_type.h" - // We need to export everything from this module because common_type inherits from __builtin_common_type, - // which needs to be re-exported. - export * + // We need to export those because common_type inherits from either of those based on __builtin_common_type. + export std_core.type_traits.type_identity + export std_core.utility_core.empty } module conditional { header "__type_traits/conditional.h" } module conjunction { header "__type_traits/conjunction.h" } diff --git a/yass/third_party/libc++/trunk/src/CMakeLists.txt b/yass/third_party/libc++/trunk/src/CMakeLists.txt index b187677ff2..4af04f202d 100644 --- a/yass/third_party/libc++/trunk/src/CMakeLists.txt +++ b/yass/third_party/libc++/trunk/src/CMakeLists.txt @@ -143,10 +143,6 @@ if (LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) ) endif() -if(NOT LIBCXX_INSTALL_LIBRARY) - set(exclude_from_all EXCLUDE_FROM_ALL) -endif() - if (APPLE AND LLVM_USE_SANITIZER) if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR @@ -177,77 +173,80 @@ split_list(LIBCXX_COMPILE_FLAGS) split_list(LIBCXX_LINK_FLAGS) # Build the shared library. -if (LIBCXX_ENABLE_SHARED) - add_library(cxx_shared SHARED ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) - target_include_directories(cxx_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(cxx_shared PUBLIC cxx-headers libcxx-libc-shared - PRIVATE ${LIBCXX_LIBRARIES}) - set_target_properties(cxx_shared - PROPERTIES - COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" - LINK_FLAGS "${LIBCXX_LINK_FLAGS}" - OUTPUT_NAME "${LIBCXX_SHARED_OUTPUT_NAME}" - VERSION "${LIBCXX_LIBRARY_VERSION}" - SOVERSION "${LIBCXX_ABI_VERSION}" - DEFINE_SYMBOL "" +add_library(cxx_shared SHARED ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) +target_include_directories(cxx_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(cxx_shared PUBLIC cxx-headers libcxx-libc-shared + PRIVATE ${LIBCXX_LIBRARIES}) +set_target_properties(cxx_shared + PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" + COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" + LINK_FLAGS "${LIBCXX_LINK_FLAGS}" + OUTPUT_NAME "${LIBCXX_SHARED_OUTPUT_NAME}" + VERSION "${LIBCXX_LIBRARY_VERSION}" + SOVERSION "${LIBCXX_ABI_VERSION}" + DEFINE_SYMBOL "" +) +cxx_add_common_build_flags(cxx_shared) + +if(ZOS) + add_custom_command(TARGET cxx_shared POST_BUILD + COMMAND + ${LIBCXX_SOURCE_DIR}/utils/zos_rename_dll_side_deck.sh + $ $ "${LIBCXX_DLL_NAME}" + COMMENT "Rename dll name inside the side deck file" + WORKING_DIRECTORY $ ) - cxx_add_common_build_flags(cxx_shared) +endif() - if(ZOS) - add_custom_command(TARGET cxx_shared POST_BUILD - COMMAND - ${LIBCXX_SOURCE_DIR}/utils/zos_rename_dll_side_deck.sh - $ $ "${LIBCXX_DLL_NAME}" - COMMENT "Rename dll name inside the side deck file" - WORKING_DIRECTORY $ - ) - endif() +# Link against libc++abi +if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) + target_link_libraries(cxx_shared PRIVATE libcxx-abi-shared-objects) +else() + target_link_libraries(cxx_shared PUBLIC libcxx-abi-shared) +endif() - # Link against libc++abi - if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) - target_link_libraries(cxx_shared PRIVATE libcxx-abi-shared-objects) - else() - target_link_libraries(cxx_shared PUBLIC libcxx-abi-shared) - endif() +# Maybe force some symbols to be weak, not weak or not exported. +# TODO: This shouldn't depend on the platform, and ideally it should be done in the sources. +if (APPLE AND LIBCXX_CXX_ABI MATCHES "libcxxabi$" + AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) + target_link_libraries(cxx_shared PRIVATE + "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/notweak.exp" + "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/weak.exp") +endif() - # Maybe force some symbols to be weak, not weak or not exported. - # TODO: This shouldn't depend on the platform, and ideally it should be done in the sources. - if (APPLE AND LIBCXX_CXX_ABI MATCHES "libcxxabi$" - AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) - target_link_libraries(cxx_shared PRIVATE - "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/notweak.exp" - "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/weak.exp") - endif() +# Generate a linker script in place of a libc++.so symlink. +if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) + set(link_libraries) - # Generate a linker script in place of a libc++.so symlink. - if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) - set(link_libraries) + set(imported_libname "$") + set(output_name "$") + string(APPEND link_libraries "${CMAKE_LINK_LIBRARY_FLAG}$,${imported_libname},${output_name}>") - set(imported_libname "$") - set(output_name "$") - string(APPEND link_libraries "${CMAKE_LINK_LIBRARY_FLAG}$,${imported_libname},${output_name}>") - - # TODO: Move to the same approach as above for the unwind library - if (LIBCXXABI_USE_LLVM_UNWINDER) - if (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY) - # libunwind is already included in libc++abi - elseif (TARGET unwind_shared OR HAVE_LIBUNWIND) - string(APPEND link_libraries " ${CMAKE_LINK_LIBRARY_FLAG}$") - else() - string(APPEND link_libraries " ${CMAKE_LINK_LIBRARY_FLAG}unwind") - endif() + # TODO: Move to the same approach as above for the unwind library + if (LIBCXXABI_USE_LLVM_UNWINDER) + if (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY) + # libunwind is already included in libc++abi + elseif (TARGET unwind_shared OR HAVE_LIBUNWIND) + string(APPEND link_libraries " ${CMAKE_LINK_LIBRARY_FLAG}$") + else() + string(APPEND link_libraries " ${CMAKE_LINK_LIBRARY_FLAG}unwind") endif() - - set(linker_script "INPUT($ ${link_libraries})") - add_custom_command(TARGET cxx_shared POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E remove "$" - COMMAND "${CMAKE_COMMAND}" -E echo "${linker_script}" > "$" - COMMENT "Generating linker script: '${linker_script}' as file $" - VERBATIM - ) endif() + set(linker_script "INPUT($ ${link_libraries})") + add_custom_command(TARGET cxx_shared POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E remove "$" + COMMAND "${CMAKE_COMMAND}" -E echo "${linker_script}" > "$" + COMMENT "Generating linker script: '${linker_script}' as file $" + VERBATIM + ) +endif() + +if (LIBCXX_ENABLE_SHARED) list(APPEND LIBCXX_BUILD_TARGETS "cxx_shared") +endif() + if(WIN32 AND NOT MINGW AND NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") # Since we most likely do not have a mt.exe replacement, disable the # manifest bundling. This allows a normal cmake invocation to pass which @@ -260,51 +259,52 @@ if (LIBCXX_ENABLE_SHARED) APPEND_STRING PROPERTY LINK_FLAGS " -Xlinker /MANIFEST:NO") endif() endif() -endif() set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # Build the static library. -if (LIBCXX_ENABLE_STATIC) - add_library(cxx_static STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) - target_include_directories(cxx_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(cxx_static PUBLIC cxx-headers libcxx-libc-static - PRIVATE ${LIBCXX_LIBRARIES} - PRIVATE libcxx-abi-static) - set_target_properties(cxx_static - PROPERTIES - COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" - LINK_FLAGS "${LIBCXX_LINK_FLAGS}" - OUTPUT_NAME "${LIBCXX_STATIC_OUTPUT_NAME}" - ) - cxx_add_common_build_flags(cxx_static) +add_library(cxx_static STATIC ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) +target_include_directories(cxx_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(cxx_static PUBLIC cxx-headers libcxx-libc-static + PRIVATE ${LIBCXX_LIBRARIES} + PRIVATE libcxx-abi-static) +set_target_properties(cxx_static + PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" + COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" + LINK_FLAGS "${LIBCXX_LINK_FLAGS}" + OUTPUT_NAME "${LIBCXX_STATIC_OUTPUT_NAME}" +) +cxx_add_common_build_flags(cxx_static) - if (LIBCXX_HERMETIC_STATIC_LIBRARY) - # If the hermetic library doesn't define the operator new/delete functions - # then its code shouldn't declare them with hidden visibility. They might - # actually be provided by a shared library at link time. - if (LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) - append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete=force-hidden) - if (NOT CXX_SUPPORTS_FVISIBILITY_GLOBAL_NEW_DELETE_EQ_FORCE_HIDDEN_FLAG) - append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden) - endif() +if (LIBCXX_HERMETIC_STATIC_LIBRARY) + # If the hermetic library doesn't define the operator new/delete functions + # then its code shouldn't declare them with hidden visibility. They might + # actually be provided by a shared library at link time. + if (LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) + append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete=force-hidden) + if (NOT CXX_SUPPORTS_FVISIBILITY_GLOBAL_NEW_DELETE_EQ_FORCE_HIDDEN_FLAG) + append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden) endif() - target_compile_options(cxx_static PRIVATE ${CXX_STATIC_LIBRARY_FLAGS}) - # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in __config_site - # too. Define it in the same way here, to avoid redefinition conflicts. - target_compile_definitions(cxx_static PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) endif() + target_compile_options(cxx_static PRIVATE ${CXX_STATIC_LIBRARY_FLAGS}) + # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in __config_site + # too. Define it in the same way here, to avoid redefinition conflicts. + target_compile_definitions(cxx_static PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) +endif() +if (LIBCXX_ENABLE_STATIC) list(APPEND LIBCXX_BUILD_TARGETS "cxx_static") - # Attempt to merge the libc++.a archive and the ABI library archive into one. - if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY) - target_link_libraries(cxx_static PRIVATE libcxx-abi-static-objects) - endif() +endif() +# Attempt to merge the libc++.a archive and the ABI library archive into one. +if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY) + target_link_libraries(cxx_static PRIVATE libcxx-abi-static-objects) endif() # Add a meta-target for both libraries. add_custom_target(cxx DEPENDS ${LIBCXX_BUILD_TARGETS}) +# Build the experimental static library set(LIBCXX_EXPERIMENTAL_SOURCES experimental/keep.cpp ) diff --git a/yass/third_party/libc++/trunk/test/configs/llvm-libc++-shared-mingw.cfg.in b/yass/third_party/libc++/trunk/test/configs/llvm-libc++-mingw.cfg.in similarity index 92% rename from yass/third_party/libc++/trunk/test/configs/llvm-libc++-shared-mingw.cfg.in rename to yass/third_party/libc++/trunk/test/configs/llvm-libc++-mingw.cfg.in index 8868f0cadd..01c4d58ca0 100644 --- a/yass/third_party/libc++/trunk/test/configs/llvm-libc++-shared-mingw.cfg.in +++ b/yass/third_party/libc++/trunk/test/configs/llvm-libc++-mingw.cfg.in @@ -1,5 +1,5 @@ # This testing configuration handles running the test suite against LLVM's libc++ -# using a DLL with MinGW/Clang on Windows. +# using either a DLL or a static library, with MinGW/Clang on Windows. lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') diff --git a/yass/third_party/libc++/trunk/test/configs/llvm-libc++-static-mingw.cfg.in b/yass/third_party/libc++/trunk/test/configs/llvm-libc++-static-mingw.cfg.in deleted file mode 100644 index fb2f906589..0000000000 --- a/yass/third_party/libc++/trunk/test/configs/llvm-libc++-static-mingw.cfg.in +++ /dev/null @@ -1,25 +0,0 @@ -# This testing configuration handles running the test suite against LLVM's libc++ -# using a static library with MinGW/Clang on Windows. - -lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') - -config.substitutions.append(('%{flags}', '')) -config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -I %{target-include-dir} -I %{include-dir} -I %{libcxx-dir}/test/support' -)) -config.substitutions.append(('%{link_flags}', - '-nostdlib++ -L %{lib-dir} -lc++' -)) -config.substitutions.append(('%{exec}', - '%{executor} --execdir %T --prepend_env PATH=%{lib-dir} -- ' -)) - -import os, site -site.addsitedir(os.path.join('@LIBCXX_SOURCE_DIR@', 'utils')) -import libcxx.test.params, libcxx.test.config -libcxx.test.config.configure( - libcxx.test.params.DEFAULT_PARAMETERS, - libcxx.test.features.DEFAULT_FEATURES, - config, - lit_config -) diff --git a/yass/third_party/libc++/trunk/test/std/utilities/template.bitset/bitset.members/nonstdmem.uglified.compile.pass.cpp b/yass/third_party/libc++/trunk/test/std/utilities/template.bitset/bitset.members/nonstdmem.uglified.compile.pass.cpp new file mode 100644 index 0000000000..c9dd923d71 --- /dev/null +++ b/yass/third_party/libc++/trunk/test/std/utilities/template.bitset/bitset.members/nonstdmem.uglified.compile.pass.cpp @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// This test ensures that we don't use a non-uglified name 'iterator' and +// 'const_iterator' in the implementation of bitset. +// +// See https://github.com/llvm/llvm-project/issues/111125. + +#include +#include +#include + +struct my_base { + typedef int* iterator; + typedef const int* const_iterator; +}; + +template +struct my_derived : my_base, std::bitset {}; + +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); +static_assert(std::is_same::iterator, int*>::value, ""); + +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); +static_assert(std::is_same::const_iterator, const int*>::value, ""); diff --git a/yass/third_party/libc++/trunk/utils/ci/run-buildbot b/yass/third_party/libc++/trunk/utils/ci/run-buildbot index e040f15acc..0ce1def5f3 100755 --- a/yass/third_party/libc++/trunk/utils/ci/run-buildbot +++ b/yass/third_party/libc++/trunk/utils/ci/run-buildbot @@ -28,10 +28,6 @@ ${PROGNAME} [options] --build-dir The directory to use for building the library. By default, this is '/build/'. ---osx-roots Path to pre-downloaded macOS dylibs. By default, we download - them from Green Dragon. This is only relevant at all when - running back-deployment testing if one wants to override - the old dylibs we use to run the tests with different ones. Environment variables CC The C compiler to use, this value is used by CMake. This variable is optional. @@ -66,10 +62,6 @@ while [[ $# -gt 0 ]]; do BUILD_DIR="${2}" shift; shift ;; - --osx-roots) - OSX_ROOTS="${2}" - shift; shift - ;; *) BUILDER="${1}" shift @@ -246,7 +238,7 @@ check-generated-output) # Reject patches that introduce non-ASCII characters or hard tabs. # Depends on LC_COLLATE set at the top of this script. set -x - ! grep -rn '[^ -~]' libcxx/include libcxx/src libcxx/test libcxx/benchmarks \ + ! grep -rn '[^ -~]' libcxx/include libcxx/src libcxx/test \ --exclude '*.dat' \ --exclude '*unicode*.cpp' \ --exclude '*print*.sh.cpp' \ diff --git a/yass/third_party/libc++abi/trunk/src/CMakeLists.txt b/yass/third_party/libc++abi/trunk/src/CMakeLists.txt index 480e528b81..84fe2784be 100644 --- a/yass/third_party/libc++abi/trunk/src/CMakeLists.txt +++ b/yass/third_party/libc++abi/trunk/src/CMakeLists.txt @@ -184,75 +184,76 @@ if (CMAKE_POSITION_INDEPENDENT_CODE OR NOT DEFINED CMAKE_POSITION_INDEPENDENT_CO endif() target_compile_options(cxxabi_shared_objects PRIVATE "${LIBCXXABI_ADDITIONAL_COMPILE_FLAGS}") -if (LIBCXXABI_ENABLE_SHARED) - add_library(cxxabi_shared SHARED) - set_target_properties(cxxabi_shared - PROPERTIES - LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" - OUTPUT_NAME "${LIBCXXABI_SHARED_OUTPUT_NAME}" - SOVERSION "1" - VERSION "${LIBCXXABI_LIBRARY_VERSION}" +add_library(cxxabi_shared SHARED) +set_target_properties(cxxabi_shared + PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" + LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" + OUTPUT_NAME "${LIBCXXABI_SHARED_OUTPUT_NAME}" + SOVERSION "1" + VERSION "${LIBCXXABI_LIBRARY_VERSION}" +) + +if (ZOS) + add_custom_command(TARGET cxxabi_shared POST_BUILD + COMMAND + ${LIBCXXABI_LIBCXX_PATH}/utils/zos_rename_dll_side_deck.sh + $ $ "${LIBCXXABI_DLL_NAME}" + COMMENT "Rename dll name inside the side deck file" + WORKING_DIRECTORY $ ) +endif () - if (ZOS) - add_custom_command(TARGET cxxabi_shared POST_BUILD - COMMAND - ${LIBCXXABI_LIBCXX_PATH}/utils/zos_rename_dll_side_deck.sh - $ $ "${LIBCXXABI_DLL_NAME}" - COMMENT "Rename dll name inside the side deck file" - WORKING_DIRECTORY $ - ) - endif () +target_link_libraries(cxxabi_shared + PUBLIC cxxabi_shared_objects + PRIVATE ${LIBCXXABI_LIBRARIES}) - target_link_libraries(cxxabi_shared - PUBLIC cxxabi_shared_objects - PRIVATE ${LIBCXXABI_LIBRARIES}) +if (LIBCXXABI_ENABLE_SHARED) +list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared") +endif() +if (LIBCXXABI_INSTALL_SHARED_LIBRARY) +list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_shared") +endif() - list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared") - if (LIBCXXABI_INSTALL_SHARED_LIBRARY) - list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_shared") +# TODO: Move this to libc++'s HandleLibCXXABI.cmake since this is effectively trying to control +# what libc++ re-exports. +add_library(cxxabi-reexports INTERFACE) +function(export_symbols file) + # -exported_symbols_list is only available on Apple platforms + if (APPLE) + target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}") endif() +endfunction() - # TODO: Move this to libc++'s HandleLibCXXABI.cmake since this is effectively trying to control - # what libc++ re-exports. - add_library(cxxabi-reexports INTERFACE) - function(export_symbols file) - # -exported_symbols_list is only available on Apple platforms - if (APPLE) - target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}") - endif() - endfunction() - - function(reexport_symbols file) - export_symbols("${file}") - # -reexported_symbols_list is only available on Apple platforms - if (APPLE) - target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}") - endif() - endfunction() - - export_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/symbols-not-reexported.exp") - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/cxxabiv1.exp") - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/fundamental-types.exp") - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp") - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/std-misc.exp") - - if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/new-delete.exp") +function(reexport_symbols file) + export_symbols("${file}") + # -reexported_symbols_list is only available on Apple platforms + if (APPLE) + target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}") endif() +endfunction() - # Note that std:: exception types are always defined by the library regardless of - # whether the exception runtime machinery is provided. - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/std-exceptions.exp") +export_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/symbols-not-reexported.exp") +reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/cxxabiv1.exp") +reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/fundamental-types.exp") +reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp") +reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/std-misc.exp") - if (LIBCXXABI_ENABLE_EXCEPTIONS) - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-exceptions.exp") +if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) + reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/new-delete.exp") +endif() - if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-sjlj.exp") - else() - reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-v0.exp") - endif() +# Note that std:: exception types are always defined by the library regardless of +# whether the exception runtime machinery is provided. +reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/std-exceptions.exp") + +if (LIBCXXABI_ENABLE_EXCEPTIONS) + reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-exceptions.exp") + + if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") + reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-sjlj.exp") + else() + reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-v0.exp") endif() endif() @@ -294,24 +295,25 @@ if(LIBCXXABI_HERMETIC_STATIC_LIBRARY) _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) endif() -if (LIBCXXABI_ENABLE_STATIC) - add_library(cxxabi_static STATIC) - if (LIBCXXABI_USE_LLVM_UNWINDER AND NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY) - target_link_libraries(cxxabi_static PUBLIC unwind_static) - endif() - set_target_properties(cxxabi_static - PROPERTIES - LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" - OUTPUT_NAME "${LIBCXXABI_STATIC_OUTPUT_NAME}" - ) - target_link_libraries(cxxabi_static - PUBLIC cxxabi_static_objects - PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) +add_library(cxxabi_static STATIC) +if (LIBCXXABI_USE_LLVM_UNWINDER AND NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY) + target_link_libraries(cxxabi_static PUBLIC unwind_static) +endif() +set_target_properties(cxxabi_static + PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" + LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" + OUTPUT_NAME "${LIBCXXABI_STATIC_OUTPUT_NAME}" + ) +target_link_libraries(cxxabi_static + PUBLIC cxxabi_static_objects + PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) +if (LIBCXXABI_ENABLE_STATIC) list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_static") - if (LIBCXXABI_INSTALL_STATIC_LIBRARY) - list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static") - endif() +endif() +if (LIBCXXABI_INSTALL_STATIC_LIBRARY) + list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static") endif() # Add a meta-target for both libraries. diff --git a/yass/third_party/libc++abi/trunk/src/abort_message.cpp b/yass/third_party/libc++abi/trunk/src/abort_message.cpp index 859a5031b9..9e5a984807 100644 --- a/yass/third_party/libc++abi/trunk/src/abort_message.cpp +++ b/yass/third_party/libc++abi/trunk/src/abort_message.cpp @@ -26,7 +26,7 @@ # define _LIBCXXABI_USE_CRASHREPORTER_CLIENT #endif -void abort_message(const char* format, ...) +void __abort_message(const char* format, ...) { // Write message to stderr. We do this before formatting into a // variable-size buffer so that we still get some information if diff --git a/yass/third_party/libc++abi/trunk/src/abort_message.h b/yass/third_party/libc++abi/trunk/src/abort_message.h index 9764177780..2c12c42956 100644 --- a/yass/third_party/libc++abi/trunk/src/abort_message.h +++ b/yass/third_party/libc++abi/trunk/src/abort_message.h @@ -12,14 +12,14 @@ #include "cxxabi.h" extern "C" _LIBCXXABI_HIDDEN _LIBCXXABI_NORETURN void -abort_message(const char *format, ...) __attribute__((format(printf, 1, 2))); +__abort_message(const char *format, ...) __attribute__((format(printf, 1, 2))); #ifndef _LIBCXXABI_ASSERT # define _LIBCXXABI_ASSERT(expr, msg) \ do { \ if (!(expr)) { \ char const* __msg = (msg); \ - ::abort_message("%s:%d: %s", __FILE__, __LINE__, __msg); \ + ::__abort_message("%s:%d: %s", __FILE__, __LINE__, __msg); \ } \ } while (false) diff --git a/yass/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp b/yass/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp index 60e402c55b..52b1aacae9 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_default_handlers.cpp @@ -30,18 +30,18 @@ static void demangling_terminate_handler() // If there is no uncaught exception, just note that we're terminating if (!globals) - abort_message("terminating"); + __abort_message("terminating"); __cxa_exception* exception_header = globals->caughtExceptions; if (!exception_header) - abort_message("terminating"); + __abort_message("terminating"); _Unwind_Exception* unwind_exception = reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1; // If we're terminating due to a foreign exception if (!__isOurExceptionClass(unwind_exception)) - abort_message("terminating due to %s foreign exception", cause); + __abort_message("terminating due to %s foreign exception", cause); void* thrown_object = __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ? @@ -67,19 +67,19 @@ static void demangling_terminate_handler() { // Include the what() message from the exception const std::exception* e = static_cast(thrown_object); - abort_message("terminating due to %s exception of type %s: %s", cause, name, e->what()); + __abort_message("terminating due to %s exception of type %s: %s", cause, name, e->what()); } else { // Else just note that we're terminating due to an exception - abort_message("terminating due to %s exception of type %s", cause, name); + __abort_message("terminating due to %s exception of type %s", cause, name); } } #else // !_LIBCXXABI_NO_EXCEPTIONS __attribute__((noreturn)) static void demangling_terminate_handler() { - abort_message("terminating"); + __abort_message("terminating"); } #endif // !_LIBCXXABI_NO_EXCEPTIONS diff --git a/yass/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp b/yass/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp index c842da195a..733f0d4705 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_exception_storage.cpp @@ -61,12 +61,12 @@ namespace { void _LIBCPP_TLS_DESTRUCTOR_CC destruct_(void *p) { __free_with_fallback(p); if (0 != std::__libcpp_tls_set(key_, NULL)) - abort_message("cannot zero out thread value for __cxa_get_globals()"); + __abort_message("cannot zero out thread value for __cxa_get_globals()"); } void construct_() { if (0 != std::__libcpp_tls_create(&key_, destruct_)) - abort_message("cannot create thread specific key for __cxa_get_globals()"); + __abort_message("cannot create thread specific key for __cxa_get_globals()"); } } // namespace @@ -80,9 +80,9 @@ extern "C" { retVal = static_cast<__cxa_eh_globals*>( __calloc_with_fallback(1, sizeof(__cxa_eh_globals))); if (NULL == retVal) - abort_message("cannot allocate __cxa_eh_globals"); + __abort_message("cannot allocate __cxa_eh_globals"); if (0 != std::__libcpp_tls_set(key_, retVal)) - abort_message("std::__libcpp_tls_set failure in __cxa_get_globals()"); + __abort_message("std::__libcpp_tls_set failure in __cxa_get_globals()"); } return retVal; } @@ -94,7 +94,7 @@ extern "C" { __cxa_eh_globals *__cxa_get_globals_fast() { // First time through, create the key. if (0 != std::__libcpp_execute_once(&flag_, construct_)) - abort_message("execute once failure in __cxa_get_globals_fast()"); + __abort_message("execute once failure in __cxa_get_globals_fast()"); return static_cast<__cxa_eh_globals*>(std::__libcpp_tls_get(key_)); } } // extern "C" diff --git a/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h b/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h index 3e53305409..7b05bf32f3 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h +++ b/yass/third_party/libc++abi/trunk/src/cxa_guard_impl.h @@ -91,7 +91,7 @@ // the former. #ifdef BUILDING_CXA_GUARD # include "abort_message.h" -# define ABORT_WITH_MESSAGE(...) ::abort_message(__VA_ARGS__) +# define ABORT_WITH_MESSAGE(...) ::__abort_message(__VA_ARGS__) #elif defined(TESTING_CXA_GUARD) # define ABORT_WITH_MESSAGE(...) ::abort() #else diff --git a/yass/third_party/libc++abi/trunk/src/cxa_handlers.cpp b/yass/third_party/libc++abi/trunk/src/cxa_handlers.cpp index 344250dde0..f879ff0d8f 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_handlers.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_handlers.cpp @@ -33,7 +33,7 @@ __unexpected(unexpected_handler func) { func(); // unexpected handler should not return - abort_message("unexpected_handler unexpectedly returned"); + __abort_message("unexpected_handler unexpectedly returned"); } __attribute__((noreturn)) @@ -58,13 +58,13 @@ __terminate(terminate_handler func) noexcept #endif // _LIBCXXABI_NO_EXCEPTIONS func(); // handler should not return - abort_message("terminate_handler unexpectedly returned"); + __abort_message("terminate_handler unexpectedly returned"); #ifndef _LIBCXXABI_NO_EXCEPTIONS } catch (...) { // handler should not throw exception - abort_message("terminate_handler unexpectedly threw an exception"); + __abort_message("terminate_handler unexpectedly threw an exception"); } #endif // _LIBCXXABI_NO_EXCEPTIONS } diff --git a/yass/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp b/yass/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp index c6bd0aa323..8546cfe48c 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_thread_atexit.cpp @@ -89,7 +89,7 @@ namespace { // __cxa_thread_atexit() may be called arbitrarily late (for example, from // global destructors or atexit() handlers). if (std::__libcpp_tls_create(&dtors_key, run_dtors) != 0) { - abort_message("std::__libcpp_tls_create() failed in __cxa_thread_atexit()"); + __abort_message("std::__libcpp_tls_create() failed in __cxa_thread_atexit()"); } } diff --git a/yass/third_party/libc++abi/trunk/src/cxa_vector.cpp b/yass/third_party/libc++abi/trunk/src/cxa_vector.cpp index 17d942a6e6..857ee27d06 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_vector.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_vector.cpp @@ -121,7 +121,7 @@ void throw_bad_array_new_length() { #ifndef _LIBCXXABI_NO_EXCEPTIONS throw std::bad_array_new_length(); #else - abort_message("__cxa_vec_new failed to allocate memory"); + __abort_message("__cxa_vec_new failed to allocate memory"); #endif } diff --git a/yass/third_party/libc++abi/trunk/src/cxa_virtual.cpp b/yass/third_party/libc++abi/trunk/src/cxa_virtual.cpp index c868672e00..8f4fdd0919 100644 --- a/yass/third_party/libc++abi/trunk/src/cxa_virtual.cpp +++ b/yass/third_party/libc++abi/trunk/src/cxa_virtual.cpp @@ -13,12 +13,12 @@ namespace __cxxabiv1 { extern "C" { _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_pure_virtual(void) { - abort_message("Pure virtual function called!"); + __abort_message("Pure virtual function called!"); } _LIBCXXABI_FUNC_VIS _LIBCXXABI_NORETURN void __cxa_deleted_virtual(void) { - abort_message("Deleted virtual function called!"); + __abort_message("Deleted virtual function called!"); } } // extern "C" } // abi diff --git a/yass/third_party/libc++abi/trunk/src/demangle/DemangleConfig.h b/yass/third_party/libc++abi/trunk/src/demangle/DemangleConfig.h index d67d89bdb0..06fd223f55 100644 --- a/yass/third_party/libc++abi/trunk/src/demangle/DemangleConfig.h +++ b/yass/third_party/libc++abi/trunk/src/demangle/DemangleConfig.h @@ -15,7 +15,7 @@ // build systems to override this value. // https://libcxx.llvm.org/UsingLibcxx.html#enabling-the-safe-libc-mode #ifndef _LIBCPP_VERBOSE_ABORT -#define _LIBCPP_VERBOSE_ABORT(...) abort_message(__VA_ARGS__) +#define _LIBCPP_VERBOSE_ABORT(...) __abort_message(__VA_ARGS__) #include "../abort_message.h" #endif diff --git a/yass/third_party/libc++abi/trunk/src/stdlib_new_delete.cpp b/yass/third_party/libc++abi/trunk/src/stdlib_new_delete.cpp index b802559d47..bd576e6aee 100644 --- a/yass/third_party/libc++abi/trunk/src/stdlib_new_delete.cpp +++ b/yass/third_party/libc++abi/trunk/src/stdlib_new_delete.cpp @@ -32,14 +32,14 @@ inline void __throw_bad_alloc_shim() { #ifndef _LIBCPP_HAS_NO_EXCEPTIONS throw std::bad_alloc(); #else - abort_message("bad_alloc was thrown in -fno-exceptions mode"); + __abort_message("bad_alloc was thrown in -fno-exceptions mode"); #endif } #define _LIBCPP_ASSERT_SHIM(expr, str) \ do { \ if (!expr) \ - abort_message(str); \ + __abort_message(str); \ } while (false) // ------------------ BEGIN COPY ------------------ diff --git a/yass/third_party/libunwind/trunk/src/CMakeLists.txt b/yass/third_party/libunwind/trunk/src/CMakeLists.txt index 125cf4ffe9..3065bfc8a0 100644 --- a/yass/third_party/libunwind/trunk/src/CMakeLists.txt +++ b/yass/third_party/libunwind/trunk/src/CMakeLists.txt @@ -153,11 +153,11 @@ if (CMAKE_POSITION_INDEPENDENT_CODE OR NOT DEFINED CMAKE_POSITION_INDEPENDENT_CO set_target_properties(unwind_shared_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) # must set manually because it's an object library endif() -if (LIBUNWIND_ENABLE_SHARED) add_library(unwind_shared SHARED) target_link_libraries(unwind_shared PUBLIC unwind_shared_objects) set_target_properties(unwind_shared PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}" LINKER_LANGUAGE C OUTPUT_NAME "${LIBUNWIND_SHARED_OUTPUT_NAME}" @@ -165,10 +165,11 @@ if (LIBUNWIND_ENABLE_SHARED) SOVERSION "1" ) +if (LIBUNWIND_ENABLE_SHARED) list(APPEND LIBUNWIND_BUILD_TARGETS "unwind_shared") - if (LIBUNWIND_INSTALL_SHARED_LIBRARY) - list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_shared") - endif() +endif() +if (LIBUNWIND_INSTALL_SHARED_LIBRARY) + list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_shared") endif() # Build the static library. @@ -199,20 +200,21 @@ if(LIBUNWIND_HIDE_SYMBOLS) target_compile_definitions(unwind_static_objects PRIVATE _LIBUNWIND_HIDE_SYMBOLS) endif() -if (LIBUNWIND_ENABLE_STATIC) add_library(unwind_static STATIC) target_link_libraries(unwind_static PUBLIC unwind_static_objects) set_target_properties(unwind_static PROPERTIES + EXCLUDE_FROM_ALL "$,FALSE,TRUE>" LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}" LINKER_LANGUAGE C OUTPUT_NAME "${LIBUNWIND_STATIC_OUTPUT_NAME}" ) +if (LIBUNWIND_ENABLE_STATIC) list(APPEND LIBUNWIND_BUILD_TARGETS "unwind_static") - if (LIBUNWIND_INSTALL_STATIC_LIBRARY) - list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_static") - endif() +endif() +if (LIBUNWIND_INSTALL_STATIC_LIBRARY) + list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_static") endif() # Add a meta-target for both libraries. diff --git a/yt-dlp/yt_dlp/extractor/tver.py b/yt-dlp/yt_dlp/extractor/tver.py index c13832c6f5..a8865fe649 100644 --- a/yt-dlp/yt_dlp/extractor/tver.py +++ b/yt-dlp/yt_dlp/extractor/tver.py @@ -6,11 +6,12 @@ from ..utils import ( str_or_none, strip_or_none, traverse_obj, + update_url_query, ) class TVerIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?tver\.jp/(?:(?Plp|corner|series|episodes?|feature|tokyo2020/video|olympic/paris2024/video)/)+(?P[a-zA-Z0-9]+)' + _VALID_URL = r'https?://(?:www\.)?tver\.jp/(?:(?Plp|corner|series|episodes?|feature)/)+(?P[a-zA-Z0-9]+)' _TESTS = [{ 'skip': 'videos are only available for 7 days', 'url': 'https://tver.jp/episodes/ep83nf3w4p', @@ -21,80 +22,115 @@ class TVerIE(InfoExtractor): 'episode': '売り場席巻のチーズSP&財前直見×森泉親子の脱東京暮らし密着!', 'alt_title': '売り場席巻のチーズSP&財前直見×森泉親子の脱東京暮らし密着!', 'channel': 'テレビ朝日', + 'id': 'ep83nf3w4p', + 'ext': 'mp4', + 'onair_label': '5月3日(火)放送分', + 'ext_title': '家事ヤロウ!!! 売り場席巻のチーズSP&財前直見×森泉親子の脱東京暮らし密着! テレビ朝日 5月3日(火)放送分', }, 'add_ie': ['BrightcoveNew'], - }, { - 'url': 'https://tver.jp/olympic/paris2024/video/6359578055112/', - 'info_dict': { - 'id': '6359578055112', - 'ext': 'mp4', - 'title': '堀米雄斗 金メダルで五輪連覇!「みんなの応援が最後に乗れたカギ」', - 'timestamp': 1722279928, - 'upload_date': '20240729', - 'tags': ['20240729', 'japanese', 'japanmedal', 'paris'], - 'uploader_id': '4774017240001', - 'thumbnail': r're:https?://[^/?#]+boltdns\.net/[^?#]+/1920x1080/match/image\.jpg', - 'duration': 670.571, - }, - 'params': {'skip_download': 'm3u8'}, }, { 'url': 'https://tver.jp/corner/f0103888', 'only_matching': True, }, { 'url': 'https://tver.jp/lp/f0033031', 'only_matching': True, + }, { + 'url': 'https://tver.jp/series/srtxft431v', + 'info_dict': { + 'id': 'srtxft431v', + 'title': '名探偵コナン', + }, + 'playlist': [ + { + 'md5': '779ffd97493ed59b0a6277ea726b389e', + 'info_dict': { + 'id': 'ref:conan-1137-241005', + 'ext': 'mp4', + 'title': '名探偵コナン #1137「行列店、味変の秘密」', + 'uploader_id': '5330942432001', + 'tags': [], + 'channel': '読売テレビ', + 'series': '名探偵コナン', + 'description': 'md5:601fccc1d2430d942a2c8068c4b33eb5', + 'episode': '#1137「行列店、味変の秘密」', + 'duration': 1469.077, + 'timestamp': 1728030405, + 'upload_date': '20241004', + 'alt_title': '名探偵コナン #1137「行列店、味変の秘密」 読売テレビ 10月5日(土)放送分', + 'thumbnail': r're:https://.+\.jpg', + }, + }], + }, { + 'url': 'https://tver.jp/series/sru35hwdd2', + 'info_dict': { + 'id': 'sru35hwdd2', + 'title': '神回だけ見せます!', + }, + 'playlist_count': 11, + }, { + 'url': 'https://tver.jp/series/srkq2shp9d', + 'only_matching': True, }] BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/%s/default_default/index.html?videoId=%s' - _PLATFORM_UID = None - _PLATFORM_TOKEN = None + _HEADERS = {'x-tver-platform-type': 'web'} + _PLATFORM_QUERY = {} def _real_initialize(self): - create_response = self._download_json( - 'https://platform-api.tver.jp/v2/api/platform_users/browser/create', None, - note='Creating session', data=b'device_type=pc', headers={ - 'Origin': 'https://s.tver.jp', - 'Referer': 'https://s.tver.jp/', - 'Content-Type': 'application/x-www-form-urlencoded', + session_info = self._download_json( + 'https://platform-api.tver.jp/v2/api/platform_users/browser/create', + None, 'Creating session', data=b'device_type=pc') + self._PLATFORM_QUERY = traverse_obj(session_info, ('result', { + 'platform_uid': 'platform_uid', + 'platform_token': 'platform_token', + })) + + def _call_platform_api(self, path, video_id, note=None, fatal=True, query=None): + return self._download_json( + f'https://platform-api.tver.jp/service/api/{path}', video_id, note, + fatal=fatal, headers=self._HEADERS, query={ + **self._PLATFORM_QUERY, + **(query or {}), }) - self._PLATFORM_UID = traverse_obj(create_response, ('result', 'platform_uid')) - self._PLATFORM_TOKEN = traverse_obj(create_response, ('result', 'platform_token')) + + def _yield_episode_ids_for_series(self, series_id): + seasons_info = self._download_json( + f'https://service-api.tver.jp/api/v1/callSeriesSeasons/{series_id}', + series_id, 'Downloading seasons info', headers=self._HEADERS) + for season_id in traverse_obj( + seasons_info, ('result', 'contents', lambda _, v: v['type'] == 'season', 'content', 'id', {str})): + episodes_info = self._call_platform_api( + f'v1/callSeasonEpisodes/{season_id}', series_id, f'Downloading season {season_id} episodes info') + yield from traverse_obj(episodes_info, ( + 'result', 'contents', lambda _, v: v['type'] == 'episode', 'content', 'id', {str})) def _real_extract(self, url): video_id, video_type = self._match_valid_url(url).group('id', 'type') - if video_type == 'olympic/paris2024/video': - # Player ID is taken from .content.brightcove.E200.pro.pc.account_id: - # https://tver.jp/olympic/paris2024/req/api/hook?q=https%3A%2F%2Folympic-assets.tver.jp%2Fweb-static%2Fjson%2Fconfig.json&d= - return self.url_result(smuggle_url( - self.BRIGHTCOVE_URL_TEMPLATE % ('4774017240001', video_id), - {'geo_countries': ['JP']}), 'BrightcoveNew') + if video_type == 'series': + series_info = self._call_platform_api( + f'v2/callSeries/{video_id}', video_id, 'Downloading series info') + return self.playlist_from_matches( + self._yield_episode_ids_for_series(video_id), video_id, + traverse_obj(series_info, ('result', 'content', 'content', 'title', {str})), + ie=TVerIE, getter=lambda x: f'https://tver.jp/episodes/{x}') - elif video_type not in {'series', 'episodes'}: + if video_type != 'episodes': webpage = self._download_webpage(url, video_id, note='Resolving to new URL') video_id = self._match_id(self._search_regex( (r'canonical"\s*href="(https?://tver\.jp/[^"]+)"', r'&link=(https?://tver\.jp/[^?&]+)[?&]'), webpage, 'url regex')) - episode_info = self._download_json( - f'https://platform-api.tver.jp/service/api/v1/callEpisode/{video_id}?require_data=mylist,later[epefy106ur],good[epefy106ur],resume[epefy106ur]', - video_id, fatal=False, - query={ - 'platform_uid': self._PLATFORM_UID, - 'platform_token': self._PLATFORM_TOKEN, - }, headers={ - 'x-tver-platform-type': 'web', + episode_info = self._call_platform_api( + f'v1/callEpisode/{video_id}', video_id, 'Downloading episode info', fatal=False, query={ + 'require_data': 'mylist,later[epefy106ur],good[epefy106ur],resume[epefy106ur]', }) episode_content = traverse_obj( episode_info, ('result', 'episode', 'content')) or {} + version = traverse_obj(episode_content, ('version', {str_or_none}), default='5') video_info = self._download_json( - f'https://statics.tver.jp/content/episode/{video_id}.json', video_id, - query={ - 'v': str_or_none(episode_content.get('version')) or '5', - }, headers={ - 'Origin': 'https://tver.jp', - 'Referer': 'https://tver.jp/', - }) + f'https://statics.tver.jp/content/episode/{video_id}.json', video_id, 'Downloading video info', + query={'v': version}, headers={'Referer': 'https://tver.jp/'}) p_id = video_info['video']['accountID'] r_id = traverse_obj(video_info, ('video', ('videoRefID', 'videoID')), get_all=False) if not r_id: @@ -110,6 +146,23 @@ class TVerIE(InfoExtractor): provider = str_or_none(episode_content.get('productionProviderName')) onair_label = str_or_none(episode_content.get('broadcastDateLabel')) + thumbnails = [ + { + 'id': quality, + 'url': update_url_query( + f'https://statics.tver.jp/images/content/thumbnail/episode/{quality}/{video_id}.jpg', + {'v': version}), + 'width': width, + 'height': height, + } + for quality, width, height in [ + ('small', 480, 270), + ('medium', 640, 360), + ('large', 960, 540), + ('xlarge', 1280, 720), + ] + ] + return { '_type': 'url_transparent', 'title': title, @@ -119,6 +172,7 @@ class TVerIE(InfoExtractor): 'alt_title': join_nonempty(title, provider, onair_label, delim=' '), 'channel': provider, 'description': str_or_none(video_info.get('description')), + 'thumbnails': thumbnails, 'url': smuggle_url( self.BRIGHTCOVE_URL_TEMPLATE % (p_id, r_id), {'geo_countries': ['JP']}), 'ie_key': 'BrightcoveNew', diff --git a/yt-dlp/yt_dlp/extractor/weverse.py b/yt-dlp/yt_dlp/extractor/weverse.py index c94ca9db97..6f1a8b95d8 100644 --- a/yt-dlp/yt_dlp/extractor/weverse.py +++ b/yt-dlp/yt_dlp/extractor/weverse.py @@ -27,8 +27,9 @@ from ..utils import ( class WeverseBaseIE(InfoExtractor): _NETRC_MACHINE = 'weverse' - _ACCOUNT_API_BASE = 'https://accountapi.weverse.io/web/api/v2' + _ACCOUNT_API_BASE = 'https://accountapi.weverse.io/web/api' _API_HEADERS = { + 'Accept': 'application/json', 'Referer': 'https://weverse.io/', 'WEV-device-Id': str(uuid.uuid4()), } @@ -39,14 +40,14 @@ class WeverseBaseIE(InfoExtractor): headers = { 'x-acc-app-secret': '5419526f1c624b38b10787e5c10b2a7a', - 'x-acc-app-version': '2.2.6', + 'x-acc-app-version': '3.3.6', 'x-acc-language': 'en', 'x-acc-service-id': 'weverse', 'x-acc-trace-id': str(uuid.uuid4()), 'x-clog-user-device-id': str(uuid.uuid4()), } valid_username = traverse_obj(self._download_json( - f'{self._ACCOUNT_API_BASE}/signup/email/status', None, note='Checking username', + f'{self._ACCOUNT_API_BASE}/v2/signup/email/status', None, note='Checking username', query={'email': username}, headers=headers, expected_status=(400, 404)), 'hasPassword') if not valid_username: raise ExtractorError('Invalid username provided', expected=True) @@ -54,8 +55,9 @@ class WeverseBaseIE(InfoExtractor): headers['content-type'] = 'application/json' try: auth = self._download_json( - f'{self._ACCOUNT_API_BASE}/auth/token/by-credentials', None, data=json.dumps({ + f'{self._ACCOUNT_API_BASE}/v3/auth/token/by-credentials', None, data=json.dumps({ 'email': username, + 'otpSessionId': 'BY_PASS', 'password': password, }, separators=(',', ':')).encode(), headers=headers, note='Logging in') except ExtractorError as e: @@ -78,8 +80,10 @@ class WeverseBaseIE(InfoExtractor): # From https://ssl.pstatic.net/static/wevweb/2_3_2_11101725/public/static/js/main.e206f7c1.js: key = b'1b9cb6378d959b45714bec49971ade22e6e24e42' api_path = update_url_query(ep, { + # 'gcc': 'US', 'appId': 'be4d79eb8fc7bd008ee82c8ec4ff6fd4', 'language': 'en', + 'os': 'WEB', 'platform': 'WEB', 'wpf': 'pc', }) @@ -152,7 +156,7 @@ class WeverseBaseIE(InfoExtractor): 'description': ((('extension', 'mediaInfo', 'body'), 'body'), {str}), 'uploader': ('author', 'profileName', {str}), 'uploader_id': ('author', 'memberId', {str}), - 'creator': ('community', 'communityName', {str}), + 'creators': ('community', 'communityName', {str}, all), 'channel_id': (('community', 'author'), 'communityId', {str_or_none}), 'duration': ('extension', 'video', 'playTime', {float_or_none}), 'timestamp': ('publishedAt', {lambda x: int_or_none(x, 1000)}), @@ -196,7 +200,7 @@ class WeverseIE(WeverseBaseIE): 'channel': 'billlie', 'channel_id': '72', 'channel_url': 'https://weverse.io/billlie', - 'creator': 'Billlie', + 'creators': ['Billlie'], 'timestamp': 1666262062, 'upload_date': '20221020', 'release_timestamp': 1666262058, @@ -222,7 +226,7 @@ class WeverseIE(WeverseBaseIE): 'channel': 'lesserafim', 'channel_id': '47', 'channel_url': 'https://weverse.io/lesserafim', - 'creator': 'LE SSERAFIM', + 'creators': ['LE SSERAFIM'], 'timestamp': 1659353400, 'upload_date': '20220801', 'release_timestamp': 1659353400, @@ -286,7 +290,7 @@ class WeverseIE(WeverseBaseIE): elif live_status == 'is_live': video_info = self._call_api( - f'/video/v1.0/lives/{api_video_id}/playInfo?preview.format=json&preview.version=v2', + f'/video/v1.2/lives/{api_video_id}/playInfo?preview.format=json&preview.version=v2', video_id, note='Downloading live JSON') playback = self._parse_json(video_info['lipPlayback'], video_id) m3u8_url = traverse_obj(playback, ( @@ -302,7 +306,7 @@ class WeverseIE(WeverseBaseIE): else: infra_video_id = post['extension']['video']['infraVideoId'] in_key = self._call_api( - f'/video/v1.0/vod/{api_video_id}/inKey?preview=false', video_id, + f'/video/v1.1/vod/{api_video_id}/inKey?preview=false', video_id, data=b'{}', note='Downloading VOD API key')['inKey'] video_info = self._download_json( @@ -347,7 +351,6 @@ class WeverseMediaIE(WeverseBaseIE): _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P[^/?#]+)/media/(?P[\d-]+)' _TESTS = [{ 'url': 'https://weverse.io/billlie/media/4-116372884', - 'md5': '8efc9cfd61b2f25209eb1a5326314d28', 'info_dict': { 'id': 'e-C9wLSQs6o', 'ext': 'mp4', @@ -358,8 +361,9 @@ class WeverseMediaIE(WeverseBaseIE): 'channel_url': 'https://www.youtube.com/channel/UCyc9sUCxELTDK9vELO5Fzeg', 'uploader': 'Billlie', 'uploader_id': '@Billlie', - 'uploader_url': 'http://www.youtube.com/@Billlie', + 'uploader_url': 'https://www.youtube.com/@Billlie', 'upload_date': '20230403', + 'timestamp': 1680533992, 'duration': 211, 'age_limit': 0, 'playable_in_embed': True, @@ -372,6 +376,8 @@ class WeverseMediaIE(WeverseBaseIE): 'thumbnail': 'https://i.ytimg.com/vi/e-C9wLSQs6o/maxresdefault.jpg', 'categories': ['Entertainment'], 'tags': 'count:7', + 'channel_is_verified': True, + 'heatmap': 'count:100', }, }, { 'url': 'https://weverse.io/billlie/media/3-102914520', @@ -386,7 +392,7 @@ class WeverseMediaIE(WeverseBaseIE): 'channel': 'billlie', 'channel_id': '72', 'channel_url': 'https://weverse.io/billlie', - 'creator': 'Billlie', + 'creators': ['Billlie'], 'timestamp': 1662174000, 'upload_date': '20220903', 'release_timestamp': 1662174000, @@ -432,7 +438,7 @@ class WeverseMomentIE(WeverseBaseIE): 'uploader_id': '66a07e164b56a696ee71c99315ffe27b', 'channel': 'secretnumber', 'channel_id': '56', - 'creator': 'SECRET NUMBER', + 'creators': ['SECRET NUMBER'], 'duration': 10, 'upload_date': '20230405', 'timestamp': 1680653968, @@ -441,7 +447,6 @@ class WeverseMomentIE(WeverseBaseIE): 'comment_count': int, 'availability': 'needs_auth', }, - 'skip': 'Moment has expired', }] def _real_extract(self, url): @@ -571,7 +576,7 @@ class WeverseLiveIE(WeverseBaseIE): 'channel': 'purplekiss', 'channel_id': '35', 'channel_url': 'https://weverse.io/purplekiss', - 'creator': 'PURPLE KISS', + 'creators': ['PURPLE KISS'], 'timestamp': 1680780892, 'upload_date': '20230406', 'release_timestamp': 1680780883, @@ -584,6 +589,31 @@ class WeverseLiveIE(WeverseBaseIE): 'live_status': 'is_live', }, 'skip': 'Livestream has ended', + }, { + 'url': 'https://weverse.io/lesserafim', + 'info_dict': { + 'id': '4-181521628', + 'ext': 'mp4', + 'title': r're:심심해서요', + 'description': '', + 'uploader': '채채🤎', + 'uploader_id': 'd49b8b06f3cc1d92d655b25ab27ac2e7', + 'channel': 'lesserafim', + 'channel_id': '47', + 'creators': ['LE SSERAFIM'], + 'channel_url': 'https://weverse.io/lesserafim', + 'timestamp': 1728570273, + 'upload_date': '20241010', + 'release_timestamp': 1728570264, + 'release_date': '20241010', + 'thumbnail': r're:https://phinf\.wevpstatic\.net/.+\.png', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'is_live', + }, + 'skip': 'Livestream has ended', }, { 'url': 'https://weverse.io/billlie/', 'only_matching': True,