peachsim 0.1.2182 → 0.1.2186

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/cli/commands/cpu-profile.ts +6 -2
  2. package/cli/commands/shell-url.ts +3 -6
  3. package/cli/outbound-endpoints.ts +11 -1
  4. package/dist-lib/agent-daemon-client.cjs +1 -1
  5. package/dist-lib/agent-events.cjs +1 -1
  6. package/dist-lib/attached-projects.cjs +1 -1
  7. package/dist-lib/auth/shared-session.cjs +1 -1
  8. package/dist-lib/backend-origin.cjs +1 -1
  9. package/dist-lib/beta.cjs +1 -1
  10. package/dist-lib/beta.mjs +1 -1
  11. package/dist-lib/bridge-constants.cjs +1 -1
  12. package/dist-lib/bridge-contract-input.cjs +1 -1
  13. package/dist-lib/bridge-contract-input.mjs +1 -1
  14. package/dist-lib/bridge-contract.cjs +1 -1
  15. package/dist-lib/bridge-contract.mjs +1 -1
  16. package/dist-lib/bundle-channel.cjs +371 -36
  17. package/dist-lib/capture-contract.cjs +1 -1
  18. package/dist-lib/capture-contract.mjs +1 -1
  19. package/dist-lib/cloud-contract.cjs +1 -1
  20. package/dist-lib/cloud-contract.mjs +1 -1
  21. package/dist-lib/cloud-test-args.cjs +1 -1
  22. package/dist-lib/cloud-test-args.mjs +1 -1
  23. package/dist-lib/cloud.cjs +1 -1
  24. package/dist-lib/cloud.mjs +1 -1
  25. package/dist-lib/config.cjs +1 -1
  26. package/dist-lib/config.mjs +1 -1
  27. package/dist-lib/detox/index.cjs +2 -2
  28. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  29. package/dist-lib/expo-swift-bundle.cjs +325 -28
  30. package/dist-lib/expo-swift-metadata.cjs +2 -1
  31. package/dist-lib/expo-swift-metadata.mjs +2 -1
  32. package/dist-lib/home-paths.cjs +1 -1
  33. package/dist-lib/host/bridge-host.cjs +364 -36
  34. package/dist-lib/host/fetch-proxy-handler.cjs +8 -5
  35. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  36. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  37. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  38. package/dist-lib/host/websocket-proxy.cjs +1 -1
  39. package/dist-lib/index.cjs +51 -7
  40. package/dist-lib/jump-to-source-babel.cjs +1 -1
  41. package/dist-lib/jump-to-source-native.cjs +1 -1
  42. package/dist-lib/kotlin-host.cjs +5 -3
  43. package/dist-lib/menu.cjs +1 -1
  44. package/dist-lib/menu.mjs +1 -1
  45. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  46. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  47. package/dist-lib/metro-production-bundle.cjs +1 -1
  48. package/dist-lib/metro-production-bundle.mjs +1 -1
  49. package/dist-lib/metro.cjs +51 -7
  50. package/dist-lib/native-app-identity-project.cjs +49 -5
  51. package/dist-lib/native-app-identity-project.mjs +49 -5
  52. package/dist-lib/native-app-identity.cjs +40 -2
  53. package/dist-lib/native-app-identity.mjs +40 -2
  54. package/dist-lib/native-firebase-metadata.cjs +1 -1
  55. package/dist-lib/native-firebase-metadata.mjs +1 -1
  56. package/dist-lib/pdfium-raster.cjs +1 -1
  57. package/dist-lib/pdfium-raster.mjs +1 -1
  58. package/dist-lib/plist.cjs +1 -1
  59. package/dist-lib/plist.mjs +1 -1
  60. package/dist-lib/profiles.cjs +1 -1
  61. package/dist-lib/public-brand.cjs +1 -1
  62. package/dist-lib/public-origins-lib-esm.json +25 -24
  63. package/dist-lib/public-origins-lib.json +63 -53
  64. package/dist-lib/react-native-host-modules.cjs +1 -1
  65. package/dist-lib/react-native-host-modules.mjs +1 -1
  66. package/dist-lib/reap-browser.cjs +1 -1
  67. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  68. package/dist-lib/sdk.cjs +1 -1
  69. package/dist-lib/sdk.mjs +1 -1
  70. package/dist-lib/skills.cjs +383 -39
  71. package/dist-lib/swift-compile.cjs +2 -2
  72. package/dist-lib/swift-compile.mjs +2 -2
  73. package/dist-lib/swift-package.cjs +26 -1
  74. package/dist-lib/swift-package.mjs +25 -1
  75. package/dist-lib/swift-submit.cjs +1 -1
  76. package/dist-lib/swift-submit.mjs +1 -1
  77. package/dist-lib/swift-toolchain.cjs +1 -1
  78. package/dist-lib/swift.cjs +1 -1
  79. package/dist-lib/vite-swift.cjs +286 -24
  80. package/dist-lib/vite.cjs +8 -5
  81. package/dist-lib/worklet-executable.cjs +1 -1
  82. package/dist-lib/worklet-executable.mjs +1 -1
  83. package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +1 -0
  84. package/kotlin/sdk.tar.gz +0 -0
  85. package/package.json +1 -1
  86. package/runtime-companion.json +1 -1
  87. package/sdk/ios/System/Library/Frameworks/ActivityKit.framework/Headers/ActivityKit.h +1 -0
  88. package/sdk/ios/System/Library/Frameworks/ActivityKit.framework/Modules/module.modulemap +4 -0
  89. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIImageAsset.h +1 -1
  90. package/sdk/ios/usr/lib/swift/ActivityKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +14 -0
  91. package/sdk/ios/usr/lib/swift/CoreGraphics.swiftmodule/arm64-apple-ios-simulator.swiftinterface +14 -0
  92. package/sdk/ios/usr/lib/swift/Dispatch.swiftmodule/arm64-apple-ios-simulator.swiftinterface +3 -0
  93. package/sdk/ios/usr/lib/swift/Foundation.swiftmodule/arm64-apple-ios-simulator.swiftinterface +147 -16
  94. package/sdk/ios/usr/lib/swift/UIKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +5 -0
  95. package/src/expo-native-workspace.ts +9 -2
  96. package/src/kotlin-host.ts +4 -2
  97. package/src/native-app-identity-project.ts +10 -2
  98. package/src/native-app-identity.ts +15 -1
  99. package/src/nativeAppIconContract.ts +37 -0
  100. package/src/swift-installed-targets.ts +8 -0
  101. package/src/swift-interface-bodies.ts +165 -0
  102. package/src/swift-objc-standin.ts +73 -13
  103. package/src/swift-package.ts +26 -0
  104. package/src/swift-source-pods.ts +27 -4
  105. package/src/swift-standin-emit.ts +30 -3
  106. package/src/swift-standins.ts +75 -12
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
32
32
  var define_SWIFT_COVERAGE_SOURCE_DIGESTS_default;
