faradayfuture claude opus 5.5 commited on
Commit
54a51e6
·
0 Parent(s):

Sample Viewer (history squashed; viewer content is served from gated datasets)

Browse files

Co-authored-by: claude opus 5.5 <claude opus 5.5@users.noreply.huggingface.co>

Files changed (50) hide show
  1. .gitattributes +245 -0
  2. README.md +14 -0
  3. covers/egoSample.jpg +3 -0
  4. covers/motionSample.jpg +0 -0
  5. covers/teleopSample.jpg +3 -0
  6. egoSample/ego-legacy/demo02/viewer.html +6 -0
  7. egoSample/ego-legacy/demo05/viewer.html +6 -0
  8. egoSample/ego-legacy/demo07/viewer.html +6 -0
  9. egoSample/ego-legacy/demo08/viewer.html +6 -0
  10. egoSample/ego-legacy/demo09/viewer.html +6 -0
  11. egoSample/ego-legacy/demo10/viewer.html +6 -0
  12. egoSample/faberu.html +6 -0
  13. egoSample/index.html +6 -0
  14. egoSample/jizhi.html +6 -0
  15. egoSample/mego.html +6 -0
  16. egoSample/stereogs.html +6 -0
  17. gate.html +129 -0
  18. index.html +45 -0
  19. motionSample/index.html +6 -0
  20. sceneSample/b2/viewer.html +237 -0
  21. sceneSample/cover.jpg +0 -0
  22. sceneSample/index.html +167 -0
  23. sceneSample/ss.js +61 -0
  24. style.css +28 -0
  25. sw.js +97 -0
  26. teleop.html +6 -0
  27. teleopSample/clip.html +6 -0
  28. teleopSample/drink_ep0.html +6 -0
  29. teleopSample/drink_ep1.html +6 -0
  30. teleopSample/ep0/viewer.html +6 -0
  31. teleopSample/ep1/viewer.html +6 -0
  32. teleopSample/ep2/viewer.html +6 -0
  33. teleopSample/ep3/viewer.html +6 -0
  34. teleopSample/ep4/viewer.html +6 -0
  35. teleopSample/ep5/viewer.html +6 -0
  36. teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052527/viewer.html +6 -0
  37. teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052609/viewer.html +6 -0
  38. teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050737/viewer.html +6 -0
  39. teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050827/viewer.html +6 -0
  40. teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728075709/viewer.html +6 -0
  41. teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728080339/viewer.html +6 -0
  42. teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045050/viewer.html +6 -0
  43. teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045152/viewer.html +6 -0
  44. teleopSample/index.html +6 -0
  45. teleopSample/mem_ep0.html +6 -0
  46. teleopSample/mem_ep1.html +6 -0
  47. teleopSample/sort_ep0.html +6 -0
  48. teleopSample/sort_ep1.html +6 -0
  49. teleopSample/wipe_ep0.html +6 -0
  50. teleopSample/wipe_ep1.html +6 -0
