@doubao-apps/ai 0.0.30 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,10 +14,10 @@
14
14
  | 界面 / 输入 | 键盘和输入框选区能力。 | 2 | [查看](./06-界面-输入.md) |
15
15
  | 网络 | 网络请求与 WebSocket。 | 2 | [查看](./07-网络.md) |
16
16
  | 媒体 | 图片选择、预览、保存、压缩和信息读取。 | 5 | [查看](./08-媒体.md) |
17
- | 开放能力 / 业务能力 | 开放业务能力、支付、隐私设置、上下文和外部应用打开。 | 17 | [查看](./09-开放能力-业务能力.md) |
17
+ | 开放能力 / 业务能力 | 开放业务能力、支付、隐私设置、上下文和外部应用打开。 | 20 | [查看](./09-开放能力-业务能力.md) |
18
18
  | 数据分析 | 监控上报、事件和数据分析上报。 | 1 | [查看](./10-数据分析.md) |
19
19
  | 设备 / 蓝牙 | 蓝牙和 BLE 能力;通常先打开适配器,再扫描、连接和读写。 | 19 | [查看](./11-设备-蓝牙.md) |
20
- | 设备 / Wi-Fi | Wi-Fi 模块能力;通常先 startWifi,再获取列表或连接。 | 6 | [查看](./12-设备-wi-fi.md) |
20
+ | 设备 / Wi-Fi | Wi-Fi 模块能力;通常先 startWifi,再获取列表或连接。 | 7 | [查看](./12-设备-wi-fi.md) |
21
21
  | 设备 / 加速度计 | 加速度计监听能力。 | 3 | [查看](./13-设备-加速度计.md) |
22
22
  | 设备 / iBeacon | iBeacon 搜索和结果读取能力。 | 3 | [查看](./14-设备-ibeacon.md) |
23
23
  | 设备 / 罗盘 | 罗盘监听能力。 | 3 | [查看](./15-设备-罗盘.md) |
@@ -36,3 +36,4 @@
36
36
  | 设备 / 扫码 | 调起扫码并读取扫码结果。 | 1 | [查看](./28-设备-扫码.md) |
37
37
  | 设备 / 屏幕 | 屏幕亮度、常亮和截屏/录屏相关能力。 | 5 | [查看](./29-设备-屏幕.md) |
38
38
  | 设备 / 震动 | 触发短震动和长震动。 | 2 | [查看](./30-设备-震动.md) |
39
+ | 文件系统 | 文件读写、目录管理和文件信息操作。 | 1 | [查看](./31-文件系统.md) |
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 公开可用的端能力 API。默认从 `@doubao-apps/framework/api` 导入;本文件根据 `packages/open-api/src` 的导出结构自动生成,按模块列出 API 名称和说明。
4
4
 
5
- 覆盖 126 个函数。详细参数、返回值、示例和相关类型请查看 [Open API 目录](open-api/README.md),精确字段也可按参数/结果类型名查看 IDE 类型提示或 `@doubao-apps/framework/api` 类型定义。
5
+ 覆盖 131 个函数。详细参数、返回值、示例和相关类型请查看 [Open API 目录](open-api/README.md),精确字段也可按参数/结果类型名查看 IDE 类型提示或 `@doubao-apps/framework/api` 类型定义。
6
6
 
7
7
  ## 使用方式
8
8
 