33
33
  var init_define_SWIFT_COVERAGE_SOURCE_DIGESTS = __esm({
34
34
  "<define:__SWIFT_COVERAGE_SOURCE_DIGESTS__>"() {
35
- define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "0b82b3773f9c0b27636f277d9c123b3e631b9c9980995d67d67efa6b3176df4a", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "65a0698bf022ace2f4254f3f891828dedf403d61c102238e242084a2279e04eb", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "5f41cd0bd86cb0cffbfb0047348b963f81d5e51cb0e8dd574c739b1a27aa56de", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
35
+ define_SWIFT_COVERAGE_SOURCE_DIGESTS_default = { "swift-coverage/indexdump.ts": "0d82d8eeb96bf377f409ea7e33274c341a710c0e071f6b6e17571a23d8d92412", "swift-coverage/indexing.ts": "633ccf19eec1f382a8847d0ee1dca42a2792a3c60aafd43622ed5152b09b8272", "swift-coverage/types.ts": "bd8fae54ea6c53e110cd8a5d7b57c1d532dd0166e09fdaea63c4f270c3780dd1", "swift-coverage/source.ts": "c151758a9f67631bc61473c375df0dc017da6902a34533b2cf4fc4fd7d19b6ee", "swift-coverage/package.ts": "1f0068be7461fa7c5a7a891faf318f305cbed2e94c19667ba76627f7e5be260b", "swift-coverage/xcode.ts": "65a500b806ce1c3a496de27f2e0ad77287c0f6795c618342c08af647f92af1fa", "swift-coverage/xcode-assets.ts": "99e03b74c961d2449afd58c2cbc415ba91d1d469a4f89e461c137fd6c305b27c", "swift-coverage/xcode-asset-symbols.ts": "1b2a67733bc9d139b351466270205452a6172140bc25080d72619e2952c44671", "swift-coverage/xcode-bridging.ts": "33184be8c5daf6646aa5a1276a4e15531f1be27b7c26f56550e0fbb1fc678a11", "swift-coverage/xcode-packages.ts": "8e6020d17d24474150a5a50d042aca6261819ef75c79680a287a66f395909915", "swift-coverage/xcode-strings.ts": "f2dd4c7cd8ef77035184b0132909c2fa09fd20ed06b7757c2f1f960bfdde031c", "swift-coverage/reader.ts": "da559b67ecd1161dea70c980b5f98f2c55af3550f0714479100fa5e9e813625c", "swift-coverage/provenance.ts": "eb3b41ae8b58b48f6758f084800f188dfb1edb227e483abdd6b80cde66e849b9", "swift-package-manifest.ts": "4b7d4a715cdaf57468ead23f2ff9dce76d02c6a888d73d144d4baa2ae571ba3c", "swift-package.ts": "338cfef9a34a930206ac2e1a8a90b85c8d61f776d9a41e6445dc18e0c5385cdb", "swift-source-file.ts": "93fd659ed63a27b67f54a7c229a7ceb636dc9c59e68414920ba36cff1eda1f94", "swift-toolchain.ts": "65a0698bf022ace2f4254f3f891828dedf403d61c102238e242084a2279e04eb", "home-paths.ts": "f5583b61f8bdd81823b3b29ff519a48daf9993719f194ddb7de22218472e90f9", "xcode-header-search.ts": "f8c3d557b4eca5ddad32907545353eb7ad53b2ebd0969d9ed8f7275e109a13b1", "xcode-project.ts": "5f41cd0bd86cb0cffbfb0047348b963f81d5e51cb0e8dd574c739b1a27aa56de", "xcode-target-members.ts": "ad7589132bffab265e8a10b64e24484fe88b4a2b1cc0ee19a97f151a002eca77", "xcode-json-project.ts": "41990ebbe4b488eef34e74c4608b4b48e5a5b299ba98ca7fbcfdfa0e77be63b6", "openstep-plist.ts": "74e6ce1dac80c9c318e0e9f5e3e8cd19a898a8820c36fc160609695bcb59dcd3" };
36
36
  }
37
37
  });