.gitattributes ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ ep0/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
37
+ ep0/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
38
+ ep0/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
39
+ ep0/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
40
+ ep0/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
41
+ ep0/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
42
+ ep1/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
43
+ ep1/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
44
+ ep1/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
45
+ ep1/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
46
+ ep1/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
47
+ ep1/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
48
+ ep2/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
49
+ ep2/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
50
+ ep2/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
51
+ ep2/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
52
+ ep2/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
53
+ ep2/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
54
+ ep3/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
55
+ ep3/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
56
+ ep3/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
57
+ ep3/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
58
+ ep3/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
59
+ ep3/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
60
+ ep4/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
61
+ ep4/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
62
+ ep4/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
63
+ ep4/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
64
+ ep4/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
65
+ ep4/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
66
+ ep5/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
67
+ ep5/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
68
+ ep5/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
69
+ ep5/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
70
+ ep5/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
71
+ ep5/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
72
+ ego_annotation_demo/thumb.jpg filter=lfs diff=lfs merge=lfs -text
73
+ ego_annotation_demo/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
74
+ ego_annotation_demo/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
75
+ ego_annotation_demo/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
76
+ egoSample/thumb.jpg filter=lfs diff=lfs merge=lfs -text
77
+ egoSample/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
78
+ egoSample/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
79
+ egoSample/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
80
+ egoSample/demo02/thumb.jpg filter=lfs diff=lfs merge=lfs -text
81
+ egoSample/demo02/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
82
+ egoSample/demo02/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
83
+ egoSample/demo02/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
84
+ egoSample/demo05/thumb.jpg filter=lfs diff=lfs merge=lfs -text
85
+ egoSample/demo05/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
86
+ egoSample/demo05/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
87
+ egoSample/demo05/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
88
+ egoSample/demo07/thumb.jpg filter=lfs diff=lfs merge=lfs -text
89
+ egoSample/demo07/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
90
+ egoSample/demo07/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
91
+ egoSample/demo07/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
92
+ egoSample/demo08/thumb.jpg filter=lfs diff=lfs merge=lfs -text
93
+ egoSample/demo08/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
94
+ egoSample/demo08/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
95
+ egoSample/demo08/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
96
+ egoSample/demo09/thumb.jpg filter=lfs diff=lfs merge=lfs -text
97
+ egoSample/demo09/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
98
+ egoSample/demo09/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
99
+ egoSample/demo09/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
100
+ egoSample/demo10/thumb.jpg filter=lfs diff=lfs merge=lfs -text
101
+ egoSample/demo10/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
102
+ egoSample/demo10/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
103
+ egoSample/demo10/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
104
+ egoSample/cover.jpg filter=lfs diff=lfs merge=lfs -text
105
+ ep0/thumb.jpg filter=lfs diff=lfs merge=lfs -text
106
+ ep1/thumb.jpg filter=lfs diff=lfs merge=lfs -text
107
+ ep2/thumb.jpg filter=lfs diff=lfs merge=lfs -text
108
+ ep3/thumb.jpg filter=lfs diff=lfs merge=lfs -text
109
+ ep4/thumb.jpg filter=lfs diff=lfs merge=lfs -text
110
+ ep5/thumb.jpg filter=lfs diff=lfs merge=lfs -text
111
+ *.pack filter=lfs diff=lfs merge=lfs -text
112
+ egoSample/ego-legacy/demo02/thumb.jpg filter=lfs diff=lfs merge=lfs -text
113
+ egoSample/ego-legacy/demo02/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
114
+ egoSample/ego-legacy/demo02/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
115
+ egoSample/ego-legacy/demo02/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
116
+ egoSample/ego-legacy/demo05/thumb.jpg filter=lfs diff=lfs merge=lfs -text
117
+ egoSample/ego-legacy/demo05/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
118
+ egoSample/ego-legacy/demo05/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
119
+ egoSample/ego-legacy/demo05/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
120
+ egoSample/ego-legacy/demo07/thumb.jpg filter=lfs diff=lfs merge=lfs -text
121
+ egoSample/ego-legacy/demo07/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
122
+ egoSample/ego-legacy/demo07/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
123
+ egoSample/ego-legacy/demo07/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
124
+ egoSample/ego-legacy/demo08/thumb.jpg filter=lfs diff=lfs merge=lfs -text
125
+ egoSample/ego-legacy/demo08/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
126
+ egoSample/ego-legacy/demo08/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
127
+ egoSample/ego-legacy/demo08/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
128
+ egoSample/ego-legacy/demo09/thumb.jpg filter=lfs diff=lfs merge=lfs -text
129
+ egoSample/ego-legacy/demo09/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
130
+ egoSample/ego-legacy/demo09/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
131
+ egoSample/ego-legacy/demo09/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
132
+ egoSample/ego-legacy/demo10/thumb.jpg filter=lfs diff=lfs merge=lfs -text
133
+ egoSample/ego-legacy/demo10/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
134
+ egoSample/ego-legacy/demo10/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
135
+ egoSample/ego-legacy/demo10/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
136
+ egoSample/media/task_15365_ep000/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
137
+ egoSample/media/task_15365_ep000/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
138
+ egoSample/media/task_15365_ep000/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
139
+ egoSample/media/task_15365_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
140
+ egoSample/media/task_15365_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
141
+ egoSample/media/task_15634_ep003/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
142
+ egoSample/media/task_15634_ep003/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
143
+ egoSample/media/task_15634_ep003/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
144
+ egoSample/media/task_15634_ep003/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
145
+ egoSample/media/task_15634_ep003/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
146
+ egoSample/media/task_15638_ep001/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
147
+ egoSample/media/task_15638_ep001/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
148
+ egoSample/media/task_15638_ep001/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
149
+ egoSample/media/task_15638_ep001/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
150
+ egoSample/media/task_15638_ep001/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
151
+ egoSample/media/task_15648_ep002/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
152
+ egoSample/media/task_15648_ep002/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
153
+ egoSample/media/task_15648_ep002/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
154
+ egoSample/media/task_15648_ep002/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
155
+ egoSample/media/task_15648_ep002/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
156
+ egoSample/media/task_15659_ep004/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
157
+ egoSample/media/task_15659_ep004/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
158
+ egoSample/media/task_15659_ep004/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
159
+ egoSample/media/task_15659_ep004/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
160
+ egoSample/media/task_15659_ep004/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
161
+ teleopSample/media/drink_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
162
+ teleopSample/media/drink_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
163
+ teleopSample/media/drink_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
164
+ teleopSample/media/drink_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
165
+ teleopSample/media/drink_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
166
+ teleopSample/media/drink_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
167
+ teleopSample/media/drink_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
168
+ teleopSample/media/drink_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
169
+ teleopSample/media/drink_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
170
+ teleopSample/media/drink_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
171
+ teleopSample/media/drink_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
172
+ teleopSample/media/drink_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
173
+ teleopSample/media/mem_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
174
+ teleopSample/media/mem_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
175
+ teleopSample/media/mem_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
176
+ teleopSample/media/mem_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
177
+ teleopSample/media/mem_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
178
+ teleopSample/media/mem_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
179
+ teleopSample/media/mem_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
180
+ teleopSample/media/mem_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
181
+ teleopSample/media/mem_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
182
+ teleopSample/media/mem_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
183
+ teleopSample/media/mem_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
184
+ teleopSample/media/mem_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
185
+ teleopSample/media/sort_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
186
+ teleopSample/media/sort_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
187
+ teleopSample/media/sort_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
188
+ teleopSample/media/sort_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
189
+ teleopSample/media/sort_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
190
+ teleopSample/media/sort_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
191
+ teleopSample/media/sort_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
192
+ teleopSample/media/sort_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
193
+ teleopSample/media/sort_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
194
+ teleopSample/media/sort_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
195
+ teleopSample/media/sort_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
196
+ teleopSample/media/sort_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
197
+ teleopSample/media/wipe_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
198
+ teleopSample/media/wipe_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
199
+ teleopSample/media/wipe_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
200
+ teleopSample/media/wipe_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
201
+ teleopSample/media/wipe_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
202
+ teleopSample/media/wipe_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
203
+ teleopSample/media/wipe_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
204
+ teleopSample/media/wipe_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
205
+ teleopSample/media/wipe_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
206
+ teleopSample/media/wipe_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
207
+ teleopSample/media/wipe_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
208
+ teleopSample/media/wipe_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
209
+ teleopSample/cover.jpg filter=lfs diff=lfs merge=lfs -text
210
+ teleopSample/ep0/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
211
+ teleopSample/ep0/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
212
+ teleopSample/ep1/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
213
+ teleopSample/ep1/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
214
+ teleopSample/ep2/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
215
+ teleopSample/ep2/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
216
+ teleopSample/ep3/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
217
+ teleopSample/ep3/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
218
+ teleopSample/ep4/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
219
+ teleopSample/ep4/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
220
+ teleopSample/ep5/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
221
+ teleopSample/ep5/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
222
+ teleopSample/faberU/**/*.mp4 filter=lfs diff=lfs merge=lfs -text
223
+ egoSample/media/craft_20260629_sticker_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
224
+ egoSample/media/craft_20260629_sticker_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
225
+ egoSample/epdata/restock_20260916_ep000.js filter=lfs diff=lfs merge=lfs -text
226
+ egoSample/media/restock_20260916_ep000/head_color.mp4 filter=lfs diff=lfs merge=lfs -text
227
+ egoSample/media/restock_20260916_ep000/head_depth.mp4 filter=lfs diff=lfs merge=lfs -text
228
+ egoSample/media/restock_20260916_ep000/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
229
+ egoSample/media/restock_20260916_ep000/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
230
+ egoSample/media/restock_20260916_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
231
+ egoSample/media/restock_20260916_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
232
+ egoSample/epdata/restock_20260916_ep000.core filter=lfs diff=lfs merge=lfs -text
233
+ egoSample/epdata/restock_20260916_ep000.map filter=lfs diff=lfs merge=lfs -text
234
+ egoSample/epdata/restock_20260916_ep000.scans filter=lfs diff=lfs merge=lfs -text
235
+ egoSample/epdata/restock_20260916_ep000.dgrid filter=lfs diff=lfs merge=lfs -text
236
+ egoSample/media/garment_sewing_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
237
+ egoSample/media/garment_sewing_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
238
+ egoSample/media/electronic_assembly_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
239
+ egoSample/media/electronic_assembly_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
240
+ egoSample/media/hand_sewing_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
241
+ egoSample/media/hand_sewing_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
242
+ egoSample/media/hand_sewing_ep000/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
243
+ egoSample/media/hand_sewing_ep000/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
244
+ covers/teleopSample.jpg filter=lfs diff=lfs merge=lfs -text
245
+ covers/egoSample.jpg filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: TeleopSample Viewer
3
+ emoji: 😻
4
+ colorFrom: yellow
5
+ colorTo: yellow
6
+ sdk: static
7
+ pinned: false
8
+ hf_oauth: true
9
+ hf_oauth_scopes:
10
+ - gated-repos
11
+ hf_oauth_expiration_minutes: 10080
12
+ ---
13
+
14
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
covers/egoSample.jpg ADDED

Git LFS Details

  • SHA256: 83e4f3fd67e775fc2a64276e6852dace7c9a43c86e99aa986aeab3e5ae643536
  • Pointer size: 131 Bytes
  • Size of remote file: 178 kB
covers/motionSample.jpg ADDED
covers/teleopSample.jpg ADDED

