xto-fronted 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +19 -8
  2. package/dist/App.vue.d.ts +2 -0
  3. package/dist/api/auth.d.ts +8 -0
  4. package/dist/api/system.d.ts +16 -0
  5. package/dist/api/user.d.ts +13 -0
  6. package/dist/components/Layout/Footer.vue.d.ts +2 -0
  7. package/dist/components/Layout/Header.vue.d.ts +5 -0
  8. package/dist/components/Layout/Sidebar.vue.d.ts +7 -0
  9. package/dist/components/Layout/Tabs.vue.d.ts +2 -0
  10. package/dist/components/Layout/TopMenu.vue.d.ts +2 -0
  11. package/dist/components/Layout/index.vue.d.ts +2 -0
  12. package/dist/composables/useApp.d.ts +29 -0
  13. package/dist/composables/useAuth.d.ts +6 -0
  14. package/dist/composables/useForm.d.ts +20 -0
  15. package/dist/composables/useTable.d.ts +29 -0
  16. package/dist/directives/permission.d.ts +4 -0
  17. package/dist/enums/index.d.ts +32 -0
  18. package/dist/index-BCv8lkNK.js +142 -0
  19. package/dist/index-CGq_kOCw.js +372 -0
  20. package/dist/index-CrJYCWl-.js +345 -0
  21. package/dist/index-D8DWh2wV.js +475 -0
  22. package/dist/index-TvEBauqV.js +2067 -0
  23. package/dist/index.d.ts +31 -0
  24. package/dist/index.es.js +91 -0
  25. package/dist/index.umd.js +1 -0
  26. package/dist/main.d.ts +0 -0
  27. package/dist/router/dynamicRoutes.d.ts +30 -0
  28. package/dist/router/guards.d.ts +17 -0
  29. package/dist/router/index.d.ts +6 -0
  30. package/dist/router/layoutRoute.d.ts +18 -0
  31. package/dist/router/staticRoutes.d.ts +3 -0
  32. package/dist/stores/app.d.ts +87 -0
  33. package/dist/stores/auth.d.ts +41 -0
  34. package/dist/stores/index.d.ts +9 -0
  35. package/dist/stores/menu.d.ts +77 -0
  36. package/dist/stores/user.d.ts +92 -0
  37. package/dist/{assets/index-4-QoJAgA.css → style.css} +1 -1
  38. package/dist/utils/auth.d.ts +27 -0
  39. package/dist/utils/config.d.ts +30 -0
  40. package/dist/utils/permission.d.ts +18 -0
  41. package/dist/utils/request.d.ts +23 -0
  42. package/dist/utils/storage.d.ts +24 -0
  43. package/dist/views/dashboard/index.vue.d.ts +2 -0
  44. package/dist/views/error/403.vue.d.ts +2 -0
  45. package/dist/views/error/404.vue.d.ts +2 -0
  46. package/dist/views/login/index.vue.d.ts +4 -0
  47. package/dist/views/system/menu/index.vue.d.ts +4 -0
  48. package/dist/views/system/role/index.vue.d.ts +4 -0
  49. package/dist/views/system/user/index.vue.d.ts +4 -0
  50. package/package.json +3 -3
  51. package/dist/assets/403-AFBQifUI.js +0 -1
  52. package/dist/assets/403-BHEXXbt2.css +0 -1
  53. package/dist/assets/404-Ct_A1n7S.css +0 -1
  54. package/dist/assets/404-WFvpcD2_.js +0 -1
  55. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +0 -1
  56. package/dist/assets/index-BHwEwbkp.js +0 -1
  57. package/dist/assets/index-BRR97dc6.js +0 -1
  58. package/dist/assets/index-BTsRosKu.js +0 -1
  59. package/dist/assets/index-BpV_8nl0.js +0 -1
  60. package/dist/assets/index-CUh_s55Z.css +0 -1
  61. package/dist/assets/index-CZAlkDIC.css +0 -1
  62. package/dist/assets/index-Cz2P_bsS.js +0 -1
  63. package/dist/assets/index-D9wlAuR_.js +0 -1
  64. package/dist/assets/index-DawJb02s.css +0 -1
  65. package/dist/assets/index-Do3gMkWw.js +0 -2
  66. package/dist/assets/index-DwVgMO8e.js +0 -1
  67. package/dist/assets/index-GDP-IkXE.css +0 -1
  68. package/dist/assets/index-PfV8pzQz.css +0 -1
  69. package/dist/assets/index-Swfu6yvD.css +0 -1
  70. package/dist/assets/vendor-42ANG6Sg.js +0 -6
  71. package/dist/assets/vite-Dw-pgLOX.js +0 -1
  72. package/dist/assets/vue-vendor-Br-l7wbK.js +0 -29
  73. package/dist/assets/xto-base-C-IBqjVs.js +0 -1
  74. package/dist/assets/xto-base-C6eqMPdO.css +0 -1
  75. package/dist/assets/xto-business--V1F5Gwb.css +0 -1
  76. package/dist/assets/xto-core-DZK7Cyg0.js +0 -1
  77. package/dist/assets/xto-data-BFpiDgJi.js +0 -1
  78. package/dist/assets/xto-data-CnAQAQH2.css +0 -1
  79. package/dist/assets/xto-feedback-B7ipsTfz.js +0 -1
  80. package/dist/assets/xto-feedback-DBwJzoTj.css +0 -1
  81. package/dist/assets/xto-form-CrsyAjyr.css +0 -1
  82. package/dist/assets/xto-form-NRjKKNcY.js +0 -1
  83. package/dist/assets/xto-layout-BqU8RuWL.css +0 -1
  84. package/dist/assets/xto-navigation-BiSaXPfr.js +0 -1
  85. package/dist/assets/xto-navigation-C1cnSL2E.css +0 -1
  86. package/dist/index.html +0 -28