38
38
 
@@ -1373,6 +1373,34 @@ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1373
1373
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
1374
1374
 
1375
1375
  // src/nativeAppIconContract.ts
1376
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
1377
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
1378
+ const resolve = (value) => {
1379
+ if (typeof value === "string") return resolveReference(value);
1380
+ if (Array.isArray(value)) return value.map(resolve);
1381
+ if (isRecord(value))
1382
+ return Object.fromEntries(
1383
+ Object.entries(value).map(([key, entry]) => [
1384
+ resolveReference(key),
1385
+ resolve(entry)
1386
+ ])
1387
+ );
1388
+ return value;
1389
+ };
1390
+ const dictionary = isRecord(icons) ? Object.fromEntries(
1391
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
1392
+ ) : {};
1393
+ if (catalogNames.length === 0) return dictionary;
1394
+ return {
1395
+ ...dictionary,
1396
+ CFBundleAlternateIcons: {
1397
+ ...Object.fromEntries(
1398
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
1399
+ ),
1400
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
1401
+ }
1402
+ };
1403
+ }
1376
1404
  function resolveNativeAppIconArtwork(resources, readText, resourceUri, icons, primaryName, alternateNames, resolveReference) {
1377
1405
  const members = new Set(resources);
1378
1406
  const dictionary = isRecord(icons) ? icons : {};
@@ -1949,8 +1977,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1949
1977
  );
1950
1978
  if (alternateSetting === null)
1951
1979
  throw new Error("native alternate icon setting is unresolved");
1980
+ const catalogAlternateNames = [];
1952
1981
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1953
- alternateIconNames.add(match[1] ?? match[2]);
1982
+ const name = match[1] ?? match[2];
1983
+ alternateIconNames.add(name);
1984
+ catalogAlternateNames.push(name);
1954
1985
  }
1955
1986
  const intentIds = dictionary.OneAppIntentIdentifiers;
1956
1987
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -2098,6 +2129,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
2098
2129
  ipadSupportedInterfaceOrientations,
2099
2130
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
2100
2131
  alternateIconNames: [...alternateIconNames],
2132
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
2133
+ const resolved = resolveBuildSetting(value, settings);
2134
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
2135
+ return resolved;
2136
+ }),
2101
2137
  ...resourceUri ? {
2102
2138
  appIconArtwork: resolveNativeAppIconArtwork(
2103
2139
  [...resources],
@@ -2169,6 +2205,9 @@ import { createHash as createHash2 } from "node:crypto";
2169
2205
  import fs2 from "node:fs";
2170
2206
  import path5 from "node:path";
2171
2207
 
2208
+ // src/swift-interface-bodies.ts
2209
+ init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
2210
+
2172
2211
  // src/swift-objc-platform.ts
2173
2212
  init_define_SWIFT_COVERAGE_SOURCE_DIGESTS();
2174
2213
  import { spawnSync } from "node:child_process";
@@ -3439,7 +3478,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
3439
3478
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
3440
3479
  (module) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module}"`
3441
3480
  ).join("");
