@taskon/widget-react 0.0.1-beta.1
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.
- package/README.md +1065 -0
- package/dist/CommunityTaskList.css +4893 -0
- package/dist/EligibilityInfo.css +2337 -0
- package/dist/LeaderboardWidget.css +815 -0
- package/dist/PageBuilder.css +54 -0
- package/dist/Quest.css +4214 -0
- package/dist/TaskOnProvider.css +163 -0
- package/dist/TipPopover.css +210 -0
- package/dist/UserCenterWidget.css +297 -0
- package/dist/UserCenterWidget2.css +3519 -0
- package/dist/WidgetShell.css +182 -0
- package/dist/chunks/CommunityTaskList-DoPGZsw1.js +6813 -0
- package/dist/chunks/EligibilityInfo-C7GZ2G5u.js +22228 -0
- package/dist/chunks/LeaderboardWidget-CmYfDeHV.js +1068 -0
- package/dist/chunks/PageBuilder-Tmhf2GTS.js +150 -0
- package/dist/chunks/Quest-DKFZ-pPU.js +8839 -0
- package/dist/chunks/TaskOnProvider-BD6Vp2x8.js +1435 -0
- package/dist/chunks/ThemeProvider-wnSXrNQb.js +1118 -0
- package/dist/chunks/TipPopover-BrW8jo71.js +2926 -0
- package/dist/chunks/UserCenterWidget-BE329iS7.js +3546 -0
- package/dist/chunks/UserCenterWidget-BVw_IEEd.js +3989 -0
- package/dist/chunks/WidgetShell-D_5OjvNZ.js +1517 -0
- package/dist/chunks/common-ja-DWhTaFHb.js +23 -0
- package/dist/chunks/common-ko-80ezXsMG.js +23 -0
- package/dist/chunks/dynamic-import-helper-DxEFwm31.js +537 -0
- package/dist/chunks/index-CwMvO_wZ.js +777 -0
- package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +119 -0
- package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +119 -0
- package/dist/chunks/useToast-B-wyO5zL.js +93 -0
- package/dist/chunks/useWidgetLocale-JDelxtt8.js +74 -0
- package/dist/chunks/usercenter-ja-uu-XfVF9.js +332 -0
- package/dist/chunks/usercenter-ko-DYgUOVzd.js +332 -0
- package/dist/community-task.d.ts +451 -0
- package/dist/community-task.js +9 -0
- package/dist/core.d.ts +803 -0
- package/dist/core.js +22 -0
- package/dist/dynamic-import-helper.css +389 -0
- package/dist/index.d.ts +1660 -0
- package/dist/index.js +41 -0
- package/dist/leaderboard.d.ts +547 -0
- package/dist/leaderboard.js +18 -0
- package/dist/page-builder.d.ts +20 -0
- package/dist/page-builder.js +4 -0
- package/dist/quest.d.ts +400 -0
- package/dist/quest.js +8 -0
- package/dist/user-center.d.ts +1780 -0
- package/dist/user-center.js +713 -0
- package/package.json +105 -0
package/dist/quest.d.ts
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { CampaignStatus } from '@taskon/core';
|
|
2
|
+
import { CampaignStatusInfo } from '@taskon/core';
|
|
3
|
+
import { CampaignWinnerReward } from '@taskon/core';
|
|
4
|
+
import { ChainType } from '@taskon/core';
|
|
5
|
+
import { default as default_2 } from 'react';
|
|
6
|
+
import { EligibilityValueItem } from '@taskon/core';
|
|
7
|
+
import { QuestApi } from '@taskon/core';
|
|
8
|
+
import { QuestCampaignInfo } from '@taskon/core';
|
|
9
|
+
import { QuestPointsInfo } from '@taskon/core';
|
|
10
|
+
import { QuestRewardInfo } from '@taskon/core';
|
|
11
|
+
import { QuestRewardInfoSimple } from '@taskon/core';
|
|
12
|
+
import { RewardDisplayMode } from '@taskon/core';
|
|
13
|
+
import { RewardValueInfo } from '@taskon/core';
|
|
14
|
+
import { SnsType } from '@taskon/core';
|
|
15
|
+
import { TaskValueItem } from '@taskon/core';
|
|
16
|
+
import { UserCampaignStatusInfo } from '@taskon/core';
|
|
17
|
+
import { UserTaskStatus } from '@taskon/core';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Quest Complete Button 组件 Props
|
|
21
|
+
*/
|
|
22
|
+
export declare interface QuestCompleteButtonProps {
|
|
23
|
+
/** Campaign ID */
|
|
24
|
+
campaignId: number;
|
|
25
|
+
/** Campaign 信息 */
|
|
26
|
+
campaign: QuestCampaignInfo;
|
|
27
|
+
/** 用户状态信息 */
|
|
28
|
+
userStatus?: UserCampaignStatusInfo;
|
|
29
|
+
/** 是否禁用 */
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
/** 提交成功回调 */
|
|
32
|
+
onSuccess?: () => void;
|
|
33
|
+
/** 提交失败回调 */
|
|
34
|
+
onError?: (error: Error) => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Quest 资格展示信息
|
|
39
|
+
*/
|
|
40
|
+
export declare interface QuestEligibilityDisplay {
|
|
41
|
+
/** 资格条件列表 */
|
|
42
|
+
eligibilities: EligibilityValueItem[];
|
|
43
|
+
/** 用户是否符合资格 */
|
|
44
|
+
isEligible: boolean;
|
|
45
|
+
/** 各条件的验证结果 */
|
|
46
|
+
eligibilityResults: boolean[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Quest Header 组件 Props
|
|
51
|
+
*/
|
|
52
|
+
export declare interface QuestHeaderProps {
|
|
53
|
+
/** Campaign 信息 */
|
|
54
|
+
campaign: QuestCampaignInfo;
|
|
55
|
+
/** 是否显示 Banner */
|
|
56
|
+
showBanner?: boolean;
|
|
57
|
+
/** 是否显示标题 */
|
|
58
|
+
showTitle?: boolean;
|
|
59
|
+
/** 是否显示描述 */
|
|
60
|
+
showDescription?: boolean;
|
|
61
|
+
/** 查看更多描述回调 */
|
|
62
|
+
onViewMore?: () => void;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Quest 奖励展示信息
|
|
67
|
+
*/
|
|
68
|
+
export declare interface QuestRewardDisplay {
|
|
69
|
+
/** 资格者奖励 */
|
|
70
|
+
qualifierRewards: QuestRewardInfo[];
|
|
71
|
+
/** 获奖者奖励(简化信息) */
|
|
72
|
+
winnerRewardsSimple: QuestRewardInfoSimple[];
|
|
73
|
+
/** 是否有资格者奖励 */
|
|
74
|
+
hasQualifierRewards: boolean;
|
|
75
|
+
/** 是否有获奖者奖励 */
|
|
76
|
+
hasWinnerRewards: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Quest Sidebar 组件 Props
|
|
81
|
+
*/
|
|
82
|
+
export declare interface QuestSidebarProps {
|
|
83
|
+
/** Campaign 信息 */
|
|
84
|
+
campaign: QuestCampaignInfo;
|
|
85
|
+
/** Campaign 状态信息 */
|
|
86
|
+
statusInfo?: CampaignStatusInfo;
|
|
87
|
+
/** 用户状态信息 */
|
|
88
|
+
userStatus?: UserCampaignStatusInfo;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Quest 状态信息(用于展示)
|
|
93
|
+
*/
|
|
94
|
+
export declare interface QuestStatusDisplay {
|
|
95
|
+
/** 状态类型 */
|
|
96
|
+
status: QuestStatusType;
|
|
97
|
+
/** 状态标签(Upcoming / Ongoing / Ended) */
|
|
98
|
+
label: string;
|
|
99
|
+
/** 原始状态枚举 */
|
|
100
|
+
originalStatus: CampaignStatus;
|
|
101
|
+
/** 是否已开始 */
|
|
102
|
+
isStarted: boolean;
|
|
103
|
+
/** 是否已结束 */
|
|
104
|
+
isEnded: boolean;
|
|
105
|
+
/** 是否进行中 */
|
|
106
|
+
isActive: boolean;
|
|
107
|
+
/** 剩余时间(毫秒,仅进行中状态有效) */
|
|
108
|
+
remainingTime?: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Quest 状态(简化)
|
|
113
|
+
*/
|
|
114
|
+
export declare type QuestStatusType = "upcoming" | "ongoing" | "ended";
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Quest Task List 组件 Props
|
|
118
|
+
*/
|
|
119
|
+
export declare interface QuestTaskListProps {
|
|
120
|
+
/** 任务列表 */
|
|
121
|
+
tasks: TaskValueItem[];
|
|
122
|
+
/** 用户任务状态 */
|
|
123
|
+
userTaskStatuses?: UserTaskStatus[];
|
|
124
|
+
/** Campaign ID */
|
|
125
|
+
campaignId: number;
|
|
126
|
+
/** 任务点击回调 */
|
|
127
|
+
onTaskClick?: (task: TaskValueItem) => void;
|
|
128
|
+
/** 任务完成回调 */
|
|
129
|
+
onTaskCompleted?: (taskId: number) => void;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Quest 任务进度信息
|
|
134
|
+
*/
|
|
135
|
+
export declare interface QuestTaskProgress {
|
|
136
|
+
/** 必做任务总数 */
|
|
137
|
+
requiredTotal: number;
|
|
138
|
+
/** 必做任务已完成数 */
|
|
139
|
+
requiredCompleted: number;
|
|
140
|
+
/** 选做任务总数 */
|
|
141
|
+
optionalTotal: number;
|
|
142
|
+
/** 选做任务已完成数 */
|
|
143
|
+
optionalCompleted: number;
|
|
144
|
+
/** 最少需要完成的选做任务数 */
|
|
145
|
+
minOptionalRequired: number;
|
|
146
|
+
/** 是否满足提交条件 */
|
|
147
|
+
canSubmit: boolean;
|
|
148
|
+
/** 当前积分 */
|
|
149
|
+
currentPoints: QuestPointsInfo | null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Quest 用户状态展示信息
|
|
154
|
+
*/
|
|
155
|
+
export declare interface QuestUserStatusDisplay {
|
|
156
|
+
/** 是否为访客 */
|
|
157
|
+
isVisitor: boolean;
|
|
158
|
+
/** 是否为参与者 */
|
|
159
|
+
isParticipant: boolean;
|
|
160
|
+
/** 是否已提交 */
|
|
161
|
+
isSubmitter: boolean;
|
|
162
|
+
/** 是否为资格者 */
|
|
163
|
+
isQualifier: boolean;
|
|
164
|
+
/** 是否为获奖者 */
|
|
165
|
+
isWinner: boolean;
|
|
166
|
+
/** 提交是否失败 */
|
|
167
|
+
submitFailed: boolean;
|
|
168
|
+
/** 用户排名 */
|
|
169
|
+
ranking: number;
|
|
170
|
+
/** 任务进度 */
|
|
171
|
+
taskProgress: QuestTaskProgress;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Quest Widget 主组件
|
|
176
|
+
*
|
|
177
|
+
* @description
|
|
178
|
+
* 将 taskon-website 中的 Quest (Campaign) 详情页迁移为 React Widget 组件
|
|
179
|
+
* 供第三方项目嵌入使用
|
|
180
|
+
*
|
|
181
|
+
* 架构原则:只在根组件访问 context,子组件通过 props 接收数据
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```tsx
|
|
185
|
+
* import { QuestWidget } from '@taskon/widget-react';
|
|
186
|
+
*
|
|
187
|
+
* function App() {
|
|
188
|
+
* return (
|
|
189
|
+
* <TaskOnProvider config={{ ... }}>
|
|
190
|
+
* <QuestWidget
|
|
191
|
+
* campaignId={123}
|
|
192
|
+
* showBanner={true}
|
|
193
|
+
* onLoaded={(campaign) => console.log('Quest loaded:', campaign.name)}
|
|
194
|
+
* onSubmitSuccess={() => console.log('Quest completed!')}
|
|
195
|
+
* />
|
|
196
|
+
* </TaskOnProvider>
|
|
197
|
+
* );
|
|
198
|
+
* }
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
declare function QuestWidget(props: QuestWidgetProps): default_2.ReactElement;
|
|
202
|
+
export { QuestWidget as Quest }
|
|
203
|
+
export { QuestWidget }
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Quest Widget 主组件 Props
|
|
207
|
+
*/
|
|
208
|
+
export declare interface QuestWidgetProps {
|
|
209
|
+
/**
|
|
210
|
+
* Widget ID - 传入后从云端加载配置(theme + function)
|
|
211
|
+
* 云端配置包含 campaignId、显示选项、自定义分享文案等
|
|
212
|
+
*/
|
|
213
|
+
widgetId?: number;
|
|
214
|
+
/**
|
|
215
|
+
* Campaign ID
|
|
216
|
+
* - 如果传入 widgetId,campaignId 可从云端配置获取
|
|
217
|
+
* - 如果同时传入 widgetId 和 campaignId,本地 props 优先
|
|
218
|
+
*/
|
|
219
|
+
campaignId?: number;
|
|
220
|
+
/** 渠道标识(可选) */
|
|
221
|
+
channel?: string;
|
|
222
|
+
/** KOL 标识(可选) */
|
|
223
|
+
kolHandle?: string;
|
|
224
|
+
/** 邀请码(可选) */
|
|
225
|
+
inviteCode?: string;
|
|
226
|
+
/** Boost ID(可选) */
|
|
227
|
+
boostId?: number;
|
|
228
|
+
/** 是否为预览模式 */
|
|
229
|
+
isPreview?: boolean;
|
|
230
|
+
/** 是否显示 Banner */
|
|
231
|
+
showBanner?: boolean;
|
|
232
|
+
/** 是否显示标题 */
|
|
233
|
+
showTitle?: boolean;
|
|
234
|
+
/** 是否显示描述 */
|
|
235
|
+
showDescription?: boolean;
|
|
236
|
+
/** 是否显示参与人数 */
|
|
237
|
+
showParticipants?: boolean;
|
|
238
|
+
/** 加载完成回调 */
|
|
239
|
+
onLoaded?: (campaign: QuestCampaignInfo) => void;
|
|
240
|
+
/** 任务完成回调 */
|
|
241
|
+
onTaskCompleted?: (taskId: number) => void;
|
|
242
|
+
/** Quest 提交成功回调 */
|
|
243
|
+
onSubmitSuccess?: () => void;
|
|
244
|
+
/** 错误回调 */
|
|
245
|
+
onError?: (error: Error) => void;
|
|
246
|
+
/** 连接钱包回调(未登录时触发) */
|
|
247
|
+
onConnectWallet?: () => void;
|
|
248
|
+
/** 领取 NFT 回调 (NFT/MintedNft/Cap) */
|
|
249
|
+
onClaimNft?: (reward: RewardValueInfo, layer: CampaignWinnerReward) => Promise<void>;
|
|
250
|
+
/** 领取 Discord 角色回调 */
|
|
251
|
+
onClaimDiscordRole?: (reward: RewardValueInfo, layer: CampaignWinnerReward) => Promise<void>;
|
|
252
|
+
/**
|
|
253
|
+
* @deprecated 绑定现在由 Widget 内部处理,此回调不再使用
|
|
254
|
+
* 需要绑定链地址时的回调
|
|
255
|
+
*/
|
|
256
|
+
onBindChainRequired?: (chainTypes: ChainType[]) => void;
|
|
257
|
+
/**
|
|
258
|
+
* @deprecated 绑定现在由 Widget 内部处理,此回调不再使用
|
|
259
|
+
* 需要绑定 SNS 时的回调
|
|
260
|
+
*/
|
|
261
|
+
onBindSnsRequired?: (snsTypes: SnsType[]) => void;
|
|
262
|
+
/** 是否显示分享按钮(默认 true) */
|
|
263
|
+
showShare?: boolean;
|
|
264
|
+
/** 分享链接(未配置时回退到当前页面 URL) */
|
|
265
|
+
shareUrl?: string;
|
|
266
|
+
/** Twitter 分享文案(可选,有默认文案) */
|
|
267
|
+
shareText?: string;
|
|
268
|
+
/** 是否在 Twitter 分享文案末尾自动追加带 utm_source=x 的链接(默认 true) */
|
|
269
|
+
shareAutoAppendLink?: boolean;
|
|
270
|
+
/** 奖励详情展示模式:popup 弹窗 / redirect 跳转(默认 popup) */
|
|
271
|
+
rewardDisplayMode?: RewardDisplayMode;
|
|
272
|
+
/** 跳转 URL(当 rewardDisplayMode 为 'redirect' 时使用) */
|
|
273
|
+
rewardRedirectUrl?: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 获取 Quest 详情 Hook
|
|
278
|
+
*
|
|
279
|
+
* @param options Hook 配置(包含从根组件传入的 api 实例)
|
|
280
|
+
* @returns Quest 详情、加载状态、错误信息、重新加载方法
|
|
281
|
+
*/
|
|
282
|
+
export declare function useQuestDetail(options: UseQuestDetailOptions): UseQuestDetailReturn;
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* useQuestDetail Hook 参数
|
|
286
|
+
*/
|
|
287
|
+
export declare interface UseQuestDetailOptions {
|
|
288
|
+
/** Quest API 实例(从根组件传入) */
|
|
289
|
+
api: QuestApi | null;
|
|
290
|
+
/** Campaign ID */
|
|
291
|
+
campaignId: number;
|
|
292
|
+
/** 渠道标识(可选) */
|
|
293
|
+
channel?: string;
|
|
294
|
+
/** KOL 标识(可选) */
|
|
295
|
+
kolHandle?: string;
|
|
296
|
+
/** 邀请码(可选) */
|
|
297
|
+
inviteCode?: string;
|
|
298
|
+
/** Boost ID(可选) */
|
|
299
|
+
boostId?: number;
|
|
300
|
+
/** 是否启用(默认 true) */
|
|
301
|
+
enabled?: boolean;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* useQuestDetail Hook 返回值
|
|
306
|
+
*/
|
|
307
|
+
export declare interface UseQuestDetailReturn {
|
|
308
|
+
/** Campaign 详情数据 */
|
|
309
|
+
data: QuestCampaignInfo | null;
|
|
310
|
+
/** 是否加载中 */
|
|
311
|
+
isLoading: boolean;
|
|
312
|
+
/** 错误信息 */
|
|
313
|
+
error: string | null;
|
|
314
|
+
/** 重新加载 */
|
|
315
|
+
refetch: () => void;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* 获取 Quest 状态信息 Hook
|
|
320
|
+
*
|
|
321
|
+
* @param options Hook 配置(包含从根组件传入的 api 实例)
|
|
322
|
+
* @returns Quest 状态、加载状态、错误信息、重新加载方法
|
|
323
|
+
*/
|
|
324
|
+
export declare function useQuestStatus(options: UseQuestStatusOptions): UseQuestStatusReturn;
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* useQuestStatus Hook 参数
|
|
328
|
+
*/
|
|
329
|
+
export declare interface UseQuestStatusOptions {
|
|
330
|
+
/** Quest API 实例(从根组件传入) */
|
|
331
|
+
api: QuestApi | null;
|
|
332
|
+
/** Campaign ID */
|
|
333
|
+
campaignId: number;
|
|
334
|
+
/** 渠道标识 */
|
|
335
|
+
channel?: string;
|
|
336
|
+
/** KOL 句柄 */
|
|
337
|
+
kolHandle?: string;
|
|
338
|
+
/** 是否启用(默认 true) */
|
|
339
|
+
enabled?: boolean;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* useQuestStatus Hook 返回值
|
|
344
|
+
*/
|
|
345
|
+
export declare interface UseQuestStatusReturn {
|
|
346
|
+
/** Campaign 状态数据 */
|
|
347
|
+
data: CampaignStatusInfo | null;
|
|
348
|
+
/** 是否加载中 */
|
|
349
|
+
isLoading: boolean;
|
|
350
|
+
/** 错误信息 */
|
|
351
|
+
error: string | null;
|
|
352
|
+
/** 重新加载 */
|
|
353
|
+
refetch: () => void;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* 获取用户 Quest 状态 Hook
|
|
358
|
+
*
|
|
359
|
+
* @param options Hook 配置(包含从根组件传入的 api 实例)
|
|
360
|
+
* @returns 用户状态、加载状态、错误信息、重新加载方法
|
|
361
|
+
*/
|
|
362
|
+
export declare function useQuestUserStatus(options: UseQuestUserStatusOptions): UseQuestUserStatusReturn;
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* useQuestUserStatus Hook 参数
|
|
366
|
+
*/
|
|
367
|
+
export declare interface UseQuestUserStatusOptions {
|
|
368
|
+
/** Quest API 实例(从根组件传入) */
|
|
369
|
+
api: QuestApi | null;
|
|
370
|
+
/** Campaign ID */
|
|
371
|
+
campaignId: number;
|
|
372
|
+
/** 渠道标识(可选) */
|
|
373
|
+
channel?: string;
|
|
374
|
+
/** KOL 标识(可选) */
|
|
375
|
+
kolHandle?: string;
|
|
376
|
+
/** 是否启用(默认 true) */
|
|
377
|
+
enabled?: boolean;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* useQuestUserStatus Hook 返回值
|
|
382
|
+
*/
|
|
383
|
+
export declare interface UseQuestUserStatusReturn {
|
|
384
|
+
/** 用户状态数据 */
|
|
385
|
+
data: UserCampaignStatusInfo | null;
|
|
386
|
+
/** 是否加载中 */
|
|
387
|
+
isLoading: boolean;
|
|
388
|
+
/** 错误信息 */
|
|
389
|
+
error: string | null;
|
|
390
|
+
/** 重新加载 */
|
|
391
|
+
refetch: () => void;
|
|
392
|
+
/**
|
|
393
|
+
* 立即更新指定任务的本地状态(乐观更新)
|
|
394
|
+
* @param taskId 任务 ID
|
|
395
|
+
* @param isAsync 是否为异步任务(异步任务只更新 is_submitter)
|
|
396
|
+
*/
|
|
397
|
+
updateTaskStatus: (taskId: number, isAsync?: boolean) => void;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export { }
|