Git LFS Details

  • SHA256: cef74e87819ac48a3244ea23c26b2a218943468788e30c82cf6f17c16774f62a
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
egoSample/ego-legacy/demo02/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/ego-legacy/demo05/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/ego-legacy/demo07/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/ego-legacy/demo08/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/ego-legacy/demo09/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/ego-legacy/demo10/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/faberu.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/index.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/jizhi.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/mego.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
egoSample/stereogs.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
gate.html ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Sample Viewer Access</title>
7
+ <style>
8
+ :root{color-scheme:dark}*{box-sizing:border-box}
9
+ body{margin:0;background:#0b0d12;color:#e6e8ee;font:15px/1.55 -apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
10
+ a{color:#7fb2ff}
11
+ .wrap{max-width:760px;margin:0 auto;padding:28px 16px 64px}
12
+ .back{font-size:13px;color:#9aa1ad;text-decoration:none}
13
+ h1{font-size:23px;margin:10px 0 6px}
14
+ .sub{color:#9aa1ad;font-size:14px;margin:0 0 18px}
15
+ .gate{background:#12151c;border:1px solid #232733;border-radius:12px;padding:22px}
16
+ .gate p{margin:0 0 12px}
17
+ .btn{display:inline-block;background:#1b2740;color:#7fb2ff;border:1px solid #2c3d63;border-radius:8px;padding:9px 16px;font:inherit;cursor:pointer;text-decoration:none;margin:4px 8px 4px 0}
18
+ .btn:hover{border-color:#7fb2ff}
19
+ .who{font-size:13px;color:#9aa1ad}.who button{background:none;border:0;color:#7fb2ff;cursor:pointer;font:inherit;padding:0}
20
+ code{font:13px ui-monospace,Menlo,monospace;background:#1b2030;padding:1px 5px;border-radius:4px}
21
+ </style>
22
+ </head>
23
+ <body>
24
+ <div class="wrap">
25
+ <a class="back" href="index.html">← All data sample viewers</a>
26
+ <h1 id="title">Data sample viewer</h1>
27
+ <p class="sub">These previews are available to approved Hugging Face accounts.</p>
28
+ <div class="gate" id="gate"><p>Checking access…</p></div>
29
+ </div>
30
+ <script type="module">
31
+ import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.11.2/+esm";
32
+
33
+ const SECTIONS = {
34
+ egoSample: { repo: 'faradayfuture/egoSample', name: 'Ego Sample' },
35
+ teleopSample: { repo: 'faradayfuture/teleopSample', name: 'Teleop Sample' },
36
+ motionSample: { repo: 'faradayfuture/motionSample', name: 'Motion Sample' },
37
+ };
38
+ const KEYS = ['sv_oauth', 'sceneSample_oauth'];
39
+ const SELF = location.origin + location.pathname;
40
+ const inFrame = window.top !== window.self;
41
+ const gate = document.getElementById('gate');
42
+ const qs = new URLSearchParams(location.search);
43
+
44
+ let to = qs.get('to');
45
+ if (to) { if (location.hash && !to.includes('#')) to += location.hash; try { localStorage.setItem('sv_next', to); } catch (e) {} }
46
+ else { try { to = localStorage.getItem('sv_next'); } catch (e) {} }
47
+ if (!to || !/^\/(egoSample|teleopSample|motionSample)(\/|$)/.test(to.split('#')[0])) to = '/egoSample/index.html';
48
+ const sec = to.split('/')[1];
49
+ const S = SECTIONS[sec];
50
+ const DATASET = 'https://huggingface.co/datasets/' + S.repo;
51
+ document.getElementById('title').textContent = S.name + ' viewer';
52
+ document.title = S.name + ' · access';
53
+
54
+ const show = html => { gate.innerHTML = html; };
55
+ function session() {
56
+ for (const k of KEYS) {
57
+ try { const s = JSON.parse(localStorage.getItem(k) || 'null');
58
+ if (s && s.accessToken && (!s.accessTokenExpiresAt || new Date(s.accessTokenExpiresAt) > new Date())) return s; } catch (e) {}
59
+ }
60
+ return null;
61
+ }
62
+ function save(s) { for (const k of KEYS) { try { localStorage.setItem(k, JSON.stringify(s)); } catch (e) {} } }
63
+ function clear() { for (const k of KEYS) { try { localStorage.removeItem(k); } catch (e) {} } }
64
+
65
+ async function worker() {
66
+ if (!('serviceWorker' in navigator)) throw new Error('This browser does not support service workers.');
67
+ const reg = await navigator.serviceWorker.register('/sw.js', { scope: '/' });
68
+ await navigator.serviceWorker.ready;
69
+ if (!navigator.serviceWorker.controller)
70
+ await new Promise(r => { navigator.serviceWorker.addEventListener('controllerchange', r, { once: true }); setTimeout(r, 3000); });
71
+ return reg;
72
+ }
73
+ async function sendToken(reg, tokenValue) {
74
+ const sw = reg.active || navigator.serviceWorker.controller;
75
+ await new Promise(r => {
76
+ const on = ev => { if (ev.data && ev.data.type === 'token-ok') { navigator.serviceWorker.removeEventListener('message', on); r(); } };
77
+ navigator.serviceWorker.addEventListener('message', on);
78
+ sw.postMessage({ type: 'token', token: tokenValue });
79
+ setTimeout(r, 2000);
80
+ });
81
+ }
82
+
83
+ function who(s) {
84
+ const n = (s.userInfo && (s.userInfo.preferred_username || s.userInfo.name)) || 'signed in';
85
+ return `<p class="who">Signed in as <b>${n}</b> · <button id="signout">Sign out</button></p>`;
86
+ }
87
+ function wireSignOut(reg) {
88
+ const b = document.getElementById('signout');
89
+ if (b) b.onclick = async () => { clear(); if (reg) await sendToken(reg, null); location.href = SELF + '?to=' + encodeURIComponent(to); };
90
+ }
91
+ async function signIn() {
92
+ const vars = (window.huggingface && window.huggingface.variables) || {};
93
+ location.href = (await oauthLoginUrl({ scopes: 'openid profile gated-repos', redirectUrl: SELF, clientId: vars.OAUTH_CLIENT_ID })) + '&prompt=consent';
94
+ }
95
+ function askLogin() {
96
+ if (inFrame) {
97
+ show(`<p>Sign-in opens in a new tab.</p><a class="btn" href="${SELF}?to=${encodeURIComponent(to)}" target="_blank" rel="noopener">Open in a new tab to sign in ↗</a>`);
98
+ return;
99
+ }
100
+ show(`<p>Sign in with Hugging Face. If your account has not been approved yet, request access on the dataset page first.</p>
101
+ <button class="btn" id="signin">Sign in with Hugging Face</button>
102
+ <a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
103
+ document.getElementById('signin').onclick = signIn;
104
+ }
105
+
106
+ async function main() {
107
+ let s = session();
108
+ if (!s) {
109
+ try { const r = await oauthHandleRedirectIfPresent(); if (r) { save(r); s = r; history.replaceState(null, '', SELF); } } catch (e) { console.warn(e); }
110
+ }
111
+ if (!s) return askLogin();
112
+
113
+ let reg;
114
+ try { reg = await worker(); await sendToken(reg, s.accessToken); }
115
+ catch (e) { show(`<p>${e.message}</p><p>Please open this page in a current version of Chrome, Edge, Safari or Firefox.</p>`); return; }
116
+
117
+ const r = await fetch(`https://huggingface.co/datasets/${S.repo}/resolve/main/viewer/${sec}/index.html`, { headers: { Authorization: 'Bearer ' + s.accessToken }, cache: 'no-store' }).catch(() => null);
118
+ if (r && r.ok) { try { localStorage.removeItem('sv_next'); } catch (e) {} location.replace(to); return; }
119
+ if (r && r.status === 401) { clear(); await sendToken(reg, null); return askLogin(); }
120
+ show(who(s) + `<p>Your account does not have access to the ${S.name} yet. Request access on the dataset page; once it is approved, reload this page.</p>
121
+ <a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>
122
+ <button class="btn" id="retry">Reload</button>`);
123
+ wireSignOut(reg);
124
+ document.getElementById('retry').onclick = () => location.reload();
125
+ }
126
+ main();
127
+ </script>
128
+ </body>
129
+ </html>
index.html ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html><html lang="en"><head><script>window.huggingface={variables:{"SPACE_CREATOR_USER_ID":"693d2ab492589ea93c96c4e5"}};</script><meta charset="utf-8">
2
+ <title>Faraday Future — Data Sample Viewers</title><style>
3
+ :root{color-scheme:dark}*{box-sizing:border-box}
4
+ body{margin:0;background:#0b0d12;color:#e6e8ee;font-family:-apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
5
+ header{padding:26px 28px 6px}h1{margin:0 0 5px;font-size:23px}.sub{color:#9aa1ad;font-size:13px}
6
+ .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;padding:18px 28px 44px;max-width:1800px}
7
+ .card{background:#12151c;border:1px solid #232733;border-radius:12px;overflow:hidden;text-decoration:none;color:inherit;transition:border-color .15s,transform .15s}
8
+ .card:hover{border-color:#3a4a6a;transform:translateY(-2px)}
9
+ .card img{width:100%;aspect-ratio:16/10;object-fit:cover;background:#000;display:block}
10
+ .card .m{padding:14px 16px 16px}
11
+ .card .t{font-size:17px;margin:0 0 6px;font-weight:600}
12
+ .card .r{font-size:12.5px;color:#9aa1ad;line-height:1.5}
13
+ .card .tag{display:inline-block;background:#1b2740;color:#7fb2ff;border-radius:5px;padding:2px 8px;font-size:11px;font-family:ui-monospace,monospace;margin-top:9px}
14
+ @media(max-width:1400px){.grid{grid-template-columns:repeat(2,1fr);max-width:1100px}}
15
+ @media(max-width:760px){.grid{grid-template-columns:1fr}}
16
+ </style></head><body>
17
+ <header><h1>Faraday Future · EAI Data Sample Viewers</h1>
18
+ <div class="sub">Interactive previews of embodied-AI data samples. Pick a dataset to explore.</div></header>
19
+ <div class="grid">
20
+ <a class="card" href="teleopSample/index.html">
21
+ <img src="covers/teleopSample.jpg" alt="Teleop Sample">
22
+ <div class="m"><div class="t">Teleop Sample</div>
23
+ <div class="r">Dual-arm real-robot teleoperation · 22 episodes.<br>Faber U gripper (8 scenes) + Futurist dexterous hand. Multi-camera video + depth, joint / end-effector / gripper / tactile charts, instruction segments.</div>
24
+ <span class="tag">LeRobot · Faber U + Futurist · 22 episodes</span></div>
25
+ </a>
26
+ <a class="card" href="egoSample/index.html">
27
+ <img src="covers/egoSample.jpg" alt="Ego Sample">
28
+ <div class="m"><div class="t">Ego Sample</div>
29
+ <div class="r">Head-mounted first-person capture from 3 rigs (PICO stereo, MEgo 5-cam, Stereo GS) · 12 tasks.<br>Synced multi-view video, head IMU / pose, 3D hand-pose where the rig provides it, temporal skill spans.</div>
30
+ <span class="tag">ego-rgb · 12 tasks · 3 rigs</span></div>
31
+ </a>
32
+ <a class="card" href="sceneSample/index.html">
33
+ <img src="sceneSample/cover.jpg" alt="Scene Sample">
34
+ <div class="m"><div class="t">Scene Sample</div>
35
+ <div class="r">Video paired with 3D scenes and the code that reproduces them &middot; 4 samples.<br>Native 3D (simulation, procedural Blender) and real-world video with reconstructed scenes and motion.</div>
36
+ <span class="tag">3D &middot; code &harr; video &middot; access by approval</span></div>
37
+ </a>
38
+ <a class="card" href="motionSample/index.html">
39
+ <img src="covers/motionSample.jpg" alt="Motion Sample">
40
+ <div class="m"><div class="t">Motion Sample</div>
41
+ <div class="r">FF Master 31-DoF whole-body motion references &middot; 2 clips.<br>URDF forward-kinematics playback, per-joint coordinate frames, joint-angle charts, PHC-format download.</div>
42
+ <span class="tag">PHC pickle &middot; Master &middot; 2 clips</span></div>
43
+ </a>
44
+ </div>
45
+ </body></html>
motionSample/index.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
sceneSample/b2/viewer.html ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Robot Ego Reconstruction</title>
7
+ <style>
8
+ :root{--bg:#111110;--panel:rgba(24,24,22,.86);--ink:#ecebe6;--muted:#9a988f;--line:#3a3935;--accent:#7d9cf0;--left:#5aa9ff;--right:#ff9f43}
9
+ *{box-sizing:border-box}
10
+ html,body{margin:0;height:100%;background:var(--bg);color:var(--ink);font:13px/1.45 -apple-system,"Helvetica Neue",sans-serif;overflow:hidden}
11
+ #view{position:fixed;inset:0}
12
+ .panel{position:fixed;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px;backdrop-filter:blur(6px)}
13
+ #info{top:12px;left:12px;max-width:360px}
14
+ #info h1{font-size:15px;margin:0 0 4px}
15
+ #info .stat{color:var(--muted)}
16
+ #info .badges{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0}
17
+ #info .badges span{background:#2a2a27;border-radius:5px;padding:1px 6px;font-size:11.5px}
18
+ #layers{margin-top:6px;display:flex;gap:6px;flex-wrap:wrap}
19
+ button{background:#2a2a27;color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:4px 9px;font:inherit;cursor:pointer}
20
+ button.on{border-color:var(--accent);color:var(--accent)}
21
+ #pip{top:12px;right:12px;width:min(36vw,420px);padding:6px}
22
+ #pip video{width:100%;display:block;border-radius:6px;background:#000}
23
+ #pip .cap{color:var(--muted);font-size:11.5px;margin-top:3px}
24
+ #bar{left:12px;right:12px;bottom:12px;display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center}
25
+ #bar input[type=range]{width:100%}
26
+ #chart{grid-column:1 / -1;width:100%;height:56px;display:block}
27
+ #time{font-variant-numeric:tabular-nums;color:var(--muted);min-width:110px;text-align:right}
28
+ .legend{display:flex;gap:12px;color:var(--muted);font-size:11.5px;margin-top:4px}
29
+ .legend i{display:inline-block;width:10px;height:3px;vertical-align:middle;margin-right:4px}
30
+ #msg{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--muted)}
31
+ @media (max-width:720px){#pip{width:46vw}#info{max-width:50vw;font-size:12px}}
32
+ </style>
33
+ <script src="../ss.js"></script><script>addEventListener("DOMContentLoaded",()=>SS.hydrate())</script>
34
+ <script type="importmap">
35
+ {"imports":{"three":"https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js",
36
+ "three/addons/":"https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/"}}
37
+ </script>
38
+ </head>
39
+ <body>
40
+ <div id="view"></div>
41
+ <div id="msg">Loading point cloud…</div>
42
+ <div class="panel" id="info">
43
+ <h1>Robot egocentric · shelf restocking → 3D scene + action</h1>
44
+ <div class="stat" id="stats"></div>
45
+ <div class="badges"><span>metric depth</span><span>full calibration</span><span>loop-closure de-drift</span><span>moving arm removed</span><span>1920px stereo colour</span></div>
46
+ <div>Scene points</div>
47
+ <div id="layers">
48
+ <button data-layer="rgb" class="on">RGB</button>
49
+ <button data-layer="lidar">LiDAR height</button>
50
+ <button data-layer="none">Hide</button>
51
+ </div>
52
+ <div style="margin-top:8px">View</div>
53
+ <div id="views" style="display:flex;gap:6px;margin-top:4px;flex-wrap:wrap">
54
+ <button data-view="orbit">Overview</button>
55
+ <button data-view="top">Top</button>
56
+ <button data-view="follow">Follow robot</button>
57
+ </div>
58
+ <div class="legend"><span><i style="background:var(--left)"></i>Left end-effector</span><span><i style="background:var(--right)"></i>Right end-effector</span><span><i style="background:#9be29b"></i>Base</span></div>
59
+ </div>
60
+ <div class="panel" id="pip">
61
+ <video id="vid" data-ss-src="b2/data/head_stereo_left.mp4" muted playsinline preload="auto"></video>
62
+ <div class="cap">Head stereo-left camera (faces blurred), synced with the 3D timeline</div>
63
+ </div>
64
+ <div class="panel" id="bar">
65
+ <button id="play">▶ Play</button>
66
+ <input id="slider" type="range" min="0" max="2411" value="0" step="1">
67
+ <span id="time">0.0 s</span>
68
+ <canvas id="chart"></canvas>
69
+ </div>
70
+ <script type="module">
71
+ import * as THREE from 'three';
72
+ import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
73
+ import { PLYLoader } from 'three/addons/loaders/PLYLoader.js';
74
+
75
+ const V = '?v=1';
76
+ const view = document.getElementById('view');
77
+ const renderer = new THREE.WebGLRenderer({ antialias: true });
78
+ renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
79
+ renderer.setSize(innerWidth, innerHeight);
80
+ view.appendChild(renderer.domElement);
81
+ const scene = new THREE.Scene();
82
+ scene.background = new THREE.Color(0x111110);
83
+ const camera = new THREE.PerspectiveCamera(55, innerWidth / innerHeight, 0.02, 200);
84
+ camera.up.set(0, 0, 1);
85
+ const controls = new OrbitControls(camera, renderer.domElement);
86
+ controls.enableDamping = true;
87
+ scene.add(new THREE.GridHelper(12, 24, 0x333331, 0x222220).rotateX(Math.PI / 2));
88
+
89
+ const [action, stats] = await Promise.all([
90
+ fetch('data/action.json' + V).then(r => r.json()),
91
+ fetch('data/recon_stats.json' + V).then(r => r.json())
92
+ ]);
93
+ const F = action.frames, N = F.length, FPS = action.fps;
94
+ document.getElementById('stats').innerHTML =
95
+ `${stats.duration_s}s · ${N} frames @${FPS}Hz �� scene ${(stats.scene_points / 1e6).toFixed(2)}M points<br>` +
96
+ `base path ${stats.base_path_m}m · right EE path ${stats.right_ee_path_m}m · drift residual ${stats.residual_before_cm}→${stats.residual_after_cm}cm`;
97
+
98
+ // point clouds
99
+ const loader = new PLYLoader();
100
+ function brighten(geo, k) {
101
+ const c = geo.getAttribute('color');
102
+ if (!c) return;
103
+ for (let i = 0; i < c.array.length; i++) c.array[i] = Math.min(1, c.array[i] * k);
104
+ c.needsUpdate = true;
105
+ }
106
+ const clouds = {};
107
+ function loadCloud(name, file, size, k) {
108
+ return new Promise((res, rej) => loader.load(file + V, geo => {
109
+ brighten(geo, k);
110
+ const pts = new THREE.Points(geo, new THREE.PointsMaterial({ size, vertexColors: true, sizeAttenuation: true }));
111
+ clouds[name] = pts; scene.add(pts); res(pts);
112
+ }, undefined, rej));
113
+ }
114
+ await loadCloud('rgb', 'data/scene_rgb.ply', 0.012, 1.7).catch(e => { document.getElementById('msg').textContent = 'Failed to load point cloud (serve this folder over http, see README): ' + e; });
115
+ document.getElementById('msg').remove();
116
+ loadCloud('lidar', 'data/scene.ply', 0.02, 1.0).then(p => { p.visible = false; });
117
+
118
+ // trajectories
119
+ function line(key, color) {
120
+ const pos = new Float32Array(N * 3);
121
+ F.forEach((f, i) => pos.set(f[key], i * 3));
122
+ const g = new THREE.BufferGeometry(); g.setAttribute('position', new THREE.BufferAttribute(pos, 3));
123
+ g.setDrawRange(0, 1);
124
+ const l = new THREE.Line(g, new THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.9 }));
125
+ scene.add(l); return l;
126
+ }
127
+ const baseZ = 0.02;
128
+ const basePos = F.map(f => [f.base[0], f.base[1], baseZ]);
129
+ const lineL = line('ee_l', 0x5aa9ff), lineR = line('ee_r', 0xff9f43);
130
+ const baseGeo = new THREE.BufferGeometry();
131
+ baseGeo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(basePos.flat()), 3));
132
+ const lineB = new THREE.Line(baseGeo, new THREE.LineBasicMaterial({ color: 0x9be29b })); scene.add(lineB);
133
+
134
+ // gripper markers: two jaws whose gap follows the gripper opening
135
+ function gripper(color) {
136
+ const g = new THREE.Group();
137
+ const m = new THREE.MeshBasicMaterial({ color });
138
+ const palm = new THREE.Mesh(new THREE.BoxGeometry(0.05, 0.02, 0.02), m);
139
+ const j1 = new THREE.Mesh(new THREE.BoxGeometry(0.012, 0.012, 0.06), m);
140
+ const j2 = j1.clone();
141
+ g.add(palm, j1, j2); g.userData = { j1, j2 }; scene.add(g); return g;
142
+ }
143
+ const gL = gripper(0x5aa9ff), gR = gripper(0xff9f43);
144
+ const robot = new THREE.Group();
145
+ const body = new THREE.Mesh(new THREE.BoxGeometry(0.55, 0.45, 0.04), new THREE.MeshBasicMaterial({ color: 0x9be29b, wireframe: true }));
146
+ body.position.z = 0.03;
147
+ const nose = new THREE.Mesh(new THREE.ConeGeometry(0.06, 0.16, 12), new THREE.MeshBasicMaterial({ color: 0x9be29b }));
148
+ nose.rotation.z = -Math.PI / 2; nose.position.set(0.34, 0, 0.03);
149
+ robot.add(body, nose); scene.add(robot);
150
+
151
+ const q = new THREE.Quaternion();
152
+ function setFrame(i) {
153
+ const f = F[i];
154
+ for (const [g, p, qq, open] of [[gL, f.ee_l, f.q_l, f.grip_l], [gR, f.ee_r, f.q_r, f.grip_r]]) {
155
+ g.position.set(...p);
156
+ q.set(qq[0], qq[1], qq[2], qq[3]); g.quaternion.copy(q);
157
+ const gap = 0.012 + 0.04 * open;
158
+ g.userData.j1.position.set(-gap, 0, 0.03); g.userData.j2.position.set(gap, 0, 0.03);
159
+ }
160
+ robot.position.set(f.base[0], f.base[1], 0); robot.rotation.z = f.base[2];
161
+ lineL.geometry.setDrawRange(0, i + 1); lineR.geometry.setDrawRange(0, i + 1);
162
+ baseGeo.setDrawRange(0, i + 1);
163
+ slider.value = i;
164
+ timeEl.textContent = `${f.t.toFixed(1)} s · #${i}`;
165
+ drawChart(i);
166
+ if (mode === 'follow') follow(f);
167
+ }
168
+
169
+ // gripper chart
170
+ const chart = document.getElementById('chart'), ctx = chart.getContext('2d');
171
+ function drawChart(i) {
172
+ const w = chart.width = chart.clientWidth * devicePixelRatio, h = chart.height = chart.clientHeight * devicePixelRatio;
173
+ ctx.clearRect(0, 0, w, h);
174
+ ctx.fillStyle = '#9a988f'; ctx.font = `${10 * devicePixelRatio}px sans-serif`;
175
+ ctx.fillText('Gripper opening (up = open)', 4, 11 * devicePixelRatio);
176
+ for (const [key, col] of [['grip_l', '#5aa9ff'], ['grip_r', '#ff9f43']]) {
177
+ ctx.strokeStyle = col; ctx.lineWidth = 1.5 * devicePixelRatio; ctx.beginPath();
178
+ F.forEach((f, k) => { const x = k / (N - 1) * w, y = h - 3 - f[key] * (h - 16); k ? ctx.lineTo(x, y) : ctx.moveTo(x, y); });
179
+ ctx.stroke();
180
+ }
181
+ ctx.strokeStyle = '#ecebe6'; ctx.lineWidth = 1 * devicePixelRatio;
182
+ const x = i / (N - 1) * w; ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, h); ctx.stroke();
183
+ }
184
+ chart.addEventListener('click', e => seek(Math.round(e.offsetX / chart.clientWidth * (N - 1))));
185
+
186
+ // timeline + video sync (video is the clock while playing)
187
+ const slider = document.getElementById('slider'), timeEl = document.getElementById('time');
188
+ const vid = document.getElementById('vid'), playBtn = document.getElementById('play');
189
+ let frame = 0, playing = false;
190
+ function seek(i) { frame = Math.max(0, Math.min(N - 1, i)); vid.currentTime = (frame + 0.5) / FPS; setFrame(frame); }
191
+ slider.addEventListener('input', () => seek(+slider.value));
192
+ playBtn.onclick = () => {
193
+ playing = !playing;
194
+ playBtn.textContent = playing ? '❚❚ Pause' : '▶ Play';
195
+ if (playing) { if (frame >= N - 1) seek(0); vid.play().catch(() => {}); } else vid.pause();
196
+ };
197
+ vid.addEventListener('ended', () => { playing = false; playBtn.textContent = '▶ Play'; });
198
+
199
+ // cameras
200
+ let mode = 'orbit';
201
+ function setView(m) {
202
+ mode = m;
203
+ document.querySelectorAll('#views button').forEach(b => b.classList.toggle('on', b.dataset.view === m));
204
+ const c = new THREE.Vector3(0.6, 0.2, 0.8);
205
+ if (m === 'orbit') { camera.position.set(-2.6, -3.4, 3.0); controls.target.copy(c); }
206
+ if (m === 'top') { camera.position.set(0.6, 0.15, 7.5); controls.target.set(0.6, 0.2, 0); }
207
+ if (m === 'follow') follow(F[frame], true);
208
+ }
209
+ function follow(f, jump) {
210
+ const [x, y, yaw] = f.base;
211
+ const target = new THREE.Vector3(x + Math.cos(yaw) * 0.9, y + Math.sin(yaw) * 0.9, 0.85);
212
+ const eye = new THREE.Vector3(x - Math.cos(yaw) * 1.6, y - Math.sin(yaw) * 1.6, 1.9);
213
+ if (jump) { camera.position.copy(eye); controls.target.copy(target); return; }
214
+ camera.position.lerp(eye, 0.08); controls.target.lerp(target, 0.08);
215
+ }
216
+ document.querySelectorAll('#views button').forEach(b => b.onclick = () => setView(b.dataset.view));
217
+ document.querySelectorAll('#layers button').forEach(b => b.onclick = () => {
218
+ document.querySelectorAll('#layers button').forEach(x => x.classList.toggle('on', x === b));
219
+ for (const [k, p] of Object.entries(clouds)) p.visible = (k === b.dataset.layer);
220
+ });
221
+
222
+ setView('orbit'); setFrame(0);
223
+ addEventListener('resize', () => {
224
+ camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix();
225
+ renderer.setSize(innerWidth, innerHeight); drawChart(frame);
226
+ });
227
+ renderer.setAnimationLoop(() => {
228
+ if (playing) {
229
+ const i = Math.min(N - 1, Math.floor(vid.currentTime * FPS));
230
+ if (i !== frame) { frame = i; setFrame(i); }
231
+ }
232
+ controls.update();
233
+ renderer.render(scene, camera);
234
+ });
235
+ </script>
236
+ </body>
237
+ </html>
sceneSample/cover.jpg ADDED
sceneSample/index.html ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Scene Sample</title>
7
+ <script type="module" src="https://unpkg.com/@google/model-viewer@3.5.0/dist/model-viewer.min.js"></script>
8
+ <script src="ss.js"></script>
9
+ <style>
10
+ :root{color-scheme:dark;--bg:#0b0d12;--surface:#12151c;--ink:#e6e8ee;--muted:#9aa1ad;--line:#232733;--accent:#7fb2ff;--good:#4cc282;--warn:#e0a84a;--chip:#1b2030}
11
+ *{box-sizing:border-box}
12
+ body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.55 -apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
13
+ a{color:var(--accent)}
14
+ .wrap{max-width:1280px;margin:0 auto;padding:22px 16px 64px}
15
+ .back{font-size:13px;color:var(--muted);text-decoration:none}
16
+ h1{font-size:24px;margin:10px 0 4px}h2{font-size:19px;margin:0}
17
+ .sub{color:var(--muted);margin:0 0 18px;max-width:900px;font-size:14px}
18
+ .gate{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:22px;max-width:720px}
19
+ .gate p{margin:0 0 12px}
20
+ .gate .btn{display:inline-block;background:#1b2740;color:var(--accent);border:1px solid #2c3d63;border-radius:8px;padding:9px 16px;font:inherit;cursor:pointer;text-decoration:none;margin:4px 8px 4px 0}
21
+ .gate .btn:hover{border-color:var(--accent)}
22
+ .who{font-size:13px;color:var(--muted);margin:0 0 16px}.who button{background:none;border:0;color:var(--accent);cursor:pointer;font:inherit;padding:0}
23
+ nav{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 20px}
24
+ nav a{padding:6px 12px;border:1px solid var(--line);border-radius:999px;color:var(--ink);text-decoration:none;background:var(--surface);font-size:13.5px}
25
+ nav a:hover{border-color:var(--accent)}
26
+ .tablewrap{overflow-x:auto;background:var(--surface);border:1px solid var(--line);border-radius:12px;margin-bottom:30px}
27
+ table{border-collapse:collapse;width:100%;min-width:980px;font-size:13.5px}
28
+ th,td{padding:9px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
29
+ th{background:var(--chip);font-weight:600}td:first-child{font-weight:600;white-space:nowrap}tr:last-child td{border-bottom:0}
30
+ .y{color:var(--good)}.p{color:var(--warn)}
31
+ .card{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:20px;margin:0 0 26px}
32
+ .head{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:6px}
33
+ .tag{font-size:11.5px;padding:2px 8px;border-radius:5px;font-family:ui-monospace,monospace}
34
+ .tag.a{background:#1b2740;color:var(--accent)}.tag.b{background:#16301f;color:var(--good)}
35
+ .desc{color:var(--muted);margin:0 0 14px}
36
+ .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:14px}
37
+ .grid.wide{grid-template-columns:1fr}
38
+ @media (max-width:520px){.grid{grid-template-columns:1fr}}
39
+ .mt{margin-top:14px}figure{margin:0}
40
+ figcaption{font-size:12.5px;color:var(--muted);margin-top:4px}
41
+ video,img{width:100%;border-radius:8px;background:#000;display:block;min-height:60px}
42
+ model-viewer{width:100%;height:420px;border-radius:8px;background:var(--chip)}
43
+ iframe.embed{width:100%;height:620px;border:0;border-radius:8px;background:#111}
44
+ .load3d,.loadframe{width:100%;height:420px;border-radius:8px;border:1px dashed #33405a;background:var(--chip) center/cover;color:var(--ink);font:inherit;font-size:15px;cursor:pointer;text-shadow:0 1px 4px #000;padding:12px}
45
+ .loadframe[data-h="480"]{height:220px}
46
+ details{margin-top:14px}summary{cursor:pointer;color:var(--accent)}
47
+ pre.code{max-height:520px;overflow:auto;background:#0e1118;border:1px solid var(--line);border-radius:8px;padding:12px;font:12px/1.45 ui-monospace,Menlo,monospace;white-space:pre}
48
+ .cols{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:14px}
49
+ @media (max-width:760px){.cols{grid-template-columns:1fr}}
50
+ .cols h3{font-size:14px;margin:0 0 4px}.cols ul{margin:0;padding-left:18px;color:var(--muted);font-size:14px}
51
+ .dl{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--line);font-size:13.5px}
52
+ .dl .dlk{font-size:11.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
53
+ .dl a{color:#7fe0a0;text-decoration:none}.dl a:hover{text-decoration:underline}
54
+ .cpy{background:#1b2740;color:var(--accent);border:1px solid #2c3d63;border-radius:6px;padding:4px 10px;font:12.5px inherit;cursor:pointer}
55
+ code{font:12.5px ui-monospace,Menlo,monospace;background:var(--chip);padding:1px 5px;border-radius:4px}
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <div class="wrap">
60
+ <a class="back" href="../index.html">← All data sample viewers</a>
61
+ <h1>Scene Sample · video ↔ 3D scene + code</h1>
62
+ <p class="sub">Paired 3D samples in two families. <b>A</b>: native 3D, where code and assets render the video exactly. <b>B</b>: real-world video paired with a reconstructed 3D scene and motion. Access is by approval.</p>
63
+ <div id="gate" class="gate"><p>Checking access…</p></div>
64
+ <div id="app" hidden></div>
65
+ </div>
66
+
67
+ <script type="module">
68
+ import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.11.2/+esm";
69
+
70
+ const gate = document.getElementById('gate'), app = document.getElementById('app');
71
+ const DATASET = 'https://huggingface.co/datasets/' + SS.REPO;
72
+ const SELF = location.origin + location.pathname;
73
+ const inFrame = window.top !== window.self;
74
+
75
+ function show(html) { gate.innerHTML = html; gate.hidden = false; }
76
+
77
+ async function signIn() {
78
+ const vars = (window.huggingface && window.huggingface.variables) || {};
79
+ location.href = (await oauthLoginUrl({ scopes: 'openid profile gated-repos', redirectUrl: SELF, clientId: vars.OAUTH_CLIENT_ID })) + '&prompt=consent';
80
+ }
81
+
82
+ function askLogin() {
83
+ if (inFrame) {
84
+ show(`<p>This preview is available to approved Hugging Face accounts.</p>
85
+ <a class="btn" href="${SELF}" target="_blank" rel="noopener">Open in a new tab to sign in ↗</a>`);
86
+ return;
87
+ }
88
+ show(`<p>This preview is available to approved Hugging Face accounts. Sign in with Hugging Face; if you have not been approved yet, request access on the dataset page first.</p>
89
+ <button class="btn" id="signin">Sign in with Hugging Face</button>
90
+ <a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
91
+ document.getElementById('signin').onclick = signIn;
92
+ }
93
+
94
+ function signOutLink(s) {
95
+ const name = (s.userInfo && (s.userInfo.preferred_username || s.userInfo.name)) || 'signed in';
96
+ return `<p class="who">Signed in as <b>${name}</b> · <button id="signout">Sign out</button></p>`;
97
+ }
98
+ function wireSignOut() {
99
+ const b = document.getElementById('signout');
100
+ if (b) b.onclick = () => { SS.clear(); location.href = SELF; };
101
+ }
102
+
103
+ async function main() {
104
+ let s = SS.session();
105
+ if (!s) {
106
+ try {
107
+ const r = await oauthHandleRedirectIfPresent();
108
+ if (r) { SS.save(r); s = r; history.replaceState(null, '', SELF); }
109
+ } catch (e) { console.warn(e); }
110
+ }
111
+ if (!s) return askLogin();
112
+
113
+ let html;
114
+ try { html = await (await SS.get('content.html')).text(); }
115
+ catch (e) {
116
+ if (e.status === 401) { SS.clear(); return askLogin(); }
117
+ show(signOutLink(s) + `<p>Your account does not have access yet. Request access on the dataset page; once it is approved, reload this page.</p>
118
+ <a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
119
+ return wireSignOut();
120
+ }
121
+
122
+ gate.hidden = true;
123
+ app.innerHTML = signOutLink(s) + `<nav>
124
+ <a href="#a1">A1 · Simulated robot, generated world</a><a href="#a2">A2 · Procedural scene from code</a>
125
+ <a href="#b1">B1 · Kitchen digital twin</a><a href="#b2">B2 · Robot egocentric</a><a href="#download">Download</a></nav>` + html;
126
+ app.hidden = false;
127
+ wireSignOut();
128
+ SS.hydrate(app);
129
+
130
+ app.querySelectorAll('.load3d').forEach(btn => btn.addEventListener('click', async () => {
131
+ btn.textContent = 'Loading…';
132
+ const mv = document.createElement('model-viewer');
133
+ mv.setAttribute('camera-controls', ''); mv.setAttribute('touch-action', 'pan-y');
134
+ mv.setAttribute('exposure', btn.dataset.exposure || '1.1');
135
+ if (btn.dataset.orbit) mv.setAttribute('camera-orbit', btn.dataset.orbit);
136
+ if (btn.dataset.orient) mv.setAttribute('orientation', btn.dataset.orient);
137
+ if (btn.dataset.target) { mv.setAttribute('camera-target', btn.dataset.target); mv.setAttribute('min-camera-orbit', 'auto auto 0.5m'); }
138
+ if (btn.dataset.maxr) mv.setAttribute('max-camera-orbit', 'auto auto ' + btn.dataset.maxr);
139
+ if (btn.dataset.fov) mv.setAttribute('field-of-view', btn.dataset.fov);
140
+ if (btn.dataset.env) mv.setAttribute('environment-image', btn.dataset.env);
141
+ try { mv.setAttribute('src', await SS.blobURL(btn.dataset.ssGlb)); btn.replaceWith(mv); }
142
+ catch (e) { btn.textContent = 'Could not load: ' + e.message; }
143
+ }));
144
+ app.querySelectorAll('.loadframe').forEach(btn => btn.addEventListener('click', () => {
145
+ const f = document.createElement('iframe');
146
+ f.className = 'embed'; f.src = btn.dataset.frame;
147
+ if (btn.dataset.h) f.style.height = btn.dataset.h + 'px';
148
+ btn.replaceWith(f);
149
+ }));
150
+ const det = document.getElementById('a2code');
151
+ if (det) det.addEventListener('toggle', async () => {
152
+ const pre = det.querySelector('pre');
153
+ if (!det.open || pre.dataset.done) return;
154
+ try { pre.textContent = await (await SS.get('a2/bedroom_scene.py')).text(); pre.dataset.done = 1; }
155
+ catch (e) { pre.textContent = 'Could not load: ' + e.message; }
156
+ });
157
+ app.querySelectorAll('.cpy').forEach(b => b.addEventListener('click', () => {
158
+ const label = b.textContent;
159
+ navigator.clipboard.writeText(b.dataset.cmd).then(() => { b.textContent = '✓ copied'; setTimeout(() => b.textContent = label, 1500); },
160
+ () => { prompt('Copy this command:', b.dataset.cmd); });
161
+ }));
162
+ if (location.hash) document.querySelector(location.hash)?.scrollIntoView();
163
+ }
164
+ main();
165
+ </script>
166
+ </body>
167
+ </html>
sceneSample/ss.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Shared loader for sceneSample: media lives in a gated dataset and is fetched
2
+ // with the viewer's own HF OAuth token (scope: gated-repos). Nothing here is secret.
3
+ (function () {
4
+ const REPO = 'faradayfuture/sceneSample';
5
+ const BASE = 'https://huggingface.co/datasets/' + REPO + '/resolve/main/';
6
+ const KEY = 'sceneSample_oauth';
7
+ const cache = new Map();
8
+
9
+ const KEYS = [KEY, 'sv_oauth']; // shared with the Sample Viewer sign-in page (gate.html)
10
+ function session() {
11
+ for (const k of KEYS) {
12
+ try {
13
+ const s = JSON.parse(localStorage.getItem(k) || 'null');
14
+ if (s && s.accessToken && (!s.accessTokenExpiresAt || new Date(s.accessTokenExpiresAt) > new Date())) return s;
15
+ } catch (e) {}
16
+ }
17
+ return null;
18
+ }
19
+ function save(s) { for (const k of KEYS) { try { localStorage.setItem(k, JSON.stringify(s)); } catch (e) {} } }
20
+ function clear() { for (const k of KEYS) { try { localStorage.removeItem(k); } catch (e) {} } }
21
+
22
+ const nativeFetch = window.fetch.bind(window);
23
+
24
+ async function get(path) {
25
+ const s = session();
26
+ const r = await nativeFetch(BASE + path, { headers: s ? { Authorization: 'Bearer ' + s.accessToken } : {} });
27
+ if (!r.ok) { const e = new Error(path + ' → HTTP ' + r.status); e.status = r.status; throw e; }
28
+ return r;
29
+ }
30
+ function blobURL(path) {
31
+ if (!cache.has(path)) cache.set(path, get(path).then(r => r.blob()).then(b => URL.createObjectURL(b)));
32
+ return cache.get(path);
33
+ }
34
+
35
+ // Map a URL on this Space under /sceneSample/ to a dataset path, else null.
36
+ function datasetPath(u) {
37
+ let url;
38
+ try { url = new URL(typeof u === 'string' ? u : u.url, location.href); } catch (e) { return null; }
39
+ if (url.origin !== location.origin) return null;
40
+ const m = url.pathname.match(/\/sceneSample\/((?:b2|b3)\/data\/.+)$/);
41
+ return m ? decodeURIComponent(m[1]) : null;
42
+ }
43
+ // Viewers keep their original relative fetches; redirect data files to the dataset.
44
+ window.fetch = function (u, opts) {
45
+ const p = datasetPath(u);
46
+ return p ? get(p) : nativeFetch(u, opts);
47
+ };
48
+
49
+ async function hydrate(root) {
50
+ const els = [...(root || document).querySelectorAll('[data-ss-src],[data-ss-poster],[data-ss-bg]')];
51
+ await Promise.all(els.map(async el => {
52
+ try {
53
+ if (el.dataset.ssPoster) el.poster = await blobURL(el.dataset.ssPoster);
54
+ if (el.dataset.ssBg) el.style.backgroundImage = 'url(' + await blobURL(el.dataset.ssBg) + ')';
55
+ if (el.dataset.ssSrc) el.src = await blobURL(el.dataset.ssSrc);
56
+ } catch (e) { console.warn(e); }
57
+ }));
58
+ }
59
+
60
+ window.SS = { REPO, session, save, clear, get, blobURL, hydrate };
61
+ })();
style.css ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body {
2
+ padding: 2rem;
3
+ font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
+ }
5
+
6
+ h1 {
7
+ font-size: 16px;
8
+ margin-top: 0;
9
+ }
10
+
11
+ p {
12
+ color: rgb(107, 114, 128);
13
+ font-size: 15px;
14
+ margin-bottom: 10px;
15
+ margin-top: 5px;
16
+ }
17
+
18
+ .card {
19
+ max-width: 620px;
20
+ margin: 0 auto;
21
+ padding: 16px;
22
+ border: 1px solid lightgray;
23
+ border-radius: 16px;
24
+ }
25
+
26
+ .card p:last-child {
27
+ margin-bottom: 0;
28
+ }
sw.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // SampleViewer access proxy. Viewer pages for these sections live in gated HF datasets
2
+ // (under viewer/<section>/); this worker serves them on the Space origin using the
3
+ // visitor's own HF OAuth token (scope gated-repos). Nothing here is secret.
4
+ const SECTIONS = {
5
+ egoSample: 'faradayfuture/egoSample',
6
+ teleopSample: 'faradayfuture/teleopSample',
7
+ motionSample: 'faradayfuture/motionSample',
8
+ };
9
+ const VERSION = 'sv-1';
10
+ const TYPES = {
11
+ html: 'text/html; charset=utf-8', htm: 'text/html; charset=utf-8', js: 'text/javascript; charset=utf-8',
12
+ mjs: 'text/javascript; charset=utf-8', css: 'text/css; charset=utf-8', json: 'application/json',
13
+ mp4: 'video/mp4', webm: 'video/webm', jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png',
14
+ webp: 'image/webp', gif: 'image/gif', svg: 'image/svg+xml', glb: 'model/gltf-binary', bin: 'application/octet-stream',
15
+ txt: 'text/plain; charset=utf-8', csv: 'text/csv; charset=utf-8', wasm: 'application/wasm',
16
+ };
17
+
18
+ self.addEventListener('install', () => self.skipWaiting());
19
+ self.addEventListener('activate', e => e.waitUntil(self.clients.claim()));
20
+
21
+ let TOKEN = null;
22
+ async function token() {
23
+ if (TOKEN) return TOKEN;
24
+ try { const r = await (await caches.open('sv-auth')).match('/__sv_token'); TOKEN = r ? await r.text() : null; } catch (e) {}
25
+ return TOKEN;
26
+ }
27
+ self.addEventListener('message', e => {
28
+ const d = e.data || {};
29
+ if (d.type !== 'token') return;
30
+ TOKEN = d.token || null;
31
+ cache.clear();
32
+ e.waitUntil(caches.open('sv-auth').then(c => TOKEN ? c.put('/__sv_token', new Response(TOKEN)) : c.delete('/__sv_token'))
33
+ .then(() => e.source && e.source.postMessage({ type: 'token-ok' })));
34
+ });
35
+
36
+ // small in-memory LRU of whole files (so video Range requests are served locally)
37
+ const cache = new Map(); let cacheBytes = 0; const CACHE_MAX = 300e6;
38
+ function remember(key, buf) {
39
+ if (buf.byteLength > 80e6) return;
40
+ cache.set(key, buf); cacheBytes += buf.byteLength;
41
+ for (const [k, v] of cache) { if (cacheBytes <= CACHE_MAX) break; cache.delete(k); cacheBytes -= v.byteLength; }
42
+ }
43
+ const inflight = new Map();
44
+
45
+ self.addEventListener('fetch', e => {
46
+ const u = new URL(e.request.url);
47
+ if (u.origin !== self.location.origin || e.request.method !== 'GET') return;
48
+ const m = u.pathname.match(/^\/(egoSample|teleopSample|motionSample)(\/.*)?$/);
49
+ if (!m) return;
50
+ let path = decodeURIComponent((m[2] || '/').slice(1));
51
+ if (path === '' || path.endsWith('/')) path += 'index.html';
52
+ e.respondWith(serve(e.request, m[1], path, u));
53
+ });
54
+
55
+ function toGate(u, why) {
56
+ return Response.redirect(new URL('/gate.html?to=' + encodeURIComponent(u.pathname + u.search) + (why ? '&why=' + why : ''), u).href, 302);
57
+ }
58
+
59
+ async function getFile(sec, path, tok) {
60
+ const key = sec + '/' + path;
61
+ if (cache.has(key)) { const b = cache.get(key); cache.delete(key); cache.set(key, b); return { status: 200, buf: b }; }
62
+ if (inflight.has(key)) return inflight.get(key);
63
+ const p = (async () => {
64
+ const url = 'https://huggingface.co/datasets/' + SECTIONS[sec] + '/resolve/main/viewer/' + sec + '/' + path.split('/').map(encodeURIComponent).join('/');
65
+ const r = await fetch(url, { headers: { Authorization: 'Bearer ' + tok }, cache: 'no-store' });
66
+ if (!r.ok) return { status: r.status };
67
+ const buf = await r.arrayBuffer(); remember(key, buf);
68
+ return { status: 200, buf };
69
+ })().finally(() => inflight.delete(key));
70
+ inflight.set(key, p);
71
+ return p;
72
+ }
73
+
74
+ async function serve(req, sec, path, u) {
75
+ const nav = req.mode === 'navigate';
76
+ const tok = await token();
77
+ if (!tok) return nav ? toGate(u, 'login') : new Response('', { status: 401 });
78
+ let f;
79
+ try { f = await getFile(sec, path, tok); } catch (err) { return new Response('Network error', { status: 502 }); }
80
+ if (f.status === 401) return nav ? toGate(u, 'login') : new Response('', { status: 401 });
81
+ if (f.status === 403) return nav ? toGate(u, 'denied') : new Response('', { status: 403 });
82
+ if (f.status !== 200) return new Response('Not found', { status: f.status === 404 ? 404 : 502 });
83
+ const ext = (path.split('.').pop() || '').toLowerCase();
84
+ const type = TYPES[ext] || 'application/octet-stream';
85
+ const total = f.buf.byteLength;
86
+ const base = { 'Content-Type': type, 'Accept-Ranges': 'bytes', 'Cache-Control': 'private, no-store', 'X-Sample-Viewer': VERSION };
87
+ const range = req.headers.get('range');
88
+ const mm = range && /bytes=(\d*)-(\d*)/.exec(range);
89
+ if (mm && (mm[1] !== '' || mm[2] !== '')) {
90
+ let start, end;
91
+ if (mm[1] === '') { start = Math.max(0, total - Number(mm[2])); end = total - 1; }
92
+ else { start = Number(mm[1]); end = mm[2] === '' ? total - 1 : Math.min(Number(mm[2]), total - 1); }
93
+ if (start >= total || start > end) return new Response('', { status: 416, headers: { 'Content-Range': 'bytes */' + total } });
94
+ return new Response(f.buf.slice(start, end + 1), { status: 206, headers: { ...base, 'Content-Range': `bytes ${start}-${end}/${total}`, 'Content-Length': String(end - start + 1) } });
95
+ }
96
+ return new Response(f.buf, { status: 200, headers: { ...base, 'Content-Length': String(total) } });
97
+ }
teleop.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html><meta charset="utf-8">
2
+ <!-- teleop 页已移到 teleopSample/ 子目录; 这个桩只为兼容旧链接, 可安全删除。 -->
3
+ <meta http-equiv="refresh" content="0; url=teleopSample/index.html">
4
+ <title>Moved</title>
5
+ <p style="font:14px -apple-system,sans-serif;padding:2rem">
6
+ Moved to <a href="teleopSample/index.html">teleopSample/index.html</a>.</p>
teleopSample/clip.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/drink_ep0.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/drink_ep1.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep0/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep1/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep2/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep3/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep4/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/ep5/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052527/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052609/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050737/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050827/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728075709/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728080339/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045050/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045152/viewer.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/index.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/mem_ep0.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/mem_ep1.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/sort_ep0.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/sort_ep1.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/wipe_ep0.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
teleopSample/wipe_ep1.html ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
3
+ <title>Faraday Future · Data Sample Viewers</title>
4
+ <script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
5
+ <style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
6
+ </head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>