3442
- var compilerSourceDigest = true ? "73960368f0b83cf042511655d857d5f64204fa539e2c984423a12c08657b068e" : swiftCompilerSourceDigest(import.meta.dirname);
3481
+ var compilerSourceDigest = true ? "0d2e8d6fb4545fb31a692a87bd3215ef3a9a64a8c3e1b2fc1f2a3e79511325ec" : swiftCompilerSourceDigest(import.meta.dirname);
3443
3482
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
3444
3483
  "CFAllocator",
3445
3484
  "CFArray",
@@ -6043,9 +6082,13 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
6043
6082
  }
6044
6083
  }
6045
6084
  const alternateSetting = settings?.("ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES") ?? "";
6085
+ const catalogAlternateNames = [];
6046
6086
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
6047
6087
  const val = match[1] ?? match[2];
6048
- if (val) alternateIconNames.add(val);
6088
+ if (val) {
6089
+ alternateIconNames.add(val);
6090
+ catalogAlternateNames.push(val);
6091
+ }
6049
6092
  }
6050
6093
  const permissionUsageDescriptions = {};
6051
6094
  for (const [key, value] of Object.entries(dictionary)) {
@@ -6108,6 +6151,7 @@ function readNativeAppIdentityFromXcodeTarget(app, parseInfoPlist = parsePlistSo
6108
6151
  ipadSupportedInterfaceOrientations,
6109
6152
  ...defaultScreenOrientationMask ? { defaultScreenOrientationMask } : {},
6110
6153
  alternateIconNames: [...alternateIconNames],
6154
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => value),
6111
6155
  appIconArtwork: resolveNativeAppIconArtwork(
6112
6156
  app.resources,
6113
6157
  (file) => fs17.readFileSync(file, "utf8"),
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -265,6 +265,34 @@ function isSwiftImageVariants(value) {
265
265
  }
266
266
 
267
267
  // src/nativeAppIconContract.ts
268
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
269
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
270
+ const resolve = (value) => {
271
+ if (typeof value === "string") return resolveReference(value);
272
+ if (Array.isArray(value)) return value.map(resolve);
273
+ if (isRecord(value))
274
+ return Object.fromEntries(
275
+ Object.entries(value).map(([key, entry]) => [
276
+ resolveReference(key),
277
+ resolve(entry)
278
+ ])
279
+ );
280
+ return value;
281
+ };
282
+ const dictionary = isRecord(icons) ? Object.fromEntries(
283
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
284
+ ) : {};
285
+ if (catalogNames.length === 0) return dictionary;
286
+ return {
287
+ ...dictionary,
288
+ CFBundleAlternateIcons: {
289
+ ...Object.fromEntries(
290
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
291
+ ),
292
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
293
+ }
294
+ };
295
+ }
268
296
  function isNativeAppIconArtwork(value) {
269
297
  return isRecord(value) && (value.primary === void 0 || isSwiftImageVariants(value.primary)) && isRecord(value.alternates) && Object.values(value.alternates).every(isSwiftImageVariants);
270
298
  }
@@ -597,6 +625,7 @@ function isNativeAppIdentity(value) {
597
625
  if (value.androidPhotoLibraryAddOnly !== void 0 && value.androidPhotoLibraryAddOnly !== true)
598
626
  return false;
599
627
  if (value.googleSignIn !== void 0 && !isRecord(value.googleSignIn)) return false;
628
+ if (value.bundleIcons !== void 0 && !isRecord(value.bundleIcons)) return false;
600
629
  const descriptions = value.permissionUsageDescriptions;
601
630
  if (value.reanimatedStaticFeatureFlags !== void 0 && (!isRecord(value.reanimatedStaticFeatureFlags) || !Object.values(value.reanimatedStaticFeatureFlags).every(
602
631
  (flag) => typeof flag === "boolean"
@@ -687,6 +716,7 @@ function readNativeAppIdentity(value) {
687
716
  ...value.reanimatedStaticFeatureFlags === void 0 ? {} : { reanimatedStaticFeatureFlags: { ...value.reanimatedStaticFeatureFlags } },
688
717
  ...value.appIconArtwork === void 0 ? {} : { appIconArtwork: readNativeAppIconArtwork(value.appIconArtwork) },
689
718
  ...value.alternateIconNames === void 0 ? {} : { alternateIconNames: [...value.alternateIconNames] },
719
+ ...value.bundleIcons === void 0 ? {} : { bundleIcons: structuredClone(value.bundleIcons) },
690
720
  ...value.androidManifestPermissions === void 0 ? {} : {
691
721
  androidManifestPermissions: value.androidManifestPermissions.map(
692
722
  (permission) => ({ ...permission })
@@ -1109,8 +1139,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1109
1139
  );
1110
1140
  if (alternateSetting === null)
1111
1141
  throw new Error("native alternate icon setting is unresolved");
1142
+ const catalogAlternateNames = [];
1112
1143
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1113
- alternateIconNames.add(match[1] ?? match[2]);
1144
+ const name = match[1] ?? match[2];
1145
+ alternateIconNames.add(name);
1146
+ catalogAlternateNames.push(name);
1114
1147
  }
1115
1148
  const intentIds = dictionary.OneAppIntentIdentifiers;
1116
1149
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -1258,6 +1291,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1258
1291
  ipadSupportedInterfaceOrientations,
1259
1292
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
1260
1293
  alternateIconNames: [...alternateIconNames],
1294
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
1295
+ const resolved = resolveBuildSetting(value, settings);
1296
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
1297
+ return resolved;
1298
+ }),
1261
1299
  ...resourceUri ? {
1262
1300
  appIconArtwork: resolveNativeAppIconArtwork(
1263
1301
  [...resources],
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // ../peach-globals/src/bundle-global-footer.ts
4
4
  function findBundleFooter(source, prefix) {
@@ -220,6 +220,34 @@ function isSwiftImageVariants(value) {
220
220
  }
221
221
 
222
222
  // src/nativeAppIconContract.ts
223
+ function resolveNativeBundleIcons(icons, catalogNames, resolveReference) {
224
+ if (!isRecord(icons) && catalogNames.length === 0) return void 0;
225
+ const resolve = (value) => {
226
+ if (typeof value === "string") return resolveReference(value);
227
+ if (Array.isArray(value)) return value.map(resolve);
228
+ if (isRecord(value))
229
+ return Object.fromEntries(
230
+ Object.entries(value).map(([key, entry]) => [
231
+ resolveReference(key),
232
+ resolve(entry)
233
+ ])
234
+ );
235
+ return value;
236
+ };
237
+ const dictionary = isRecord(icons) ? Object.fromEntries(
238
+ Object.entries(icons).map(([key, value]) => [key, resolve(value)])
239
+ ) : {};
240
+ if (catalogNames.length === 0) return dictionary;
241
+ return {
242
+ ...dictionary,
243
+ CFBundleAlternateIcons: {
244
+ ...Object.fromEntries(
245
+ catalogNames.map((name) => [name, { CFBundleIconName: name }])
246
+ ),
247
+ ...isRecord(dictionary.CFBundleAlternateIcons) ? dictionary.CFBundleAlternateIcons : {}
248
+ }
249
+ };
250
+ }
223
251
  function isNativeAppIconArtwork(value) {
224
252
  return isRecord(value) && (value.primary === void 0 || isSwiftImageVariants(value.primary)) && isRecord(value.alternates) && Object.values(value.alternates).every(isSwiftImageVariants);
225
253
  }
@@ -552,6 +580,7 @@ function isNativeAppIdentity(value) {
552
580
  if (value.androidPhotoLibraryAddOnly !== void 0 && value.androidPhotoLibraryAddOnly !== true)
553
581
  return false;
554
582
  if (value.googleSignIn !== void 0 && !isRecord(value.googleSignIn)) return false;
583
+ if (value.bundleIcons !== void 0 && !isRecord(value.bundleIcons)) return false;
555
584
  const descriptions = value.permissionUsageDescriptions;
556
585
  if (value.reanimatedStaticFeatureFlags !== void 0 && (!isRecord(value.reanimatedStaticFeatureFlags) || !Object.values(value.reanimatedStaticFeatureFlags).every(
557
586
  (flag) => typeof flag === "boolean"
@@ -642,6 +671,7 @@ function readNativeAppIdentity(value) {
642
671
  ...value.reanimatedStaticFeatureFlags === void 0 ? {} : { reanimatedStaticFeatureFlags: { ...value.reanimatedStaticFeatureFlags } },
643
672
  ...value.appIconArtwork === void 0 ? {} : { appIconArtwork: readNativeAppIconArtwork(value.appIconArtwork) },
644
673
  ...value.alternateIconNames === void 0 ? {} : { alternateIconNames: [...value.alternateIconNames] },
674
+ ...value.bundleIcons === void 0 ? {} : { bundleIcons: structuredClone(value.bundleIcons) },
645
675
  ...value.androidManifestPermissions === void 0 ? {} : {
646
676
  androidManifestPermissions: value.androidManifestPermissions.map(
647
677
  (permission) => ({ ...permission })
@@ -1064,8 +1094,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1064
1094
  );
1065
1095
  if (alternateSetting === null)
1066
1096
  throw new Error("native alternate icon setting is unresolved");
1097
+ const catalogAlternateNames = [];
1067
1098
  for (const match of alternateSetting.replace(/\\"/g, '"').matchAll(/"([^"]*)"|([^\s(),]+)/g)) {
1068
- alternateIconNames.add(match[1] ?? match[2]);
1099
+ const name = match[1] ?? match[2];
1100
+ alternateIconNames.add(name);
1101
+ catalogAlternateNames.push(name);
1069
1102
  }
1070
1103
  const intentIds = dictionary.OneAppIntentIdentifiers;
1071
1104
  const appIntentIdentifiers = Array.isArray(intentIds) && intentIds.every((value) => typeof value === "string") ? intentIds.map((value) => resolveBuildSetting(value, settings)) : [];
@@ -1213,6 +1246,11 @@ function nativeAppIdentityFromIos(files, parseInfoPlist, iosTarget, resourceUri)
1213
1246
  ipadSupportedInterfaceOrientations,
1214
1247
  ...defaultScreenOrientationMask === void 0 ? {} : { defaultScreenOrientationMask },
1215
1248
  alternateIconNames: [...alternateIconNames],
1249
+ bundleIcons: resolveNativeBundleIcons(icons, catalogAlternateNames, (value) => {
1250
+ const resolved = resolveBuildSetting(value, settings);
1251
+ if (resolved === null) throw new Error("native bundle icon reference is unresolved");
1252
+ return resolved;
1253
+ }),
1216
1254
  ...resourceUri ? {
1217
1255
  appIconArtwork: resolveNativeAppIconArtwork(
1218
1256
  [...resources],
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // ../peach-globals/src/bundle-global-footer.ts
4
4
  function findBundleFooter(source, prefix) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/pdfium-raster.ts
4
4
  import { PDFiumLibrary } from "@hyzyla/pdfium/inline";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/plist.ts
4
4
  import plist from "plist";
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2182 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2186 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -2,37 +2,37 @@
2
2
  "version": 1,
3
3
  "outputs": {
4
4
  "beta.mjs": {
5
- "sha256": "16eaff006550b40d5a7efc736cae11a76fd189f6f7a721a5b11cecaf974e4ece",
5
+ "sha256": "4ff040e26c26ee8119bb23b16b5bd9bb679428a619a438d586a3b03a6f81a689",
6
6
  "inputs": [
7
7
  "packages/peachsim/src/beta.ts"
8
8
  ]
9
9
  },
10
10
  "bridge-contract.mjs": {
11
- "sha256": "c8a0386f432ada10143e7c6868f6e0462b157071bc1d5ce0e5058ae4434c1176",
11
+ "sha256": "161ea5802d1003714b21de61d115f70aae06168084ea71d64e133f29add97c16",
12
12
  "inputs": [
13
13
  "packages/peachsim/src/bridge-contract.ts"
14
14
  ]
15
15
  },
16
16
  "capture-contract.mjs": {
17
- "sha256": "4459b9892567f651bf6a9e0588afa32758a7e403d0752b88f3ea82ef45ae57de",
17
+ "sha256": "49c39fce322b2a7ad01e490fce35390c0e2bc0fe958b7c929891bb9cd41380e4",
18
18
  "inputs": [
19
19
  "packages/peachsim/src/capture-contract.ts"
20
20
  ]
21
21
  },
22
22
  "cloud-contract.mjs": {
23
- "sha256": "dfc66c1c69e28f63a3af6bd67be0ff8b75fee33a8cb54712625f572a0234717f",
23
+ "sha256": "08f6a7bceea198d4309e9869d402335c277fe10b129260d7d51499b94d703160",
24
24
  "inputs": [
25
25
  "packages/peachsim/src/cloud-contract.ts"
26
26
  ]
27
27
  },
28
28
  "cloud-test-args.mjs": {
29
- "sha256": "816509b7a2e35f3d93e5cd3d0b5c8ff9d3a85456dda15a1e42d71d34daf2f799",
29
+ "sha256": "95440c399a7092babe1b41b72ceca872c72880cc1864f4c4274259675325f2ff",
30
30
  "inputs": [
31
31
  "packages/peachsim/src/cloud-test-args.ts"
32
32
  ]
33
33
  },
34
34
  "cloud.mjs": {
35
- "sha256": "b648e9d70b4ec067be1a8f32a7c0bf237be2ec641a3c44e1e0d0367ce38bcec1",
35
+ "sha256": "49a44b38436e52f8df262e2960cd5f52e4855873563c1743aad846eb7ca555e9",
36
36
  "inputs": [
37
37
  "packages/peachsim/src/backend-origin.ts",
38
38
  "packages/peachsim/src/capture-contract.ts",
@@ -44,14 +44,14 @@
44
44
  ]
45
45
  },
46
46
  "menu.mjs": {
47
- "sha256": "9d84591227109b6d236829c7d4f3b00edcfe2f8364f59f807d5017d0fa9001e7",
47
+ "sha256": "00650508e324943c7a4b7f6917aa7d838435e195dcc13a3f2760c15b4a22bcb6",
48
48
  "inputs": [
49
49
  "packages/peachsim/src/public-brand.ts",
50
50
  "packages/peachsim/src/menu.ts"
51
51
  ]
52
52
  },
53
53
  "config.mjs": {
54
- "sha256": "ff967bc65a39ce38c6f3051e4f99461d43695d3227bbf56c65fcb902c1513ac5",
54
+ "sha256": "4adb8a0f68c2e168fb288dd63c23769b13513a5f2e821d9802bfdac711705795",
55
55
  "inputs": [
56
56
  "packages/contrast-runtime-delivery/src/version.ts",
57
57
  "packages/peach-globals/src/bundle-global-footer.ts",
@@ -61,20 +61,20 @@
61
61
  ]
62
62
  },
63
63
  "host/fetch-proxy-overrides.mjs": {
64
- "sha256": "cb45fe0e4fb6a0a55b2f1d23fdba0c1666286de96b114df1fe52b20d1b20991b",
64
+ "sha256": "5b9dab7b156a6755a45e2501ce57bfca5ec0b5433ef6bad286b1a98caf8f10c5",
65
65
  "inputs": [
66
66
  "packages/peachsim/src/host/fetch-proxy-overrides.ts"
67
67
  ]
68
68
  },
69
69
  "metro-fingerprint-registry.mjs": {
70
- "sha256": "f4eb8557b0773d8291d20274b143b1f57751f188268183aabd930431089c8c67",
70
+ "sha256": "65b6aed92a66cdfbb37ab43fbdfdc995b36e9eceae16a8e66293c34f50150b11",
71
71
  "inputs": [
72
72
  "packages/peachsim/src/is-record.ts",
73
73
  "packages/peachsim/src/metro-fingerprint-registry.ts"
74
74
  ]
75
75
  },
76
76
  "metro-production-bundle.mjs": {
77
- "sha256": "ad64acb7fb1c0e6bb598db770480113c25b2aa49709eb83052b15f4d9836881a",
77
+ "sha256": "818dca41d39562a08685003b3c7e89caa9351a41972f63bd0a3adfbb9d682888",
78
78
  "inputs": [
79
79
  "packages/peachsim/src/swift-coverage/indexdump.ts",
80
80
  "packages/peachsim/src/swift-coverage/indexing.ts",
@@ -105,13 +105,13 @@
105
105
  ]
106
106
  },
107
107
  "worklet-executable.mjs": {
108
- "sha256": "27da206a9b4c814cea78f49de03dbe6b0fd27d4b9e7edd1530f7c13195e79de5",
108
+ "sha256": "a8280b6299a8e2a200b0557493ac5afb495a819492582193361f84c6cf8d261c",
109
109
  "inputs": [
110
110
  "packages/peachsim/src/worklet-executable.ts"
111
111
  ]
112
112
  },
113
113
  "native-app-identity.mjs": {
114
- "sha256": "53521e51209101628a7b9d7490bf95920d7e9fd29d8b89d78df59a2e63f836c0",
114
+ "sha256": "f8c0f44645a89cdd09f2650ed34fdeeec9689399e7695cd89276eac507347fa9",
115
115
  "inputs": [
116
116
  "packages/peach-globals/src/bundle-global-footer.ts",
117
117
  "packages/peachsim/src/android-string-value.ts",
@@ -126,7 +126,7 @@
126
126
  ]
127
127
  },
128
128
  "native-app-identity-project.mjs": {
129
- "sha256": "6359701758d167a124fce7ecdc023041e4856ab12f38310975d9d910bcbb86bb",
129
+ "sha256": "13726e828b44782d5c4ee7d6818f7453a529173f046aa96ce55112628ed8bcfc",
130
130
  "inputs": [
131
131
  "packages/peachsim/src/swift-coverage/indexdump.ts",
132
132
  "packages/peachsim/src/swift-coverage/indexing.ts",
@@ -169,6 +169,7 @@
169
169
  "packages/peachsim/src/xcode-target-members.ts",
170
170
  "packages/peachsim/src/plist.ts",
171
171
  "packages/peachsim/src/swift-objc-standin.ts",
172
+ "packages/peachsim/src/swift-interface-bodies.ts",
172
173
  "packages/peachsim/src/swift-objc-platform.ts",
173
174
  "packages/peachsim/src/swift-toolchain.ts",
174
175
  "packages/peachsim/src/swift-objc-sdk.ts",
@@ -240,26 +241,26 @@
240
241
  ]
241
242
  },
242
243
  "native-firebase-metadata.mjs": {
243
- "sha256": "6c90a7dc5ab86253de48ca06160954fc55512b4f31a7449cbde3d4642d3d299e",
244
+ "sha256": "716205da4b4a50832de90ac79d4371a01c1d21ae0a3479f497ff00bce1b6d798",
244
245
  "inputs": [
245
246
  "packages/peach-globals/src/bundle-global-footer.ts",
246
247
  "packages/peachsim/src/native-firebase-metadata.ts"
247
248
  ]
248
249
  },
249
250
  "plist.mjs": {
250
- "sha256": "3f6b927431951076512c5298571001ec89137b6dd6f1ab03c89ca7add72d017f",
251
+ "sha256": "4a51d325573dbc13947290338ffb70fd6077557b7b422aa037c7037799867aa8",
251
252
  "inputs": [
252
253
  "packages/peachsim/src/plist.ts"
253
254
  ]
254
255
  },
255
256
  "react-native-host-modules.mjs": {
256
- "sha256": "fcee84bd1a53bd6e6014d7fd7a46888f1e546019cb701718b13a58971db3d782",
257
+ "sha256": "6c6da1044e88fe7ebfc6c656009befbf0d484c7ae05773b2c475d99ba2e94f10",
257
258
  "inputs": [
258
259
  "packages/peachsim/src/react-native-host-modules.ts"
259
260
  ]
260
261
  },
261
262
  "sdk.mjs": {
262
- "sha256": "f9c01c5e416858ec9307894cee74776fd5e127833414bb028cae3a47ffb05fa2",
263
+ "sha256": "e4865020e86b96cfba2707c84817fda0ca4da823a3ee27edafd9d4007519cb88",
263
264
  "inputs": [
264
265
  "packages/peachsim/src/bridge-contract.ts",
265
266
  "packages/peachsim/src/is-record.ts",
@@ -276,7 +277,7 @@
276
277
  ]
277
278
  },
278
279
  "bridge-contract-input.mjs": {
279
- "sha256": "f821e57bf12a2a980f0f2e281010740c3a7b271a4204d91eade48c4c414f20cb",
280
+ "sha256": "8a14e54fadab4ed52487042878e627a5e152cefd3815d32510a903a3316e69ba",
280
281
  "inputs": [
281
282
  "packages/peachsim/src/bridge-contract.ts",
282
283
  "packages/peachsim/src/is-record.ts",
@@ -284,7 +285,7 @@
284
285
  ]
285
286
  },
286
287
  "swift-submit.mjs": {
287
- "sha256": "84869714344f807bda4ca60fb3f8d1e4d3cee49c842b9797b45e05a2d2b73d5f",
288
+ "sha256": "1bccd0107e78da327dcdc55bbf4d3c8a4822233f859dfb97d365dfd1281bc00f",
288
289
  "inputs": [
289
290
  "packages/peachsim/src/is-record.ts",
290
291
  "packages/peachsim/src/swiftContract.ts",
@@ -292,19 +293,19 @@
292
293
  ]
293
294
  },
294
295
  "pdfium-raster.mjs": {
295
- "sha256": "8864fefad0663113d99b3eead9757ad658a448e39ee1ec20ec3f67b609ad2b36",
296
+ "sha256": "3e0232862fc4b728f1c23a91bbf3b1d42ad712c8ac3705d258b8c588c6282c5e",
296
297
  "inputs": [
297
298
  "packages/peachsim/src/pdfium-raster.ts"
298
299
  ]
299
300
  },
300
301
  "swift-package.mjs": {
301
- "sha256": "ec0dba58355f4a329cf74887d36cd82571dc71d2e0bece21b97bb311f42b7d79",
302
+ "sha256": "e4a806a7b91254ec0832547fa4527f397ceb5b01625b3bc7ff9a8fa3fbee27f1",
302
303
  "inputs": [
303
304
  "packages/peachsim/src/swift-package.ts"
304
305
  ]
305
306
  },
306
307
  "swift-compile.mjs": {
307
- "sha256": "0ee196a1cf7732cd4a96d62d69dfe427790dc2d706851b1909fae12888958bd5",
308
+ "sha256": "dff537518e5fc5095d36aa780dbdf71dc3f416a8b8c53e179ffa93869a274415",
308
309
  "inputs": [
309
310
  "packages/peachsim/src/swift-compile.ts",
310
311
  "packages/peachsim/src/admitted-mac-build.ts",
@@ -361,7 +362,7 @@
361
362
  ]
362
363
  },
363
364
  "expo-swift-metadata.mjs": {
364
- "sha256": "cbab5cf5256efa1cefa7161a234b8da2c8cbe5912cb5c8faa264afdff36c74f5",
365
+ "sha256": "d478862916c9597857fc71da499deb659a0b2c601e59bef57ca1ba6cb83b0ff7",
365
366
  "inputs": [
366
367
  "packages/peach-globals/src/bundle-global-footer.ts",
367
368
  "packages/peachsim/src/is-record.ts",