package/README.md CHANGED
@@ -40,23 +40,34 @@ pnpm install
40
40
  # 启动开发服务器
41
41
  pnpm dev
42
42
 
43
- # 构建
43
+ # 构建(应用模式 - 用于本地测试)
44
44
  pnpm build
45
+
46
+ # 构建(库模式 - 用于 npm 发布)
47
+ pnpm build:lib
45
48
  ```
46
49
 
47
- ## 推送仓库
50
+ ## 发布到 npm
51
+
48
52
  ```bash
49
- pnpm install
53
+ # ⚠️ 重要:必须使用 build:lib 构建库产物
50
54
 
51
- # 1. 构建(库模式)
55
+ # 1. 构建库产物
52
56
  pnpm run build:lib
53
57
 
54
- # 2. 登录 npm(首次需要)
55
- npm login
58
+ # 2. 验证构建产物(确保包含 index.es.js 和 index.umd.js)
59
+ ls dist/
56
60
 
57
- # 3. 发布
58
- npm publish
61
+ # 3. 更新版本号(修改 package.json 中的 version)
62
+
63
+ # 4. 发布
64
+ npm publish --access public
65
+
66
+ # 5. 提交代码
67
+ git add -A && git commit -m "chore: 发布 xto-fronted x.x.x"
68
+ git push origin main
59
69
  ```
70
+
60
71
  ## 功能模块
61
72
 
62
73
  - [x] 登录/登出
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { LoginParams, LoginResult, UserInfo } from '../types/api';
2
+ export declare function login(data: LoginParams): Promise<LoginResult>;
3
+ export declare function logout(): Promise<unknown>;
4
+ export declare function getUserInfo(): Promise<UserInfo>;
5
+ export declare function refreshToken(refreshToken: string): Promise<{
6
+ token: string;
7
+ expireTime: number;
8
+ }>;
@@ -0,0 +1,16 @@
1
+ import { PageParams, PageResponse } from '../utils/request';
2
+ import { RoleInfo, MenuItem } from '../types/api';
3
+ export declare function getRoleList(params: PageParams & {
4
+ status?: number;
5
+ keyword?: string;
6
+ }): Promise<PageResponse<RoleInfo>>;
7
+ export declare function getRoleDetail(id: string | number): Promise<RoleInfo>;
8
+ export declare function createRole(data: Partial<RoleInfo>): Promise<RoleInfo>;
9
+ export declare function updateRole(id: string | number, data: Partial<RoleInfo>): Promise<RoleInfo>;
10
+ export declare function deleteRole(id: string | number): Promise<unknown>;
11
+ export declare function updateRoleStatus(id: string | number, status: number): Promise<unknown>;
12
+ export declare function getMenuList(): Promise<MenuItem[]>;
13
+ export declare function getMenuTree(appId?: string): Promise<MenuItem[]>;
14
+ export declare function createMenu(data: Partial<MenuItem>): Promise<MenuItem>;
15
+ export declare function updateMenu(id: string | number, data: Partial<MenuItem>): Promise<MenuItem>;
16
+ export declare function deleteMenu(id: string | number): Promise<unknown>;
@@ -0,0 +1,13 @@
1
+ import { PageParams, PageResponse } from '../utils/request';
2
+ import { UserInfo } from '../types/api';
3
+ export declare function getUserList(params: PageParams & {
4
+ status?: number;
5
+ keyword?: string;
6
+ }): Promise<PageResponse<UserInfo>>;
7
+ export declare function getUserDetail(id: string | number): Promise<UserInfo>;
8
+ export declare function createUser(data: Partial<UserInfo>): Promise<UserInfo>;
9
+ export declare function updateUser(id: string | number, data: Partial<UserInfo>): Promise<UserInfo>;
10
+ export declare function deleteUser(id: string | number): Promise<unknown>;
11
+ export declare function batchDeleteUsers(ids: (string | number)[]): Promise<unknown>;
12
+ export declare function updateUserStatus(id: string | number, status: number): Promise<unknown>;
13
+ export declare function resetPassword(id: string | number): Promise<unknown>;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,5 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
2
+ dropdownRef: HTMLDivElement;
3
+ searchRef: HTMLDivElement;
4
+ }, HTMLDivElement>;
5
+ export default _default;
@@ -0,0 +1,7 @@
1
+ type __VLS_Props = {
2
+ menuList?: any[];
3
+ };
4
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
5
+ menuList: any[];
6
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 应用组合函数
3
+ * 提供应用级别的状态和方法
4
+ */
5
+ /**
6
+ * 应用级别组合函数
7
+ * @returns 应用状态和方法
8
+ */
9
+ export declare function useApp(): {
10
+ userName: import('vue').ComputedRef<string>;
11
+ userInfo: import('vue').ComputedRef<{
12
+ appId: string;
13
+ userId: string;
14
+ userName: string;
15
+ departmentName?: string | undefined;
16
+ email?: string | undefined;
17
+ mobilePhone?: string | undefined;
18
+ positionName?: string | undefined;
19
+ avatar?: string | undefined;
20
+ } | null>;
21
+ appName: import('vue').ComputedRef<string>;
22
+ isLoggedIn: import('vue').ComputedRef<boolean>;
23
+ isDark: import('vue').ComputedRef<boolean>;
24
+ theme: import('vue').ComputedRef<import('../stores/app').ThemeMode>;
25
+ isCollapsed: import('vue').ComputedRef<boolean>;
26
+ layout: import('vue').ComputedRef<import('../stores/app').LayoutMode>;
27
+ toggleTheme: () => void;
28
+ toggleCollapse: () => void;
29
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 权限组合函数
3
+ */
4
+ export declare function useAuth(): {
5
+ isLoggedIn: import('vue').ComputedRef<boolean>;
6
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 表单组合函数
3
+ */
4
+ export interface FormOptions<T = any> {
5
+ rules?: Record<string, any[]>;
6
+ onSubmit?: (data: T) => Promise<void> | void;
7
+ }
8
+ export declare function useForm<T extends Record<string, any> = Record<string, any>>(initialValues: T, options?: FormOptions<T>): {
9
+ formRef: import('vue').Ref<any, any>;
10
+ formData: import('vue').Reactive<T>;
11
+ rules: Record<string, any[]> | undefined;
12
+ loading: import('vue').Ref<boolean, boolean>;
13
+ visible: import('vue').Ref<boolean, boolean>;
14
+ isEdit: import('vue').Ref<boolean, boolean>;
15
+ openAdd: () => void;
16
+ openEdit: (data: Partial<T>) => void;
17
+ close: () => void;
18
+ resetForm: () => void;
19
+ handleSubmit: () => Promise<void>;
20
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * 表格组合函数
3
+ */
4
+ export interface TableOptions<T = any> {
5
+ fetchData: (params: any) => Promise<{
6
+ list: T[];
7
+ total: number;
8
+ }>;
9
+ defaultPageSize?: number;
10
+ }
11
+ export declare function useTable<T = any>(options: TableOptions<T>): {
12
+ loading: import('vue').Ref<boolean, boolean>;
13
+ data: any;
14
+ total: import('vue').Ref<number, number>;
15
+ currentPage: import('vue').Ref<number, number>;
16
+ pageSize: import('vue').Ref<number, number>;
17
+ searchParams: Record<string, any>;
18
+ pagination: import('vue').ComputedRef<{
19
+ current: number;
20
+ pageSize: number;
21
+ total: number;
22
+ }>;
23
+ getData: () => Promise<void>;
24
+ handleSearch: () => void;
25
+ handleReset: () => void;
26
+ handlePageChange: (page: number) => void;
27
+ handleSizeChange: (size: number) => void;
28
+ refresh: () => void;
29
+ };
@@ -0,0 +1,4 @@
1
+ import { Directive } from 'vue';
2
+ declare const permission: Directive;
3
+ export default permission;
4
+ export declare function setupPermissionDirective(app: any): void;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 枚举常量
3
+ */
4
+ export declare enum Status {
5
+ ENABLED = 1,
6
+ DISABLED = 0
7
+ }
8
+ export declare enum Gender {
9
+ UNKNOWN = 0,
10
+ MALE = 1,
11
+ FEMALE = 2
12
+ }
13
+ export declare enum MenuType {
14
+ DIRECTORY = 0,
15
+ MENU = 1,
16
+ BUTTON = 2
17
+ }
18
+ export declare const StatusText: Record<Status, string>;
19
+ export declare const GenderText: Record<Gender, string>;
20
+ export declare const MenuTypeText: Record<MenuType, string>;
21
+ export declare const StatusOptions: {
22
+ label: string;
23
+ value: Status;
24
+ }[];
25
+ export declare const GenderOptions: {
26
+ label: string;
27
+ value: Gender;
28
+ }[];
29
+ export declare const MenuTypeOptions: {
30
+ label: string;
31
+ value: MenuType;
32
+ }[];
@@ -0,0 +1,142 @@
1
+ import { defineComponent as g, ref as r, resolveComponent as x, openBlock as o, createElementBlock as c, createElementVNode as s, Fragment as d, renderList as m, createBlock as u, unref as l, withCtx as i, normalizeStyle as p, toDisplayString as a, createVNode as n, createTextVNode as q } from "vue";
2
+ import { Card as _, Tag as C, Progress as y } from "@xto/data";
3
+ import { _ as V } from "./index-TvEBauqV.js";
4
+ const B = { class: "dashboard" }, L = { class: "dashboard__stats" }, N = { class: "stat-card__content" }, S = { class: "stat-card__info" }, w = { class: "stat-card__title" }, z = { class: "dashboard__main" }, E = { class: "quick-links" }, I = { class: "quick-link__icon" }, T = { class: "quick-link__title" }, D = { class: "activity-list" }, F = { class: "activity-item__action" }, P = { class: "activity-item__time" }, U = { class: "system-info" }, j = { class: "system-info__item" }, A = { class: "system-info__item" }, G = /* @__PURE__ */ g({
5
+ __name: "index",
6
+ setup(H) {
7
+ const f = r([
8
+ { title: "用户总数", value: 1234, icon: "👥", color: "#409eff" },
9
+ { title: "今日访问", value: 567, icon: "👀", color: "#67c23a" },
10
+ { title: "订单数量", value: 890, icon: "📦", color: "#e6a23c" },
11
+ { title: "销售金额", value: 123456, icon: "💰", color: "#f56c6c" }
12
+ ]), v = r([
13
+ { user: "张三", action: "登录系统", time: "2分钟前", type: "success" },
14
+ { user: "李四", action: "修改了用户信息", time: "5分钟前", type: "warning" },
15
+ { user: "王五", action: "创建了新订单", time: "10分钟前", type: "info" },
16
+ { user: "赵六", action: "删除了测试数据", time: "30分钟前", type: "danger" },
17
+ { user: "钱七", action: "更新了系统配置", time: "1小时前", type: "primary" }
18
+ ]), k = r([
19
+ { title: "用户管理", path: "/system/user", icon: "👤" },
20
+ { title: "角色管理", path: "/system/role", icon: "👥" },
21
+ { title: "菜单管理", path: "/system/menu", icon: "📋" },
22
+ { title: "系统设置", path: "/system", icon: "⚙️" }
23
+ ]);
24
+ return (J, t) => {
25
+ const b = x("router-link");
26
+ return o(), c("div", B, [
27
+ s("div", L, [
28
+ (o(!0), c(d, null, m(f.value, (e) => (o(), u(l(_), {
29
+ key: e.title,
30
+ class: "stat-card"
31
+ }, {
32
+ default: i(() => [
33
+ s("div", N, [
34
+ s("div", {
35
+ class: "stat-card__icon",
36
+ style: p({ backgroundColor: e.color + "20" })
37
+ }, a(e.icon), 5),
38
+ s("div", S, [
39
+ s("div", w, a(e.title), 1),
40
+ s("div", {
41
+ class: "stat-card__value",
42
+ style: p({ color: e.color })
43
+ }, a(e.value.toLocaleString()), 5)
44
+ ])
45
+ ])
46
+ ]),
47
+ _: 2
48
+ }, 1024))), 128))
49
+ ]),
50
+ s("div", z, [
51
+ n(l(_), { class: "dashboard__quick" }, {
52
+ header: i(() => [...t[0] || (t[0] = [
53
+ s("span", { class: "card-title" }, "快捷入口", -1)
54
+ ])]),
55
+ default: i(() => [
56
+ s("div", E, [
57
+ (o(!0), c(d, null, m(k.value, (e) => (o(), u(b, {
58
+ key: e.path,
59
+ to: e.path,
60
+ class: "quick-link"
61
+ }, {
62
+ default: i(() => [
63
+ s("span", I, a(e.icon), 1),
64
+ s("span", T, a(e.title), 1)
65
+ ]),
66
+ _: 2
67
+ }, 1032, ["to"]))), 128))
68
+ ])
69
+ ]),
70
+ _: 1
71
+ }),
72
+ n(l(_), { class: "dashboard__activity" }, {
73
+ header: i(() => [...t[1] || (t[1] = [
74
+ s("span", { class: "card-title" }, "最近活动", -1)
75
+ ])]),
76
+ default: i(() => [
77
+ s("div", D, [
78
+ (o(!0), c(d, null, m(v.value, (e, h) => (o(), c("div", {
79
+ key: h,
80
+ class: "activity-item"
81
+ }, [
82
+ n(l(C), {
83
+ type: e.type,
84
+ size: "small"
85
+ }, {
86
+ default: i(() => [
87
+ q(a(e.user), 1)
88
+ ]),
89
+ _: 2
90
+ }, 1032, ["type"]),
91
+ s("span", F, a(e.action), 1),
92
+ s("span", P, a(e.time), 1)
93
+ ]))), 128))
94
+ ])
95
+ ]),
96
+ _: 1
97
+ })
98
+ ]),
99
+ n(l(_), { class: "dashboard__system" }, {
100
+ header: i(() => [...t[2] || (t[2] = [
101
+ s("span", { class: "card-title" }, "系统信息", -1)
102
+ ])]),
103
+ default: i(() => [
104
+ s("div", U, [
105
+ t[5] || (t[5] = s("div", { class: "system-info__item" }, [
106
+ s("span", { class: "system-info__label" }, "系统版本"),
107
+ s("span", { class: "system-info__value" }, "v1.0.0")
108
+ ], -1)),
109
+ t[6] || (t[6] = s("div", { class: "system-info__item" }, [
110
+ s("span", { class: "system-info__label" }, "Vue 版本"),
111
+ s("span", { class: "system-info__value" }, "3.4.21")
112
+ ], -1)),
113
+ t[7] || (t[7] = s("div", { class: "system-info__item" }, [
114
+ s("span", { class: "system-info__label" }, "构建工具"),
115
+ s("span", { class: "system-info__value" }, "Vite 5")
116
+ ], -1)),
117
+ t[8] || (t[8] = s("div", { class: "system-info__item" }, [
118
+ s("span", { class: "system-info__label" }, "UI 组件库"),
119
+ s("span", { class: "system-info__value" }, "xto")
120
+ ], -1)),
121
+ s("div", j, [
122
+ t[3] || (t[3] = s("span", { class: "system-info__label" }, "服务器状态", -1)),
123
+ n(l(y), {
124
+ percentage: 75,
125
+ status: "success"
126
+ })
127
+ ]),
128
+ s("div", A, [
129
+ t[4] || (t[4] = s("span", { class: "system-info__label" }, "内存使用", -1)),
130
+ n(l(y), { percentage: 45 })
131
+ ])
132
+ ])
133
+ ]),
134
+ _: 1
135
+ })
136
+ ]);
137
+ };
138
+ }
139
+ }), Q = /* @__PURE__ */ V(G, [["__scopeId", "data-v-44648cb1"]]);
140
+ export {
141
+ Q as default
142
+ };