@@ -130,6 +130,9 @@ Toast、Loading、Modal、ActionSheet 和返回前提醒。
130
130
  | [getPrivacySetting](open-api/09-开放能力-业务能力.md#getprivacysetting) | 获取隐私设置状态。 |
131
131
  | [sendQueryMessage](open-api/09-开放能力-业务能力.md#sendquerymessage) | 以用户身份发送一条消息。<br><br>返回 void,不是 Promise。 |
132
132
  | [setAdditionalContext](open-api/09-开放能力-业务能力.md#setadditionalcontext) | 设置全局上下文供大模型理解。<br><br>设置全局上下文。 |
133
+ | [createTask](open-api/09-开放能力-业务能力.md#createtask) | 创建任务。<br><br>创建任务时需要传入开发者侧唯一任务标识、任务模板、任务详情和任务类型。开发者侧唯一任务标识 可用于幂等创建和后续业务关联。远端任务创建成功后,返回的 taskId 可用于查询或更新任务。 |
134
+ | [updateTask](open-api/09-开放能力-业务能力.md#updatetask) | 更新任务状态或任务详情。<br><br>更新任务时至少传入 taskStatus 或 taskDetail 中的一个。更新远端任务成功后,旧 token 会失效, 如返回 nextToken,后续需要使用新的 token 继续更新远端任务。 |
135
+ | [getTask](open-api/09-开放能力-业务能力.md#gettask) | 查询任务。<br><br>根据任务 ID 查询任务的模板、详情、状态和类型。若返回 token,可在后续远端任务更新中继续使用。 |
133
136
  | [updateModelContext](open-api/09-开放能力-业务能力.md#updatemodelcontext) | 向 Agent 捐赠上下文。 |
134
137
  | [updateWidget](open-api/09-开放能力-业务能力.md#updatewidget) | 更新指定卡片。 |
135
138
  | [openApp](open-api/09-开放能力-业务能力.md#openapp) | 通过 deep link 等方式打开外部应用。 |
@@ -176,10 +179,11 @@ Wi-Fi 模块能力;通常先 startWifi,再获取列表或连接。
176
179
  | --- | --- |
177
180
  | [startWifi](open-api/12-设备-wi-fi.md#startwifi) | 初始化 Wi-Fi 模块。<br><br>Wi-Fi 流程入口。 |
178
181
  | [stopWifi](open-api/12-设备-wi-fi.md#stopwifi) | 关闭 Wi-Fi 模块。 |
179
- | [setWifiList](open-api/12-设备-wi-fi.md#setwifilist) | 设置 Wi-Fi 预设列表。<br><br>用于预设 Wi-Fi 列表。 |
182
+ | [setWifiList](open-api/12-设备-wi-fi.md#setwifilist) | 设置 Wi-Fi 预设列表(iOS 特有)。<br><br>该接口为 iOS 特有,用于预设 Wi-Fi 列表。 |
180
183
  | [connectWifi](open-api/12-设备-wi-fi.md#connectwifi) | 连接指定 Wi-Fi。<br><br>通常先调用 startWifi。 |
181
184
  | [getConnectedWifi](open-api/12-设备-wi-fi.md#getconnectedwifi) | 获取当前已连接 Wi-Fi 信息。 |
182
185
  | [getWifiList](open-api/12-设备-wi-fi.md#getwifilist) | 获取 Wi-Fi 列表。<br><br>通常先调用 startWifi。 |
186
+ | [onWifiConnected](open-api/12-设备-wi-fi.md#onwificonnected) | 监听连接上 Wi-Fi 的事件。<br><br>返回取消监听函数。 |
183
187
 
184
188
  ## 设备 / 加速度计
185
189
 
@@ -345,3 +349,11 @@ iBeacon 搜索和结果读取能力。
345
349
  | --- | --- |
346
350
  | [vibrateShort](open-api/30-设备-震动.md#vibrateshort) | 触发短震动。 |
347
351
  | [vibrateLong](open-api/30-设备-震动.md#vibratelong) | 触发长震动。 |
352
+
353
+ ## 文件系统
354
+
355
+ 文件读写、目录管理和文件信息操作。
356
+
357
+ | API | 说明 |
358
+ | --- | --- |
359
+ | [getFileSystemManager](open-api/31-文件系统.md#getfilesystemmanager) | 获取文件系统管理器。 |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "packageName": "@byted-doubao-apps/ai-assets",
3
- "version": "0.0.30",
4
- "generatedAt": "2026-05-28T10:29:52.885Z",
3
+ "version": "0.0.31",
4
+ "generatedAt": "2026-05-29T13:07:54.764Z",
5
5
  "skills": [
6
6
  {
7
7
  "name": "doubao-apps-dev",
@@ -253,6 +253,18 @@ export default defineWidget({
253
253
  - **Components**:SDK 内置 UI 组件(Button、Switch、Slider、Swiper、Dialog 等)
254
254
  - **Bridge API**:系统能力接口(网络、存储、设备、UI 交互等)
255
255
 
256
+ ### Playground 测试页范式
257
+
258
+ 当任务涉及 `examples/playground`、Open API 测试页、JSB 验证页或组件 Demo 时,必须按当前 Playground 结构编写:
259
+
260
+ - **API 测试页**:放在 `examples/playground/src/pages/api/<group>/<api-name>/index.tsx`,并同步 `src/case-metadata.ts` 与 `src/pages/api/registry.ts`;`apiCaseMetas.name` 使用 `<group>/<api-name>`,允许带 `/`。
261
+ - **组件测试页**:放在 `examples/playground/src/pages/component/<component-name>/index.tsx`,并同步 `src/case-metadata.ts` 与 `src/pages/component/registry.ts`。
262
+ - **页面结构**:直接写 `definePage`、`PlaygroundPage`、纵向排列的多个 `TestCase`、`ActionButton` 和真实 API/组件调用,禁止任何页面工厂函数。
263
+ - **覆盖方式**:API 页尽可能覆盖参数组合、边界值、失败路径和事件回调;组件页覆盖默认态、边界态和交互态。不要只写 2~3 个 happy path。
264
+ - **日志隔离**:多个 `TestCase` 不共用同一个日志 state;日志 payload 可带 `case` / `caseName`,避免不同日志面板串扰。
265
+ - **路由编码**:入口页跳转含 `/` 的 case name 时必须 `encodeURIComponent`;开发模式 `delegate-page` 的 query 需要 encode/decode。
266
+ - **响应式主题**:Playground 外壳和示例辅助 UI 使用 `--pg-*` 变量;不要在 Playground 任务中顺手修组件库自身主题。
267
+
256
268
  ### Lynx 组件
257
269
 
258
270
  Lynx 组件库完整参考文档请访问官方文档:
@@ -22,6 +22,9 @@
22
22
  | [getPrivacySetting](#getprivacysetting) | 获取隐私设置状态。 |
23
23
  | [sendQueryMessage](#sendquerymessage) | 以用户身份发送一条消息。<br><br>返回 void,不是 Promise。 |
24
24
  | [setAdditionalContext](#setadditionalcontext) | 设置全局上下文供大模型理解。<br><br>设置全局上下文。 |
25
+ | [createTask](#createtask) | 创建任务。<br><br>创建任务时需要传入开发者侧唯一任务标识、任务模板、任务详情和任务类型。开发者侧唯一任务标识 可用于幂等创建和后续业务关联。远端任务创建成功后,返回的 taskId 可用于查询或更新任务。 |
26
+ | [updateTask](#updatetask) | 更新任务状态或任务详情。<br><br>更新任务时至少传入 taskStatus 或 taskDetail 中的一个。更新远端任务成功后,旧 token 会失效, 如返回 nextToken,后续需要使用新的 token 继续更新远端任务。 |
27
+ | [getTask](#gettask) | 查询任务。<br><br>根据任务 ID 查询任务的模板、详情、状态和类型。若返回 token,可在后续远端任务更新中继续使用。 |
25
28
  | [updateModelContext](#updatemodelcontext) | 向 Agent 捐赠上下文。 |
26
29
  | [updateWidget](#updatewidget) | 更新指定卡片。 |
27
30
  | [openApp](#openapp) | 通过 deep link 等方式打开外部应用。 |
@@ -309,6 +312,124 @@ await sendQueryMessage({ content: '订阅消息', type: 'text' })
309
312
 
310
313
  设置全局上下文。
311
314
 
315
+ <a id="createtask"></a>
316
+ ### createTask()
317
+
318
+ > **createTask**(`params`): `Promise`\<[`CreateTaskResult`](#createtaskresult)\>
319
+
320
+ 创建任务。
321
+
322
+ #### Parameters
323
+
324
+ • **params**: [`CreateTaskParams`](#createtaskparams)
325
+
326
+ 任务创建参数。
327
+
328
+ #### Returns
329
+
330
+ `Promise`\<[`CreateTaskResult`](#createtaskresult)\>
331
+
332
+ 返回创建后的任务 ID、远端任务 token 和过期时间。
333
+
334
+ #### Remarks
335
+
336
+ 创建任务时需要传入开发者侧唯一任务标识、任务模板、任务详情和任务类型。开发者侧唯一任务标识
337
+ 可用于幂等创建和后续业务关联。远端任务创建成功后,返回的 taskId 可用于查询或更新任务。
338
+
339
+ #### Example
340
+
341
+ ```typescript
342
+ import { createTask } from '@doubao-apps/framework/api';
343
+
344
+ const result = await createTask({
345
+ outTaskId: 'order-20260529-001',
346
+ taskTemplate: 'remote_normal_v1',
347
+ taskType: 'remote',
348
+ taskDetail: JSON.stringify({
349
+ title: '订单处理中',
350
+ description: '正在为你处理订单,请稍候'
351
+ })
352
+ });
353
+
354
+ console.log(result.taskId, result.token, result.expiresIn);
355
+ ```
356
+
357
+ <a id="updatetask"></a>
358
+ ### updateTask()
359
+
360
+ > **updateTask**(`params`): `Promise`\<[`UpdateTaskResult`](#updatetaskresult)\>
361
+
362
+ 更新任务状态或任务详情。
363
+
364
+ #### Parameters
365
+
366
+ • **params**: [`UpdateTaskParams`](#updatetaskparams)
367
+
368
+ 任务更新参数,taskStatus 与 taskDetail 二选一。
369
+
370
+ #### Returns
371
+
372
+ `Promise`\<[`UpdateTaskResult`](#updatetaskresult)\>
373
+
374
+ 返回任务 ID、新 token 和过期时间。
375
+
376
+ #### Remarks
377
+
378
+ 更新任务时至少传入 taskStatus 或 taskDetail 中的一个。更新远端任务成功后,旧 token 会失效,
379
+ 如返回 nextToken,后续需要使用新的 token 继续更新远端任务。
380
+
381
+ #### Example
382
+
383
+ ```typescript
384
+ import { updateTask } from '@doubao-apps/framework/api';
385
+
386
+ const result = await updateTask({
387
+ taskId: 'task_123',
388
+ taskStatus: 'completed',
389
+ taskDetail: JSON.stringify({
390
+ title: '订单已完成',
391
+ description: '订单处理完成'
392
+ })
393
+ });
394
+
395
+ console.log(result.taskId, result.nextToken, result.expiresIn);
396
+ ```
397
+
398
+ <a id="gettask"></a>
399
+ ### getTask()
400
+
401
+ > **getTask**(`params`): `Promise`\<[`GetTaskResult`](#gettaskresult)\>
402
+
403
+ 查询任务。
404
+
405
+ #### Parameters
406
+
407
+ • **params**: [`GetTaskParams`](#gettaskparams)
408
+
409
+ 任务查询参数。
410
+
411
+ #### Returns
412
+
413
+ `Promise`\<[`GetTaskResult`](#gettaskresult)\>
414
+
415
+ 返回任务详情、状态、类型和 token 信息。
416
+
417
+ #### Remarks
418
+
419
+ 根据任务 ID 查询任务的模板、详情、状态和类型。若返回 token,可在后续远端任务更新中继续使用。
420
+
421
+ #### Example
422
+
423
+ ```typescript
424
+ import { getTask } from '@doubao-apps/framework/api';
425
+
426
+ const task = await getTask({ taskId: 'task_123' });
427
+
428
+ if (task.taskStatus === 'running') {
429
+ console.log('任务仍在运行', task.taskDetail);
430
+ }
431
+ ```
432
+
312
433
  <a id="updatemodelcontext"></a>
313
434
  ### updateModelContext()
314
435
 
@@ -843,6 +964,194 @@ Whether user authorization for privacy agreement is required
843
964
 
844
965
  指定 bot id
845
966
 
967
+ <a id="createtaskparams"></a>
968
+ ### CreateTaskParams
969
+
970
+ 创建任务的请求参数。
971
+
972
+ #### Properties
973
+
974
+ ##### outTaskId
975
+
976
+ > **outTaskId**: `string`
977
+
978
+ 开发者侧任务唯一标识,用于幂等和关联
979
+
980
+ ##### taskDetail
981
+
982
+ > **taskDetail**: `string`
983
+
984
+ 模板对应的数据的 JSON 字符串
985
+
986
+ ##### taskTemplate
987
+
988
+ > **taskTemplate**: `"remote_normal_v1"`
989
+
990
+ 任务样式模板,当前仅支持 remote_normal_v1
991
+
992
+ ##### taskType
993
+
994
+ > **taskType**: [`TaskType`](#tasktype-2)
995
+
996
+ 任务类型,当前支持 local 和 remote
997
+
998
+ <a id="createtaskresult"></a>
999
+ ### CreateTaskResult
1000
+
1001
+ 创建任务的返回结果。
1002
+
1003
+ #### Properties
1004
+
1005
+ ##### expiresIn?
1006
+
1007
+ > `optional` **expiresIn**: `number`
1008
+
1009
+ 任务超时过期时间
1010
+
1011
+ ##### taskId
1012
+
1013
+ > **taskId**: `string`
1014
+
1015
+ 任务 ID,后续可以使用这个 ID 更新任务
1016
+
1017
+ ##### token?
1018
+
1019
+ > `optional` **token**: `string`
1020
+
1021
+ 远端任务 token,后续使用 token 通过 OpenAPI 更新远端任务
1022
+
1023
+ <a id="tasktype-2"></a>
1024
+ <a id="tasktype"></a>
1025
+ ### TaskType
1026
+
1027
+ > **TaskType**: `"local"` \| `"remote"`
1028
+
1029
+ 任务类型。
1030
+
1031
+ local 表示本地任务,remote 表示远端任务。
1032
+
1033
+ <a id="updatetaskparams"></a>
1034
+ ### UpdateTaskParams
1035
+
1036
+ 更新任务的请求参数。
1037
+
1038
+ #### Properties
1039
+
1040
+ ##### taskDetail?
1041
+
1042
+ > `optional` **taskDetail**: `string`
1043
+
1044
+ 模板对应的数据的 JSON 字符串,与 taskStatus 二选一
1045
+
1046
+ ##### taskId
1047
+
1048
+ > **taskId**: `string`
1049
+
1050
+ 任务 ID
1051
+
1052
+ ##### taskStatus?
1053
+
1054
+ > `optional` **taskStatus**: [`TaskStatus`](#taskstatus-2)
1055
+
1056
+ 任务状态,与 taskDetail 二选一
1057
+
1058
+ <a id="updatetaskresult"></a>
1059
+ ### UpdateTaskResult
1060
+
1061
+ 更新任务的返回结果。
1062
+
1063
+ #### Properties
1064
+
1065
+ ##### expiresIn?
1066
+
1067
+ > `optional` **expiresIn**: `number`
1068
+
1069
+ 任务超时过期时间
1070
+
1071
+ ##### nextToken?
1072
+
1073
+ > `optional` **nextToken**: `string`
1074
+
1075
+ 每次更新后旧的 token 失效,必须使用新返回的 token
1076
+
1077
+ ##### taskId
1078
+
1079
+ > **taskId**: `string`
1080
+
1081
+ 任务 ID,更新后任务 ID 不变
1082
+
1083
+ <a id="taskstatus-2"></a>
1084
+ <a id="taskstatus"></a>
1085
+ ### TaskStatus
1086
+
1087
+ > **TaskStatus**: `"running"` \| `"completed"`
1088
+
1089
+ 任务状态。
1090
+
1091
+ running 表示任务运行中,completed 表示任务已完成。
1092
+
1093
+ <a id="gettaskparams"></a>
1094
+ ### GetTaskParams
1095
+
1096
+ 查询任务的请求参数。
1097
+
1098
+ #### Properties
1099
+
1100
+ ##### taskId
1101
+
1102
+ > **taskId**: `string`
1103
+
1104
+ 任务 ID
1105
+
1106
+ <a id="gettaskresult"></a>
1107
+ ### GetTaskResult
1108
+
1109
+ 查询任务的返回结果。
1110
+
1111
+ #### Properties
1112
+
1113
+ ##### expiresIn?
1114
+
1115
+ > `optional` **expiresIn**: `number`
1116
+
1117
+ 任务超时过期时间
1118
+
1119
+ ##### taskDetail
1120
+
1121
+ > **taskDetail**: `string`
1122
+
1123
+ 模板对应的数据的 JSON 字符串
1124
+
1125
+ ##### taskId
1126
+
1127
+ > **taskId**: `string`
1128
+
1129
+ 任务 ID
1130
+
1131
+ ##### taskStatus
1132
+
1133
+ > **taskStatus**: [`TaskStatus`](#taskstatus-2)
1134
+
1135
+ 任务状态,运行中或已完成
1136
+
1137
+ ##### taskTemplate
1138
+
1139
+ > **taskTemplate**: `"remote_normal_v1"`
1140
+
1141
+ 任务样式模板,当前仅支持 remote_normal_v1
1142
+
1143
+ ##### taskType
1144
+
1145
+ > **taskType**: [`TaskType`](#tasktype-2)
1146
+
1147
+ 任务类型,local 或 remote
1148
+
1149
+ ##### token?
1150
+
1151
+ > `optional` **token**: `string`
1152
+
1153
+ 每次更新后旧的 token 失效,必须使用新返回的 token
1154
+
846
1155
  <a id="updatemodelcontextparams"></a>
847
1156
  ### UpdateModelContextParams
848
1157
 
@@ -10,10 +10,11 @@ Wi-Fi 模块能力;通常先 startWifi,再获取列表或连接。
10
10
  | --- | --- |
11
11
  | [startWifi](#startwifi) | 初始化 Wi-Fi 模块。<br><br>Wi-Fi 流程入口。 |
12
12
  | [stopWifi](#stopwifi) | 关闭 Wi-Fi 模块。 |
13
- | [setWifiList](#setwifilist) | 设置 Wi-Fi 预设列表。<br><br>用于预设 Wi-Fi 列表。 |
13
+ | [setWifiList](#setwifilist) | 设置 Wi-Fi 预设列表(iOS 特有)。<br><br>该接口为 iOS 特有,用于预设 Wi-Fi 列表。 |
14
14
  | [connectWifi](#connectwifi) | 连接指定 Wi-Fi。<br><br>通常先调用 startWifi。 |
15
15
  | [getConnectedWifi](#getconnectedwifi) | 获取当前已连接 Wi-Fi 信息。 |
16
16
  | [getWifiList](#getwifilist) | 获取 Wi-Fi 列表。<br><br>通常先调用 startWifi。 |
17
+ | [onWifiConnected](#onwificonnected) | 监听连接上 Wi-Fi 的事件。<br><br>返回取消监听函数。 |
17
18
 
18
19
  ## API 详情
19
20
 
@@ -56,7 +57,7 @@ Wi-Fi 流程入口。
56
57
 
57
58
  > **setWifiList**(`params`): `Promise`\<`object`\>
58
59
 
59
- 设置 Wi-Fi 预设列表。
60
+ 设置 Wi-Fi 预设列表(iOS 特有)。
60
61
 
61
62
  #### Parameters
62
63
 
@@ -68,7 +69,7 @@ Wi-Fi 流程入口。
68
69
 
69
70
  #### Remarks
70
71
 
71
- 用于预设 Wi-Fi 列表。
72
+ 该接口为 iOS 特有,用于预设 Wi-Fi 列表。
72
73
 
73
74
  <a id="connectwifi"></a>
74
75
  ### connectWifi()
@@ -123,12 +124,45 @@ Wi-Fi 流程入口。
123
124
 
124
125
  通常先调用 startWifi。
125
126
 
127
+ <a id="onwificonnected"></a>
128
+ ### onWifiConnected()
129
+
130
+ > **onWifiConnected**(`handler`): () => `void`
131
+
132
+ 监听连接上 Wi-Fi 的事件。
133
+
134
+ #### Parameters
135
+
136
+ • **handler**
137
+
138
+ #### Returns
139
+
140
+ `Function`
141
+
142
+ 返回取消当前监听函数的函数。
143
+
144
+ ##### Returns
145
+
146
+ `void`
147
+
148
+ #### Example
149
+
150
+ ```ts
151
+ import { onWifiConnected } from '@doubao-apps/framework/api';
152
+
153
+ const off = onWifiConnected(({ wifi }) => {
154
+ console.log(wifi.ssid);
155
+ });
156
+
157
+ off();
158
+ ```
159
+
126
160
  ## 相关类型
127
161
 
128
162
  <a id="setwifilistparams"></a>
129
163
  ### SetWifiListParams
130
164
 
131
- 设置 Wi-Fi 预设列表的请求参数。
165
+ 设置 Wi-Fi 预设列表的请求参数(iOS 特有)。
132
166
 
133
167
  #### Properties
134
168