Skip to content

Commit cac2be3

Browse files
committed
Migrate to VideoKit
1 parent e966d0b commit cac2be3

File tree

7 files changed

+116
-54
lines changed

7 files changed

+116
-54
lines changed

Assembly-CSharp.csproj

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<DebugType>full</DebugType>
2323
<Optimize>false</Optimize>
2424
<OutputPath>Temp\bin\Debug\</OutputPath>
25-
<DefineConstants>DEBUG;TRACE;UNITY_2021_3_4;UNITY_2021_3;UNITY_2021;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;UNITY_INCLUDE_TESTS;USE_SEARCH_ENGINE_API;USE_SEARCH_TABLE;USE_SEARCH_MODULE;USE_PROPERTY_DATABASE;USE_SEARCH_EXTENSION_API;SCENE_TEMPLATE_MODULE;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_ENGINE_CODE_STRIPPING;ENABLE_MANAGED_UNITYTLS;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;PLATFORM_WEBGL;TEXTCORE_1_0_OR_NEWER;UNITY_WEBGL;UNITY_WEBGL_API;UNITY_DISABLE_WEB_VERIFICATION;UNITY_GFX_USE_PLATFORM_VSYNC;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_SPATIALTRACKING;ENABLE_MONO;NET_STANDARD_2_0;NET_STANDARD;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
25+
<DefineConstants>DEBUG;TRACE;UNITY_2021_3_4;UNITY_2021_3;UNITY_2021;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;UNITY_2020_3_OR_NEWER;UNITY_2021_1_OR_NEWER;UNITY_2021_2_OR_NEWER;UNITY_2021_3_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;USE_SEARCH_ENGINE_API;USE_SEARCH_TABLE;USE_SEARCH_MODULE;USE_PROPERTY_DATABASE;USE_SEARCH_EXTENSION_API;SCENE_TEMPLATE_MODULE;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;ENABLE_MANAGED_UNITYTLS;INCLUDE_DYNAMIC_GI;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;ENABLE_ACCELERATOR_CLIENT_DEBUGGING;PLATFORM_STANDALONE;TEXTCORE_1_0_OR_NEWER;PLATFORM_STANDALONE_OSX;UNITY_STANDALONE_OSX;UNITY_STANDALONE;ENABLE_GAMECENTER;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;ENABLE_SPATIALTRACKING;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;NET_STANDARD;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
2626
<ErrorReport>prompt</ErrorReport>
2727
<WarningLevel>4</WarningLevel>
2828
<NoWarn>0169</NoWarn>
@@ -43,6 +43,9 @@
4343
<Reference Include="UnityEngine.AIModule">
4444
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.AIModule.dll</HintPath>
4545
</Reference>
46+
<Reference Include="UnityEngine.ARModule">
47+
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.ARModule.dll</HintPath>
48+
</Reference>
4649
<Reference Include="UnityEngine.AccessibilityModule">
4750
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.AccessibilityModule.dll</HintPath>
4851
</Reference>
@@ -61,6 +64,12 @@
6164
<Reference Include="UnityEngine.ClothModule">
6265
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.ClothModule.dll</HintPath>
6366
</Reference>
67+
<Reference Include="UnityEngine.ClusterInputModule">
68+
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.ClusterInputModule.dll</HintPath>
69+
</Reference>
70+
<Reference Include="UnityEngine.ClusterRendererModule">
71+
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.ClusterRendererModule.dll</HintPath>
72+
</Reference>
6473
<Reference Include="UnityEngine.CoreModule">
6574
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.CoreModule.dll</HintPath>
6675
</Reference>
@@ -217,8 +226,8 @@
217226
<Reference Include="UnityEngine.VideoModule">
218227
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.VideoModule.dll</HintPath>
219228
</Reference>
220-
<Reference Include="UnityEngine.WebGLModule">
221-
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/PlaybackEngines/WebGLSupport/Managed/UnityEngine.WebGLModule.dll</HintPath>
229+
<Reference Include="UnityEngine.VirtualTexturingModule">
230+
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.VirtualTexturingModule.dll</HintPath>
222231
</Reference>
223232
<Reference Include="UnityEngine.WindModule">
224233
<HintPath>/Applications/Unity/Hub/Editor/2021.3.4f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.WindModule.dll</HintPath>
@@ -679,6 +688,9 @@
679688
<Reference Include="Unity.VisualStudio.Editor">
680689
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/Unity.VisualStudio.Editor.dll</HintPath>
681690
</Reference>
691+
<Reference Include="NatML.Vision.Meet">
692+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Vision.Meet.dll</HintPath>
693+
</Reference>
682694
<Reference Include="Unity.Timeline">
683695
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/Unity.Timeline.dll</HintPath>
684696
</Reference>
@@ -724,9 +736,6 @@
724736
<Reference Include="Unity.EditorCoroutines.Editor">
725737
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/Unity.EditorCoroutines.Editor.dll</HintPath>
726738
</Reference>
727-
<Reference Include="NatML.Vision.Meet2">
728-
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Vision.Meet2.dll</HintPath>
729-
</Reference>
730739
<Reference Include="Unity.Services.Core.Analytics">
731740
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/Unity.Services.Core.Analytics.dll</HintPath>
732741
</Reference>
@@ -757,6 +766,24 @@
757766
<Reference Include="Unity.VisualScripting.State">
758767
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/Unity.VisualScripting.State.dll</HintPath>
759768
</Reference>
769+
<Reference Include="NatML.Sharing.Editor">
770+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Sharing.Editor.dll</HintPath>
771+
</Reference>
772+
<Reference Include="NatML.Recorders">
773+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Recorders.dll</HintPath>
774+
</Reference>
775+
<Reference Include="NatML.VideoKit.Editor">
776+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.VideoKit.Editor.dll</HintPath>
777+
</Reference>
778+
<Reference Include="NatML.VideoKit">
779+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.VideoKit.dll</HintPath>
780+
</Reference>
781+
<Reference Include="NatML.Recorders.Editor">
782+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Recorders.Editor.dll</HintPath>
783+
</Reference>
784+
<Reference Include="NatML.Sharing">
785+
<HintPath>/Users/yusuf/Desktop/Meet/Library/ScriptAssemblies/NatML.Sharing.dll</HintPath>
786+
</Reference>
760787
</ItemGroup>
761788
<ItemGroup>
762789
</ItemGroup>

