| Línea 2... |
Línea 2... |
| 2 |
|
2 |
|
| Línea 3... |
Línea 3... |
| 3 |
declare(strict_types=1);
|
3 |
declare(strict_types=1);
|
| Línea 4... |
Línea 4... |
| 4 |
|
4 |
|
| 5 |
namespace LeadersLinked\Controller;
|
- |
|
| 6 |
|
- |
|
| 7 |
use Laminas\Db\Adapter\AdapterInterface;
|
5 |
namespace LeadersLinked\Controller;
|
| 8 |
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
|
6 |
|
| 9 |
use Laminas\Mvc\Controller\AbstractActionController;
|
7 |
use LeadersLinked\Library\Zoom;
|
| - |
|
8 |
use Laminas\Log\LoggerInterface;
|
| - |
|
9 |
use Laminas\View\Model\JsonModel;
|
| - |
|
10 |
use Laminas\View\Model\ViewModel;
|
| 10 |
use Laminas\Log\LoggerInterface;
|
11 |
use LeadersLinked\Model\ChatUser;
|
| 11 |
use Laminas\View\Model\JsonModel;
|
12 |
use LeadersLinked\Model\ChatGroup;
|
| 12 |
use Laminas\View\Model\ViewModel;
|
- |
|
| 13 |
use LeadersLinked\Library\Functions;
|
- |
|
| 14 |
use LeadersLinked\Mapper\UserMapper;
|
- |
|
| 15 |
use LeadersLinked\Mapper\ConnectionMapper;
|
- |
|
| 16 |
use LeadersLinked\Mapper\ChatMessageMapper;
|
- |
|
| 17 |
use LeadersLinked\Mapper\ChatGroupMapper;
|
13 |
use LeadersLinked\Model\Connection;
|
| 18 |
use LeadersLinked\Mapper\ChatGroupMessageMapper;
|
14 |
use LeadersLinked\Library\Functions;
|
| - |
|
15 |
use LeadersLinked\Mapper\UserMapper;
|
| - |
|
16 |
use LeadersLinked\Mapper\UtilMapper;
|
| - |
|
17 |
use LeadersLinked\Model\ChatMessage;
|
| - |
|
18 |
use LeadersLinked\Model\ZoomMeeting;
|
| - |
|
19 |
use LeadersLinked\Model\ChatGroupUser;
|
| - |
|
20 |
use Laminas\Db\Adapter\AdapterInterface;
|
| - |
|
21 |
use LeadersLinked\Form\Chat\ZoomAddForm;
|
| 19 |
use LeadersLinked\Mapper\ChatGroupUserMessageMapper;
|
22 |
use LeadersLinked\Mapper\ChatUserMapper;
|
| 20 |
use LeadersLinked\Mapper\ChatUserMapper;
|
- |
|
| 21 |
use LeadersLinked\Model\ChatMessage;
|
23 |
use LeadersLinked\Model\ZoomMeetingUser;
|
| 22 |
use LeadersLinked\Model\ChatGroupMessage;
|
- |
|
| 23 |
use LeadersLinked\Model\ChatGroupUserMessage;
|
- |
|
| 24 |
use LeadersLinked\Model\Connection;
|
24 |
use LeadersLinked\Mapper\ChatGroupMapper;
|
| - |
|
25 |
use LeadersLinked\Model\ChatGroupMessage;
|
| - |
|
26 |
use LeadersLinked\Mapper\ConnectionMapper;
|
| 25 |
use LeadersLinked\Model\ChatGroup;
|
27 |
use LeadersLinked\Form\CreateChatGroupForm;
|
| 26 |
use LeadersLinked\Model\ChatUser;
|
28 |
use LeadersLinked\Mapper\ChatMessageMapper;
|
| 27 |
use LeadersLinked\Form\CreateChatGroupForm;
|
29 |
use LeadersLinked\Mapper\ZoomMeetingMapper;
|
| - |
|
30 |
use LeadersLinked\Mapper\ChatGroupUserMapper;
|
| - |
|
31 |
use LeadersLinked\Model\ChatGroupUserMessage;
|
| - |
|
32 |
use LeadersLinked\Mapper\ZoomMeetingUserMapper;
|
| - |
|
33 |
use LeadersLinked\Mapper\ChatGroupMessageMapper;
|
| Línea 28... |
Línea 34... |
| 28 |
use LeadersLinked\Mapper\ChatGroupUserMapper;
|
34 |
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
|
| 29 |
use LeadersLinked\Model\ChatGroupUser;
|
35 |
use Laminas\Mvc\Controller\AbstractActionController;
|
| 30 |
use LeadersLinked\Mapper\UtilMapper;
|
36 |
use LeadersLinked\Mapper\ChatGroupUserMessageMapper;
|
| Línea 2502... |
Línea 2508... |
| 2502 |
return true;
|
2508 |
return true;
|
| 2503 |
}
|
2509 |
}
|
| Línea 2504... |
Línea 2510... |
| 2504 |
|
2510 |
|
| 2505 |
return ($diff->s) > 15 ? true : false;
|
2511 |
return ($diff->s) > 15 ? true : false;
|
| - |
|
2512 |
}
|
| - |
|
2513 |
|
| - |
|
2514 |
public function zoomAction()
|
| - |
|
2515 |
{
|
| - |
|
2516 |
$request = $this->getRequest();
|
| - |
|
2517 |
if ($request->isPost()) {
|
| - |
|
2518 |
$currentUserPlugin = $this->plugin('currentUserPlugin');
|
| - |
|
2519 |
$currentUser = $currentUserPlugin->getUser();
|
| - |
|
2520 |
$id = $this->params()->fromRoute('id');
|
| - |
|
2521 |
|
| - |
|
2522 |
if (!$id) {
|
| - |
|
2523 |
return new JsonModel([
|
| - |
|
2524 |
'success' => false,
|
| - |
|
2525 |
'data' => 'ERROR_PARAMETERS_ARE_INVALID'
|
| - |
|
2526 |
]);
|
| - |
|
2527 |
}
|
| - |
|
2528 |
|
| - |
|
2529 |
$chatUserMapper = ChatUserMapper::getInstance($this->adapter);
|
| - |
|
2530 |
$chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
|
| - |
|
2531 |
$chatUser = null;
|
| - |
|
2532 |
$chatGroup = $chatGroupMapper->fetchOneByUuid($id);
|
| - |
|
2533 |
|
| - |
|
2534 |
if ($chatGroup) {
|
| - |
|
2535 |
$chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
|
| - |
|
2536 |
$chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
|
| - |
|
2537 |
|
| - |
|
2538 |
if (!$chatGroupUser) {
|
| - |
|
2539 |
$data = [
|
| - |
|
2540 |
'success' => false,
|
| - |
|
2541 |
'data' => 'ERROR_ZOOM_CHAT_UNAUTHORIZE'
|
| - |
|
2542 |
];
|
| - |
|
2543 |
return new JsonModel($data);
|
| - |
|
2544 |
}
|
| - |
|
2545 |
} else {
|
| - |
|
2546 |
$userMapper = UserMapper::getInstance($this->adapter);
|
| - |
|
2547 |
$user = $userMapper->fetchOneByUuid($id);
|
| - |
|
2548 |
|
| - |
|
2549 |
if (!$user) {
|
| - |
|
2550 |
return new JsonModel([
|
| - |
|
2551 |
'success' => false,
|
| - |
|
2552 |
'data' => 'ERROR_USER_NOT_FOUND'
|
| - |
|
2553 |
]);
|
| - |
|
2554 |
}
|
| - |
|
2555 |
|
| - |
|
2556 |
$connectionMapper = ConnectionMapper::getInstance($this->adapter);
|
| - |
|
2557 |
$connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
|
| - |
|
2558 |
|
| - |
|
2559 |
if (!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
|
| - |
|
2560 |
|
| - |
|
2561 |
return new JsonModel([
|
| - |
|
2562 |
'success' => false,
|
| - |
|
2563 |
'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
|
| - |
|
2564 |
]);
|
| - |
|
2565 |
}
|
| - |
|
2566 |
|
| - |
|
2567 |
$chatUserMapper = ChatUserMapper::getInstance($this->adapter);
|
| - |
|
2568 |
$chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
|
| - |
|
2569 |
|
| - |
|
2570 |
if (!$chatUser) {
|
| - |
|
2571 |
$chatUser = new ChatUser();
|
| - |
|
2572 |
$chatUser->user_id1 = $currentUser->id;
|
| - |
|
2573 |
$chatUser->user_id2 = $user->id;
|
| - |
|
2574 |
$response = $chatUserMapper->insert($chatUser);
|
| - |
|
2575 |
|
| - |
|
2576 |
if (!$response) {
|
| - |
|
2577 |
return new JsonModel([
|
| - |
|
2578 |
'success' => false,
|
| - |
|
2579 |
'data' => $chatUserMapper->getError()
|
| - |
|
2580 |
]);
|
| - |
|
2581 |
}
|
| - |
|
2582 |
|
| - |
|
2583 |
$chatUser = $chatUserMapper->fetchOne($chatUser->id);
|
| - |
|
2584 |
$fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
|
| - |
|
2585 |
$dirpath = $fullpath_chat . $chatUser->uuid;
|
| - |
|
2586 |
|
| - |
|
2587 |
if (!file_exists($dirpath)) {
|
| - |
|
2588 |
mkdir($dirpath, 0777, true);
|
| - |
|
2589 |
chmod($dirpath, 0777);
|
| - |
|
2590 |
}
|
| - |
|
2591 |
}
|
| - |
|
2592 |
}
|
| - |
|
2593 |
|
| - |
|
2594 |
if (!$chatUser && !$chatGroup) {
|
| - |
|
2595 |
$data = [
|
| - |
|
2596 |
'success' => false,
|
| - |
|
2597 |
'data' => 'ERROR_ZOOM_CHAT_NOT_FOUND'
|
| - |
|
2598 |
];
|
| - |
|
2599 |
return new JsonModel($data);
|
| - |
|
2600 |
}
|
| - |
|
2601 |
|
| - |
|
2602 |
$dataPost = $request->getPost()->toArray();
|
| - |
|
2603 |
$form = new ZoomAddForm();
|
| - |
|
2604 |
$form->setData($dataPost);
|
| - |
|
2605 |
|
| - |
|
2606 |
if ($form->isValid()) {
|
| - |
|
2607 |
$dataPost = (array) $form->getData();
|
| - |
|
2608 |
$dtStart = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
|
| - |
|
2609 |
if (!$dtStart) {
|
| - |
|
2610 |
return new JsonModel([
|
| - |
|
2611 |
'success' => false,
|
| - |
|
2612 |
'data' => 'ERROR_PARAMETERS_ARE_INVALID'
|
| - |
|
2613 |
]);
|
| - |
|
2614 |
}
|
| - |
|
2615 |
|
| - |
|
2616 |
$dtEnd = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
|
| - |
|
2617 |
$dtEnd->add(new \DateInterval('PT' . $dataPost['duration'] . 'M'));
|
| - |
|
2618 |
$start_time = $dtStart->format('Y-m-d\TH:i:s');
|
| - |
|
2619 |
$zoom = new Zoom($this->adapter, $this->config, $this->cache);
|
| - |
|
2620 |
$response = $zoom->getOAuthAccessToken();
|
| - |
|
2621 |
|
| - |
|
2622 |
if ($response['success']) {
|
| - |
|
2623 |
$access_token = $response['data'];
|
| - |
|
2624 |
$result = $zoom->addMeeting($access_token, $dataPost['title'], $dataPost['description'], $dataPost['type'], $start_time, $dataPost['duration'], $dataPost['timezone'], $dataPost['password']);
|
| - |
|
2625 |
} else {
|
| - |
|
2626 |
return new JsonModel([
|
| - |
|
2627 |
'success' => false,
|
| - |
|
2628 |
'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
|
| - |
|
2629 |
]);
|
| - |
|
2630 |
}
|
| - |
|
2631 |
|
| - |
|
2632 |
if ($result['success']) {
|
| - |
|
2633 |
$zoomMeetingMapper = ZoomMeetingMapper::getInstance($this->adapter);
|
| - |
|
2634 |
$zoomMeeting = $zoomMeetingMapper->fetchOne($result['data']['id']);
|
| - |
|
2635 |
|
| - |
|
2636 |
if (!$zoomMeeting) {
|
| - |
|
2637 |
$zoomMeeting = new ZoomMeeting();
|
| - |
|
2638 |
$zoomMeeting->id = $result['data']['id'];
|
| - |
|
2639 |
$zoomMeeting->topic = $dataPost['title'];
|
| - |
|
2640 |
$zoomMeeting->agenda = $dataPost['description'];
|
| - |
|
2641 |
$zoomMeeting->duration = $dataPost['duration'];
|
| - |
|
2642 |
$zoomMeeting->join_url = $result['data']['join_url'];
|
| - |
|
2643 |
$zoomMeeting->start_time = $dtStart->format('Y-m-d H:i:s');
|
| - |
|
2644 |
$zoomMeeting->end_time = $dtEnd->format('Y-m-d H:i:s');
|
| - |
|
2645 |
$zoomMeeting->timezone = $dataPost['timezone'];
|
| - |
|
2646 |
$zoomMeeting->type = $dataPost['type'];
|
| - |
|
2647 |
$zoomMeeting->uuid = $result['data']['uuid'];
|
| - |
|
2648 |
$zoomMeeting->password = $dataPost['password'];
|
| - |
|
2649 |
|
| - |
|
2650 |
if (!$zoomMeetingMapper->insert($zoomMeeting)) {
|
| - |
|
2651 |
return new JsonModel([
|
| - |
|
2652 |
'success' => false,
|
| - |
|
2653 |
'data' => $zoomMeetingMapper->getError()
|
| - |
|
2654 |
]);
|
| - |
|
2655 |
}
|
| - |
|
2656 |
}
|
| - |
|
2657 |
|
| - |
|
2658 |
$chatMessageContent = "LABEL_ZOOM_MEETING \r\n" .
|
| - |
|
2659 |
" LABEL_ZOOM_MEETING_START_DATE : " . $dtStart->format('Y-m-d') . "\r\n" .
|
| - |
|
2660 |
" LABEL_ZOOM_MEETING_START_TIME : " . $dtStart->format('H:i a') . "\r\n" .
|
| - |
|
2661 |
" LABEL_ZOOM_MEETING_TIMEZONE : " . $zoomMeeting->timezone . "\r\n" .
|
| - |
|
2662 |
" LABEL_ZOOM_MEETING_TITLE : " . $zoomMeeting->topic . "\r\n" .
|
| - |
|
2663 |
" LABEL_ZOOM_MEETING_URL : " . $zoomMeeting->join_url . "\r\n" .
|
| - |
|
2664 |
" LABEL_ZOOM_MEETING_PASSWORD : " . $zoomMeeting->password . "\r\n";
|
| - |
|
2665 |
$zoomMeetingUserMapper = ZoomMeetingUserMapper::getInstance($this->adapter);
|
| - |
|
2666 |
$zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $currentUser->id);
|
| - |
|
2667 |
|
| - |
|
2668 |
if (!$zoomMeetingUser) {
|
| - |
|
2669 |
$zoomMeetingUser = new ZoomMeetingUser();
|
| - |
|
2670 |
$zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
|
| - |
|
2671 |
$zoomMeetingUser->user_id = $currentUser->id;
|
| - |
|
2672 |
$zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
|
| - |
|
2673 |
$zoomMeetingUserMapper->insert($zoomMeetingUser);
|
| - |
|
2674 |
}
|
| - |
|
2675 |
|
| - |
|
2676 |
if ($chatUser) {
|
| - |
|
2677 |
if ($chatUser->user_id1 == $currentUser->id) {
|
| - |
|
2678 |
$zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id2);
|
| - |
|
2679 |
|
| - |
|
2680 |
if (!$zoomMeetingUser) {
|
| - |
|
2681 |
$zoomMeetingUser = new ZoomMeetingUser();
|
| - |
|
2682 |
$zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
|
| - |
|
2683 |
$zoomMeetingUser->user_id = $chatUser->user_id2;
|
| - |
|
2684 |
$zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
|
| - |
|
2685 |
$zoomMeetingUserMapper->insert($zoomMeetingUser);
|
| - |
|
2686 |
}
|
| - |
|
2687 |
} else {
|
| - |
|
2688 |
$zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id1);
|
| - |
|
2689 |
|
| - |
|
2690 |
if (!$zoomMeetingUser) {
|
| - |
|
2691 |
$zoomMeetingUser = new ZoomMeetingUser();
|
| - |
|
2692 |
$zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
|
| - |
|
2693 |
$zoomMeetingUser->user_id = $chatUser->user_id1;
|
| - |
|
2694 |
$zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
|
| - |
|
2695 |
$zoomMeetingUserMapper->insert($zoomMeetingUser);
|
| - |
|
2696 |
}
|
| - |
|
2697 |
}
|
| - |
|
2698 |
|
| - |
|
2699 |
$chatMessage = new ChatMessage();
|
| - |
|
2700 |
$chatMessage->recd = ChatMessage::RECD_NO;
|
| - |
|
2701 |
$chatMessage->seen = ChatMessage::SEEN_NO;
|
| - |
|
2702 |
$chatMessage->type = ChatMessage::TYPE_TEXT;
|
| - |
|
2703 |
$chatMessage->content = $chatMessageContent;
|
| - |
|
2704 |
$chatMessage->from_id = $currentUser->id;
|
| - |
|
2705 |
$chatMessage->to_id = $chatUser->user_id1 == $currentUser->id ? $chatUser->user_id2 : $chatUser->user_id1;
|
| - |
|
2706 |
$chatMessage->chat_id = $chatUser->id;
|
| - |
|
2707 |
$chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
|
| - |
|
2708 |
$chatMessageMapper->insert($chatMessage);
|
| - |
|
2709 |
$chatUserMapper->markIsOpen1($chatUser->id);
|
| - |
|
2710 |
$chatUserMapper->markIsOpen2($chatUser->id);
|
| - |
|
2711 |
} else if ($chatGroup) {
|
| - |
|
2712 |
|
| - |
|
2713 |
$chatGroupMessage = new ChatGroupMessage();
|
| - |
|
2714 |
$chatGroupMessage->group_id = $chatGroup->id;
|
| - |
|
2715 |
$chatGroupMessage->content = $chatMessageContent;
|
| - |
|
2716 |
$chatGroupMessage->sender_id = $currentUser->id;
|
| - |
|
2717 |
$chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
|
| - |
|
2718 |
$chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
|
| - |
|
2719 |
|
| - |
|
2720 |
if ($chatGroupMessageMapper->insert($chatGroupMessage)) {
|
| - |
|
2721 |
$chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
|
| - |
|
2722 |
$groupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
|
| - |
|
2723 |
$chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
|
| - |
|
2724 |
foreach ($groupUsers as $groupUser) {
|
| - |
|
2725 |
if ($groupUser->user_id != $currentUser->id) {
|
| - |
|
2726 |
$zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $groupUser->user_id);
|
| - |
|
2727 |
|
| - |
|
2728 |
if (!$zoomMeetingUser) {
|
| - |
|
2729 |
$zoomMeetingUser = new ZoomMeetingUser();
|
| - |
|
2730 |
$zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
|
| - |
|
2731 |
$zoomMeetingUser->user_id = $groupUser->user_id;
|
| - |
|
2732 |
$zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
|
| - |
|
2733 |
$zoomMeetingUserMapper->insert($zoomMeetingUser);
|
| - |
|
2734 |
}
|
| - |
|
2735 |
}
|
| - |
|
2736 |
|
| - |
|
2737 |
$chatGroupUserMessage = new ChatGroupUserMessage();
|
| - |
|
2738 |
$chatGroupUserMessage->group_id = $chatGroup->id;
|
| - |
|
2739 |
$chatGroupUserMessage->message_id = $chatGroupMessage->id;
|
| - |
|
2740 |
$chatGroupUserMessage->receiver_id = $groupUser->user_id;
|
| - |
|
2741 |
$chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
|
| - |
|
2742 |
$chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
|
| - |
|
2743 |
$chatGroupUserMessageMapper->insert($chatGroupUserMessage);
|
| - |
|
2744 |
$chatGroupUserMapper->markIsOpen($groupUser->group_id, $groupUser->user_id);
|
| - |
|
2745 |
}
|
| - |
|
2746 |
}
|
| - |
|
2747 |
}
|
| - |
|
2748 |
|
| - |
|
2749 |
return new JsonModel([
|
| - |
|
2750 |
'success' => true,
|
| - |
|
2751 |
'data' => 'LABEL_ZOOM_NEW_MEETING_SUCCESSFULLY'
|
| - |
|
2752 |
]);
|
| - |
|
2753 |
} else {
|
| - |
|
2754 |
return new JsonModel([
|
| - |
|
2755 |
'success' => false,
|
| - |
|
2756 |
'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
|
| - |
|
2757 |
]);
|
| - |
|
2758 |
}
|
| - |
|
2759 |
} else {
|
| - |
|
2760 |
$messages = [];
|
| - |
|
2761 |
$form_messages = (array) $form->getMessages();
|
| - |
|
2762 |
foreach ($form_messages as $fieldname => $field_messages) {
|
| - |
|
2763 |
$messages[$fieldname] = array_values($field_messages);
|
| - |
|
2764 |
}
|
| - |
|
2765 |
|
| - |
|
2766 |
return new JsonModel([
|
| - |
|
2767 |
'success' => false,
|
| - |
|
2768 |
'data' => $messages
|
| - |
|
2769 |
]);
|
| - |
|
2770 |
|
| - |
|
2771 |
return new JsonModel($response);
|
| - |
|
2772 |
}
|
| - |
|
2773 |
} else {
|
| - |
|
2774 |
$response = [
|
| - |
|
2775 |
'success' => false,
|
| - |
|
2776 |
'data' => 'ERROR_METHOD_NOT_ALLOWED'
|
| - |
|
2777 |
];
|
| - |
|
2778 |
}
|
| - |
|
2779 |
|
| - |
|
2780 |
return new JsonModel($response);
|
| 2506 |
}
|
2781 |
}
|