# 插件系统

<cite>
**本文引用的文件**
- [Plugin.php](file://vendor/thinkcmf/cmf/src/lib/Plugin.php)
- [SwaggerPlugin.php](file://public/plugins/swagger/SwaggerPlugin.php)
- [SystemInfoPlugin.php](file://public/plugins/system_info/SystemInfoPlugin.php)
- [TiandituPlugin.php](file://public/plugins/tianditu/TiandituPlugin.php)
- [composer.json（Swagger 插件）](file://public/plugins/swagger/composer.json)
- [config.php（天地图插件）](file://public/plugins/tianditu/config.php)
- [OpenApi.php](file://public/plugins/swagger/service/OpenApi.php)
- [OpenApiSpec.php](file://public/plugins/swagger/swagger/OpenApiSpec.php)
- [AdminIndexController.php](file://public/plugins/swagger/controller/AdminIndexController.php)
- [ApiAdminIndexController.php](file://public/plugins/swagger/controller/ApiAdminIndexController.php)
- [IndexController.php](file://public/plugins/swagger/controller/IndexController.php)
- [widget.html（Swagger 插件）](file://public/plugins/swagger/view/widget.html)
- [widget.html（系统信息插件）](file://public/plugins/system_info/view/widget.html)
- [widget.html（天地图插件）](file://public/plugins/tianditu/view/widget.html)
- [hooks.html（后台钩子管理）](file://public/themes/admin_default/admin/plugin/hooks.html)
- [plugins.html（钩子插件排序）](file://public/themes/admin_default/admin/hook/plugins.html)
- [index.html（后台插件列表）](file://public/themes/admin_default/admin/plugin/index.html)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)

## 简介
本文件面向 ThinkCMF 插件系统的使用者与开发者，系统性阐述插件架构设计、Plugin 基类、钩子机制与生命周期管理；并以 Swagger、SystemInfo、Tianditu 三个实际插件为例，讲解插件创建、配置、安装启用、禁用卸载、钩子注册与执行顺序控制、插件间依赖与执行顺序、最佳实践与常见问题。文档同时提供 API 使用说明与可视化流程图，帮助读者快速上手与深度掌握。

## 项目结构
ThinkCMF 插件位于公共目录下的 plugins 子目录，每个插件拥有独立命名空间、控制器、服务、视图与配置文件。核心基类位于 vendor/thinkcmf/cmf/src/lib/Plugin.php，提供插件通用能力：模板引擎初始化、视图渲染、配置读取、钩子调用桥接等。

```mermaid
graph TB
A["public/plugins/swagger"] --> A1["SwaggerPlugin.php"]
A --> A2["controller/AdminIndexController.php"]
A --> A3["controller/ApiAdminIndexController.php"]
A --> A4["controller/IndexController.php"]
A --> A5["service/OpenApi.php"]
A --> A6["swagger/OpenApiSpec.php"]
A --> A7["view/widget.html"]
A --> A8["composer.json"]
B["public/plugins/system_info"] --> B1["SystemInfoPlugin.php"]
B --> B2["view/widget.html"]
C["public/plugins/tianditu"] --> C1["TiandituPlugin.php"]
C --> C2["config.php"]
C --> C3["view/widget.html"]
```

图表来源
- [SwaggerPlugin.php:1-106](file://public/plugins/swagger/SwaggerPlugin.php#L1-L106)
- [SystemInfoPlugin.php:1-85](file://public/plugins/system_info/SystemInfoPlugin.php#L1-L85)
- [TiandituPlugin.php:1-46](file://public/plugins/tianditu/TiandituPlugin.php#L1-L46)
- [OpenApi.php:1-65](file://public/plugins/swagger/service/OpenApi.php#L1-L65)
- [OpenApiSpec.php:1-73](file://public/plugins/swagger/swagger/OpenApiSpec.php#L1-L73)
- [AdminIndexController.php:1-50](file://public/plugins/swagger/controller/AdminIndexController.php#L1-L50)
- [ApiAdminIndexController.php:1-106](file://public/plugins/swagger/controller/ApiAdminIndexController.php#L1-L106)
- [IndexController.php:1-41](file://public/plugins/swagger/controller/IndexController.php#L1-L41)
- [widget.html（Swagger 插件）:1-32](file://public/plugins/swagger/view/widget.html#L1-L32)
- [widget.html（系统信息插件）:1-12](file://public/plugins/system_info/view/widget.html#L1-L12)
- [widget.html（天地图插件）:1-158](file://public/plugins/tianditu/view/widget.html#L1-L158)
- [composer.json（Swagger 插件）:1-20](file://public/plugins/swagger/composer.json#L1-L20)
- [config.php（天地图插件）:1-17](file://public/plugins/tianditu/config.php#L1-L17)

章节来源
- [SwaggerPlugin.php:1-106](file://public/plugins/swagger/SwaggerPlugin.php#L1-L106)
- [SystemInfoPlugin.php:1-85](file://public/plugins/system_info/SystemInfoPlugin.php#L1-L85)
- [TiandituPlugin.php:1-46](file://public/plugins/tianditu/TiandituPlugin.php#L1-L46)

## 核心组件
- Plugin 基类：提供插件信息校验、模板引擎初始化、视图渲染、配置读取与缓存、钩子调用桥接等能力。
- 插件类：继承 Plugin，声明 info 与 hasAdmin，实现 install/uninstall 生命周期方法，并暴露钩子回调方法（如 adminDashboard、adminDialogMapView、adminApiImportView 等）。
- 控制器层：提供插件后台管理页面与 REST 接口，用于展示与导入 API 文档。
- 服务层：封装扫描与生成 OpenAPI 规范的逻辑。
- 配置与视图：插件配置文件与前端小部件视图。

章节来源
- [Plugin.php:1-309](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L1-L309)
- [SwaggerPlugin.php:1-106](file://public/plugins/swagger/SwaggerPlugin.php#L1-L106)
- [SystemInfoPlugin.php:1-85](file://public/plugins/system_info/SystemInfoPlugin.php#L1-L85)
- [TiandituPlugin.php:1-46](file://public/plugins/tianditu/TiandituPlugin.php#L1-L46)

## 架构总览
ThinkCMF 插件系统采用“基类 + 插件类 + 控制器 + 服务 + 视图”的分层架构。插件通过基类统一接入模板引擎与配置系统，控制器负责对外交互，服务负责业务处理，视图负责渲染输出。后台管理界面通过钩子与插件回调集成到系统。

```mermaid
classDiagram
class Plugin {
+info
+install()
+uninstall()
+fetch(template)
+display(content)
+assign(name, value)
+getConfig()
+getDefaultConfig()
+getView()
}
class SwaggerPlugin {
+info
+install()
+uninstall()
+adminApiImportView()
}
class SystemInfoPlugin {
+info
+install()
+uninstall()
+adminDashboard()
}
class TiandituPlugin {
+info
+install()
+uninstall()
+adminDialogMapView()
}
Plugin <|-- SwaggerPlugin
Plugin <|-- SystemInfoPlugin
Plugin <|-- TiandituPlugin
```

图表来源
- [Plugin.php:22-309](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L22-L309)
- [SwaggerPlugin.php:17-106](file://public/plugins/swagger/SwaggerPlugin.php#L17-L106)
- [SystemInfoPlugin.php:14-85](file://public/plugins/system_info/SystemInfoPlugin.php#L14-L85)
- [TiandituPlugin.php:13-46](file://public/plugins/tianditu/TiandituPlugin.php#L13-L46)

## 组件详解

### Plugin 基类
- 模板引擎初始化：根据插件主题路径与 CDN 配置，设置视图基础路径与替换变量，支持后台与前台模板渲染。
- 视图渲染：提供 fetch/display/assign 方法，统一模板加载与变量赋值。
- 配置系统：优先读取缓存，再回退数据库存储的 JSON 配置；若无配置则读取插件根目录 config.php 默认值。
- 生命周期：抽象 install/uninstall 必须实现；checkInfo 校验 info 字段完整性；getName/getPluginPath/getConfigFilePath/getThemeRoot/getView 提供运行期元数据访问。

章节来源
- [Plugin.php:52-132](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L52-L132)
- [Plugin.php:141-177](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L141-L177)
- [Plugin.php:249-301](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L249-L301)
- [Plugin.php:303-308](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L303-L308)

### Swagger 插件
- 功能概述：扫描系统与插件控制器，生成 OpenAPI 规范，导入后台 API 到权限与菜单体系。
- 关键点：
  - 插件类：声明 info、hasAdmin，实现 install/uninstall；提供 adminApiImportView 钩子回调，将扫描结果写入 admin_api 与 auth_rule。
  - 控制器：AdminIndexController 提供后台页面入口；IndexController 提供前端页面与跨域 JSON 导出；ApiAdminIndexController 提供 REST 接口导入。
  - 服务：OpenApi::generate 扫描路径集合（系统 API、插件控制器与 swagger 目录），调用外部库生成规范。
  - 视图：widget.html 作为导入成功后的提示页面。
  - 依赖：composer.json 声明 swagger-php 与 annotations 依赖。

```mermaid
sequenceDiagram
participant Admin as "后台用户"
participant Ctrl as "ApiAdminIndexController"
participant Svc as "OpenApi : : generate"
participant DB as "数据库"
Admin->>Ctrl : "POST /plugin/swagger/api_admin_index/importApi"
Ctrl->>Svc : "生成 OpenAPI 规范"
Svc-->>Ctrl : "返回规范 JSON"
Ctrl->>DB : "写入 admin_api 与 auth_rule"
Ctrl-->>Admin : "返回导入成功"
```

图表来源
- [ApiAdminIndexController.php:44-102](file://public/plugins/swagger/controller/ApiAdminIndexController.php#L44-L102)
- [OpenApi.php:10-64](file://public/plugins/swagger/service/OpenApi.php#L10-L64)

章节来源
- [SwaggerPlugin.php:17-106](file://public/plugins/swagger/SwaggerPlugin.php#L17-L106)
- [AdminIndexController.php:19-49](file://public/plugins/swagger/controller/AdminIndexController.php#L19-L49)
- [IndexController.php:18-40](file://public/plugins/swagger/controller/IndexController.php#L18-L40)
- [ApiAdminIndexController.php:21-106](file://public/plugins/swagger/controller/ApiAdminIndexController.php#L21-L106)
- [OpenApi.php:7-65](file://public/plugins/swagger/service/OpenApi.php#L7-L65)
- [OpenApiSpec.php:6-72](file://public/plugins/swagger/swagger/OpenApiSpec.php#L6-L72)
- [widget.html（Swagger 插件）:1-32](file://public/plugins/swagger/view/widget.html#L1-L32)
- [composer.json（Swagger 插件）:1-20](file://public/plugins/swagger/composer.json#L1-L20)

### SystemInfo 插件
- 功能概述：在后台首页挂载系统信息面板，展示操作系统、服务器环境、PHP、MySQL、CURL、OpenSSL、ThinkPHP、ThinkCMF 版本、上传限制、磁盘剩余等信息。
- 关键点：
  - 插件类：实现 install/uninstall；提供 adminDashboard 钩子回调，返回面板宽度、视图与插件标识。
  - 视图：widget.html 展示键值对信息列表。

```mermaid
flowchart TD
Start(["进入后台首页"]) --> Call["调用插件回调 adminDashboard()"]
Call --> Build["组装服务器信息数组"]
Build --> Assign["assign('server_info', info)"]
Assign --> Render["fetch('widget') 返回 HTML 结构"]
Render --> Return["返回 {width, view, plugin}"]
```

图表来源
- [SystemInfoPlugin.php:39-82](file://public/plugins/system_info/SystemInfoPlugin.php#L39-L82)
- [widget.html（系统信息插件）:1-12](file://public/plugins/system_info/view/widget.html#L1-L12)

章节来源
- [SystemInfoPlugin.php:14-85](file://public/plugins/system_info/SystemInfoPlugin.php#L14-L85)
- [widget.html（系统信息插件）:1-12](file://public/plugins/system_info/view/widget.html#L1-L12)

### Tianditu 插件
- 功能概述：在后台弹窗中嵌入天地图，支持拖拽标记获取经纬度与地址信息，并提供密钥配置项。
- 关键点：
  - 插件类：实现 install/uninstall；提供 adminDialogMapView 钩子回调，读取配置并渲染视图。
  - 配置：config.php 定义 map_secret_key 配置项，含标题、类型、默认值与提示。
  - 视图：widget.html 内嵌天地图 JS SDK，实现地图初始化、标记拖拽、地址反解析与数据输出。

```mermaid
sequenceDiagram
participant Admin as "后台用户"
participant Plugin as "TiandituPlugin"
participant View as "widget.html"
participant Config as "config.php"
Admin->>Plugin : "调用 adminDialogMapView()"
Plugin->>Config : "getConfig()"
Config-->>Plugin : "返回配置数组"
Plugin->>View : "assign(config) 并 fetch('widget')"
View-->>Admin : "渲染地图与输入框"
```

图表来源
- [TiandituPlugin.php:38-43](file://public/plugins/tianditu/TiandituPlugin.php#L38-L43)
- [config.php（天地图插件）:9-16](file://public/plugins/tianditu/config.php#L9-L16)
- [widget.html（天地图插件）:30-158](file://public/plugins/tianditu/view/widget.html#L30-L158)

章节来源
- [TiandituPlugin.php:13-46](file://public/plugins/tianditu/TiandituPlugin.php#L13-L46)
- [config.php（天地图插件）:1-17](file://public/plugins/tianditu/config.php#L1-L17)
- [widget.html（天地图插件）:1-158](file://public/plugins/tianditu/view/widget.html#L1-L158)

### 钩子机制与执行顺序
- 钩子类型：系统钩子、应用钩子、主题钩子、后台主题钩子。
- 后台管理：
  - 插件列表页提供“执行顺序”入口，打开钩子插件排序对话框。
  - 钩子管理页列出所有钩子，点击“管理插件”进入排序页面，支持拖拽调整执行顺序。
- 执行顺序控制：通过列表序号字段维护插件在某个钩子上的执行顺序，数值越小优先级越高。

```mermaid
flowchart TD
A["后台插件列表"] --> B["点击“执行顺序”"]
B --> C["打开钩子管理页"]
C --> D["选择具体钩子"]
D --> E["进入插件排序页"]
E --> F["拖拽调整 list_order"]
F --> G["提交保存"]
```

图表来源
- [index.html（后台插件列表）:112-206](file://public/themes/admin_default/admin/plugin/index.html#L112-L206)
- [hooks.html（后台钩子管理）:1-43](file://public/themes/admin_default/admin/plugin/hooks.html#L1-L43)
- [plugins.html（钩子插件排序）:1-53](file://public/themes/admin_default/admin/hook/plugins.html#L1-L53)

章节来源
- [index.html（后台插件列表）:112-206](file://public/themes/admin_default/admin/plugin/index.html#L112-L206)
- [hooks.html（后台钩子管理）:1-43](file://public/themes/admin_default/admin/plugin/hooks.html#L1-L43)
- [plugins.html（钩子插件排序）:1-53](file://public/themes/admin_default/admin/hook/plugins.html#L1-L53)

## 依赖关系分析
- 插件与基类：所有插件类均继承 Plugin，复用模板引擎、配置缓存与钩子调用能力。
- Swagger 插件内部依赖：
  - 外部库：zircote/swagger-php 与 doctrine/annotations。
  - 服务依赖：OpenApi::generate 扫描系统与插件控制器目录，生成 OpenAPI 规范。
  - 控制器依赖：REST 接口与后台页面控制器分别处理导入与展示。
- Tianditu 插件依赖：
  - 配置依赖：config.php 提供密钥配置。
  - 视图依赖：widget.html 内嵌天地图 SDK 并实现交互逻辑。

```mermaid
graph LR
P["Plugin 基类"] --> SW["SwaggerPlugin"]
P --> SI["SystemInfoPlugin"]
P --> TD["TiandituPlugin"]
SW --> OA["OpenApi::generate"]
SW --> C1["ApiAdminIndexController"]
SW --> C2["AdminIndexController"]
SW --> C3["IndexController"]
SW --> V1["Swagger 视图"]
SW --> D1["Swagger 依赖(composer.json)"]
SI --> V2["SystemInfo 视图"]
TD --> CFG["config.php"]
TD --> V3["Tianditu 视图"]
```

图表来源
- [Plugin.php:22-309](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L22-L309)
- [SwaggerPlugin.php:17-106](file://public/plugins/swagger/SwaggerPlugin.php#L17-L106)
- [SystemInfoPlugin.php:14-85](file://public/plugins/system_info/SystemInfoPlugin.php#L14-L85)
- [TiandituPlugin.php:13-46](file://public/plugins/tianditu/TiandituPlugin.php#L13-L46)
- [OpenApi.php:7-65](file://public/plugins/swagger/service/OpenApi.php#L7-L65)
- [ApiAdminIndexController.php:21-106](file://public/plugins/swagger/controller/ApiAdminIndexController.php#L21-L106)
- [AdminIndexController.php:19-49](file://public/plugins/swagger/controller/AdminIndexController.php#L19-L49)
- [IndexController.php:18-40](file://public/plugins/swagger/controller/IndexController.php#L18-L40)
- [widget.html（Swagger 插件）:1-32](file://public/plugins/swagger/view/widget.html#L1-L32)
- [widget.html（系统信息插件）:1-12](file://public/plugins/system_info/view/widget.html#L1-L12)
- [widget.html（天地图插件）:1-158](file://public/plugins/tianditu/view/widget.html#L1-L158)
- [composer.json（Swagger 插件）:1-20](file://public/plugins/swagger/composer.json#L1-L20)
- [config.php（天地图插件）:1-17](file://public/plugins/tianditu/config.php#L1-L17)

章节来源
- [OpenApi.php:7-65](file://public/plugins/swagger/service/OpenApi.php#L7-L65)
- [composer.json（Swagger 插件）:1-20](file://public/plugins/swagger/composer.json#L1-L20)
- [config.php（天地图插件）:1-17](file://public/plugins/tianditu/config.php#L1-L17)

## 性能考量
- 配置缓存：Plugin::getConfig 对插件配置进行缓存，减少数据库查询与 JSON 解析开销。
- 路径扫描：OpenApi::generate 会扫描多个目录，建议在生产环境避免频繁触发扫描，或结合缓存策略降低 IO。
- 视图渲染：统一模板引擎初始化与替换变量，避免重复初始化；合理组织视图层级，减少模板查找时间。
- 外部依赖：swagger-php 生成规范时可能消耗较多内存与 CPU，建议在后台定时任务或离线场景执行。

## 故障排查指南
- 模板未找到：检查插件视图路径与后缀配置，确保 fetch 的模板文件存在。
- 配置不生效：确认数据库中插件记录的 config 字段为合法 JSON；或检查插件根目录 config.php 默认值。
- OpenAPI 导入失败：检查扫描路径是否存在控制器与 swagger 目录；确认已安装 swagger-php 与 annotations。
- 天地图密钥无效：检查 config.php 中 map_secret_key 是否正确配置；确认网络可访问天地图 SDK。
- 钩子执行顺序异常：进入后台“插件管理 -> 钩子管理 -> 插件排序”，调整 list_order 数值。

章节来源
- [Plugin.php:141-154](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L141-L154)
- [OpenApi.php:10-64](file://public/plugins/swagger/service/OpenApi.php#L10-L64)
- [config.php（天地图插件）:9-16](file://public/plugins/tianditu/config.php#L9-L16)

## 结论
ThinkCMF 插件系统以 Plugin 基类为核心，通过清晰的分层与钩子机制，实现了插件的生命周期管理、配置与视图渲染、以及与后台管理的无缝集成。Swagger、SystemInfo、Tianditu 三个插件展示了从目录结构、配置文件、控制器与服务到视图渲染的完整开发流程。通过后台的钩子管理与插件排序，开发者可以灵活控制插件的执行顺序与行为，满足复杂业务需求。

## 附录

### 插件创建流程（从零到一）
- 目录结构：在 public/plugins 下创建插件目录，按需建立 controller、service、view、swagger 等子目录。
- 插件类：新建插件类，继承 Plugin，填写 info 与 hasAdmin，实现 install/uninstall。
- 配置文件：在插件根目录创建 config.php，定义配置项（含标题、类型、默认值、提示）。
- 控制器与视图：按需创建后台控制器与页面控制器，编写视图模板。
- 服务与依赖：如需扫描或第三方库，编写服务类并在 composer.json 中声明依赖。
- 钩子回调：在插件类中实现钩子回调方法（如 adminDashboard、adminDialogMapView、adminApiImportView）。
- 安装启用：在后台“插件管理”中安装并启用插件；如涉及钩子，可在“钩子管理”中设置执行顺序。

章节来源
- [SwaggerPlugin.php:17-106](file://public/plugins/swagger/SwaggerPlugin.php#L17-L106)
- [SystemInfoPlugin.php:14-85](file://public/plugins/system_info/SystemInfoPlugin.php#L14-L85)
- [TiandituPlugin.php:13-46](file://public/plugins/tianditu/TiandituPlugin.php#L13-L46)
- [config.php（天地图插件）:1-17](file://public/plugins/tianditu/config.php#L1-L17)
- [OpenApi.php:7-65](file://public/plugins/swagger/service/OpenApi.php#L7-L65)
- [composer.json（Swagger 插件）:1-20](file://public/plugins/swagger/composer.json#L1-L20)

### 插件生命周期管理
- 安装：install 返回布尔值，成功安装后可在数据库中看到插件记录。
- 启用/禁用：通过后台插件列表操作，更新插件状态。
- 卸载：uninstall 返回布尔值，卸载前应清理数据库与文件资源。
- 更新：通过后台“更新插件”按钮或手动替换代码后刷新缓存。

章节来源
- [Plugin.php:303-308](file://vendor/thinkcmf/cmf/src/lib/Plugin.php#L303-L308)
- [index.html（后台插件列表）:112-206](file://public/themes/admin_default/admin/plugin/index.html#L112-L206)

### 钩子使用与注册
- 系统内置钩子：如 adminDashboard、adminDialogMapView、adminApiImportView 等。
- 自定义钩子：在插件类中新增回调方法，即可被系统识别并按顺序执行。
- 注册与执行：通过后台“钩子管理”页面查看钩子类型与描述，进入“管理插件”设置各插件在该钩子上的执行顺序。

章节来源
- [SystemInfoPlugin.php:39-82](file://public/plugins/system_info/SystemInfoPlugin.php#L39-L82)
- [TiandituPlugin.php:38-43](file://public/plugins/tianditu/TiandituPlugin.php#L38-L43)
- [SwaggerPlugin.php:44-103](file://public/plugins/swagger/SwaggerPlugin.php#L44-L103)
- [hooks.html（后台钩子管理）:1-43](file://public/themes/admin_default/admin/plugin/hooks.html#L1-L43)
- [plugins.html（钩子插件排序）:1-53](file://public/themes/admin_default/admin/hook/plugins.html#L1-L53)

### 插件 API 说明与示例
- Swagger 插件 REST 接口
  - 路径：/plugin/swagger/api_admin_index/importApi
  - 方法：POST
  - 功能：扫描并导入后台 API 到 admin_api 与 auth_rule
  - 成功响应：返回“API导入成功！”提示
- Swagger 插件前端导出
  - 路径：/plugin/swagger/index/config
  - 方法：GET
  - 功能：返回 OpenAPI JSON，支持跨域
- SystemInfo 插件
  - 钩子：adminDashboard 返回面板宽度、视图与插件标识
- Tianditu 插件
  - 钩子：adminDialogMapView 返回弹窗视图，读取配置项 map_secret_key

章节来源
- [ApiAdminIndexController.php:44-102](file://public/plugins/swagger/controller/ApiAdminIndexController.php#L44-L102)
- [IndexController.php:20-40](file://public/plugins/swagger/controller/IndexController.php#L20-L40)
- [SystemInfoPlugin.php:39-82](file://public/plugins/system_info/SystemInfoPlugin.php#L39-L82)
- [TiandituPlugin.php:38-43](file://public/plugins/tianditu/TiandituPlugin.php#L38-L43)