Assets/MeetSample.cs

Lines changed: 22 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,62 +7,45 @@ namespace NatML.Examples {
77

88
using UnityEngine;
99
using UnityEngine.UI;
10-
using NatML.Devices;
11-
using NatML.Devices.Outputs;
10+
using NatML.VideoKit;
1211
using NatML.Vision;
1312

1413
public class MeetSample : MonoBehaviour {
1514

15+
[Header(@"Camera Manager")]
16+
public VideoKitCameraManager cameraManager;
17+
1618
[Header(@"UI")]
1719
public RawImage rawImage;
1820
public AspectRatioFitter aspectFitter;
1921

20-
private CameraDevice cameraDevice;
21-
private TextureOutput cameraTextureOutput;
22-
private RenderTexture matteImage;
23-
2422
private MLModel model;
2523
private MeetPredictor predictor;
24+
private RenderTexture matteTexture;
2625

27-
async void Start () {
28-
// Request camera permissions
29-
var permissionStatus = await MediaDeviceQuery.RequestPermissions<CameraDevice>();
30-
if (permissionStatus != PermissionStatus.Authorized) {
31-
Debug.LogError(@"User did not grant camera permissions");
32-
return;
33-
}
34-
// Get the default camera device
35-
var query = new MediaDeviceQuery(MediaDeviceCriteria.CameraDevice);
36-
cameraDevice = query.current as CameraDevice;
37-
// Start the camera preview
38-
cameraDevice.previewResolution = (1280, 720);
39-
cameraTextureOutput = new TextureOutput();
40-
cameraDevice.StartRunning(cameraTextureOutput);
41-
// Create matte texture
42-
var cameraTexture = await cameraTextureOutput;
43-
matteImage = new RenderTexture(cameraTexture.width, cameraTexture.height, 0);
44-
// Display matte texture on UI
45-
rawImage.texture = matteImage;
46-
aspectFitter.aspectRatio = (float)cameraTexture.width / cameraTexture.height;
47-
// Create the Meet predictor
26+
private async void Start () {
4827
Debug.Log("Fetching model from NatML...");
28+
// Fetch the model data from NatML Hub
4929
var modelData = await MLModelData.FromHub("@natml/meet");
50-
model = modelData.Deserialize();
30+
// Create the edge model
31+
model = new MLEdgeModel(modelData);
32+
// Create the Meet predictor
5133
predictor = new MeetPredictor(model);
34+
// Listen for camera frames
35+
cameraManager.OnFrame.AddListener(OnCameraFrame);
5236
}
5337

54-
void Update () {
55-
// Check that the predictor has been created
56-
if (predictor == null)
57-
return;
58-
// Predict
59-
var matte = predictor.Predict(cameraTextureOutput.texture);
60-
matte.Render(matteImage);
38+
private void OnCameraFrame (CameraFrame frame) {
39+
// Predict matte
40+
var matte = predictor.Predict(frame);
41+
// Render matte to texture
42+
matteTexture = matteTexture ? matteTexture : new RenderTexture(frame.image.width, frame.image.height, 0);
43+
matte.Render(matteTexture);
44+
// Display matte texture
45+
rawImage.texture = matteTexture;
46+
aspectFitter.aspectRatio = (float)matteTexture.width / matteTexture.height;
6147
}
6248

63-
void OnDisable () {
64-
// Dispose model
65-
model?.Dispose();
66-
}
49+
private void OnDisable () => model?.Dispose(); // Dispose model
6750
}
6851
}

Assets/MeetSample.unity

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ GameObject:
327327
serializedVersion: 6
328328
m_Component:
329329
- component: {fileID: 916787100}
330+
- component: {fileID: 916787102}
330331
- component: {fileID: 916787101}
331332
m_Layer: 0
332333
m_Name: MeetSample
@@ -362,8 +363,29 @@ MonoBehaviour:
362363
m_Script: {fileID: 11500000, guid: cd496ebc2dd7c48aebbac061316df1a6, type: 3}
363364
m_Name:
364365
m_EditorClassIdentifier:
366+
cameraManager: {fileID: 916787102}
365367
rawImage: {fileID: 1849636822}
366368
aspectFitter: {fileID: 1849636821}
369+
--- !u!114 &916787102
370+
MonoBehaviour:
371+
m_ObjectHideFlags: 0
372+
m_CorrespondingSourceObject: {fileID: 0}
373+
m_PrefabInstance: {fileID: 0}
374+
m_PrefabAsset: {fileID: 0}
375+
m_GameObject: {fileID: 916787099}
376+
m_Enabled: 1
377+
m_EditorHideFlags: 0
378+
m_Script: {fileID: 11500000, guid: 98622613d505143a9a06b4b11b0a82cf, type: 3}
379+
m_Name:
380+
m_EditorClassIdentifier:
381+
resolution: 3
382+
capabilities: 1
383+
playOnAwake: 1
384+
focusMode: 0
385+
exposureMode: 0
386+
OnFrame:
387+
m_PersistentCalls:
388+
m_Calls: []
367389
--- !u!1 &963194225
368390
GameObject:
369391
m_ObjectHideFlags: 0

Packages/ai.natml.vision.meet/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"description": "MediaPipe Meet Segmentation for human matting in Unity Engine.",
66
"unity": "2021.2",
77
"dependencies": {
8-
"ai.natml.natml": "1.0.18"
8+
"ai.natml.natml": "1.0.19"
99
},
1010
"keywords": [
1111
"natml",

Packages/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
}
1010
],
1111
"dependencies": {
12-
"ai.natml.natdevice": "1.2.4",
12+
"ai.natml.videokit": "0.0.3",
1313
"com.unity.collab-proxy": "1.15.17",
1414
"com.unity.feature.development": "1.0.1",
1515
"com.unity.ide.rider": "3.0.14",

Packages/packages-lock.json

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,66 @@
11
{
22
"dependencies": {
33
"ai.natml.hub": {
4-
"version": "1.0.12",
5-
"depth": 1,
4+
"version": "1.0.15",
5+
"depth": 2,
66
"source": "registry",
77
"dependencies": {},
88
"url": "https://registry.npmjs.com"
99
},
10+
"ai.natml.natcorder": {
11+
"version": "1.9.1",
12+
"depth": 1,
13+
"source": "registry",
14+
"dependencies": {
15+
"ai.natml.hub": "1.0.15"
16+
},
17+
"url": "https://registry.npmjs.com"
18+
},
1019
"ai.natml.natdevice": {
11-
"version": "1.2.4",
12-
"depth": 0,
20+
"version": "1.3.1",
21+
"depth": 1,
1322
"source": "registry",
1423
"dependencies": {
15-
"ai.natml.hub": "1.0.12"
24+
"ai.natml.hub": "1.0.15"
1625
},
1726
"url": "https://registry.npmjs.com"
1827
},
1928
"ai.natml.natml": {
20-
"version": "1.0.18",
29+
"version": "1.0.19",
30+
"depth": 1,
31+
"source": "registry",
32+
"dependencies": {
33+
"ai.natml.hub": "1.0.12"
34+
},
35+
"url": "https://registry.npmjs.com"
36+
},
37+
"ai.natml.natshare": {
38+
"version": "1.3.0",
2139
"depth": 1,
2240
"source": "registry",
2341
"dependencies": {
2442
"ai.natml.hub": "1.0.12"
2543
},
2644
"url": "https://registry.npmjs.com"
2745
},
46+
"ai.natml.videokit": {
47+
"version": "0.0.3",
48+
"depth": 0,
49+
"source": "registry",
50+
"dependencies": {
51+
"ai.natml.natcorder": "1.9.1",
52+
"ai.natml.natdevice": "1.3.1",
53+
"ai.natml.natml": "1.0.19",
54+
"ai.natml.natshare": "1.3.0"
55+
},
56+
"url": "https://registry.npmjs.com"
57+
},
2858
"ai.natml.vision.meet": {
2959
"version": "file:ai.natml.vision.meet",
3060
"depth": 0,
3161
"source": "embedded",
3262
"dependencies": {
33-
"ai.natml.natml": "1.0.18"
63+
"ai.natml.natml": "1.0.19"
3464
}
3565
},
3666
"com.unity.collab-proxy": {

ProjectSettings/NatShare.asset

4.08 KB
Binary file not shown.

0 commit comments

Comments
 (0)