diff --git a/build.gradle b/build.gradle index 39927d19b..5ec752b5e 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,8 @@ dependencies { implementation 'com.github.ben-manes.caffeine:caffeine' implementation 'org.springframework.kafka:spring-kafka' implementation 'org.springframework.boot:spring-boot-starter-data-redis' + implementation 'org.springframework.boot:spring-boot-starter-websocket' + implementation 'org.springframework.security:spring-security-messaging' runtimeOnly 'org.postgresql:postgresql' diff --git a/docker-compose.yml b/docker-compose.yml index 3e9c24f85..dbfb2c057 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,32 +1,45 @@ -version: '3.8' - services: - app: - image: discodeit:local + reverse-proxy: + image: nginx:1.28.0 + container_name: reverse-proxy + depends_on: + - backend + ports: + - "3000:80" + networks: + - discodeit-network + volumes: + - ./src/main/resources/static:/usr/share/nginx/html:ro + - ./nginx.conf:/etc/nginx/nginx.conf:ro + + backend: build: context: . dockerfile: Dockerfile - container_name: discodeit - ports: - - "8081:80" + container_name: backend + depends_on: + - db + - redis + - broker environment: - - SPRING_PROFILES_ACTIVE=prod + - SPRING_PROFILES_ACTIVE=dev - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/discodeit - SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME} - SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD} - - STORAGE_TYPE=s3 + - STORAGE_TYPE=local - STORAGE_LOCAL_ROOT_PATH=.discodeit/storage - - AWS_S3_ACCESS_KEY=${AWS_S3_ACCESS_KEY} - - AWS_S3_SECRET_KEY=${AWS_S3_SECRET_KEY} - - AWS_S3_REGION=${AWS_S3_REGION} - - AWS_S3_BUCKET=${AWS_S3_BUCKET} - - AWS_S3_PRESIGNED_URL_EXPIRATION=600 - depends_on: - - db - volumes: - - binary-content-storage:/app/.discodeit/storage + - DISCODEIT_ADMIN_USERNAME=${DISCODEIT_ADMIN_USERNAME} + - DISCODEIT_ADMIN_EMAIL=${DISCODEIT_ADMIN_EMAIL} + - DISCODEIT_ADMIN_PASSWORD=${DISCODEIT_ADMIN_PASSWORD} + - KAFKA_BOOTSTRAP_SERVERS=broker:29092 + - REDIS_HOST=redis + - REDIS_PORT=6379 + expose: + - 8080 networks: - discodeit-network + volumes: + - binary-content-storage:/app/.discodeit/storage db: image: postgres:16-alpine @@ -35,17 +48,55 @@ services: - POSTGRES_DB=discodeit - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - ports: - - "5432:5432" + expose: + - 5432 + networks: + - discodeit-network volumes: - postgres-data:/var/lib/postgresql/data - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/schema.sql + + + broker: + image: apache/kafka:4.0.0 + container_name: broker + environment: + KAFKA_BROKER_ID: 1 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_PROCESS_ROLES: broker,controller + KAFKA_NODE_ID: 1 + KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:29093 + KAFKA_LISTENERS: PLAINTEXT://broker:29092,CONTROLLER://broker:29093,PLAINTEXT_HOST://0.0.0.0:9092 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER + KAFKA_LOG_DIRS: /tmp/kraft-combined-logs + CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk + expose: + - 29092 + networks: + - discodeit-network + + redis: + image: redis:7.2-alpine + container_name: redis + expose: + - 6379 networks: - discodeit-network + volumes: + - redis-data:/data + command: redis-server --appendonly yes + volumes: postgres-data: binary-content-storage: + redis-data: networks: discodeit-network: diff --git a/src/main/java/com/sprint/mission/discodeit/config/WebSocketConfig.java b/src/main/java/com/sprint/mission/discodeit/config/WebSocketConfig.java new file mode 100644 index 000000000..b2918ba0c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/WebSocketConfig.java @@ -0,0 +1,56 @@ +package com.sprint.mission.discodeit.config; + + +import com.sprint.mission.discodeit.entity.Role; +import com.sprint.mission.discodeit.security.JwtAuthenticationChannelInterceptor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.security.messaging.access.intercept.AuthorizationChannelInterceptor; +import org.springframework.security.messaging.access.intercept.MessageMatcherDelegatingAuthorizationManager; +import org.springframework.security.messaging.context.SecurityContextChannelInterceptor; +import org.springframework.web.socket.config.annotation.*; + +@Slf4j +@Configuration +@EnableWebSocketMessageBroker +@RequiredArgsConstructor +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + private final JwtAuthenticationChannelInterceptor jwtAuthenticationChannelInterceptor; + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/sub"); // 구독 prefix + config.setApplicationDestinationPrefixes("/pub"); // 발행 prefix + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws") + .setAllowedOriginPatterns("*") + .withSockJS(); + } + + @Bean + public AuthorizationChannelInterceptor authorizationChannelInterceptor() { + var authzManager = MessageMatcherDelegatingAuthorizationManager + .builder() + // 예: 모든 메시지는 최소 USER 권한 요구 + .anyMessage().hasRole(Role.USER.name()) + .build(); + return new AuthorizationChannelInterceptor(authzManager); + } + + @Override + public void configureClientInboundChannel(ChannelRegistration registration) { + registration.interceptors( + jwtAuthenticationChannelInterceptor, // 1) CONNECT 시 JWT 인증 → accessor.setUser + new SecurityContextChannelInterceptor(), // 2) 이후 흐름에서 SecurityContext 연동 + authorizationChannelInterceptor() // 3) 권한 검사 (hasRole(USER)) + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageWebSocketController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageWebSocketController.java new file mode 100644 index 000000000..09bbf3ca6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageWebSocketController.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.service.MessageService; +import java.util.ArrayList; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Controller; + +@Slf4j +@Controller +@RequiredArgsConstructor +public class MessageWebSocketController { + + private final MessageService messageService; + + // 클라이언트는 "/pub/messages" 로 발행 + @MessageMapping("messages") + public MessageDto sendMessage(@Payload MessageCreateRequest messageCreateRequest) { + log.info("텍스트 메시지 생성 요청: request={}", messageCreateRequest); + // 첨부파일 없는 케이스만 WS로 받음. 첨부가 있으면 기존 REST POST /api/messages 사용. + MessageDto createdMessage = messageService.create(messageCreateRequest, new ArrayList<>()); + log.debug("텍스트 메시지 생성 응답: {}", createdMessage); + return createdMessage; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/SseController.java b/src/main/java/com/sprint/mission/discodeit/controller/SseController.java new file mode 100644 index 000000000..70a2b90fb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/SseController.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.sse.SseService; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/sse") +public class SseController { + + private final SseService sseService; + + // 표준: Last-Event-ID 헤더 사용 (없으면 null 허용) + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter connect( + @RequestParam(required = false) UUID receiverId, + @RequestHeader(name = "Last-Event-ID", required = false) String lastEventIdHeader + ) { + if (receiverId == null) { + // TODO: 보안 컨텍스트에서 현재 사용자 ID를 추출해 사용하고 싶으면 여기에 적용 + // ex) receiverId = currentUserIdProvider.get(); + throw new IllegalArgumentException("receiverId is required (또는 인증 사용자 ID 사용으로 교체)"); + } + UUID lastEventId = null; + if (lastEventIdHeader != null && !lastEventIdHeader.isBlank()) { + try { lastEventId = UUID.fromString(lastEventIdHeader); } catch (IllegalArgumentException ignore) {} + } + return sseService.connect(receiverId, lastEventId); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/event/listener/BinaryContentSseEventListener.java b/src/main/java/com/sprint/mission/discodeit/event/listener/BinaryContentSseEventListener.java new file mode 100644 index 000000000..e2c39bb23 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/event/listener/BinaryContentSseEventListener.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.event.listener; + +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import com.sprint.mission.discodeit.sse.SseService; +import java.util.Set; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +public class BinaryContentSseEventListener { + + private final SseService sseService; + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onUpdated(/* BinaryContentUpdatedEvent */ Object event) { + UUID ownerId = /* ((BinaryContentUpdatedEvent) event).getOwnerId() */ null; + BinaryContentDto dto = /* ((BinaryContentUpdatedEvent) event).getData() */ null; + + if (ownerId != null && dto != null) { + sseService.send(Set.of(ownerId), "binaryContents.updated", dto); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/event/listener/ChannelSseEventListener.java b/src/main/java/com/sprint/mission/discodeit/event/listener/ChannelSseEventListener.java new file mode 100644 index 000000000..71f687bd7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/event/listener/ChannelSseEventListener.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.event.listener; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.sse.SseService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; +import org.springframework.transaction.event.TransactionPhase; + +@Component +@RequiredArgsConstructor +public class ChannelSseEventListener { + + private final SseService sseService; + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onCreated(/* ChannelCreatedEvent */ Object event) { + ChannelDto dto = /* ((ChannelCreatedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("channels.created", dto); + } + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onUpdated(/* ChannelUpdatedEvent */ Object event) { + ChannelDto dto = /* ((ChannelUpdatedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("channels.updated", dto); + } + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onDeleted(/* ChannelDeletedEvent */ Object event) { + ChannelDto dto = /* ((ChannelDeletedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("channels.deleted", dto); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/event/listener/NotificationSseEventListener.java b/src/main/java/com/sprint/mission/discodeit/event/listener/NotificationSseEventListener.java new file mode 100644 index 000000000..5d019e0ca --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/event/listener/NotificationSseEventListener.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.event.listener; + +import com.sprint.mission.discodeit.dto.data.NotificationDto; +import com.sprint.mission.discodeit.sse.SseService; +import java.util.Set; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +public class NotificationSseEventListener { + + private final SseService sseService; + + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onCreated(/* NotificationCreatedEvent */ Object event) { + + UUID receiverId = /* ((NotificationCreatedEvent) event).getReceiverId() */ null; + NotificationDto dto = /* ((NotificationCreatedEvent) event).getData() */ null; + + if (receiverId != null && dto != null) { + sseService.send(Set.of(receiverId), "notifications.created", dto); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/event/listener/UserSseEventListener.java b/src/main/java/com/sprint/mission/discodeit/event/listener/UserSseEventListener.java new file mode 100644 index 000000000..c2fb0a32a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/event/listener/UserSseEventListener.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.event.listener; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.sse.SseService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; +import org.springframework.transaction.event.TransactionPhase; + +@Component +@RequiredArgsConstructor +public class UserSseEventListener { + + private final SseService sseService; + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onCreated(/* UserCreatedEvent */ Object event) { + UserDto dto = /* ((UserCreatedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("users.created", dto); + } + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onUpdated(/* UserUpdatedEvent */ Object event) { + UserDto dto = /* ((UserUpdatedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("users.updated", dto); + } + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onDeleted(/* UserDeletedEvent */ Object event) { + UserDto dto = /* ((UserDeletedEvent) event).getData() */ null; + if (dto != null) sseService.broadcast("users.deleted", dto); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/event/listener/WebSocketRequiredEventListener.java b/src/main/java/com/sprint/mission/discodeit/event/listener/WebSocketRequiredEventListener.java new file mode 100644 index 000000000..568babc5c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/event/listener/WebSocketRequiredEventListener.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.event.listener; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.event.message.MessageCreatedEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Slf4j +@RequiredArgsConstructor +@Component +public class WebSocketRequiredEventListener { + + private final SimpMessagingTemplate messagingTemplate; + + // 트랜잭션 커밋 후 전송 + @Async("eventTaskExecutor") + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void handleMessage(MessageCreatedEvent event) { + MessageDto message = event.getData(); + // 클라이언트는 "/sub/channels.{channelId}.messages" 를 구독 + String destination = String.format("/sub/channels.%s.messages", message.channelId()); + messagingTemplate.convertAndSend(destination, message); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/security/JwtAuthenticationChannelInterceptor.java b/src/main/java/com/sprint/mission/discodeit/security/JwtAuthenticationChannelInterceptor.java new file mode 100644 index 000000000..af599086d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/security/JwtAuthenticationChannelInterceptor.java @@ -0,0 +1,69 @@ +package com.sprint.mission.discodeit.security; + +import com.sprint.mission.discodeit.security.jwt.JwtTokenProvider; +import java.util.List; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.messaging.support.MessageHeaderAccessor; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.stereotype.Component; + +/** + * STOMP CONNECT 시 Authorization 헤더의 JWT를 검증하여 accessor.setUser(authentication) 에 저장. + * 검증 로직은 기존 JwtAuthenticationFilter / JwtTokenProvider 와 동일 규칙을 사용한다. + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class JwtAuthenticationChannelInterceptor implements ChannelInterceptor { + + private final DiscodeitUserDetailsService userDetailsService; + private final JwtTokenProvider jwtTokenProvider; + + @Override + public Message preSend(Message message, MessageChannel channel) { + StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); + if (accessor == null) return message; + + if (StompCommand.CONNECT.equals(accessor.getCommand())) { + String bearer = firstNativeHeader(accessor, "Authorization") + .or(() -> firstNativeHeader(accessor, "authorization")) + .orElseThrow(() -> new BadCredentialsException("Missing Authorization header")); + + if (!bearer.startsWith("Bearer ")) { + throw new BadCredentialsException("Invalid Authorization header"); + } + String token = bearer.substring("Bearer ".length()).trim(); + + // private validateToken(..) 말고 공개 메서드 사용 + if (!jwtTokenProvider.validateAccessToken(token)) { + throw new BadCredentialsException("Invalid or expired ACCESS token"); + } + + // getUsernameFromToken(..) 사용 (getUsername 아님) + String username = jwtTokenProvider.getUsernameFromToken(token); + + var userDetails = userDetailsService.loadUserByUsername(username); + var authentication = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities() + ); + + // SecurityContext 대신 accessor에 저장 → 이후 SecurityContextChannelInterceptor가 이어받음 + accessor.setUser(authentication); + log.debug("STOMP CONNECT authenticated: {}", username); + } + return message; + } + + private Optional firstNativeHeader(StompHeaderAccessor accessor, String name) { + List values = accessor.getNativeHeader(name); + return (values == null || values.isEmpty()) ? Optional.empty() : Optional.ofNullable(values.get(0)); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/sse/SseEmitterRepository.java b/src/main/java/com/sprint/mission/discodeit/sse/SseEmitterRepository.java new file mode 100644 index 000000000..713ec948d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/sse/SseEmitterRepository.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.sse; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import org.springframework.stereotype.Repository; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +@Repository +public class SseEmitterRepository { + + // 사용자별 다중 탭/기기 연결 허용 + private final Map> data = new ConcurrentHashMap<>(); + + public void add(UUID receiverId, SseEmitter emitter) { + data.computeIfAbsent(receiverId, id -> new CopyOnWriteArrayList<>()).add(emitter); + } + + public void remove(UUID receiverId, SseEmitter emitter) { + var list = data.get(receiverId); + if (list != null) { + list.remove(emitter); + if (list.isEmpty()) data.remove(receiverId); + } + } + + public List getAll(UUID receiverId) { + return data.getOrDefault(receiverId, new CopyOnWriteArrayList<>()); + } + + public Set>> allEntries() { + return data.entrySet(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/sse/SseMessage.java b/src/main/java/com/sprint/mission/discodeit/sse/SseMessage.java new file mode 100644 index 000000000..b14c44a23 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/sse/SseMessage.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.sse; + +import java.time.Instant; +import java.util.Set; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class SseMessage { + private final UUID id; + private final String name; + private final Object data; + // null 이면 broadcast 의미 + private final Set receiverIds; + private final Instant createdAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/sse/SseMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/sse/SseMessageRepository.java new file mode 100644 index 000000000..bee9f6730 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/sse/SseMessageRepository.java @@ -0,0 +1,45 @@ +package com.sprint.mission.discodeit.sse; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedDeque; +import org.springframework.stereotype.Repository; + +@Repository +public class SseMessageRepository { + + // 이벤트 재전송(유실 복원)용 - 최근 N개만 보존 + private static final int CAPACITY = 5000; + + private final ConcurrentLinkedDeque eventIdQueue = new ConcurrentLinkedDeque<>(); + private final Map messages = new ConcurrentHashMap<>(); + + public void save(SseMessage message) { + messages.put(message.getId(), message); + eventIdQueue.addLast(message.getId()); + while (eventIdQueue.size() > CAPACITY) { + UUID oldest = eventIdQueue.pollFirst(); + if (oldest != null) messages.remove(oldest); + } + } + + public Optional findById(UUID id) { + return Optional.ofNullable(messages.get(id)); + } + + /** lastEventId 이후의 메시지를 순서대로 반환 */ + public List findAfter(UUID lastEventId) { + if (lastEventId == null) return List.of(); + List result = new ArrayList<>(); + boolean after = false; + for (UUID id : eventIdQueue) { + if (!after) { + if (id.equals(lastEventId)) after = true; + continue; + } + SseMessage msg = messages.get(id); + if (msg != null) result.add(msg); + } + return result; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/sse/SseService.java b/src/main/java/com/sprint/mission/discodeit/sse/SseService.java new file mode 100644 index 000000000..8ff8745c9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/sse/SseService.java @@ -0,0 +1,119 @@ +package com.sprint.mission.discodeit.sse; + +import jakarta.annotation.Nullable; +import java.io.IOException; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SseService { + + private static final long DEFAULT_TIMEOUT_MS = 30L * 60L * 1000L; // 30분 + + private final SseEmitterRepository emitterRepository; + private final SseMessageRepository messageRepository; + + /** 최초 연결 & 유실 복원 */ + public SseEmitter connect(UUID receiverId, @Nullable UUID lastEventId) { + SseEmitter emitter = new SseEmitter(DEFAULT_TIMEOUT_MS); + + // 콜백 등록 + emitter.onCompletion(() -> emitterRepository.remove(receiverId, emitter)); + emitter.onTimeout(() -> emitterRepository.remove(receiverId, emitter)); + emitter.onError((ex) -> emitterRepository.remove(receiverId, emitter)); + + emitterRepository.add(receiverId, emitter); + + // 연결 확인용 ping + ping(emitter); + + // 이벤트 유실 복원 (Last-Event-ID 이후) + if (lastEventId != null) { + var backlog = messageRepository.findAfter(lastEventId); + for (SseMessage m : filterByReceiver(backlog, receiverId)) { + safeSend(emitter, m.getId(), m.getName(), m.getData()); + } + } + + return emitter; + } + + /** 선택 사용자에게 이벤트 전송 */ + public void send(Collection receiverIds, String eventName, Object data) { + if (receiverIds == null || receiverIds.isEmpty()) return; + + UUID eventId = UUID.randomUUID(); + SseMessage msg = new SseMessage(eventId, eventName, data, Set.copyOf(receiverIds), Instant.now()); + messageRepository.save(msg); + + for (UUID receiverId : receiverIds) { + var emitters = new CopyOnWriteArrayList<>(emitterRepository.getAll(receiverId)); + for (SseEmitter emitter : emitters) { + boolean ok = safeSend(emitter, eventId, eventName, data); + if (!ok) emitterRepository.remove(receiverId, emitter); + } + } + } + + /** 전체 브로드캐스트 */ + public void broadcast(String eventName, Object data) { + UUID eventId = UUID.randomUUID(); + SseMessage msg = new SseMessage(eventId, eventName, data, null, Instant.now()); + messageRepository.save(msg); + + for (var entry : emitterRepository.allEntries()) { + UUID receiverId = entry.getKey(); + for (SseEmitter emitter : new CopyOnWriteArrayList<>(entry.getValue())) { + boolean ok = safeSend(emitter, eventId, eventName, data); + if (!ok) emitterRepository.remove(receiverId, emitter); + } + } + } + + /** 30분마다 연결 상태 점검 & 정리 */ + @Scheduled(fixedDelay = 1000 * 60 * 30) + public void cleanUp() { + for (var entry : emitterRepository.allEntries()) { + UUID receiverId = entry.getKey(); + for (SseEmitter emitter : new CopyOnWriteArrayList<>(entry.getValue())) { + if (!ping(emitter)) { + emitterRepository.remove(receiverId, emitter); + } + } + } + } + + /** 연결/타임아웃 확인용 더미 이벤트 */ + public boolean ping(SseEmitter sseEmitter) { + return safeSend(sseEmitter, UUID.randomUUID(), "sse.ping", "pong"); + } + + private boolean safeSend(SseEmitter emitter, UUID id, String name, Object data) { + try { + emitter.send(SseEmitter.event() + .id(id.toString()) + .name(name) + .data(data)); + return true; + } catch (IOException e) { + try { emitter.completeWithError(e); } catch (Exception ignore) {} + log.debug("SSE 전송 실패 → emitter 제거 대상: {}", e.getMessage()); + return false; + } + } + + private List filterByReceiver(List messages, UUID receiverId) { + return messages.stream() + .filter(m -> m.getReceiverIds() == null || m.getReceiverIds().contains(receiverId)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/resources/static/assets/index-bOSCxVDt.js b/src/main/resources/static/assets/index-bOSCxVDt.js new file mode 100644 index 000000000..00653d879 --- /dev/null +++ b/src/main/resources/static/assets/index-bOSCxVDt.js @@ -0,0 +1,1586 @@ +var U0=Object.defineProperty;var F0=(n,o,i)=>o in n?U0(n,o,{enumerable:!0,configurable:!0,writable:!0,value:i}):n[o]=i;var Zp=(n,o,i)=>F0(n,typeof o!="symbol"?o+"":o,i);(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))s(l);new MutationObserver(l=>{for(const c of l)if(c.type==="childList")for(const d of c.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&s(d)}).observe(document,{childList:!0,subtree:!0});function i(l){const c={};return l.integrity&&(c.integrity=l.integrity),l.referrerPolicy&&(c.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?c.credentials="include":l.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function s(l){if(l.ep)return;l.ep=!0;const c=i(l);fetch(l.href,c)}})();var ie=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ba(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Eu={exports:{}},di={},Cu={exports:{}},Le={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var eh;function z0(){if(eh)return Le;eh=1;var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),d=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),x=Symbol.iterator;function E(C){return C===null||typeof C!="object"?null:(C=x&&C[x]||C["@@iterator"],typeof C=="function"?C:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},j=Object.assign,b={};function T(C,F,fe){this.props=C,this.context=F,this.refs=b,this.updater=fe||M}T.prototype.isReactComponent={},T.prototype.setState=function(C,F){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,F,"setState")},T.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function G(){}G.prototype=T.prototype;function A(C,F,fe){this.props=C,this.context=F,this.refs=b,this.updater=fe||M}var R=A.prototype=new G;R.constructor=A,j(R,T.prototype),R.isPureReactComponent=!0;var k=Array.isArray,S=Object.prototype.hasOwnProperty,U={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function L(C,F,fe){var me,xe={},ke=null,Ae=null;if(F!=null)for(me in F.ref!==void 0&&(Ae=F.ref),F.key!==void 0&&(ke=""+F.key),F)S.call(F,me)&&!D.hasOwnProperty(me)&&(xe[me]=F[me]);var Re=arguments.length-2;if(Re===1)xe.children=fe;else if(1>>1,F=N[C];if(0>>1;Cl(xe,V))kel(Ae,xe)?(N[C]=Ae,N[ke]=V,C=ke):(N[C]=xe,N[me]=V,C=me);else if(kel(Ae,V))N[C]=Ae,N[ke]=V,C=ke;else break e}}return W}function l(N,W){var V=N.sortIndex-W.sortIndex;return V!==0?V:N.id-W.id}if(typeof performance=="object"&&typeof performance.now=="function"){var c=performance;n.unstable_now=function(){return c.now()}}else{var d=Date,p=d.now();n.unstable_now=function(){return d.now()-p}}var g=[],y=[],v=1,x=null,E=3,M=!1,j=!1,b=!1,T=typeof setTimeout=="function"?setTimeout:null,G=typeof clearTimeout=="function"?clearTimeout:null,A=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function R(N){for(var W=i(y);W!==null;){if(W.callback===null)s(y);else if(W.startTime<=N)s(y),W.sortIndex=W.expirationTime,o(g,W);else break;W=i(y)}}function k(N){if(b=!1,R(N),!j)if(i(g)!==null)j=!0,K(S);else{var W=i(y);W!==null&&H(k,W.startTime-N)}}function S(N,W){j=!1,b&&(b=!1,G(L),L=-1),M=!0;var V=E;try{for(R(W),x=i(g);x!==null&&(!(x.expirationTime>W)||N&&!re());){var C=x.callback;if(typeof C=="function"){x.callback=null,E=x.priorityLevel;var F=C(x.expirationTime<=W);W=n.unstable_now(),typeof F=="function"?x.callback=F:x===i(g)&&s(g),R(W)}else s(g);x=i(g)}if(x!==null)var fe=!0;else{var me=i(y);me!==null&&H(k,me.startTime-W),fe=!1}return fe}finally{x=null,E=V,M=!1}}var U=!1,D=null,L=-1,P=5,X=-1;function re(){return!(n.unstable_now()-XN||125C?(N.sortIndex=V,o(y,N),i(g)===null&&N===i(y)&&(b?(G(L),L=-1):b=!0,H(k,V-C))):(N.sortIndex=F,o(g,N),j||M||(j=!0,K(S))),N},n.unstable_shouldYield=re,n.unstable_wrapCallback=function(N){var W=E;return function(){var V=E;E=W;try{return N.apply(this,arguments)}finally{E=V}}}}(_u)),_u}var ih;function V0(){return ih||(ih=1,bu.exports=W0()),bu.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var sh;function Y0(){if(sh)return zt;sh=1;var n=sd(),o=V0();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),g=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,v={},x={};function E(e){return g.call(x,e)?!0:g.call(v,e)?!1:y.test(e)?x[e]=!0:(v[e]=!0,!1)}function M(e,t,r,a){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function j(e,t,r,a){if(t===null||typeof t>"u"||M(e,t,r,a))return!0;if(a)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function b(e,t,r,a,u,f,h){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=u,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=f,this.removeEmptyString=h}var T={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){T[e]=new b(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];T[t]=new b(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){T[e]=new b(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){T[e]=new b(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){T[e]=new b(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){T[e]=new b(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){T[e]=new b(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){T[e]=new b(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){T[e]=new b(e,5,!1,e.toLowerCase(),null,!1,!1)});var G=/[\-:]([a-z])/g;function A(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(G,A);T[t]=new b(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(G,A);T[t]=new b(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(G,A);T[t]=new b(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){T[e]=new b(e,1,!1,e.toLowerCase(),null,!1,!1)}),T.xlinkHref=new b("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){T[e]=new b(e,1,!1,e.toLowerCase(),null,!0,!0)});function R(e,t,r,a){var u=T.hasOwnProperty(t)?T[t]:null;(u!==null?u.type!==0:a||!(2w||u[h]!==f[w]){var _=` +`+u[h].replace(" at new "," at ");return e.displayName&&_.includes("")&&(_=_.replace("",e.displayName)),_}while(1<=h&&0<=w);break}}}finally{fe=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?F(e):""}function xe(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=me(e.type,!1),e;case 11:return e=me(e.type.render,!1),e;case 1:return e=me(e.type,!0),e;default:return""}}function ke(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case D:return"Fragment";case U:return"Portal";case P:return"Profiler";case L:return"StrictMode";case te:return"Suspense";case ae:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case re:return(e.displayName||"Context")+".Consumer";case X:return(e._context.displayName||"Context")+".Provider";case Ce:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Z:return t=e.displayName||null,t!==null?t:ke(e.type)||"Memo";case K:t=e._payload,e=e._init;try{return ke(e(t))}catch{}}return null}function Ae(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ke(t);case 8:return t===L?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Re(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function je(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ie(e){var t=je(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var u=r.get,f=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return u.call(this)},set:function(h){a=""+h,f.call(this,h)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return a},setValue:function(h){a=""+h},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Ue(e){e._valueTracker||(e._valueTracker=Ie(e))}function ct(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),a="";return e&&(a=je(e)?e.checked?"true":"false":e.value),e=a,e!==r?(t.setValue(e),!0):!1}function cn(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function To(e,t){var r=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function Ao(e,t){var r=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;r=Re(t.value!=null?t.value:r),e._wrapperState={initialChecked:a,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Y(e,t){t=t.checked,t!=null&&R(e,"checked",t,!1)}function le(e,t){Y(e,t);var r=Re(t.value),a=t.type;if(r!=null)a==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?se(e,t.type,r):t.hasOwnProperty("defaultValue")&&se(e,t.type,Re(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function he(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function se(e,t,r){(t!=="number"||cn(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Ee=Array.isArray;function ve(e,t,r,a){if(e=e.options,t){t={};for(var u=0;u"+t.valueOf().toString()+"",t=qe.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function dn(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var dt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},wt=["Webkit","ms","Moz","O"];Object.keys(dt).forEach(function(e){wt.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),dt[t]=dt[e]})});function Mt(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||dt.hasOwnProperty(e)&&dt[e]?(""+t).trim():t+"px"}function On(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var a=r.indexOf("--")===0,u=Mt(r,t[r],a);r==="float"&&(r="cssFloat"),a?e.setProperty(r,u):e[r]=u}}var Hr=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function qt(e,t){if(t){if(Hr[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function Hn(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ft=null;function Sr(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var fn=null,qn=null,Wn=null;function Oo(e){if(e=Qo(e)){if(typeof fn!="function")throw Error(i(280));var t=e.stateNode;t&&(t=is(t),fn(e.stateNode,e.type,t))}}function qr(e){qn?Wn?Wn.push(e):Wn=[e]:qn=e}function Vn(){if(qn){var e=qn,t=Wn;if(Wn=qn=null,Oo(e),t)for(e=0;e>>=0,e===0?32:31-(rv(e)/ov|0)|0}var Fi=64,zi=4194304;function No(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Hi(e,t){var r=e.pendingLanes;if(r===0)return 0;var a=0,u=e.suspendedLanes,f=e.pingedLanes,h=r&268435455;if(h!==0){var w=h&~u;w!==0?a=No(w):(f&=h,f!==0&&(a=No(f)))}else h=r&~u,h!==0?a=No(h):f!==0&&(a=No(f));if(a===0)return 0;if(t!==0&&t!==a&&!(t&u)&&(u=a&-a,f=t&-t,u>=f||u===16&&(f&4194240)!==0))return t;if(a&4&&(a|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0r;r++)t.push(e);return t}function Io(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-hn(t),e[t]=r}function lv(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var a=e.eventTimes;for(e=e.expirationTimes;0=Fo),Wd=" ",Vd=!1;function Yd(e,t){switch(e){case"keyup":return Mv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Gd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Yr=!1;function $v(e,t){switch(e){case"compositionend":return Gd(t);case"keypress":return t.which!==32?null:(Vd=!0,Wd);case"textInput":return e=t.data,e===Wd&&Vd?null:e;default:return null}}function Bv(e,t){if(Yr)return e==="compositionend"||!nl&&Yd(e,t)?(e=Bd(),Gi=Qa=Kn=null,Yr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=a}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=tf(r)}}function rf(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?rf(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function of(){for(var e=window,t=cn();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=cn(e.document)}return t}function il(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Gv(e){var t=of(),r=e.focusedElem,a=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&rf(r.ownerDocument.documentElement,r)){if(a!==null&&il(r)){if(t=a.start,e=a.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var u=r.textContent.length,f=Math.min(a.start,u);a=a.end===void 0?f:Math.min(a.end,u),!e.extend&&f>a&&(u=a,a=f,f=u),u=nf(r,f);var h=nf(r,a);u&&h&&(e.rangeCount!==1||e.anchorNode!==u.node||e.anchorOffset!==u.offset||e.focusNode!==h.node||e.focusOffset!==h.offset)&&(t=t.createRange(),t.setStart(u.node,u.offset),e.removeAllRanges(),f>a?(e.addRange(t),e.extend(h.node,h.offset)):(t.setEnd(h.node,h.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Gr=null,sl=null,Wo=null,al=!1;function sf(e,t,r){var a=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;al||Gr==null||Gr!==cn(a)||(a=Gr,"selectionStart"in a&&il(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Wo&&qo(Wo,a)||(Wo=a,a=ns(sl,"onSelect"),0Zr||(e.current=xl[Zr],xl[Zr]=null,Zr--)}function Ve(e,t){Zr++,xl[Zr]=e.current,e.current=t}var tr={},bt=er(tr),Dt=er(!1),kr=tr;function eo(e,t){var r=e.type.contextTypes;if(!r)return tr;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var u={},f;for(f in r)u[f]=t[f];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=u),u}function $t(e){return e=e.childContextTypes,e!=null}function ss(){Ge(Dt),Ge(bt)}function Sf(e,t,r){if(bt.current!==tr)throw Error(i(168));Ve(bt,t),Ve(Dt,r)}function Ef(e,t,r){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return r;a=a.getChildContext();for(var u in a)if(!(u in t))throw Error(i(108,Ae(e)||"Unknown",u));return V({},r,a)}function as(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||tr,kr=bt.current,Ve(bt,e),Ve(Dt,Dt.current),!0}function Cf(e,t,r){var a=e.stateNode;if(!a)throw Error(i(169));r?(e=Ef(e,t,kr),a.__reactInternalMemoizedMergedChildContext=e,Ge(Dt),Ge(bt),Ve(bt,e)):Ge(Dt),Ve(Dt,r)}var In=null,ls=!1,wl=!1;function kf(e){In===null?In=[e]:In.push(e)}function s0(e){ls=!0,kf(e)}function nr(){if(!wl&&In!==null){wl=!0;var e=0,t=He;try{var r=In;for(He=1;e>=h,u-=h,Ln=1<<32-hn(t)+u|r<_e?(vt=Se,Se=null):vt=Se.sibling;var $e=Q($,Se,B[_e],ne);if($e===null){Se===null&&(Se=vt);break}e&&Se&&$e.alternate===null&&t($,Se),O=f($e,O,_e),we===null?ye=$e:we.sibling=$e,we=$e,Se=vt}if(_e===B.length)return r($,Se),Qe&&_r($,_e),ye;if(Se===null){for(;_e_e?(vt=Se,Se=null):vt=Se.sibling;var dr=Q($,Se,$e.value,ne);if(dr===null){Se===null&&(Se=vt);break}e&&Se&&dr.alternate===null&&t($,Se),O=f(dr,O,_e),we===null?ye=dr:we.sibling=dr,we=dr,Se=vt}if($e.done)return r($,Se),Qe&&_r($,_e),ye;if(Se===null){for(;!$e.done;_e++,$e=B.next())$e=ee($,$e.value,ne),$e!==null&&(O=f($e,O,_e),we===null?ye=$e:we.sibling=$e,we=$e);return Qe&&_r($,_e),ye}for(Se=a($,Se);!$e.done;_e++,$e=B.next())$e=ce(Se,$,_e,$e.value,ne),$e!==null&&(e&&$e.alternate!==null&&Se.delete($e.key===null?_e:$e.key),O=f($e,O,_e),we===null?ye=$e:we.sibling=$e,we=$e);return e&&Se.forEach(function(B0){return t($,B0)}),Qe&&_r($,_e),ye}function st($,O,B,ne){if(typeof B=="object"&&B!==null&&B.type===D&&B.key===null&&(B=B.props.children),typeof B=="object"&&B!==null){switch(B.$$typeof){case S:e:{for(var ye=B.key,we=O;we!==null;){if(we.key===ye){if(ye=B.type,ye===D){if(we.tag===7){r($,we.sibling),O=u(we,B.props.children),O.return=$,$=O;break e}}else if(we.elementType===ye||typeof ye=="object"&&ye!==null&&ye.$$typeof===K&&Af(ye)===we.type){r($,we.sibling),O=u(we,B.props),O.ref=Ko($,we,B),O.return=$,$=O;break e}r($,we);break}else t($,we);we=we.sibling}B.type===D?(O=Lr(B.props.children,$.mode,ne,B.key),O.return=$,$=O):(ne=Ms(B.type,B.key,B.props,null,$.mode,ne),ne.ref=Ko($,O,B),ne.return=$,$=ne)}return h($);case U:e:{for(we=B.key;O!==null;){if(O.key===we)if(O.tag===4&&O.stateNode.containerInfo===B.containerInfo&&O.stateNode.implementation===B.implementation){r($,O.sibling),O=u(O,B.children||[]),O.return=$,$=O;break e}else{r($,O);break}else t($,O);O=O.sibling}O=yu(B,$.mode,ne),O.return=$,$=O}return h($);case K:return we=B._init,st($,O,we(B._payload),ne)}if(Ee(B))return pe($,O,B,ne);if(W(B))return ge($,O,B,ne);fs($,B)}return typeof B=="string"&&B!==""||typeof B=="number"?(B=""+B,O!==null&&O.tag===6?(r($,O.sibling),O=u(O,B),O.return=$,$=O):(r($,O),O=gu(B,$.mode,ne),O.return=$,$=O),h($)):r($,O)}return st}var oo=Of(!0),Nf=Of(!1),ps=er(null),hs=null,io=null,_l=null;function Rl(){_l=io=hs=null}function jl(e){var t=ps.current;Ge(ps),e._currentValue=t}function Tl(e,t,r){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===r)break;e=e.return}}function so(e,t){hs=e,_l=io=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Bt=!0),e.firstContext=null)}function rn(e){var t=e._currentValue;if(_l!==e)if(e={context:e,memoizedValue:t,next:null},io===null){if(hs===null)throw Error(i(308));io=e,hs.dependencies={lanes:0,firstContext:e}}else io=io.next=e;return t}var Rr=null;function Al(e){Rr===null?Rr=[e]:Rr.push(e)}function If(e,t,r,a){var u=t.interleaved;return u===null?(r.next=r,Al(t)):(r.next=u.next,u.next=r),t.interleaved=r,Mn(e,a)}function Mn(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var rr=!1;function Ol(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Lf(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Dn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function or(e,t,r){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,Me&2){var u=a.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),a.pending=t,Mn(e,r)}return u=a.interleaved,u===null?(t.next=t,Al(a)):(t.next=u.next,u.next=t),a.interleaved=t,Mn(e,r)}function ms(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,r|=a,t.lanes=r,Wa(e,r)}}function Pf(e,t){var r=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,r===a)){var u=null,f=null;if(r=r.firstBaseUpdate,r!==null){do{var h={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};f===null?u=f=h:f=f.next=h,r=r.next}while(r!==null);f===null?u=f=t:f=f.next=t}else u=f=t;r={baseState:a.baseState,firstBaseUpdate:u,lastBaseUpdate:f,shared:a.shared,effects:a.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function gs(e,t,r,a){var u=e.updateQueue;rr=!1;var f=u.firstBaseUpdate,h=u.lastBaseUpdate,w=u.shared.pending;if(w!==null){u.shared.pending=null;var _=w,z=_.next;_.next=null,h===null?f=z:h.next=z,h=_;var J=e.alternate;J!==null&&(J=J.updateQueue,w=J.lastBaseUpdate,w!==h&&(w===null?J.firstBaseUpdate=z:w.next=z,J.lastBaseUpdate=_))}if(f!==null){var ee=u.baseState;h=0,J=z=_=null,w=f;do{var Q=w.lane,ce=w.eventTime;if((a&Q)===Q){J!==null&&(J=J.next={eventTime:ce,lane:0,tag:w.tag,payload:w.payload,callback:w.callback,next:null});e:{var pe=e,ge=w;switch(Q=t,ce=r,ge.tag){case 1:if(pe=ge.payload,typeof pe=="function"){ee=pe.call(ce,ee,Q);break e}ee=pe;break e;case 3:pe.flags=pe.flags&-65537|128;case 0:if(pe=ge.payload,Q=typeof pe=="function"?pe.call(ce,ee,Q):pe,Q==null)break e;ee=V({},ee,Q);break e;case 2:rr=!0}}w.callback!==null&&w.lane!==0&&(e.flags|=64,Q=u.effects,Q===null?u.effects=[w]:Q.push(w))}else ce={eventTime:ce,lane:Q,tag:w.tag,payload:w.payload,callback:w.callback,next:null},J===null?(z=J=ce,_=ee):J=J.next=ce,h|=Q;if(w=w.next,w===null){if(w=u.shared.pending,w===null)break;Q=w,w=Q.next,Q.next=null,u.lastBaseUpdate=Q,u.shared.pending=null}}while(!0);if(J===null&&(_=ee),u.baseState=_,u.firstBaseUpdate=z,u.lastBaseUpdate=J,t=u.shared.interleaved,t!==null){u=t;do h|=u.lane,u=u.next;while(u!==t)}else f===null&&(u.shared.lanes=0);Ar|=h,e.lanes=h,e.memoizedState=ee}}function Mf(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var a=Ml.transition;Ml.transition={};try{e(!1),t()}finally{He=r,Ml.transition=a}}function tp(){return on().memoizedState}function c0(e,t,r){var a=lr(e);if(r={lane:a,action:r,hasEagerState:!1,eagerState:null,next:null},np(e))rp(t,r);else if(r=If(e,t,r,a),r!==null){var u=It();wn(r,e,a,u),op(r,t,a)}}function d0(e,t,r){var a=lr(e),u={lane:a,action:r,hasEagerState:!1,eagerState:null,next:null};if(np(e))rp(t,u);else{var f=e.alternate;if(e.lanes===0&&(f===null||f.lanes===0)&&(f=t.lastRenderedReducer,f!==null))try{var h=t.lastRenderedState,w=f(h,r);if(u.hasEagerState=!0,u.eagerState=w,mn(w,h)){var _=t.interleaved;_===null?(u.next=u,Al(t)):(u.next=_.next,_.next=u),t.interleaved=u;return}}catch{}finally{}r=If(e,t,u,a),r!==null&&(u=It(),wn(r,e,a,u),op(r,t,a))}}function np(e){var t=e.alternate;return e===Je||t!==null&&t===Je}function rp(e,t){ti=xs=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function op(e,t,r){if(r&4194240){var a=t.lanes;a&=e.pendingLanes,r|=a,t.lanes=r,Wa(e,r)}}var Es={readContext:rn,useCallback:_t,useContext:_t,useEffect:_t,useImperativeHandle:_t,useInsertionEffect:_t,useLayoutEffect:_t,useMemo:_t,useReducer:_t,useRef:_t,useState:_t,useDebugValue:_t,useDeferredValue:_t,useTransition:_t,useMutableSource:_t,useSyncExternalStore:_t,useId:_t,unstable_isNewReconciler:!1},f0={readContext:rn,useCallback:function(e,t){return Rn().memoizedState=[e,t===void 0?null:t],e},useContext:rn,useEffect:Yf,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,ws(4194308,4,Qf.bind(null,t,e),r)},useLayoutEffect:function(e,t){return ws(4194308,4,e,t)},useInsertionEffect:function(e,t){return ws(4,2,e,t)},useMemo:function(e,t){var r=Rn();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var a=Rn();return t=r!==void 0?r(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=c0.bind(null,Je,e),[a.memoizedState,e]},useRef:function(e){var t=Rn();return e={current:e},t.memoizedState=e},useState:Wf,useDebugValue:Hl,useDeferredValue:function(e){return Rn().memoizedState=e},useTransition:function(){var e=Wf(!1),t=e[0];return e=u0.bind(null,e[1]),Rn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var a=Je,u=Rn();if(Qe){if(r===void 0)throw Error(i(407));r=r()}else{if(r=t(),yt===null)throw Error(i(349));Tr&30||Uf(a,t,r)}u.memoizedState=r;var f={value:r,getSnapshot:t};return u.queue=f,Yf(zf.bind(null,a,f,e),[e]),a.flags|=2048,oi(9,Ff.bind(null,a,f,r,t),void 0,null),r},useId:function(){var e=Rn(),t=yt.identifierPrefix;if(Qe){var r=Pn,a=Ln;r=(a&~(1<<32-hn(a)-1)).toString(32)+r,t=":"+t+"R"+r,r=ni++,0<\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=h.createElement(r,{is:a.is}):(e=h.createElement(r),r==="select"&&(h=e,a.multiple?h.multiple=!0:a.size&&(h.size=a.size))):e=h.createElementNS(e,r),e[bn]=t,e[Xo]=a,kp(e,t,!1,!1),t.stateNode=e;e:{switch(h=Hn(r,a),r){case"dialog":Ye("cancel",e),Ye("close",e),u=a;break;case"iframe":case"object":case"embed":Ye("load",e),u=a;break;case"video":case"audio":for(u=0;ufo&&(t.flags|=128,a=!0,ii(f,!1),t.lanes=4194304)}else{if(!a)if(e=ys(h),e!==null){if(t.flags|=128,a=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ii(f,!0),f.tail===null&&f.tailMode==="hidden"&&!h.alternate&&!Qe)return Rt(t),null}else 2*it()-f.renderingStartTime>fo&&r!==1073741824&&(t.flags|=128,a=!0,ii(f,!1),t.lanes=4194304);f.isBackwards?(h.sibling=t.child,t.child=h):(r=f.last,r!==null?r.sibling=h:t.child=h,f.last=h)}return f.tail!==null?(t=f.tail,f.rendering=t,f.tail=t.sibling,f.renderingStartTime=it(),t.sibling=null,r=Ke.current,Ve(Ke,a?r&1|2:r&1),t):(Rt(t),null);case 22:case 23:return pu(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&t.mode&1?Gt&1073741824&&(Rt(t),t.subtreeFlags&6&&(t.flags|=8192)):Rt(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function w0(e,t){switch(El(t),t.tag){case 1:return $t(t.type)&&ss(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ao(),Ge(Dt),Ge(bt),Pl(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Il(t),null;case 13:if(Ge(Ke),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));ro()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(Ke),null;case 4:return ao(),null;case 10:return jl(t.type._context),null;case 22:case 23:return pu(),null;case 24:return null;default:return null}}var _s=!1,jt=!1,S0=typeof WeakSet=="function"?WeakSet:Set,de=null;function uo(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(a){tt(e,t,a)}else r.current=null}function tu(e,t,r){try{r()}catch(a){tt(e,t,a)}}var Rp=!1;function E0(e,t){if(pl=Vi,e=of(),il(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var a=r.getSelection&&r.getSelection();if(a&&a.rangeCount!==0){r=a.anchorNode;var u=a.anchorOffset,f=a.focusNode;a=a.focusOffset;try{r.nodeType,f.nodeType}catch{r=null;break e}var h=0,w=-1,_=-1,z=0,J=0,ee=e,Q=null;t:for(;;){for(var ce;ee!==r||u!==0&&ee.nodeType!==3||(w=h+u),ee!==f||a!==0&&ee.nodeType!==3||(_=h+a),ee.nodeType===3&&(h+=ee.nodeValue.length),(ce=ee.firstChild)!==null;)Q=ee,ee=ce;for(;;){if(ee===e)break t;if(Q===r&&++z===u&&(w=h),Q===f&&++J===a&&(_=h),(ce=ee.nextSibling)!==null)break;ee=Q,Q=ee.parentNode}ee=ce}r=w===-1||_===-1?null:{start:w,end:_}}else r=null}r=r||{start:0,end:0}}else r=null;for(hl={focusedElem:e,selectionRange:r},Vi=!1,de=t;de!==null;)if(t=de,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,de=e;else for(;de!==null;){t=de;try{var pe=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(pe!==null){var ge=pe.memoizedProps,st=pe.memoizedState,$=t.stateNode,O=$.getSnapshotBeforeUpdate(t.elementType===t.type?ge:yn(t.type,ge),st);$.__reactInternalSnapshotBeforeUpdate=O}break;case 3:var B=t.stateNode.containerInfo;B.nodeType===1?B.textContent="":B.nodeType===9&&B.documentElement&&B.removeChild(B.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(ne){tt(t,t.return,ne)}if(e=t.sibling,e!==null){e.return=t.return,de=e;break}de=t.return}return pe=Rp,Rp=!1,pe}function si(e,t,r){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var u=a=a.next;do{if((u.tag&e)===e){var f=u.destroy;u.destroy=void 0,f!==void 0&&tu(t,r,f)}u=u.next}while(u!==a)}}function Rs(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var a=r.create;r.destroy=a()}r=r.next}while(r!==t)}}function nu(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function jp(e){var t=e.alternate;t!==null&&(e.alternate=null,jp(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[bn],delete t[Xo],delete t[vl],delete t[o0],delete t[i0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Tp(e){return e.tag===5||e.tag===3||e.tag===4}function Ap(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Tp(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ru(e,t,r){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=os));else if(a!==4&&(e=e.child,e!==null))for(ru(e,t,r),e=e.sibling;e!==null;)ru(e,t,r),e=e.sibling}function ou(e,t,r){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(ou(e,t,r),e=e.sibling;e!==null;)ou(e,t,r),e=e.sibling}var Et=null,vn=!1;function ir(e,t,r){for(r=r.child;r!==null;)Op(e,t,r),r=r.sibling}function Op(e,t,r){if(kn&&typeof kn.onCommitFiberUnmount=="function")try{kn.onCommitFiberUnmount(Ui,r)}catch{}switch(r.tag){case 5:jt||uo(r,t);case 6:var a=Et,u=vn;Et=null,ir(e,t,r),Et=a,vn=u,Et!==null&&(vn?(e=Et,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Et.removeChild(r.stateNode));break;case 18:Et!==null&&(vn?(e=Et,r=r.stateNode,e.nodeType===8?yl(e.parentNode,r):e.nodeType===1&&yl(e,r),$o(e)):yl(Et,r.stateNode));break;case 4:a=Et,u=vn,Et=r.stateNode.containerInfo,vn=!0,ir(e,t,r),Et=a,vn=u;break;case 0:case 11:case 14:case 15:if(!jt&&(a=r.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){u=a=a.next;do{var f=u,h=f.destroy;f=f.tag,h!==void 0&&(f&2||f&4)&&tu(r,t,h),u=u.next}while(u!==a)}ir(e,t,r);break;case 1:if(!jt&&(uo(r,t),a=r.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=r.memoizedProps,a.state=r.memoizedState,a.componentWillUnmount()}catch(w){tt(r,t,w)}ir(e,t,r);break;case 21:ir(e,t,r);break;case 22:r.mode&1?(jt=(a=jt)||r.memoizedState!==null,ir(e,t,r),jt=a):ir(e,t,r);break;default:ir(e,t,r)}}function Np(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new S0),t.forEach(function(a){var u=O0.bind(null,e,a);r.has(a)||(r.add(a),a.then(u,u))})}}function xn(e,t){var r=t.deletions;if(r!==null)for(var a=0;au&&(u=h),a&=~f}if(a=u,a=it()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*k0(a/1960))-a,10e?16:e,ar===null)var a=!1;else{if(e=ar,ar=null,Ns=0,Me&6)throw Error(i(331));var u=Me;for(Me|=4,de=e.current;de!==null;){var f=de,h=f.child;if(de.flags&16){var w=f.deletions;if(w!==null){for(var _=0;_it()-au?Nr(e,0):su|=r),Ft(e,t)}function Wp(e,t){t===0&&(e.mode&1?(t=zi,zi<<=1,!(zi&130023424)&&(zi=4194304)):t=1);var r=It();e=Mn(e,t),e!==null&&(Io(e,t,r),Ft(e,r))}function A0(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),Wp(e,r)}function O0(e,t){var r=0;switch(e.tag){case 13:var a=e.stateNode,u=e.memoizedState;u!==null&&(r=u.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(i(314))}a!==null&&a.delete(t),Wp(e,r)}var Vp;Vp=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||Dt.current)Bt=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return Bt=!1,v0(e,t,r);Bt=!!(e.flags&131072)}else Bt=!1,Qe&&t.flags&1048576&&bf(t,cs,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;bs(e,t),e=t.pendingProps;var u=eo(t,bt.current);so(t,r),u=$l(null,t,a,e,u,r);var f=Bl();return t.flags|=1,typeof u=="object"&&u!==null&&typeof u.render=="function"&&u.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,$t(a)?(f=!0,as(t)):f=!1,t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,Ol(t),u.updater=Cs,t.stateNode=u,u._reactInternals=t,Wl(t,a,e,r),t=Xl(null,t,a,!0,f,r)):(t.tag=0,Qe&&f&&Sl(t),Nt(null,t,u,r),t=t.child),t;case 16:a=t.elementType;e:{switch(bs(e,t),e=t.pendingProps,u=a._init,a=u(a._payload),t.type=a,u=t.tag=I0(a),e=yn(a,e),u){case 0:t=Gl(null,t,a,e,r);break e;case 1:t=vp(null,t,a,e,r);break e;case 11:t=pp(null,t,a,e,r);break e;case 14:t=hp(null,t,a,yn(a.type,e),r);break e}throw Error(i(306,a,""))}return t;case 0:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:yn(a,u),Gl(e,t,a,u,r);case 1:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:yn(a,u),vp(e,t,a,u,r);case 3:e:{if(xp(t),e===null)throw Error(i(387));a=t.pendingProps,f=t.memoizedState,u=f.element,Lf(e,t),gs(t,a,null,r);var h=t.memoizedState;if(a=h.element,f.isDehydrated)if(f={element:a,isDehydrated:!1,cache:h.cache,pendingSuspenseBoundaries:h.pendingSuspenseBoundaries,transitions:h.transitions},t.updateQueue.baseState=f,t.memoizedState=f,t.flags&256){u=lo(Error(i(423)),t),t=wp(e,t,a,r,u);break e}else if(a!==u){u=lo(Error(i(424)),t),t=wp(e,t,a,r,u);break e}else for(Yt=Zn(t.stateNode.containerInfo.firstChild),Vt=t,Qe=!0,gn=null,r=Nf(t,null,a,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(ro(),a===u){t=$n(e,t,r);break e}Nt(e,t,a,r)}t=t.child}return t;case 5:return Df(t),e===null&&kl(t),a=t.type,u=t.pendingProps,f=e!==null?e.memoizedProps:null,h=u.children,ml(a,u)?h=null:f!==null&&ml(a,f)&&(t.flags|=32),yp(e,t),Nt(e,t,h,r),t.child;case 6:return e===null&&kl(t),null;case 13:return Sp(e,t,r);case 4:return Nl(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=oo(t,null,a,r):Nt(e,t,a,r),t.child;case 11:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:yn(a,u),pp(e,t,a,u,r);case 7:return Nt(e,t,t.pendingProps,r),t.child;case 8:return Nt(e,t,t.pendingProps.children,r),t.child;case 12:return Nt(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(a=t.type._context,u=t.pendingProps,f=t.memoizedProps,h=u.value,Ve(ps,a._currentValue),a._currentValue=h,f!==null)if(mn(f.value,h)){if(f.children===u.children&&!Dt.current){t=$n(e,t,r);break e}}else for(f=t.child,f!==null&&(f.return=t);f!==null;){var w=f.dependencies;if(w!==null){h=f.child;for(var _=w.firstContext;_!==null;){if(_.context===a){if(f.tag===1){_=Dn(-1,r&-r),_.tag=2;var z=f.updateQueue;if(z!==null){z=z.shared;var J=z.pending;J===null?_.next=_:(_.next=J.next,J.next=_),z.pending=_}}f.lanes|=r,_=f.alternate,_!==null&&(_.lanes|=r),Tl(f.return,r,t),w.lanes|=r;break}_=_.next}}else if(f.tag===10)h=f.type===t.type?null:f.child;else if(f.tag===18){if(h=f.return,h===null)throw Error(i(341));h.lanes|=r,w=h.alternate,w!==null&&(w.lanes|=r),Tl(h,r,t),h=f.sibling}else h=f.child;if(h!==null)h.return=f;else for(h=f;h!==null;){if(h===t){h=null;break}if(f=h.sibling,f!==null){f.return=h.return,h=f;break}h=h.return}f=h}Nt(e,t,u.children,r),t=t.child}return t;case 9:return u=t.type,a=t.pendingProps.children,so(t,r),u=rn(u),a=a(u),t.flags|=1,Nt(e,t,a,r),t.child;case 14:return a=t.type,u=yn(a,t.pendingProps),u=yn(a.type,u),hp(e,t,a,u,r);case 15:return mp(e,t,t.type,t.pendingProps,r);case 17:return a=t.type,u=t.pendingProps,u=t.elementType===a?u:yn(a,u),bs(e,t),t.tag=1,$t(a)?(e=!0,as(t)):e=!1,so(t,r),sp(t,a,u),Wl(t,a,u,r),Xl(null,t,a,!0,e,r);case 19:return Cp(e,t,r);case 22:return gp(e,t,r)}throw Error(i(156,t.tag))};function Yp(e,t){return bd(e,t)}function N0(e,t,r,a){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function an(e,t,r,a){return new N0(e,t,r,a)}function mu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function I0(e){if(typeof e=="function")return mu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ce)return 11;if(e===Z)return 14}return 2}function cr(e,t){var r=e.alternate;return r===null?(r=an(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function Ms(e,t,r,a,u,f){var h=2;if(a=e,typeof e=="function")mu(e)&&(h=1);else if(typeof e=="string")h=5;else e:switch(e){case D:return Lr(r.children,u,f,t);case L:h=8,u|=8;break;case P:return e=an(12,r,t,u|2),e.elementType=P,e.lanes=f,e;case te:return e=an(13,r,t,u),e.elementType=te,e.lanes=f,e;case ae:return e=an(19,r,t,u),e.elementType=ae,e.lanes=f,e;case H:return Ds(r,u,f,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case X:h=10;break e;case re:h=9;break e;case Ce:h=11;break e;case Z:h=14;break e;case K:h=16,a=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=an(h,r,t,u),t.elementType=e,t.type=a,t.lanes=f,t}function Lr(e,t,r,a){return e=an(7,e,a,t),e.lanes=r,e}function Ds(e,t,r,a){return e=an(22,e,a,t),e.elementType=H,e.lanes=r,e.stateNode={isHidden:!1},e}function gu(e,t,r){return e=an(6,e,null,t),e.lanes=r,e}function yu(e,t,r){return t=an(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function L0(e,t,r,a,u){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=qa(0),this.expirationTimes=qa(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=qa(0),this.identifierPrefix=a,this.onRecoverableError=u,this.mutableSourceEagerHydrationData=null}function vu(e,t,r,a,u,f,h,w,_){return e=new L0(e,t,r,w,_),t===1?(t=1,f===!0&&(t|=8)):t=0,f=an(3,null,null,t),e.current=f,f.stateNode=e,f.memoizedState={element:a,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ol(f),e}function P0(e,t,r){var a=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(o){console.error(o)}}return n(),ku.exports=Y0(),ku.exports}var lh;function X0(){if(lh)return qs;lh=1;var n=G0();return qs.createRoot=n.createRoot,qs.hydrateRoot=n.hydrateRoot,qs}var Q0=X0(),At=function(){return At=Object.assign||function(o){for(var i,s=1,l=arguments.length;s0?xt(Co,--ln):0,wo--,ut===10&&(wo=1,Ra--),ut}function En(){return ut=ln2||Wc(ut)>3?"":" "}function sx(n,o){for(;--o&&En()&&!(ut<48||ut>102||ut>57&&ut<65||ut>70&&ut<97););return Ta(n,aa()+(o<6&&Dr()==32&&En()==32))}function Vc(n){for(;En();)switch(ut){case n:return ln;case 34:case 39:n!==34&&n!==39&&Vc(ut);break;case 40:n===41&&Vc(n);break;case 92:En();break}return ln}function ax(n,o){for(;En()&&n+ut!==57;)if(n+ut===84&&Dr()===47)break;return"/*"+Ta(o,ln-1)+"*"+ld(n===47?n:En())}function lx(n){for(;!Wc(Dr());)En();return Ta(n,ln)}function ux(n){return ox(la("",null,null,null,[""],n=rx(n),0,[0],n))}function la(n,o,i,s,l,c,d,p,g){for(var y=0,v=0,x=d,E=0,M=0,j=0,b=1,T=1,G=1,A=0,R="",k=l,S=c,U=s,D=R;T;)switch(j=A,A=En()){case 40:if(j!=108&&xt(D,x-1)==58){sa(D+=Ne(Ru(A),"&","&\f"),"&\f",kg(y?p[y-1]:0))!=-1&&(G=-1);break}case 34:case 39:case 91:D+=Ru(A);break;case 9:case 10:case 13:case 32:D+=ix(j);break;case 92:D+=sx(aa()-1,7);continue;case 47:switch(Dr()){case 42:case 47:yi(cx(ax(En(),aa()),o,i,g),g);break;default:D+="/"}break;case 123*b:p[y++]=An(D)*G;case 125*b:case 59:case 0:switch(A){case 0:case 125:T=0;case 59+v:G==-1&&(D=Ne(D,/\f/g,"")),M>0&&An(D)-x&&yi(M>32?dh(D+";",s,i,x-1,g):dh(Ne(D," ","")+";",s,i,x-2,g),g);break;case 59:D+=";";default:if(yi(U=ch(D,o,i,y,v,l,p,R,k=[],S=[],x,c),c),A===123)if(v===0)la(D,o,U,U,k,c,x,p,S);else switch(E===99&&xt(D,3)===110?100:E){case 100:case 108:case 109:case 115:la(n,U,U,s&&yi(ch(n,U,U,0,0,l,p,R,l,k=[],x,S),S),l,S,x,p,s?k:S);break;default:la(D,U,U,U,[""],S,0,p,S)}}y=v=M=0,b=G=1,R=D="",x=d;break;case 58:x=1+An(D),M=j;default:if(b<1){if(A==123)--b;else if(A==125&&b++==0&&nx()==125)continue}switch(D+=ld(A),A*b){case 38:G=v>0?1:(D+="\f",-1);break;case 44:p[y++]=(An(D)-1)*G,G=1;break;case 64:Dr()===45&&(D+=Ru(En())),E=Dr(),v=x=An(R=D+=lx(aa())),A++;break;case 45:j===45&&An(D)==2&&(b=0)}}return c}function ch(n,o,i,s,l,c,d,p,g,y,v,x){for(var E=l-1,M=l===0?c:[""],j=_g(M),b=0,T=0,G=0;b0?M[A]+" "+R:Ne(R,/&\f/g,M[A])))&&(g[G++]=k);return ja(n,o,i,l===0?_a:p,g,y,v,x)}function cx(n,o,i,s){return ja(n,o,i,Eg,ld(tx()),xo(n,2,-2),0,s)}function dh(n,o,i,s,l){return ja(n,o,i,ad,xo(n,0,s),xo(n,s+1,-1),s,l)}function jg(n,o,i){switch(Z0(n,o)){case 5103:return Fe+"print-"+n+n;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Fe+n+n;case 4789:return wi+n+n;case 5349:case 4246:case 4810:case 6968:case 2756:return Fe+n+wi+n+Xe+n+n;case 5936:switch(xt(n,o+11)){case 114:return Fe+n+Xe+Ne(n,/[svh]\w+-[tblr]{2}/,"tb")+n;case 108:return Fe+n+Xe+Ne(n,/[svh]\w+-[tblr]{2}/,"tb-rl")+n;case 45:return Fe+n+Xe+Ne(n,/[svh]\w+-[tblr]{2}/,"lr")+n}case 6828:case 4268:case 2903:return Fe+n+Xe+n+n;case 6165:return Fe+n+Xe+"flex-"+n+n;case 5187:return Fe+n+Ne(n,/(\w+).+(:[^]+)/,Fe+"box-$1$2"+Xe+"flex-$1$2")+n;case 5443:return Fe+n+Xe+"flex-item-"+Ne(n,/flex-|-self/g,"")+(Un(n,/flex-|baseline/)?"":Xe+"grid-row-"+Ne(n,/flex-|-self/g,""))+n;case 4675:return Fe+n+Xe+"flex-line-pack"+Ne(n,/align-content|flex-|-self/g,"")+n;case 5548:return Fe+n+Xe+Ne(n,"shrink","negative")+n;case 5292:return Fe+n+Xe+Ne(n,"basis","preferred-size")+n;case 6060:return Fe+"box-"+Ne(n,"-grow","")+Fe+n+Xe+Ne(n,"grow","positive")+n;case 4554:return Fe+Ne(n,/([^-])(transform)/g,"$1"+Fe+"$2")+n;case 6187:return Ne(Ne(Ne(n,/(zoom-|grab)/,Fe+"$1"),/(image-set)/,Fe+"$1"),n,"")+n;case 5495:case 3959:return Ne(n,/(image-set\([^]*)/,Fe+"$1$`$1");case 4968:return Ne(Ne(n,/(.+:)(flex-)?(.*)/,Fe+"box-pack:$3"+Xe+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Fe+n+n;case 4200:if(!Un(n,/flex-|baseline/))return Xe+"grid-column-align"+xo(n,o)+n;break;case 2592:case 3360:return Xe+Ne(n,"template-","")+n;case 4384:case 3616:return i&&i.some(function(s,l){return o=l,Un(s.props,/grid-\w+-end/)})?~sa(n+(i=i[o].value),"span",0)?n:Xe+Ne(n,"-start","")+n+Xe+"grid-row-span:"+(~sa(i,"span",0)?Un(i,/\d+/):+Un(i,/\d+/)-+Un(n,/\d+/))+";":Xe+Ne(n,"-start","")+n;case 4896:case 4128:return i&&i.some(function(s){return Un(s.props,/grid-\w+-start/)})?n:Xe+Ne(Ne(n,"-end","-span"),"span ","")+n;case 4095:case 3583:case 4068:case 2532:return Ne(n,/(.+)-inline(.+)/,Fe+"$1$2")+n;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(An(n)-1-o>6)switch(xt(n,o+1)){case 109:if(xt(n,o+4)!==45)break;case 102:return Ne(n,/(.+:)(.+)-([^]+)/,"$1"+Fe+"$2-$3$1"+wi+(xt(n,o+3)==108?"$3":"$2-$3"))+n;case 115:return~sa(n,"stretch",0)?jg(Ne(n,"stretch","fill-available"),o,i)+n:n}break;case 5152:case 5920:return Ne(n,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(s,l,c,d,p,g,y){return Xe+l+":"+c+y+(d?Xe+l+"-span:"+(p?g:+g-+c)+y:"")+n});case 4949:if(xt(n,o+6)===121)return Ne(n,":",":"+Fe)+n;break;case 6444:switch(xt(n,xt(n,14)===45?18:11)){case 120:return Ne(n,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Fe+(xt(n,14)===45?"inline-":"")+"box$3$1"+Fe+"$2$3$1"+Xe+"$2box$3")+n;case 100:return Ne(n,":",":"+Xe)+n}break;case 5719:case 2647:case 2135:case 3927:case 2391:return Ne(n,"scroll-","scroll-snap-")+n}return n}function va(n,o){for(var i="",s=0;s-1&&!n.return)switch(n.type){case ad:n.return=jg(n.value,n.length,i);return;case Cg:return va([fr(n,{value:Ne(n.value,"@","@"+Fe)})],s);case _a:if(n.length)return ex(i=n.props,function(l){switch(Un(l,s=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":ho(fr(n,{props:[Ne(l,/:(read-\w+)/,":"+wi+"$1")]})),ho(fr(n,{props:[l]})),qc(n,{props:uh(i,s)});break;case"::placeholder":ho(fr(n,{props:[Ne(l,/:(plac\w+)/,":"+Fe+"input-$1")]})),ho(fr(n,{props:[Ne(l,/:(plac\w+)/,":"+wi+"$1")]})),ho(fr(n,{props:[Ne(l,/:(plac\w+)/,Xe+"input-$1")]})),ho(fr(n,{props:[l]})),qc(n,{props:uh(i,s)});break}return""})}}var mx={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Xt={},So=typeof process<"u"&&Xt!==void 0&&(Xt.REACT_APP_SC_ATTR||Xt.SC_ATTR)||"data-styled",Tg="active",Ag="data-styled-version",Aa="6.1.14",ud=`/*!sc*/ +`,xa=typeof window<"u"&&"HTMLElement"in window,gx=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&Xt!==void 0&&Xt.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&Xt.REACT_APP_SC_DISABLE_SPEEDY!==""?Xt.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&Xt.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&Xt!==void 0&&Xt.SC_DISABLE_SPEEDY!==void 0&&Xt.SC_DISABLE_SPEEDY!==""&&Xt.SC_DISABLE_SPEEDY!=="false"&&Xt.SC_DISABLE_SPEEDY),Oa=Object.freeze([]),Eo=Object.freeze({});function yx(n,o,i){return i===void 0&&(i=Eo),n.theme!==i.theme&&n.theme||o||i.theme}var Og=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),vx=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,xx=/(^-|-$)/g;function fh(n){return n.replace(vx,"-").replace(xx,"")}var wx=/(a)(d)/gi,Ws=52,ph=function(n){return String.fromCharCode(n+(n>25?39:97))};function Yc(n){var o,i="";for(o=Math.abs(n);o>Ws;o=o/Ws|0)i=ph(o%Ws)+i;return(ph(o%Ws)+i).replace(wx,"$1-$2")}var ju,Ng=5381,go=function(n,o){for(var i=o.length;i;)n=33*n^o.charCodeAt(--i);return n},Ig=function(n){return go(Ng,n)};function Sx(n){return Yc(Ig(n)>>>0)}function Ex(n){return n.displayName||n.name||"Component"}function Tu(n){return typeof n=="string"&&!0}var Lg=typeof Symbol=="function"&&Symbol.for,Pg=Lg?Symbol.for("react.memo"):60115,Cx=Lg?Symbol.for("react.forward_ref"):60112,kx={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},bx={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},Mg={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},_x=((ju={})[Cx]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},ju[Pg]=Mg,ju);function hh(n){return("type"in(o=n)&&o.type.$$typeof)===Pg?Mg:"$$typeof"in n?_x[n.$$typeof]:kx;var o}var Rx=Object.defineProperty,jx=Object.getOwnPropertyNames,mh=Object.getOwnPropertySymbols,Tx=Object.getOwnPropertyDescriptor,Ax=Object.getPrototypeOf,gh=Object.prototype;function Dg(n,o,i){if(typeof o!="string"){if(gh){var s=Ax(o);s&&s!==gh&&Dg(n,s,i)}var l=jx(o);mh&&(l=l.concat(mh(o)));for(var c=hh(n),d=hh(o),p=0;p0?" Args: ".concat(o.join(", ")):""))}var Ox=function(){function n(o){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=o}return n.prototype.indexOfGroup=function(o){for(var i=0,s=0;s=this.groupSizes.length){for(var s=this.groupSizes,l=s.length,c=l;o>=c;)if((c<<=1)<0)throw Fr(16,"".concat(o));this.groupSizes=new Uint32Array(c),this.groupSizes.set(s),this.length=c;for(var d=l;d=this.length||this.groupSizes[o]===0)return i;for(var s=this.groupSizes[o],l=this.indexOfGroup(o),c=l+s,d=l;d=0){var s=document.createTextNode(i);return this.element.insertBefore(s,this.nodes[o]||null),this.length++,!0}return!1},n.prototype.deleteRule=function(o){this.element.removeChild(this.nodes[o]),this.length--},n.prototype.getRule=function(o){return o0&&(T+="".concat(G,","))}),g+="".concat(j).concat(b,'{content:"').concat(T,'"}').concat(ud)},v=0;v0?".".concat(o):E},v=g.slice();v.push(function(E){E.type===_a&&E.value.includes("&")&&(E.props[0]=E.props[0].replace(zx,i).replace(s,y))}),d.prefix&&v.push(hx),v.push(dx);var x=function(E,M,j,b){M===void 0&&(M=""),j===void 0&&(j=""),b===void 0&&(b="&"),o=b,i=M,s=new RegExp("\\".concat(i,"\\b"),"g");var T=E.replace(Hx,""),G=ux(j||M?"".concat(j," ").concat(M," { ").concat(T," }"):T);d.namespace&&(G=Ug(G,d.namespace));var A=[];return va(G,fx(v.concat(px(function(R){return A.push(R)})))),A};return x.hash=g.length?g.reduce(function(E,M){return M.name||Fr(15),go(E,M.name)},Ng).toString():"",x}var Wx=new Bg,Xc=qx(),Fg=Qt.createContext({shouldForwardProp:void 0,styleSheet:Wx,stylis:Xc});Fg.Consumer;Qt.createContext(void 0);function wh(){return oe.useContext(Fg)}var Vx=function(){function n(o,i){var s=this;this.inject=function(l,c){c===void 0&&(c=Xc);var d=s.name+c.hash;l.hasNameForId(s.id,d)||l.insertRules(s.id,d,c(s.rules,d,"@keyframes"))},this.name=o,this.id="sc-keyframes-".concat(o),this.rules=i,dd(this,function(){throw Fr(12,String(s.name))})}return n.prototype.getName=function(o){return o===void 0&&(o=Xc),this.name+o.hash},n}(),Yx=function(n){return n>="A"&&n<="Z"};function Sh(n){for(var o="",i=0;i>>0);if(!i.hasNameForId(this.componentId,d)){var p=s(c,".".concat(d),void 0,this.componentId);i.insertRules(this.componentId,d,p)}l=Pr(l,d),this.staticRulesId=d}else{for(var g=go(this.baseHash,s.hash),y="",v=0;v>>0);i.hasNameForId(this.componentId,M)||i.insertRules(this.componentId,M,s(y,".".concat(M),void 0,this.componentId)),l=Pr(l,M)}}return l},n}(),Sa=Qt.createContext(void 0);Sa.Consumer;function Eh(n){var o=Qt.useContext(Sa),i=oe.useMemo(function(){return function(s,l){if(!s)throw Fr(14);if(Ur(s)){var c=s(l);return c}if(Array.isArray(s)||typeof s!="object")throw Fr(8);return l?At(At({},l),s):s}(n.theme,o)},[n.theme,o]);return n.children?Qt.createElement(Sa.Provider,{value:i},n.children):null}var Au={};function Kx(n,o,i){var s=cd(n),l=n,c=!Tu(n),d=o.attrs,p=d===void 0?Oa:d,g=o.componentId,y=g===void 0?function(k,S){var U=typeof k!="string"?"sc":fh(k);Au[U]=(Au[U]||0)+1;var D="".concat(U,"-").concat(Sx(Aa+U+Au[U]));return S?"".concat(S,"-").concat(D):D}(o.displayName,o.parentComponentId):g,v=o.displayName,x=v===void 0?function(k){return Tu(k)?"styled.".concat(k):"Styled(".concat(Ex(k),")")}(n):v,E=o.displayName&&o.componentId?"".concat(fh(o.displayName),"-").concat(o.componentId):o.componentId||y,M=s&&l.attrs?l.attrs.concat(p).filter(Boolean):p,j=o.shouldForwardProp;if(s&&l.shouldForwardProp){var b=l.shouldForwardProp;if(o.shouldForwardProp){var T=o.shouldForwardProp;j=function(k,S){return b(k,S)&&T(k,S)}}else j=b}var G=new Qx(i,E,s?l.componentStyle:void 0);function A(k,S){return function(U,D,L){var P=U.attrs,X=U.componentStyle,re=U.defaultProps,Ce=U.foldedComponentIds,te=U.styledComponentId,ae=U.target,Z=Qt.useContext(Sa),K=wh(),H=U.shouldForwardProp||K.shouldForwardProp,N=yx(D,Z,re)||Eo,W=function(xe,ke,Ae){for(var Re,je=At(At({},ke),{className:void 0,theme:Ae}),Ie=0;Ie{let o;const i=new Set,s=(y,v)=>{const x=typeof y=="function"?y(o):y;if(!Object.is(x,o)){const E=o;o=v??(typeof x!="object"||x===null)?x:Object.assign({},o,x),i.forEach(M=>M(o,E))}},l=()=>o,p={setState:s,getState:l,getInitialState:()=>g,subscribe:y=>(i.add(y),()=>i.delete(y))},g=o=n(s,l,p);return p},Zx=n=>n?bh(n):bh,e1=n=>n;function t1(n,o=e1){const i=Qt.useSyncExternalStore(n.subscribe,()=>o(n.getState()),()=>o(n.getInitialState()));return Qt.useDebugValue(i),i}const _h=n=>{const o=Zx(n),i=s=>t1(o,s);return Object.assign(i,o),i},zn=n=>n?_h(n):_h;function Wg(n,o){return function(){return n.apply(o,arguments)}}const{toString:n1}=Object.prototype,{getPrototypeOf:fd}=Object,Na=(n=>o=>{const i=n1.call(o);return n[i]||(n[i]=i.slice(8,-1).toLowerCase())})(Object.create(null)),Cn=n=>(n=n.toLowerCase(),o=>Na(o)===n),Ia=n=>o=>typeof o===n,{isArray:ko}=Array,_i=Ia("undefined");function r1(n){return n!==null&&!_i(n)&&n.constructor!==null&&!_i(n.constructor)&&Kt(n.constructor.isBuffer)&&n.constructor.isBuffer(n)}const Vg=Cn("ArrayBuffer");function o1(n){let o;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?o=ArrayBuffer.isView(n):o=n&&n.buffer&&Vg(n.buffer),o}const i1=Ia("string"),Kt=Ia("function"),Yg=Ia("number"),La=n=>n!==null&&typeof n=="object",s1=n=>n===!0||n===!1,da=n=>{if(Na(n)!=="object")return!1;const o=fd(n);return(o===null||o===Object.prototype||Object.getPrototypeOf(o)===null)&&!(Symbol.toStringTag in n)&&!(Symbol.iterator in n)},a1=Cn("Date"),l1=Cn("File"),u1=Cn("Blob"),c1=Cn("FileList"),d1=n=>La(n)&&Kt(n.pipe),f1=n=>{let o;return n&&(typeof FormData=="function"&&n instanceof FormData||Kt(n.append)&&((o=Na(n))==="formdata"||o==="object"&&Kt(n.toString)&&n.toString()==="[object FormData]"))},p1=Cn("URLSearchParams"),[h1,m1,g1,y1]=["ReadableStream","Request","Response","Headers"].map(Cn),v1=n=>n.trim?n.trim():n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ti(n,o,{allOwnKeys:i=!1}={}){if(n===null||typeof n>"u")return;let s,l;if(typeof n!="object"&&(n=[n]),ko(n))for(s=0,l=n.length;s0;)if(l=i[s],o===l.toLowerCase())return l;return null}const Mr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Xg=n=>!_i(n)&&n!==Mr;function Kc(){const{caseless:n}=Xg(this)&&this||{},o={},i=(s,l)=>{const c=n&&Gg(o,l)||l;da(o[c])&&da(s)?o[c]=Kc(o[c],s):da(s)?o[c]=Kc({},s):ko(s)?o[c]=s.slice():o[c]=s};for(let s=0,l=arguments.length;s(Ti(o,(l,c)=>{i&&Kt(l)?n[c]=Wg(l,i):n[c]=l},{allOwnKeys:s}),n),w1=n=>(n.charCodeAt(0)===65279&&(n=n.slice(1)),n),S1=(n,o,i,s)=>{n.prototype=Object.create(o.prototype,s),n.prototype.constructor=n,Object.defineProperty(n,"super",{value:o.prototype}),i&&Object.assign(n.prototype,i)},E1=(n,o,i,s)=>{let l,c,d;const p={};if(o=o||{},n==null)return o;do{for(l=Object.getOwnPropertyNames(n),c=l.length;c-- >0;)d=l[c],(!s||s(d,n,o))&&!p[d]&&(o[d]=n[d],p[d]=!0);n=i!==!1&&fd(n)}while(n&&(!i||i(n,o))&&n!==Object.prototype);return o},C1=(n,o,i)=>{n=String(n),(i===void 0||i>n.length)&&(i=n.length),i-=o.length;const s=n.indexOf(o,i);return s!==-1&&s===i},k1=n=>{if(!n)return null;if(ko(n))return n;let o=n.length;if(!Yg(o))return null;const i=new Array(o);for(;o-- >0;)i[o]=n[o];return i},b1=(n=>o=>n&&o instanceof n)(typeof Uint8Array<"u"&&fd(Uint8Array)),_1=(n,o)=>{const s=(n&&n[Symbol.iterator]).call(n);let l;for(;(l=s.next())&&!l.done;){const c=l.value;o.call(n,c[0],c[1])}},R1=(n,o)=>{let i;const s=[];for(;(i=n.exec(o))!==null;)s.push(i);return s},j1=Cn("HTMLFormElement"),T1=n=>n.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(i,s,l){return s.toUpperCase()+l}),Rh=(({hasOwnProperty:n})=>(o,i)=>n.call(o,i))(Object.prototype),A1=Cn("RegExp"),Qg=(n,o)=>{const i=Object.getOwnPropertyDescriptors(n),s={};Ti(i,(l,c)=>{let d;(d=o(l,c,n))!==!1&&(s[c]=d||l)}),Object.defineProperties(n,s)},O1=n=>{Qg(n,(o,i)=>{if(Kt(n)&&["arguments","caller","callee"].indexOf(i)!==-1)return!1;const s=n[i];if(Kt(s)){if(o.enumerable=!1,"writable"in o){o.writable=!1;return}o.set||(o.set=()=>{throw Error("Can not rewrite read-only method '"+i+"'")})}})},N1=(n,o)=>{const i={},s=l=>{l.forEach(c=>{i[c]=!0})};return ko(n)?s(n):s(String(n).split(o)),i},I1=()=>{},L1=(n,o)=>n!=null&&Number.isFinite(n=+n)?n:o,Ou="abcdefghijklmnopqrstuvwxyz",jh="0123456789",Kg={DIGIT:jh,ALPHA:Ou,ALPHA_DIGIT:Ou+Ou.toUpperCase()+jh},P1=(n=16,o=Kg.ALPHA_DIGIT)=>{let i="";const{length:s}=o;for(;n--;)i+=o[Math.random()*s|0];return i};function M1(n){return!!(n&&Kt(n.append)&&n[Symbol.toStringTag]==="FormData"&&n[Symbol.iterator])}const D1=n=>{const o=new Array(10),i=(s,l)=>{if(La(s)){if(o.indexOf(s)>=0)return;if(!("toJSON"in s)){o[l]=s;const c=ko(s)?[]:{};return Ti(s,(d,p)=>{const g=i(d,l+1);!_i(g)&&(c[p]=g)}),o[l]=void 0,c}}return s};return i(n,0)},$1=Cn("AsyncFunction"),B1=n=>n&&(La(n)||Kt(n))&&Kt(n.then)&&Kt(n.catch),Jg=((n,o)=>n?setImmediate:o?((i,s)=>(Mr.addEventListener("message",({source:l,data:c})=>{l===Mr&&c===i&&s.length&&s.shift()()},!1),l=>{s.push(l),Mr.postMessage(i,"*")}))(`axios@${Math.random()}`,[]):i=>setTimeout(i))(typeof setImmediate=="function",Kt(Mr.postMessage)),U1=typeof queueMicrotask<"u"?queueMicrotask.bind(Mr):typeof process<"u"&&process.nextTick||Jg,q={isArray:ko,isArrayBuffer:Vg,isBuffer:r1,isFormData:f1,isArrayBufferView:o1,isString:i1,isNumber:Yg,isBoolean:s1,isObject:La,isPlainObject:da,isReadableStream:h1,isRequest:m1,isResponse:g1,isHeaders:y1,isUndefined:_i,isDate:a1,isFile:l1,isBlob:u1,isRegExp:A1,isFunction:Kt,isStream:d1,isURLSearchParams:p1,isTypedArray:b1,isFileList:c1,forEach:Ti,merge:Kc,extend:x1,trim:v1,stripBOM:w1,inherits:S1,toFlatObject:E1,kindOf:Na,kindOfTest:Cn,endsWith:C1,toArray:k1,forEachEntry:_1,matchAll:R1,isHTMLForm:j1,hasOwnProperty:Rh,hasOwnProp:Rh,reduceDescriptors:Qg,freezeMethods:O1,toObjectSet:N1,toCamelCase:T1,noop:I1,toFiniteNumber:L1,findKey:Gg,global:Mr,isContextDefined:Xg,ALPHABET:Kg,generateString:P1,isSpecCompliantForm:M1,toJSONObject:D1,isAsyncFn:$1,isThenable:B1,setImmediate:Jg,asap:U1};function Te(n,o,i,s,l){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=n,this.name="AxiosError",o&&(this.code=o),i&&(this.config=i),s&&(this.request=s),l&&(this.response=l,this.status=l.status?l.status:null)}q.inherits(Te,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:q.toJSONObject(this.config),code:this.code,status:this.status}}});const Zg=Te.prototype,ey={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(n=>{ey[n]={value:n}});Object.defineProperties(Te,ey);Object.defineProperty(Zg,"isAxiosError",{value:!0});Te.from=(n,o,i,s,l,c)=>{const d=Object.create(Zg);return q.toFlatObject(n,d,function(g){return g!==Error.prototype},p=>p!=="isAxiosError"),Te.call(d,n.message,o,i,s,l),d.cause=n,d.name=n.name,c&&Object.assign(d,c),d};const F1=null;function Jc(n){return q.isPlainObject(n)||q.isArray(n)}function ty(n){return q.endsWith(n,"[]")?n.slice(0,-2):n}function Th(n,o,i){return n?n.concat(o).map(function(l,c){return l=ty(l),!i&&c?"["+l+"]":l}).join(i?".":""):o}function z1(n){return q.isArray(n)&&!n.some(Jc)}const H1=q.toFlatObject(q,{},null,function(o){return/^is[A-Z]/.test(o)});function Pa(n,o,i){if(!q.isObject(n))throw new TypeError("target must be an object");o=o||new FormData,i=q.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,function(b,T){return!q.isUndefined(T[b])});const s=i.metaTokens,l=i.visitor||v,c=i.dots,d=i.indexes,g=(i.Blob||typeof Blob<"u"&&Blob)&&q.isSpecCompliantForm(o);if(!q.isFunction(l))throw new TypeError("visitor must be a function");function y(j){if(j===null)return"";if(q.isDate(j))return j.toISOString();if(!g&&q.isBlob(j))throw new Te("Blob is not supported. Use a Buffer instead.");return q.isArrayBuffer(j)||q.isTypedArray(j)?g&&typeof Blob=="function"?new Blob([j]):Buffer.from(j):j}function v(j,b,T){let G=j;if(j&&!T&&typeof j=="object"){if(q.endsWith(b,"{}"))b=s?b:b.slice(0,-2),j=JSON.stringify(j);else if(q.isArray(j)&&z1(j)||(q.isFileList(j)||q.endsWith(b,"[]"))&&(G=q.toArray(j)))return b=ty(b),G.forEach(function(R,k){!(q.isUndefined(R)||R===null)&&o.append(d===!0?Th([b],k,c):d===null?b:b+"[]",y(R))}),!1}return Jc(j)?!0:(o.append(Th(T,b,c),y(j)),!1)}const x=[],E=Object.assign(H1,{defaultVisitor:v,convertValue:y,isVisitable:Jc});function M(j,b){if(!q.isUndefined(j)){if(x.indexOf(j)!==-1)throw Error("Circular reference detected in "+b.join("."));x.push(j),q.forEach(j,function(G,A){(!(q.isUndefined(G)||G===null)&&l.call(o,G,q.isString(A)?A.trim():A,b,E))===!0&&M(G,b?b.concat(A):[A])}),x.pop()}}if(!q.isObject(n))throw new TypeError("data must be an object");return M(n),o}function Ah(n){const o={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(n).replace(/[!'()~]|%20|%00/g,function(s){return o[s]})}function pd(n,o){this._pairs=[],n&&Pa(n,this,o)}const ny=pd.prototype;ny.append=function(o,i){this._pairs.push([o,i])};ny.toString=function(o){const i=o?function(s){return o.call(this,s,Ah)}:Ah;return this._pairs.map(function(l){return i(l[0])+"="+i(l[1])},"").join("&")};function q1(n){return encodeURIComponent(n).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function ry(n,o,i){if(!o)return n;const s=i&&i.encode||q1;q.isFunction(i)&&(i={serialize:i});const l=i&&i.serialize;let c;if(l?c=l(o,i):c=q.isURLSearchParams(o)?o.toString():new pd(o,i).toString(s),c){const d=n.indexOf("#");d!==-1&&(n=n.slice(0,d)),n+=(n.indexOf("?")===-1?"?":"&")+c}return n}class Oh{constructor(){this.handlers=[]}use(o,i,s){return this.handlers.push({fulfilled:o,rejected:i,synchronous:s?s.synchronous:!1,runWhen:s?s.runWhen:null}),this.handlers.length-1}eject(o){this.handlers[o]&&(this.handlers[o]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(o){q.forEach(this.handlers,function(s){s!==null&&o(s)})}}const oy={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},W1=typeof URLSearchParams<"u"?URLSearchParams:pd,V1=typeof FormData<"u"?FormData:null,Y1=typeof Blob<"u"?Blob:null,G1={isBrowser:!0,classes:{URLSearchParams:W1,FormData:V1,Blob:Y1},protocols:["http","https","file","blob","url","data"]},hd=typeof window<"u"&&typeof document<"u",Zc=typeof navigator=="object"&&navigator||void 0,X1=hd&&(!Zc||["ReactNative","NativeScript","NS"].indexOf(Zc.product)<0),Q1=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",K1=hd&&window.location.href||"http://localhost",J1=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:hd,hasStandardBrowserEnv:X1,hasStandardBrowserWebWorkerEnv:Q1,navigator:Zc,origin:K1},Symbol.toStringTag,{value:"Module"})),Tt={...J1,...G1};function Z1(n,o){return Pa(n,new Tt.classes.URLSearchParams,Object.assign({visitor:function(i,s,l,c){return Tt.isNode&&q.isBuffer(i)?(this.append(s,i.toString("base64")),!1):c.defaultVisitor.apply(this,arguments)}},o))}function ew(n){return q.matchAll(/\w+|\[(\w*)]/g,n).map(o=>o[0]==="[]"?"":o[1]||o[0])}function tw(n){const o={},i=Object.keys(n);let s;const l=i.length;let c;for(s=0;s=i.length;return d=!d&&q.isArray(l)?l.length:d,g?(q.hasOwnProp(l,d)?l[d]=[l[d],s]:l[d]=s,!p):((!l[d]||!q.isObject(l[d]))&&(l[d]=[]),o(i,s,l[d],c)&&q.isArray(l[d])&&(l[d]=tw(l[d])),!p)}if(q.isFormData(n)&&q.isFunction(n.entries)){const i={};return q.forEachEntry(n,(s,l)=>{o(ew(s),l,i,0)}),i}return null}function nw(n,o,i){if(q.isString(n))try{return(o||JSON.parse)(n),q.trim(n)}catch(s){if(s.name!=="SyntaxError")throw s}return(0,JSON.stringify)(n)}const Ai={transitional:oy,adapter:["xhr","http","fetch"],transformRequest:[function(o,i){const s=i.getContentType()||"",l=s.indexOf("application/json")>-1,c=q.isObject(o);if(c&&q.isHTMLForm(o)&&(o=new FormData(o)),q.isFormData(o))return l?JSON.stringify(iy(o)):o;if(q.isArrayBuffer(o)||q.isBuffer(o)||q.isStream(o)||q.isFile(o)||q.isBlob(o)||q.isReadableStream(o))return o;if(q.isArrayBufferView(o))return o.buffer;if(q.isURLSearchParams(o))return i.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),o.toString();let p;if(c){if(s.indexOf("application/x-www-form-urlencoded")>-1)return Z1(o,this.formSerializer).toString();if((p=q.isFileList(o))||s.indexOf("multipart/form-data")>-1){const g=this.env&&this.env.FormData;return Pa(p?{"files[]":o}:o,g&&new g,this.formSerializer)}}return c||l?(i.setContentType("application/json",!1),nw(o)):o}],transformResponse:[function(o){const i=this.transitional||Ai.transitional,s=i&&i.forcedJSONParsing,l=this.responseType==="json";if(q.isResponse(o)||q.isReadableStream(o))return o;if(o&&q.isString(o)&&(s&&!this.responseType||l)){const d=!(i&&i.silentJSONParsing)&&l;try{return JSON.parse(o)}catch(p){if(d)throw p.name==="SyntaxError"?Te.from(p,Te.ERR_BAD_RESPONSE,this,null,this.response):p}}return o}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Tt.classes.FormData,Blob:Tt.classes.Blob},validateStatus:function(o){return o>=200&&o<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};q.forEach(["delete","get","head","post","put","patch"],n=>{Ai.headers[n]={}});const rw=q.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ow=n=>{const o={};let i,s,l;return n&&n.split(` +`).forEach(function(d){l=d.indexOf(":"),i=d.substring(0,l).trim().toLowerCase(),s=d.substring(l+1).trim(),!(!i||o[i]&&rw[i])&&(i==="set-cookie"?o[i]?o[i].push(s):o[i]=[s]:o[i]=o[i]?o[i]+", "+s:s)}),o},Nh=Symbol("internals");function fi(n){return n&&String(n).trim().toLowerCase()}function fa(n){return n===!1||n==null?n:q.isArray(n)?n.map(fa):String(n)}function iw(n){const o=Object.create(null),i=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let s;for(;s=i.exec(n);)o[s[1]]=s[2];return o}const sw=n=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(n.trim());function Nu(n,o,i,s,l){if(q.isFunction(s))return s.call(this,o,i);if(l&&(o=i),!!q.isString(o)){if(q.isString(s))return o.indexOf(s)!==-1;if(q.isRegExp(s))return s.test(o)}}function aw(n){return n.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(o,i,s)=>i.toUpperCase()+s)}function lw(n,o){const i=q.toCamelCase(" "+o);["get","set","has"].forEach(s=>{Object.defineProperty(n,s+i,{value:function(l,c,d){return this[s].call(this,o,l,c,d)},configurable:!0})})}class Ht{constructor(o){o&&this.set(o)}set(o,i,s){const l=this;function c(p,g,y){const v=fi(g);if(!v)throw new Error("header name must be a non-empty string");const x=q.findKey(l,v);(!x||l[x]===void 0||y===!0||y===void 0&&l[x]!==!1)&&(l[x||g]=fa(p))}const d=(p,g)=>q.forEach(p,(y,v)=>c(y,v,g));if(q.isPlainObject(o)||o instanceof this.constructor)d(o,i);else if(q.isString(o)&&(o=o.trim())&&!sw(o))d(ow(o),i);else if(q.isHeaders(o))for(const[p,g]of o.entries())c(g,p,s);else o!=null&&c(i,o,s);return this}get(o,i){if(o=fi(o),o){const s=q.findKey(this,o);if(s){const l=this[s];if(!i)return l;if(i===!0)return iw(l);if(q.isFunction(i))return i.call(this,l,s);if(q.isRegExp(i))return i.exec(l);throw new TypeError("parser must be boolean|regexp|function")}}}has(o,i){if(o=fi(o),o){const s=q.findKey(this,o);return!!(s&&this[s]!==void 0&&(!i||Nu(this,this[s],s,i)))}return!1}delete(o,i){const s=this;let l=!1;function c(d){if(d=fi(d),d){const p=q.findKey(s,d);p&&(!i||Nu(s,s[p],p,i))&&(delete s[p],l=!0)}}return q.isArray(o)?o.forEach(c):c(o),l}clear(o){const i=Object.keys(this);let s=i.length,l=!1;for(;s--;){const c=i[s];(!o||Nu(this,this[c],c,o,!0))&&(delete this[c],l=!0)}return l}normalize(o){const i=this,s={};return q.forEach(this,(l,c)=>{const d=q.findKey(s,c);if(d){i[d]=fa(l),delete i[c];return}const p=o?aw(c):String(c).trim();p!==c&&delete i[c],i[p]=fa(l),s[p]=!0}),this}concat(...o){return this.constructor.concat(this,...o)}toJSON(o){const i=Object.create(null);return q.forEach(this,(s,l)=>{s!=null&&s!==!1&&(i[l]=o&&q.isArray(s)?s.join(", "):s)}),i}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([o,i])=>o+": "+i).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(o){return o instanceof this?o:new this(o)}static concat(o,...i){const s=new this(o);return i.forEach(l=>s.set(l)),s}static accessor(o){const s=(this[Nh]=this[Nh]={accessors:{}}).accessors,l=this.prototype;function c(d){const p=fi(d);s[p]||(lw(l,d),s[p]=!0)}return q.isArray(o)?o.forEach(c):c(o),this}}Ht.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);q.reduceDescriptors(Ht.prototype,({value:n},o)=>{let i=o[0].toUpperCase()+o.slice(1);return{get:()=>n,set(s){this[i]=s}}});q.freezeMethods(Ht);function Iu(n,o){const i=this||Ai,s=o||i,l=Ht.from(s.headers);let c=s.data;return q.forEach(n,function(p){c=p.call(i,c,l.normalize(),o?o.status:void 0)}),l.normalize(),c}function sy(n){return!!(n&&n.__CANCEL__)}function bo(n,o,i){Te.call(this,n??"canceled",Te.ERR_CANCELED,o,i),this.name="CanceledError"}q.inherits(bo,Te,{__CANCEL__:!0});function ay(n,o,i){const s=i.config.validateStatus;!i.status||!s||s(i.status)?n(i):o(new Te("Request failed with status code "+i.status,[Te.ERR_BAD_REQUEST,Te.ERR_BAD_RESPONSE][Math.floor(i.status/100)-4],i.config,i.request,i))}function uw(n){const o=/^([-+\w]{1,25})(:?\/\/|:)/.exec(n);return o&&o[1]||""}function cw(n,o){n=n||10;const i=new Array(n),s=new Array(n);let l=0,c=0,d;return o=o!==void 0?o:1e3,function(g){const y=Date.now(),v=s[c];d||(d=y),i[l]=g,s[l]=y;let x=c,E=0;for(;x!==l;)E+=i[x++],x=x%n;if(l=(l+1)%n,l===c&&(c=(c+1)%n),y-d{i=v,l=null,c&&(clearTimeout(c),c=null),n.apply(null,y)};return[(...y)=>{const v=Date.now(),x=v-i;x>=s?d(y,v):(l=y,c||(c=setTimeout(()=>{c=null,d(l)},s-x)))},()=>l&&d(l)]}const Ea=(n,o,i=3)=>{let s=0;const l=cw(50,250);return dw(c=>{const d=c.loaded,p=c.lengthComputable?c.total:void 0,g=d-s,y=l(g),v=d<=p;s=d;const x={loaded:d,total:p,progress:p?d/p:void 0,bytes:g,rate:y||void 0,estimated:y&&p&&v?(p-d)/y:void 0,event:c,lengthComputable:p!=null,[o?"download":"upload"]:!0};n(x)},i)},Ih=(n,o)=>{const i=n!=null;return[s=>o[0]({lengthComputable:i,total:n,loaded:s}),o[1]]},Lh=n=>(...o)=>q.asap(()=>n(...o)),fw=Tt.hasStandardBrowserEnv?((n,o)=>i=>(i=new URL(i,Tt.origin),n.protocol===i.protocol&&n.host===i.host&&(o||n.port===i.port)))(new URL(Tt.origin),Tt.navigator&&/(msie|trident)/i.test(Tt.navigator.userAgent)):()=>!0,pw=Tt.hasStandardBrowserEnv?{write(n,o,i,s,l,c){const d=[n+"="+encodeURIComponent(o)];q.isNumber(i)&&d.push("expires="+new Date(i).toGMTString()),q.isString(s)&&d.push("path="+s),q.isString(l)&&d.push("domain="+l),c===!0&&d.push("secure"),document.cookie=d.join("; ")},read(n){const o=document.cookie.match(new RegExp("(^|;\\s*)("+n+")=([^;]*)"));return o?decodeURIComponent(o[3]):null},remove(n){this.write(n,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function hw(n){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(n)}function mw(n,o){return o?n.replace(/\/?\/$/,"")+"/"+o.replace(/^\/+/,""):n}function ly(n,o){return n&&!hw(o)?mw(n,o):o}const Ph=n=>n instanceof Ht?{...n}:n;function zr(n,o){o=o||{};const i={};function s(y,v,x,E){return q.isPlainObject(y)&&q.isPlainObject(v)?q.merge.call({caseless:E},y,v):q.isPlainObject(v)?q.merge({},v):q.isArray(v)?v.slice():v}function l(y,v,x,E){if(q.isUndefined(v)){if(!q.isUndefined(y))return s(void 0,y,x,E)}else return s(y,v,x,E)}function c(y,v){if(!q.isUndefined(v))return s(void 0,v)}function d(y,v){if(q.isUndefined(v)){if(!q.isUndefined(y))return s(void 0,y)}else return s(void 0,v)}function p(y,v,x){if(x in o)return s(y,v);if(x in n)return s(void 0,y)}const g={url:c,method:c,data:c,baseURL:d,transformRequest:d,transformResponse:d,paramsSerializer:d,timeout:d,timeoutMessage:d,withCredentials:d,withXSRFToken:d,adapter:d,responseType:d,xsrfCookieName:d,xsrfHeaderName:d,onUploadProgress:d,onDownloadProgress:d,decompress:d,maxContentLength:d,maxBodyLength:d,beforeRedirect:d,transport:d,httpAgent:d,httpsAgent:d,cancelToken:d,socketPath:d,responseEncoding:d,validateStatus:p,headers:(y,v,x)=>l(Ph(y),Ph(v),x,!0)};return q.forEach(Object.keys(Object.assign({},n,o)),function(v){const x=g[v]||l,E=x(n[v],o[v],v);q.isUndefined(E)&&x!==p||(i[v]=E)}),i}const uy=n=>{const o=zr({},n);let{data:i,withXSRFToken:s,xsrfHeaderName:l,xsrfCookieName:c,headers:d,auth:p}=o;o.headers=d=Ht.from(d),o.url=ry(ly(o.baseURL,o.url),n.params,n.paramsSerializer),p&&d.set("Authorization","Basic "+btoa((p.username||"")+":"+(p.password?unescape(encodeURIComponent(p.password)):"")));let g;if(q.isFormData(i)){if(Tt.hasStandardBrowserEnv||Tt.hasStandardBrowserWebWorkerEnv)d.setContentType(void 0);else if((g=d.getContentType())!==!1){const[y,...v]=g?g.split(";").map(x=>x.trim()).filter(Boolean):[];d.setContentType([y||"multipart/form-data",...v].join("; "))}}if(Tt.hasStandardBrowserEnv&&(s&&q.isFunction(s)&&(s=s(o)),s||s!==!1&&fw(o.url))){const y=l&&c&&pw.read(c);y&&d.set(l,y)}return o},gw=typeof XMLHttpRequest<"u",yw=gw&&function(n){return new Promise(function(i,s){const l=uy(n);let c=l.data;const d=Ht.from(l.headers).normalize();let{responseType:p,onUploadProgress:g,onDownloadProgress:y}=l,v,x,E,M,j;function b(){M&&M(),j&&j(),l.cancelToken&&l.cancelToken.unsubscribe(v),l.signal&&l.signal.removeEventListener("abort",v)}let T=new XMLHttpRequest;T.open(l.method.toUpperCase(),l.url,!0),T.timeout=l.timeout;function G(){if(!T)return;const R=Ht.from("getAllResponseHeaders"in T&&T.getAllResponseHeaders()),S={data:!p||p==="text"||p==="json"?T.responseText:T.response,status:T.status,statusText:T.statusText,headers:R,config:n,request:T};ay(function(D){i(D),b()},function(D){s(D),b()},S),T=null}"onloadend"in T?T.onloadend=G:T.onreadystatechange=function(){!T||T.readyState!==4||T.status===0&&!(T.responseURL&&T.responseURL.indexOf("file:")===0)||setTimeout(G)},T.onabort=function(){T&&(s(new Te("Request aborted",Te.ECONNABORTED,n,T)),T=null)},T.onerror=function(){s(new Te("Network Error",Te.ERR_NETWORK,n,T)),T=null},T.ontimeout=function(){let k=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded";const S=l.transitional||oy;l.timeoutErrorMessage&&(k=l.timeoutErrorMessage),s(new Te(k,S.clarifyTimeoutError?Te.ETIMEDOUT:Te.ECONNABORTED,n,T)),T=null},c===void 0&&d.setContentType(null),"setRequestHeader"in T&&q.forEach(d.toJSON(),function(k,S){T.setRequestHeader(S,k)}),q.isUndefined(l.withCredentials)||(T.withCredentials=!!l.withCredentials),p&&p!=="json"&&(T.responseType=l.responseType),y&&([E,j]=Ea(y,!0),T.addEventListener("progress",E)),g&&T.upload&&([x,M]=Ea(g),T.upload.addEventListener("progress",x),T.upload.addEventListener("loadend",M)),(l.cancelToken||l.signal)&&(v=R=>{T&&(s(!R||R.type?new bo(null,n,T):R),T.abort(),T=null)},l.cancelToken&&l.cancelToken.subscribe(v),l.signal&&(l.signal.aborted?v():l.signal.addEventListener("abort",v)));const A=uw(l.url);if(A&&Tt.protocols.indexOf(A)===-1){s(new Te("Unsupported protocol "+A+":",Te.ERR_BAD_REQUEST,n));return}T.send(c||null)})},vw=(n,o)=>{const{length:i}=n=n?n.filter(Boolean):[];if(o||i){let s=new AbortController,l;const c=function(y){if(!l){l=!0,p();const v=y instanceof Error?y:this.reason;s.abort(v instanceof Te?v:new bo(v instanceof Error?v.message:v))}};let d=o&&setTimeout(()=>{d=null,c(new Te(`timeout ${o} of ms exceeded`,Te.ETIMEDOUT))},o);const p=()=>{n&&(d&&clearTimeout(d),d=null,n.forEach(y=>{y.unsubscribe?y.unsubscribe(c):y.removeEventListener("abort",c)}),n=null)};n.forEach(y=>y.addEventListener("abort",c));const{signal:g}=s;return g.unsubscribe=()=>q.asap(p),g}},xw=function*(n,o){let i=n.byteLength;if(i{const l=ww(n,o);let c=0,d,p=g=>{d||(d=!0,s&&s(g))};return new ReadableStream({async pull(g){try{const{done:y,value:v}=await l.next();if(y){p(),g.close();return}let x=v.byteLength;if(i){let E=c+=x;i(E)}g.enqueue(new Uint8Array(v))}catch(y){throw p(y),y}},cancel(g){return p(g),l.return()}},{highWaterMark:2})},Ma=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",cy=Ma&&typeof ReadableStream=="function",Ew=Ma&&(typeof TextEncoder=="function"?(n=>o=>n.encode(o))(new TextEncoder):async n=>new Uint8Array(await new Response(n).arrayBuffer())),dy=(n,...o)=>{try{return!!n(...o)}catch{return!1}},Cw=cy&&dy(()=>{let n=!1;const o=new Request(Tt.origin,{body:new ReadableStream,method:"POST",get duplex(){return n=!0,"half"}}).headers.has("Content-Type");return n&&!o}),Dh=64*1024,ed=cy&&dy(()=>q.isReadableStream(new Response("").body)),Ca={stream:ed&&(n=>n.body)};Ma&&(n=>{["text","arrayBuffer","blob","formData","stream"].forEach(o=>{!Ca[o]&&(Ca[o]=q.isFunction(n[o])?i=>i[o]():(i,s)=>{throw new Te(`Response type '${o}' is not supported`,Te.ERR_NOT_SUPPORT,s)})})})(new Response);const kw=async n=>{if(n==null)return 0;if(q.isBlob(n))return n.size;if(q.isSpecCompliantForm(n))return(await new Request(Tt.origin,{method:"POST",body:n}).arrayBuffer()).byteLength;if(q.isArrayBufferView(n)||q.isArrayBuffer(n))return n.byteLength;if(q.isURLSearchParams(n)&&(n=n+""),q.isString(n))return(await Ew(n)).byteLength},bw=async(n,o)=>{const i=q.toFiniteNumber(n.getContentLength());return i??kw(o)},_w=Ma&&(async n=>{let{url:o,method:i,data:s,signal:l,cancelToken:c,timeout:d,onDownloadProgress:p,onUploadProgress:g,responseType:y,headers:v,withCredentials:x="same-origin",fetchOptions:E}=uy(n);y=y?(y+"").toLowerCase():"text";let M=vw([l,c&&c.toAbortSignal()],d),j;const b=M&&M.unsubscribe&&(()=>{M.unsubscribe()});let T;try{if(g&&Cw&&i!=="get"&&i!=="head"&&(T=await bw(v,s))!==0){let S=new Request(o,{method:"POST",body:s,duplex:"half"}),U;if(q.isFormData(s)&&(U=S.headers.get("content-type"))&&v.setContentType(U),S.body){const[D,L]=Ih(T,Ea(Lh(g)));s=Mh(S.body,Dh,D,L)}}q.isString(x)||(x=x?"include":"omit");const G="credentials"in Request.prototype;j=new Request(o,{...E,signal:M,method:i.toUpperCase(),headers:v.normalize().toJSON(),body:s,duplex:"half",credentials:G?x:void 0});let A=await fetch(j);const R=ed&&(y==="stream"||y==="response");if(ed&&(p||R&&b)){const S={};["status","statusText","headers"].forEach(P=>{S[P]=A[P]});const U=q.toFiniteNumber(A.headers.get("content-length")),[D,L]=p&&Ih(U,Ea(Lh(p),!0))||[];A=new Response(Mh(A.body,Dh,D,()=>{L&&L(),b&&b()}),S)}y=y||"text";let k=await Ca[q.findKey(Ca,y)||"text"](A,n);return!R&&b&&b(),await new Promise((S,U)=>{ay(S,U,{data:k,headers:Ht.from(A.headers),status:A.status,statusText:A.statusText,config:n,request:j})})}catch(G){throw b&&b(),G&&G.name==="TypeError"&&/fetch/i.test(G.message)?Object.assign(new Te("Network Error",Te.ERR_NETWORK,n,j),{cause:G.cause||G}):Te.from(G,G&&G.code,n,j)}}),td={http:F1,xhr:yw,fetch:_w};q.forEach(td,(n,o)=>{if(n){try{Object.defineProperty(n,"name",{value:o})}catch{}Object.defineProperty(n,"adapterName",{value:o})}});const $h=n=>`- ${n}`,Rw=n=>q.isFunction(n)||n===null||n===!1,fy={getAdapter:n=>{n=q.isArray(n)?n:[n];const{length:o}=n;let i,s;const l={};for(let c=0;c`adapter ${p} `+(g===!1?"is not supported by the environment":"is not available in the build"));let d=o?c.length>1?`since : +`+c.map($h).join(` +`):" "+$h(c[0]):"as no adapter specified";throw new Te("There is no suitable adapter to dispatch the request "+d,"ERR_NOT_SUPPORT")}return s},adapters:td};function Lu(n){if(n.cancelToken&&n.cancelToken.throwIfRequested(),n.signal&&n.signal.aborted)throw new bo(null,n)}function Bh(n){return Lu(n),n.headers=Ht.from(n.headers),n.data=Iu.call(n,n.transformRequest),["post","put","patch"].indexOf(n.method)!==-1&&n.headers.setContentType("application/x-www-form-urlencoded",!1),fy.getAdapter(n.adapter||Ai.adapter)(n).then(function(s){return Lu(n),s.data=Iu.call(n,n.transformResponse,s),s.headers=Ht.from(s.headers),s},function(s){return sy(s)||(Lu(n),s&&s.response&&(s.response.data=Iu.call(n,n.transformResponse,s.response),s.response.headers=Ht.from(s.response.headers))),Promise.reject(s)})}const py="1.7.9",Da={};["object","boolean","number","function","string","symbol"].forEach((n,o)=>{Da[n]=function(s){return typeof s===n||"a"+(o<1?"n ":" ")+n}});const Uh={};Da.transitional=function(o,i,s){function l(c,d){return"[Axios v"+py+"] Transitional option '"+c+"'"+d+(s?". "+s:"")}return(c,d,p)=>{if(o===!1)throw new Te(l(d," has been removed"+(i?" in "+i:"")),Te.ERR_DEPRECATED);return i&&!Uh[d]&&(Uh[d]=!0,console.warn(l(d," has been deprecated since v"+i+" and will be removed in the near future"))),o?o(c,d,p):!0}};Da.spelling=function(o){return(i,s)=>(console.warn(`${s} is likely a misspelling of ${o}`),!0)};function jw(n,o,i){if(typeof n!="object")throw new Te("options must be an object",Te.ERR_BAD_OPTION_VALUE);const s=Object.keys(n);let l=s.length;for(;l-- >0;){const c=s[l],d=o[c];if(d){const p=n[c],g=p===void 0||d(p,c,n);if(g!==!0)throw new Te("option "+c+" must be "+g,Te.ERR_BAD_OPTION_VALUE);continue}if(i!==!0)throw new Te("Unknown option "+c,Te.ERR_BAD_OPTION)}}const pa={assertOptions:jw,validators:Da},Tn=pa.validators;class Br{constructor(o){this.defaults=o,this.interceptors={request:new Oh,response:new Oh}}async request(o,i){try{return await this._request(o,i)}catch(s){if(s instanceof Error){let l={};Error.captureStackTrace?Error.captureStackTrace(l):l=new Error;const c=l.stack?l.stack.replace(/^.+\n/,""):"";try{s.stack?c&&!String(s.stack).endsWith(c.replace(/^.+\n.+\n/,""))&&(s.stack+=` +`+c):s.stack=c}catch{}}throw s}}_request(o,i){typeof o=="string"?(i=i||{},i.url=o):i=o||{},i=zr(this.defaults,i);const{transitional:s,paramsSerializer:l,headers:c}=i;s!==void 0&&pa.assertOptions(s,{silentJSONParsing:Tn.transitional(Tn.boolean),forcedJSONParsing:Tn.transitional(Tn.boolean),clarifyTimeoutError:Tn.transitional(Tn.boolean)},!1),l!=null&&(q.isFunction(l)?i.paramsSerializer={serialize:l}:pa.assertOptions(l,{encode:Tn.function,serialize:Tn.function},!0)),pa.assertOptions(i,{baseUrl:Tn.spelling("baseURL"),withXsrfToken:Tn.spelling("withXSRFToken")},!0),i.method=(i.method||this.defaults.method||"get").toLowerCase();let d=c&&q.merge(c.common,c[i.method]);c&&q.forEach(["delete","get","head","post","put","patch","common"],j=>{delete c[j]}),i.headers=Ht.concat(d,c);const p=[];let g=!0;this.interceptors.request.forEach(function(b){typeof b.runWhen=="function"&&b.runWhen(i)===!1||(g=g&&b.synchronous,p.unshift(b.fulfilled,b.rejected))});const y=[];this.interceptors.response.forEach(function(b){y.push(b.fulfilled,b.rejected)});let v,x=0,E;if(!g){const j=[Bh.bind(this),void 0];for(j.unshift.apply(j,p),j.push.apply(j,y),E=j.length,v=Promise.resolve(i);x{if(!s._listeners)return;let c=s._listeners.length;for(;c-- >0;)s._listeners[c](l);s._listeners=null}),this.promise.then=l=>{let c;const d=new Promise(p=>{s.subscribe(p),c=p}).then(l);return d.cancel=function(){s.unsubscribe(c)},d},o(function(c,d,p){s.reason||(s.reason=new bo(c,d,p),i(s.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(o){if(this.reason){o(this.reason);return}this._listeners?this._listeners.push(o):this._listeners=[o]}unsubscribe(o){if(!this._listeners)return;const i=this._listeners.indexOf(o);i!==-1&&this._listeners.splice(i,1)}toAbortSignal(){const o=new AbortController,i=s=>{o.abort(s)};return this.subscribe(i),o.signal.unsubscribe=()=>this.unsubscribe(i),o.signal}static source(){let o;return{token:new md(function(l){o=l}),cancel:o}}}function Tw(n){return function(i){return n.apply(null,i)}}function Aw(n){return q.isObject(n)&&n.isAxiosError===!0}const nd={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(nd).forEach(([n,o])=>{nd[o]=n});function hy(n){const o=new Br(n),i=Wg(Br.prototype.request,o);return q.extend(i,Br.prototype,o,{allOwnKeys:!0}),q.extend(i,o,null,{allOwnKeys:!0}),i.create=function(l){return hy(zr(n,l))},i}const at=hy(Ai);at.Axios=Br;at.CanceledError=bo;at.CancelToken=md;at.isCancel=sy;at.VERSION=py;at.toFormData=Pa;at.AxiosError=Te;at.Cancel=at.CanceledError;at.all=function(o){return Promise.all(o)};at.spread=Tw;at.isAxiosError=Aw;at.mergeConfig=zr;at.AxiosHeaders=Ht;at.formToJSON=n=>iy(q.isHTMLForm(n)?new FormData(n):n);at.getAdapter=fy.getAdapter;at.HttpStatusCode=nd;at.default=at;const $a={apiBaseUrl:"/api",wsBaseUrl:"/ws",sseBaseUrl:"/api/sse"};class Ow{constructor(){Zp(this,"events",{})}on(o,i){return this.events[o]||(this.events[o]=[]),this.events[o].push(i),()=>this.off(o,i)}off(o,i){this.events[o]&&(this.events[o]=this.events[o].filter(s=>s!==i))}emit(o,i){this.events[o]&&this.events[o].forEach(s=>{s(i)})}}const vr=new Ow,Nw=async(n,o)=>{const i=new FormData;return i.append("username",n),i.append("password",o),(await Oi.post("/auth/login",i,{headers:{"Content-Type":"multipart/form-data"}})).data},Iw=async n=>(await Oi.post("/users",n,{headers:{"Content-Type":"multipart/form-data"}})).data,Lw=async()=>{await Oi.get("/auth/csrf-token")},Pw=async()=>{await Oi.post("/auth/logout")},Mw=async()=>(await Oi.post("/auth/refresh")).data,Dw=async(n,o)=>{const i={userId:n,newRole:o};return(await Ze.put("/auth/role",i)).data},mt=zn((n,o)=>({currentUser:null,accessToken:null,login:async(i,s)=>{const{userDto:l,accessToken:c}=await Nw(i,s);await o().fetchCsrfToken(),n({currentUser:l,accessToken:c})},logout:async()=>{await Pw(),o().clear(),o().fetchCsrfToken()},fetchCsrfToken:async()=>{await Lw()},refreshToken:async()=>{o().clear();const{userDto:i,accessToken:s}=await Mw();n({currentUser:i,accessToken:s})},clear:()=>{n({currentUser:null,accessToken:null})},updateUserRole:async(i,s)=>{await Dw(i,s)}}));let pi=[],Ys=!1;const Ze=at.create({baseURL:$a.apiBaseUrl,headers:{"Content-Type":"application/json"},withCredentials:!0}),Oi=at.create({baseURL:$a.apiBaseUrl,headers:{"Content-Type":"application/json"},withCredentials:!0});Ze.interceptors.request.use(n=>{const o=mt.getState().accessToken;return o&&(n.headers.Authorization=`Bearer ${o}`),n},n=>Promise.reject(n));Ze.interceptors.response.use(n=>n,async n=>{var i,s,l,c;const o=(i=n.response)==null?void 0:i.data;if(o){const d=(l=(s=n.response)==null?void 0:s.headers)==null?void 0:l["discodeit-request-id"];d&&(o.requestId=d),n.response.data=o}if(console.log({error:n,errorResponse:o}),vr.emit("api-error",{error:n,alert:((c=n.response)==null?void 0:c.status)===403}),n.response&&n.response.status===401){const d=n.config;if(d&&d.headers&&d.headers._retry)return vr.emit("auth-error"),Promise.reject(n);if(Ys&&d)return new Promise((p,g)=>{pi.push({config:d,resolve:p,reject:g})});if(d){Ys=!0;try{return await mt.getState().refreshToken(),pi.forEach(({config:p,resolve:g,reject:y})=>{p.headers=p.headers||{},p.headers._retry="true",Ze(p).then(g).catch(y)}),d.headers=d.headers||{},d.headers._retry="true",pi=[],Ys=!1,Ze(d)}catch(p){return pi.forEach(({reject:g})=>g(p)),pi=[],Ys=!1,vr.emit("auth-error"),Promise.reject(p)}}}return Promise.reject(n)});const $w=async(n,o)=>(await Ze.patch(`/users/${n}`,o,{headers:{"Content-Type":"multipart/form-data"}})).data,Bw=async()=>(await Ze.get("/users")).data,gr=zn((n,o)=>({users:[],fetchUsers:async()=>{try{const i=await Bw();n({users:i})}catch(i){console.error("사용자 목록 조회 실패:",i)}},replaceUser:i=>{const{users:s}=o();s.some(l=>l.id===i.id)?n(l=>({users:l.users.map(c=>c.id===i.id?i:c)})):n(l=>({users:[i,...l.users]}))},removeUser:i=>{n(s=>({users:s.users.filter(l=>l.id!==i)}))}})),ue={colors:{brand:{primary:"#5865F2",hover:"#4752C4"},background:{primary:"#1a1a1a",secondary:"#2a2a2a",tertiary:"#333333",input:"#40444B",hover:"rgba(255, 255, 255, 0.1)"},text:{primary:"#ffffff",secondary:"#cccccc",muted:"#999999"},status:{online:"#43b581",idle:"#faa61a",dnd:"#f04747",offline:"#747f8d",error:"#ED4245"},border:{primary:"#404040"}}},my=I.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,gy=I.div` + background: ${ue.colors.background.primary}; + padding: 32px; + border-radius: 8px; + width: 440px; + + h2 { + color: ${ue.colors.text.primary}; + margin-bottom: 24px; + font-size: 24px; + font-weight: bold; + } + + form { + display: flex; + flex-direction: column; + gap: 16px; + } +`,Si=I.input` + width: 100%; + padding: 10px; + border-radius: 4px; + background: ${ue.colors.background.input}; + border: none; + color: ${ue.colors.text.primary}; + font-size: 16px; + + &::placeholder { + color: ${ue.colors.text.muted}; + } + + &:focus { + outline: none; + } +`;I.input.attrs({type:"checkbox"})` + width: 16px; + height: 16px; + padding: 0; + border-radius: 4px; + background: ${ue.colors.background.input}; + border: none; + color: ${ue.colors.text.primary}; + cursor: pointer; + + &:focus { + outline: none; + } + + &:checked { + background: ${ue.colors.brand.primary}; + } +`;const yy=I.button` + width: 100%; + padding: 12px; + border-radius: 4px; + background: ${ue.colors.brand.primary}; + color: white; + font-size: 16px; + font-weight: 500; + border: none; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background: ${ue.colors.brand.hover}; + } +`,vy=I.div` + color: ${ue.colors.status.error}; + font-size: 14px; + text-align: center; +`,Uw=I.p` + text-align: center; + margin-top: 16px; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 14px; +`,Fw=I.span` + color: ${({theme:n})=>n.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`,Gs=I.div` + margin-bottom: 20px; +`,Xs=I.label` + display: block; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,Pu=I.span` + color: ${({theme:n})=>n.colors.status.error}; +`,zw=I.div` + display: flex; + flex-direction: column; + align-items: center; + margin: 10px 0; +`,Hw=I.img` + width: 80px; + height: 80px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,qw=I.input` + display: none; +`,Ww=I.label` + color: ${({theme:n})=>n.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`,Vw=I.span` + color: ${({theme:n})=>n.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`,Yw=I(Vw)` + display: block; + text-align: center; + margin-top: 16px; +`,Jt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAw2SURBVHgB7d3PT1XpHcfxBy5g6hipSMolGViACThxJDbVRZ2FXejKlf9h/4GmC1fTRdkwC8fE0JgyJuICFkCjEA04GeZe6P0cPC0698I95zzPc57v5f1K6DSto3A8n/v9nufXGfrr338+dgBMGnYAzCLAgGEEGDCMAAOGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwjwIBhBBgwjAADhhFgwDACDBhGgAHDCDBgGAEGDCPAgGEEGDCMAAOGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwjwIBhBBgwjAADhhFgwDACDBhGgAHDCDBgGAEGDCPAgGEEGDCMAAOGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwbcTDvyuWh//33w1/1dexwMRBgYxTW5vVh9/vxYTcxPpR9jY0OffZrdt8fu82ttlvfbLv9j4R5kBHgxCmcE1eH3NfTDTc7PfxZte3lJNgjbmlxxK3+1HKrr1oOg4kAJ0pVdnG+4ZqTw7+psEUoxF91Qv/Di1+db/q+ZpvD7g+T6gb04XLyv6mF3//osuqvTmDn3RGdQCAEOCG6+W/ONdzNTnCrhPZLN2Yb2T99hVhdwOLcSOf37f7hknUN4yedgLoGeb3Rdv/qdAIE2S8CnIDzAuGDQrzXeTZee1OtndaHy9LCSOHvU3++vv693nLPX9LS+0KAa6QQLC2o4sb5a1A7rYGtMqPU+l7v3hpx85+qeVnfdH7W2c7z/Pcrh1RjD5gHromq2JOHY9HCK2Ojzk1dL1fhH90fqxzenDoO/X79DMjhbAQ4Mg1OPXl4KauGodrls6j6FaXKq+dZn/IQ13ENBgkBjiRvQR99V2/lmZos9lc+PxOuxdd1uL3gp6pfVDwDR6Ab9cG9Me9VLAZ1CiHpmXhz6yibakJxVODAZpoN9/iBzfCq+sboFkJ/SAwyrlxAujE1WJWSIiO/sYKlxSpTnbEBqnBxVOBA9LybWnjloM8An6ysitc1NCe5FcvgqgVw/85o1OmhItY32n39uqnJuC3/FAEuhavmmcLra77UN7XP2322qRNX494aqvgojqvmUcrhFa1+6tdXkae6tMiEhR3FEWBPNOCTcni1rZCli4OHAHuQ4mjzaewJHlxMI1Wked5Uw7v99ijbwqd/FnVQQ7WmQyiOAFegZ7a736ZzCU820h+7nbfHbnO7XSq4p3+vmHbfMwdcBgGuoO4dNQrZxtaR+08nqNueT73Y2D7qTIW5aLRXGcUR4JL03FtHeBXa9Y2jyhX2PHudiqg/K9ZuoY3t/uan8TkCXIKCG/u5V2Fae9N2a+vtKO2tjqfVnxfj5zw5O4sWugwCXIJa51hiB/e0tfVWdkZX6CrMCHl5BLigWDt0RCc6rrxo1XZQu6rw6qt2tq47FD0G9Lu8E79FgAvIWucIO3QU2B9ftpK4sVWFZ5rDQTYbqHUOcdztRcJCjgLUToauvrqpny4fJlWVlp/5P4BOH1IcbFcdAe6Tght6h5FeiaLwpnZTq5VW2HzN1eYfUoS3OgLcp9sL4cOrkKT6YrI8dFUHnDQYR3j94Rm4D9kLxQLuV009vKdpXbXae00vFdm8UWVZJ3ojwH3QcS+hnn1VifSMaemVoPqeVzqDT6rG2oivQS5dH33l70ZS262w7n04yhae8MrTMAhwH0KNPFsfyNH3vd+pxkwD1Ydn4HOodQ5VfTXHyrMgqiDA55ibCbNJX1VLc6xAFQT4HCEGr9Q6s3wQPhDgM4RqnzWVQusMHwjwGTS66puCS/WFLwT4DCHOKia88IkA96BjTkOcVbzDQgZ4RIB7CBFejTzz7AufCHAPWn3lGwse4BsB7uGa5wqcLS3k7XvwjAD3cOWy84pnX4RAgHvw/QzMLhyEQIC7CLF4Y4+DyxEAAe4iRIB3PzD6DP8IcBejnncPagCL/bAIgQB34fsc5P2PtM8IgwBHcMjJqQiEAHfBm+JhBQGO4IDlkwiEAHdx2PIbuFhv+MPFQ4C7ODx0Xo2OOiAIAhwBz9QIhQB34XvOlhYaoRDgLg5+dl7pcACqMEIgwF2EWDV1bZwAwz8C3IVOzfAd4omrXGr4x13Vg++jb6YmudTwj7uqh733fgOsM6YZzIJvBLiH3Q/+NyDMB3pNCy4u3k7Yw+57/wNZM9PDbu2NGwjqJiauDrmvpxufXiv6+f+v63fw8SjrZDgLLBwC3INO0NBAls+2V220jurZNXw6h8K6ODfibsye/UjQnNR/nnQcGk/IX/DNsbp+EeAetAVQVaQ56fe5dXGu4X54YTPASwsj7uZ8o/CHmkJ/Y7aRfb3eaBNkj3gGPsNOgNZPN7G1RR36fh8/uJS96LxqR6Kf/9H9MRa2eEKAz7C5FaZS3l6w0/goaArchMeFKPkHwrVxbr+quIJn0LNqiFZPVSjEmx98U7UNVS016PWXe6NU4ooI8DnWN8O8DuX+H0eTnxdeWgjb7uv3/vMd9lpWQYDPEep9Rrp5by+kOy+s7+/mfPhWXyPzFrqRVHHlzpFPgYTwTScg87NphjhmZdTgGMohwH1YexPupdx3b40mN5ij6tuMuHabKlweV60PGo0OdTB7ioM5WjEWW5PNHqVw1fq09ibcu33zqZpUQjzTjN/Ws1urHK5an9bWW0Ffj5JSiOv4HiaYEy6Fq9YnLa1cfRWuCku+wOHmXL2DOnUEmGOHyiHABagKh17Dqxv57rcj7k+3RpKfJ0b9CHBBKy/ivOhIU0yPH4xdqD3EV37HB1ZRBLignc6c8MZW2FY6p5ZSK7b0bNyMOM3CTiE7CHAJz1+2or7vV1Msj74by4IcoyKHOMygH4fhptsHFgEuQRXqx5fx7zYFWRX5ycNL2UqpUFV5512cDuNLvAS9ONawlaQ10jpSJsZ64S+d3iCvm3777XGntW9nx9fsfqh+JK5+Nq0Qi43WvTgCXMHqq5abma53g75Gqmen9fX/alz1CBtNmenfj7k6yvIxQ3Wiha5AN/r3K4fJtX55hVarvVTy8AB9OMV0GGdwf+AQ4IpU4f75LN27Tzt9HtwbKzynrNF2zXvHsvOWClwGAfZAN18dg1r9UnuthSFF6WeK1doS4HIIsCeqVrHbziLUUpdZornc6S5iDC5p8A3FEWCPVn9KO8RlTpVUeJ8u/xLsUAPR780UUjkE2LOUQ6x11jPN4n/l+WDdaqDznEOdO3YREOAAFOJUn4mrTA3p51KQNU/sM8g8/5bHPHAgeibWAND9O2mdtlF147yCm2/o0IeBXlyuAwDKfjDotBMWcJRHBQ5IlUUVa1Bv0O1squnkVSllvd5kAXQVBDiwfBAo5pyqFbo2od5+cVEQ4Ag0CKRnYrWedVfjlLqBlEfsrSDAEWnwJx8Eqsve+zQCrA+SOq/DoCDAkeWDQE+X63k23txKIzRUXz8IcE00Qv23f/wSta3Odim9q/+Zc6Pz3Ev19YNppJrpRtaXXrGinUMhp5zUvqfg+Uu2HvlCgBORB1nzqYtzDTc77ffoHC3CSGEAS4N5zPv6Q4ATo7lVfV253MoWXegMrKob6xWaFKax9PzNdJpfBDhRqlL7n6qy2mqFWeuY9QaDfttsfRCoXd1NYOS5rnPEBh0BNuB0mGVifOgk1Ncb2VJGbVLIdxnp12qqaHO7HXQHURH6ngZ5RVqdCLBBqqj62jCwiknbBJefEd5QCDCCUWgV3hRa+EFFgBEEbXMcBBjeabR55UWLUzYiIMDwRoHVK1iZKoqHAMMLqm49CDAqyxefID42MwCGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwjwIBhBBgwjAADhhFgwDACDBhGgAHDCDBgGAEGDCPAgGEEGDCMAAOGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwjwIBhBBgwjAADhhFgwDACDBhGgAHDCDBgGAEGDCPAgGEEGDCMAAOGEWDAMAIMGEaAAcMIMGAYAQYMI8CAYQQYMIwAA4YRYMAwAgwYRoABwwgwYBgBBgwjwIBhBBgwjAADhv0XZkN9IbEGbp4AAAAASUVORK5CYII=",Gw=({isOpen:n,onClose:o})=>{const[i,s]=oe.useState(""),[l,c]=oe.useState(""),[d,p]=oe.useState(""),[g,y]=oe.useState(null),[v,x]=oe.useState(null),[E,M]=oe.useState(""),{fetchCsrfToken:j}=mt(),b=oe.useCallback(()=>{v&&URL.revokeObjectURL(v),x(null),y(null),s(""),c(""),p(""),M("")},[v]),T=oe.useCallback(()=>{b(),o()},[]),G=R=>{var S;const k=(S=R.target.files)==null?void 0:S[0];if(k){y(k);const U=new FileReader;U.onloadend=()=>{x(U.result)},U.readAsDataURL(k)}},A=async R=>{R.preventDefault(),M("");try{const k=new FormData;k.append("userCreateRequest",new Blob([JSON.stringify({email:i,username:l,password:d})],{type:"application/json"})),g&&k.append("profile",g),await Iw(k),await j(),o()}catch{M("회원가입에 실패했습니다.")}};return n?m.jsx(my,{children:m.jsxs(gy,{children:[m.jsx("h2",{children:"계정 만들기"}),m.jsxs("form",{onSubmit:A,children:[m.jsxs(Gs,{children:[m.jsxs(Xs,{children:["이메일 ",m.jsx(Pu,{children:"*"})]}),m.jsx(Si,{type:"email",value:i,onChange:R=>s(R.target.value),required:!0})]}),m.jsxs(Gs,{children:[m.jsxs(Xs,{children:["사용자명 ",m.jsx(Pu,{children:"*"})]}),m.jsx(Si,{type:"text",value:l,onChange:R=>c(R.target.value),required:!0})]}),m.jsxs(Gs,{children:[m.jsxs(Xs,{children:["비밀번호 ",m.jsx(Pu,{children:"*"})]}),m.jsx(Si,{type:"password",value:d,onChange:R=>p(R.target.value),required:!0})]}),m.jsxs(Gs,{children:[m.jsx(Xs,{children:"프로필 이미지"}),m.jsxs(zw,{children:[m.jsx(Hw,{src:v||Jt,alt:"profile"}),m.jsx(qw,{type:"file",accept:"image/*",onChange:G,id:"profile-image"}),m.jsx(Ww,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),E&&m.jsx(vy,{children:E}),m.jsx(yy,{type:"submit",children:"계속하기"}),m.jsx(Yw,{onClick:T,children:"이미 계정이 있으신가요?"})]})]})}):null},Xw=({isOpen:n,onClose:o})=>{const[i,s]=oe.useState(""),[l,c]=oe.useState(""),[d,p]=oe.useState(""),[g,y]=oe.useState(!1),{login:v}=mt(),{fetchUsers:x}=gr(),E=oe.useCallback(()=>{s(""),c(""),p(""),y(!1)},[]),M=oe.useCallback(()=>{E(),y(!0)},[E,o]),j=async()=>{var b;try{await v(i,l),await x(),E(),o()}catch(T){console.error("로그인 에러:",T),((b=T.response)==null?void 0:b.status)===401?p("아이디 또는 비밀번호가 올바르지 않습니다."):p("로그인에 실패했습니다.")}};return n?m.jsxs(m.Fragment,{children:[m.jsx(my,{children:m.jsxs(gy,{children:[m.jsx("h2",{children:"돌아오신 것을 환영해요!"}),m.jsxs("form",{onSubmit:b=>{b.preventDefault(),j()},children:[m.jsx(Si,{type:"text",placeholder:"사용자 이름",value:i,onChange:b=>s(b.target.value)}),m.jsx(Si,{type:"password",placeholder:"비밀번호",value:l,onChange:b=>c(b.target.value)}),d&&m.jsx(vy,{children:d}),m.jsx(yy,{type:"submit",children:"로그인"})]}),m.jsxs(Uw,{children:["계정이 필요한가요? ",m.jsx(Fw,{onClick:M,children:"가입하기"})]})]})}),m.jsx(Gw,{isOpen:g,onClose:()=>y(!1)})]}):null},Qw=async n=>(await Ze.get(`/channels?userId=${n}`)).data,Kw=async n=>(await Ze.post("/channels/public",n)).data,Jw=async n=>{const o={participantIds:n};return(await Ze.post("/channels/private",o)).data},Zw=async(n,o)=>(await Ze.patch(`/channels/${n}`,o)).data,eS=async n=>{await Ze.delete(`/channels/${n}`)},tS=async n=>(await Ze.get("/readStatuses",{params:{userId:n}})).data,Fh=async(n,{newLastReadAt:o,newNotificationEnabled:i})=>{const s={newLastReadAt:o,newNotificationEnabled:i};return(await Ze.patch(`/readStatuses/${n}`,s)).data},nS=async(n,o,i)=>{const s={userId:n,channelId:o,lastReadAt:i};return(await Ze.post("/readStatuses",s)).data},yo=zn((n,o)=>({readStatuses:{},fetchReadStatuses:async()=>{try{const{currentUser:i}=mt.getState();if(!i)return;const l=(await tS(i.id)).reduce((c,d)=>(c[d.channelId]={id:d.id,lastReadAt:d.lastReadAt,notificationEnabled:d.notificationEnabled},c),{});n({readStatuses:l})}catch(i){console.error("읽음 상태 조회 실패:",i)}},updateReadStatus:async i=>{try{const{currentUser:s}=mt.getState();if(!s)return;const l=o().readStatuses[i];let c;l?c=await Fh(l.id,{newLastReadAt:new Date().toISOString(),newNotificationEnabled:null}):c=await nS(s.id,i,new Date().toISOString()),n(d=>({readStatuses:{...d.readStatuses,[i]:{id:c.id,lastReadAt:c.lastReadAt,notificationEnabled:c.notificationEnabled}}}))}catch(s){console.error("읽음 상태 업데이트 실패:",s)}},updateNotificationEnabled:async(i,s)=>{try{const{currentUser:l}=mt.getState();if(!l)return;const c=o().readStatuses[i];let d;if(c)d=await Fh(c.id,{newLastReadAt:null,newNotificationEnabled:s});else return;n(p=>({readStatuses:{...p.readStatuses,[i]:{id:d.id,lastReadAt:d.lastReadAt,notificationEnabled:d.notificationEnabled}}}))}catch(l){console.error("알림 상태 업데이트 실패:",l)}},hasUnreadMessages:(i,s)=>{const l=o().readStatuses[i],c=l==null?void 0:l.lastReadAt;return!c||new Date(s)>new Date(c)}})),yr=zn((n,o)=>({channels:[],loading:!1,error:null,fetchChannels:async i=>{n({loading:!0,error:null});try{const s=await Qw(i);n(c=>{const d=new Set(c.channels.map(v=>v.id)),p=s.filter(v=>!d.has(v.id));return{channels:[...c.channels.filter(v=>s.some(x=>x.id===v.id)),...p],loading:!1}});const{fetchReadStatuses:l}=yo.getState();return l(),s}catch(s){return n({error:s,loading:!1}),[]}},createPublicChannel:async i=>{try{const s=await Kw(i);return n(l=>l.channels.some(d=>d.id===s.id)?l:{channels:[...l.channels,{...s,participantIds:[],lastMessageAt:new Date().toISOString()}]}),s}catch(s){throw console.error("공개 채널 생성 실패:",s),s}},createPrivateChannel:async i=>{try{const s=await Jw(i);return n(l=>l.channels.some(d=>d.id===s.id)?l:{channels:[...l.channels,{...s,participantIds:i,lastMessageAt:new Date().toISOString()}]}),s}catch(s){throw console.error("비공개 채널 생성 실패:",s),s}},updatePublicChannel:async(i,s)=>{try{const l=await Zw(i,s);return n(c=>({channels:c.channels.map(d=>d.id===i?{...d,...l}:d)})),l}catch(l){throw console.error("채널 수정 실패:",l),l}},deleteChannel:async i=>{try{await eS(i),o().removeChannel(i)}catch(s){throw console.error("채널 삭제 실패:",s),s}},replaceChannel:i=>{const{channels:s}=o();s.some(l=>l.id===i.id)?n(l=>({channels:l.channels.map(c=>c.id===i.id?i:c)})):n(l=>({channels:[i,...l.channels]}))},removeChannel:i=>{n(s=>({channels:s.channels.filter(l=>l.id!==i)}))}})),rS=async n=>(await Ze.get(`/binaryContents/${n}`)).data,zh=async n=>({blob:(await Ze.get(`/binaryContents/${n}/download`,{responseType:"blob"})).data});var pr=(n=>(n.USER="USER",n.CHANNEL_MANAGER="CHANNEL_MANAGER",n.ADMIN="ADMIN",n))(pr||{}),mo=(n=>(n.PROCESSING="PROCESSING",n.SUCCESS="SUCCESS",n.FAIL="FAIL",n))(mo||{});const xr=zn((n,o)=>({binaryContents:{},fetchBinaryContent:async i=>{if(o().binaryContents[i])return o().binaryContents[i];try{const s=await rS(i),{contentType:l,fileName:c,size:d,status:p}=s,g={contentType:l,fileName:c,size:d,status:p};if(p===mo.SUCCESS){const y=await zh(i),v=URL.createObjectURL(y.blob);g.url=v,g.revokeUrl=()=>URL.revokeObjectURL(v)}return n(y=>({binaryContents:{...y.binaryContents,[i]:g}})),g}catch(s){return console.error("첨부파일 정보 조회 실패:",s),null}},clearBinaryContent:i=>{const{binaryContents:s}=o(),l=s[i];l!=null&&l.revokeUrl&&(l.revokeUrl(),n(c=>{const{[i]:d,...p}=c.binaryContents;return{binaryContents:p}}))},clearBinaryContents:i=>{const{binaryContents:s}=o(),l=[];i.forEach(c=>{const d=s[c];d&&(d.revokeUrl&&d.revokeUrl(),l.push(c))}),l.length>0&&n(c=>{const d={...c.binaryContents};return l.forEach(p=>{delete d[p]}),{binaryContents:d}})},clearAllBinaryContents:()=>{const{binaryContents:i}=o();Object.values(i).forEach(s=>{s.revokeUrl&&s.revokeUrl()}),n({binaryContents:{}})},updateBinaryContentStatus:async i=>{if(i.status===mo.SUCCESS){console.log(`${i.id} 상태가 SUCCESS로 변경됨`);const s=await zh(i.id),l=URL.createObjectURL(s.blob);n(c=>({binaryContents:{...c.binaryContents,[i.id]:{...i,url:l,status:mo.SUCCESS,revokeUrl:()=>URL.revokeObjectURL(l)}}}))}else status===mo.FAIL?(console.log(`${i.id} 상태가 FAIL로 변경됨`),n(s=>({binaryContents:{...s.binaryContents,[i.id]:{...i,status:mo.FAIL}}}))):console.log(`${i.id} 상태가 여전히 PROCESSING임`)}})),Ni=I.div` + position: absolute; + bottom: -3px; + right: -3px; + width: 16px; + height: 16px; + border-radius: 50%; + background: ${n=>n.$online?ue.colors.status.online:ue.colors.status.offline}; + border: 4px solid ${n=>n.$background||ue.colors.background.secondary}; +`;I.div` + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 8px; + background: ${n=>ue.colors.status[n.status||"offline"]||ue.colors.status.offline}; +`;const _o=I.div` + position: relative; + width: ${n=>n.$size||"32px"}; + height: ${n=>n.$size||"32px"}; + flex-shrink: 0; + margin: ${n=>n.$margin||"0"}; +`,Fn=I.img` + width: 100%; + height: 100%; + border-radius: 50%; + object-fit: cover; + border: ${n=>n.$border||"none"}; +`;function oS({isOpen:n,onClose:o,user:i}){var U,D;const[s,l]=oe.useState(i.username),[c,d]=oe.useState(i.email),[p,g]=oe.useState(""),[y,v]=oe.useState(null),[x,E]=oe.useState(""),[M,j]=oe.useState(null),{binaryContents:b,fetchBinaryContent:T}=xr(),{logout:G,refreshToken:A}=mt();oe.useEffect(()=>{var L;(L=i.profile)!=null&&L.id&&!b[i.profile.id]&&T(i.profile.id)},[i.profile,b,T]);const R=()=>{l(i.username),d(i.email),g(""),v(null),j(null),E(""),o()},k=L=>{var X;const P=(X=L.target.files)==null?void 0:X[0];if(P){v(P);const re=new FileReader;re.onloadend=()=>{j(re.result)},re.readAsDataURL(P)}},S=async L=>{L.preventDefault(),E("");try{const P=new FormData,X={};s!==i.username&&(X.newUsername=s),c!==i.email&&(X.newEmail=c),p&&(X.newPassword=p),(Object.keys(X).length>0||y)&&(P.append("userUpdateRequest",new Blob([JSON.stringify(X)],{type:"application/json"})),y&&P.append("profile",y),await $w(i.id,P),await A()),o()}catch{E("사용자 정보 수정에 실패했습니다.")}};return n?m.jsx(iS,{children:m.jsxs(sS,{children:[m.jsx("h2",{children:"프로필 수정"}),m.jsxs("form",{onSubmit:S,children:[m.jsxs(Qs,{children:[m.jsx(Ks,{children:"프로필 이미지"}),m.jsxs(lS,{children:[m.jsx(uS,{src:M||((U=i.profile)!=null&&U.id?(D=b[i.profile.id])==null?void 0:D.url:void 0)||Jt,alt:"profile"}),m.jsx(cS,{type:"file",accept:"image/*",onChange:k,id:"profile-image"}),m.jsx(dS,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),m.jsxs(Qs,{children:[m.jsxs(Ks,{children:["사용자명 ",m.jsx(qh,{children:"*"})]}),m.jsx(Mu,{type:"text",value:s,onChange:L=>l(L.target.value),required:!0})]}),m.jsxs(Qs,{children:[m.jsxs(Ks,{children:["이메일 ",m.jsx(qh,{children:"*"})]}),m.jsx(Mu,{type:"email",value:c,onChange:L=>d(L.target.value),required:!0})]}),m.jsxs(Qs,{children:[m.jsx(Ks,{children:"새 비밀번호"}),m.jsx(Mu,{type:"password",placeholder:"변경하지 않으려면 비워두세요",value:p,onChange:L=>g(L.target.value)})]}),x&&m.jsx(aS,{children:x}),m.jsxs(fS,{children:[m.jsx(Hh,{type:"button",onClick:R,$secondary:!0,children:"취소"}),m.jsx(Hh,{type:"submit",children:"저장"})]})]}),m.jsx(pS,{onClick:G,children:"로그아웃"})]})}):null}const iS=I.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,sS=I.div` + background: ${({theme:n})=>n.colors.background.secondary}; + padding: 32px; + border-radius: 5px; + width: 100%; + max-width: 480px; + + h2 { + color: ${({theme:n})=>n.colors.text.primary}; + margin-bottom: 24px; + text-align: center; + font-size: 24px; + } +`,Mu=I.input` + width: 100%; + padding: 10px; + margin-bottom: 10px; + border: none; + border-radius: 4px; + background: ${({theme:n})=>n.colors.background.input}; + color: ${({theme:n})=>n.colors.text.primary}; + + &::placeholder { + color: ${({theme:n})=>n.colors.text.muted}; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${({theme:n})=>n.colors.brand.primary}; + } +`,Hh=I.button` + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + background: ${({$secondary:n,theme:o})=>n?"transparent":o.colors.brand.primary}; + color: ${({theme:n})=>n.colors.text.primary}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({$secondary:n,theme:o})=>n?o.colors.background.hover:o.colors.brand.hover}; + } +`,aS=I.div` + color: ${({theme:n})=>n.colors.status.error}; + font-size: 14px; + margin-bottom: 10px; +`,lS=I.div` + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 20px; +`,uS=I.img` + width: 100px; + height: 100px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,cS=I.input` + display: none; +`,dS=I.label` + color: ${({theme:n})=>n.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`,fS=I.div` + display: flex; + gap: 10px; + margin-top: 20px; +`,pS=I.button` + width: 100%; + padding: 10px; + margin-top: 16px; + border: none; + border-radius: 4px; + background: transparent; + color: ${({theme:n})=>n.colors.status.error}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({theme:n})=>n.colors.status.error}20; + } +`,Qs=I.div` + margin-bottom: 20px; +`,Ks=I.label` + display: block; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,qh=I.span` + color: ${({theme:n})=>n.colors.status.error}; +`,hS=I.div` + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + background-color: ${({theme:n})=>n.colors.background.tertiary}; + width: 100%; + height: 52px; +`,mS=I(_o)``;I(Fn)``;const gS=I.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; +`,yS=I.div` + font-weight: 500; + color: ${({theme:n})=>n.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.875rem; + line-height: 1.2; +`,vS=I.div` + font-size: 0.75rem; + color: ${({theme:n})=>n.colors.text.secondary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.2; +`,xS=I.div` + display: flex; + align-items: center; + flex-shrink: 0; +`,wS=I.button` + background: none; + border: none; + padding: 0.25rem; + cursor: pointer; + color: ${({theme:n})=>n.colors.text.secondary}; + font-size: 18px; + + &:hover { + color: ${({theme:n})=>n.colors.text.primary}; + } +`;function SS({user:n}){var c,d;const[o,i]=oe.useState(!1),{binaryContents:s,fetchBinaryContent:l}=xr();return oe.useEffect(()=>{var p;(p=n.profile)!=null&&p.id&&!s[n.profile.id]&&l(n.profile.id)},[n.profile,s,l]),m.jsxs(m.Fragment,{children:[m.jsxs(hS,{children:[m.jsxs(mS,{children:[m.jsx(Fn,{src:(c=n.profile)!=null&&c.id?(d=s[n.profile.id])==null?void 0:d.url:Jt,alt:n.username}),m.jsx(Ni,{$online:!0})]}),m.jsxs(gS,{children:[m.jsx(yS,{children:n.username}),m.jsx(vS,{children:"온라인"})]}),m.jsx(xS,{children:m.jsx(wS,{onClick:()=>i(!0),children:"⚙️"})})]}),m.jsx(oS,{isOpen:o,onClose:()=>i(!1),user:n})]})}const ES=I.div` + width: 240px; + background: ${ue.colors.background.secondary}; + border-right: 1px solid ${ue.colors.border.primary}; + display: flex; + flex-direction: column; +`,CS=I.div` + flex: 1; + overflow-y: auto; +`,kS=I.div` + padding: 16px; + font-size: 16px; + font-weight: bold; + color: ${ue.colors.text.primary}; +`,gd=I.div` + height: 34px; + padding: 0 8px; + margin: 1px 8px; + display: flex; + align-items: center; + gap: 6px; + color: ${n=>n.$hasUnread?n.theme.colors.text.primary:n.theme.colors.text.muted}; + font-weight: ${n=>n.$hasUnread?"600":"normal"}; + cursor: pointer; + background: ${n=>n.$isActive?n.theme.colors.background.hover:"transparent"}; + border-radius: 4px; + + &:hover { + background: ${n=>n.theme.colors.background.hover}; + color: ${n=>n.theme.colors.text.primary}; + } +`,Wh=I.div` + margin-bottom: 8px; +`,rd=I.div` + padding: 8px 16px; + display: flex; + align-items: center; + color: ${ue.colors.text.muted}; + text-transform: uppercase; + font-size: 12px; + font-weight: 600; + cursor: pointer; + user-select: none; + + & > span:nth-child(2) { + flex: 1; + margin-right: auto; + } + + &:hover { + color: ${ue.colors.text.primary}; + } +`,Vh=I.span` + margin-right: 4px; + font-size: 10px; + transition: transform 0.2s; + transform: rotate(${n=>n.$folded?"-90deg":"0deg"}); +`,Yh=I.div` + display: ${n=>n.$folded?"none":"block"}; +`,od=I(gd)` + height: ${n=>n.hasSubtext?"42px":"34px"}; +`,bS=I(_o)` + width: 32px; + height: 32px; + margin: 0 8px; +`,Gh=I.div` + font-size: 16px; + line-height: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: ${n=>n.$isActive||n.$hasUnread?n.theme.colors.text.primary:n.theme.colors.text.muted}; + font-weight: ${n=>n.$hasUnread?"600":"normal"}; +`;I(Ni)` + border-color: ${ue.colors.background.primary}; +`;const Xh=I.button` + background: none; + border: none; + color: ${ue.colors.text.muted}; + font-size: 18px; + padding: 0; + cursor: pointer; + width: 16px; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.2s, color 0.2s; + + ${rd}:hover & { + opacity: 1; + } + + &:hover { + color: ${ue.colors.text.primary}; + } +`,_S=I(_o)` + width: 40px; + height: 24px; + margin: 0 8px; +`,RS=I.div` + font-size: 12px; + line-height: 13px; + color: ${ue.colors.text.muted}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,Qh=I.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; + gap: 2px; +`,xy=I.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.85); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,wy=I.div` + background: ${ue.colors.background.primary}; + border-radius: 4px; + width: 440px; + max-width: 90%; +`,Sy=I.div` + padding: 16px; + display: flex; + justify-content: space-between; + align-items: center; +`,Ey=I.h2` + color: ${ue.colors.text.primary}; + font-size: 20px; + font-weight: 600; + margin: 0; +`,Cy=I.div` + padding: 0 16px 16px; +`,ky=I.form` + display: flex; + flex-direction: column; + gap: 16px; +`,Ei=I.div` + display: flex; + flex-direction: column; + gap: 8px; +`,Ci=I.label` + color: ${ue.colors.text.primary}; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; +`,by=I.p` + color: ${ue.colors.text.muted}; + font-size: 14px; + margin: -4px 0 0; +`,Ri=I.input` + padding: 10px; + background: ${ue.colors.background.tertiary}; + border: none; + border-radius: 3px; + color: ${ue.colors.text.primary}; + font-size: 16px; + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${ue.colors.status.online}; + } + + &::placeholder { + color: ${ue.colors.text.muted}; + } +`,_y=I.button` + margin-top: 8px; + padding: 12px; + background: ${ue.colors.status.online}; + color: white; + border: none; + border-radius: 3px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: #3ca374; + } +`,Ry=I.button` + background: none; + border: none; + color: ${ue.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px; + line-height: 1; + + &:hover { + color: ${ue.colors.text.primary}; + } +`,jS=I(Ri)` + margin-bottom: 8px; +`,TS=I.div` + max-height: 300px; + overflow-y: auto; + background: ${ue.colors.background.tertiary}; + border-radius: 4px; +`,AS=I.div` + display: flex; + align-items: center; + padding: 8px 12px; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: ${ue.colors.background.hover}; + } + + & + & { + border-top: 1px solid ${ue.colors.border.primary}; + } +`,OS=I.input` + margin-right: 12px; + width: 16px; + height: 16px; + cursor: pointer; +`,Kh=I.img` + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 12px; +`,NS=I.div` + flex: 1; + min-width: 0; +`,IS=I.div` + color: ${ue.colors.text.primary}; + font-size: 14px; + font-weight: 500; +`,LS=I.div` + color: ${ue.colors.text.muted}; + font-size: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,PS=I.div` + padding: 16px; + text-align: center; + color: ${ue.colors.text.muted}; +`,jy=I.div` + color: ${ue.colors.status.error}; + font-size: 14px; + padding: 8px 0; + text-align: center; + background-color: ${({theme:n})=>n.colors.background.tertiary}; + border-radius: 4px; + margin-bottom: 8px; +`,Du=I.div` + position: relative; + margin-left: auto; + z-index: 99999; +`,$u=I.button` + background: none; + border: none; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 16px; + cursor: pointer; + padding: 4px; + border-radius: 3px; + opacity: 0; + transition: opacity 0.2s, background 0.2s; + + &:hover { + background: ${({theme:n})=>n.colors.background.hover}; + color: ${({theme:n})=>n.colors.text.primary}; + } + + ${gd}:hover &, + ${od}:hover & { + opacity: 1; + } +`,Bu=I.div` + position: absolute; + top: 100%; + right: 0; + background: ${({theme:n})=>n.colors.background.primary}; + border: 1px solid ${({theme:n})=>n.colors.border.primary}; + border-radius: 4px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + min-width: 120px; + z-index: 100000; +`,Js=I.div` + padding: 8px 12px; + color: ${({theme:n})=>n.colors.text.primary}; + cursor: pointer; + font-size: 14px; + display: flex; + align-items: center; + gap: 8px; + + &:hover { + background: ${({theme:n})=>n.colors.background.hover}; + } + + &:first-child { + border-radius: 4px 4px 0 0; + } + + &:last-child { + border-radius: 0 0 4px 4px; + } + + &:only-child { + border-radius: 4px; + } +`;function MS(){return m.jsx(kS,{children:"채널 목록"})}function DS({isOpen:n,channel:o,onClose:i,onUpdateSuccess:s}){const[l,c]=oe.useState({name:"",description:""}),[d,p]=oe.useState(""),[g,y]=oe.useState(!1),{updatePublicChannel:v}=yr();oe.useEffect(()=>{o&&n&&(c({name:o.name||"",description:o.description||""}),p(""))},[o,n]);const x=M=>{const{name:j,value:b}=M.target;c(T=>({...T,[j]:b}))},E=async M=>{var j,b;if(M.preventDefault(),!!o){p(""),y(!0);try{if(!l.name.trim()){p("채널 이름을 입력해주세요."),y(!1);return}const T={newName:l.name.trim(),newDescription:l.description.trim()},G=await v(o.id,T);s(G)}catch(T){console.error("채널 수정 실패:",T),p(((b=(j=T.response)==null?void 0:j.data)==null?void 0:b.message)||"채널 수정에 실패했습니다. 다시 시도해주세요.")}finally{y(!1)}}};return!n||!o||o.type!=="PUBLIC"?null:m.jsx(xy,{onClick:i,children:m.jsxs(wy,{onClick:M=>M.stopPropagation(),children:[m.jsxs(Sy,{children:[m.jsx(Ey,{children:"채널 수정"}),m.jsx(Ry,{onClick:i,children:"×"})]}),m.jsx(Cy,{children:m.jsxs(ky,{onSubmit:E,children:[d&&m.jsx(jy,{children:d}),m.jsxs(Ei,{children:[m.jsx(Ci,{children:"채널 이름"}),m.jsx(Ri,{name:"name",value:l.name,onChange:x,placeholder:"새로운-채널",required:!0,disabled:g})]}),m.jsxs(Ei,{children:[m.jsx(Ci,{children:"채널 설명"}),m.jsx(by,{children:"이 채널의 주제를 설명해주세요."}),m.jsx(Ri,{name:"description",value:l.description,onChange:x,placeholder:"채널 설명을 입력하세요",disabled:g})]}),m.jsx(_y,{type:"submit",disabled:g,children:g?"수정 중...":"채널 수정"})]})})]})})}function Jh({channel:n,isActive:o,onClick:i,hasUnread:s}){var A;const{currentUser:l}=mt(),{binaryContents:c}=xr(),{deleteChannel:d}=yr(),[p,g]=oe.useState(null),[y,v]=oe.useState(!1),x=(l==null?void 0:l.role)===pr.ADMIN||(l==null?void 0:l.role)===pr.CHANNEL_MANAGER;oe.useEffect(()=>{const R=()=>{p&&g(null)};if(p)return document.addEventListener("click",R),()=>document.removeEventListener("click",R)},[p]);const E=R=>{g(p===R?null:R)},M=()=>{g(null),v(!0)},j=R=>{v(!1),console.log("Channel updated successfully:",R)},b=()=>{v(!1)},T=async R=>{var S;g(null);const k=n.type==="PUBLIC"?n.name:n.type==="PRIVATE"&&n.participants.length>2?`그룹 채팅 (멤버 ${n.participants.length}명)`:((S=n.participants.filter(U=>U.id!==(l==null?void 0:l.id))[0])==null?void 0:S.username)||"1:1 채팅";if(confirm(`"${k}" 채널을 삭제하시겠습니까?`))try{await d(R),console.log("Channel deleted successfully:",R)}catch(U){console.error("Channel delete failed:",U),alert("채널 삭제에 실패했습니다. 다시 시도해주세요.")}};let G;if(n.type==="PUBLIC")G=m.jsxs(gd,{$isActive:o,onClick:i,$hasUnread:s,children:["# ",n.name,x&&m.jsxs(Du,{children:[m.jsx($u,{onClick:R=>{R.stopPropagation(),E(n.id)},children:"⋯"}),p===n.id&&m.jsxs(Bu,{onClick:R=>R.stopPropagation(),children:[m.jsx(Js,{onClick:()=>M(),children:"✏️ 수정"}),m.jsx(Js,{onClick:()=>T(n.id),children:"🗑️ 삭제"})]})]})]});else{const R=n.participants;if(R.length>2){const k=R.filter(S=>S.id!==(l==null?void 0:l.id)).map(S=>S.username).join(", ");G=m.jsxs(od,{$isActive:o,onClick:i,children:[m.jsx(_S,{children:R.filter(S=>S.id!==(l==null?void 0:l.id)).slice(0,2).map((S,U)=>{var D;return m.jsx(Fn,{src:S.profile?(D=c[S.profile.id])==null?void 0:D.url:Jt,style:{position:"absolute",left:U*16,zIndex:2-U,width:"24px",height:"24px",border:"2px solid #2a2a2a"}},S.id)})}),m.jsxs(Qh,{children:[m.jsx(Gh,{$hasUnread:s,children:k}),m.jsxs(RS,{children:["멤버 ",R.length,"명"]})]}),x&&m.jsxs(Du,{children:[m.jsx($u,{onClick:S=>{S.stopPropagation(),E(n.id)},children:"⋯"}),p===n.id&&m.jsx(Bu,{onClick:S=>S.stopPropagation(),children:m.jsx(Js,{onClick:()=>T(n.id),children:"🗑️ 삭제"})})]})]})}else{const k=R.filter(S=>S.id!==(l==null?void 0:l.id))[0];G=k?m.jsxs(od,{$isActive:o,onClick:i,children:[m.jsxs(bS,{children:[m.jsx(Fn,{src:k.profile?(A=c[k.profile.id])==null?void 0:A.url:Jt,alt:"profile"}),m.jsx(Ni,{$online:k.online})]}),m.jsx(Qh,{children:m.jsx(Gh,{$hasUnread:s,children:k.username})}),x&&m.jsxs(Du,{children:[m.jsx($u,{onClick:S=>{S.stopPropagation(),E(n.id)},children:"⋯"}),p===n.id&&m.jsx(Bu,{onClick:S=>S.stopPropagation(),children:m.jsx(Js,{onClick:()=>T(n.id),children:"🗑️ 삭제"})})]})]}):m.jsx("div",{})}}return m.jsxs(m.Fragment,{children:[G,m.jsx(DS,{isOpen:y,channel:n,onClose:b,onUpdateSuccess:j})]})}function $S({isOpen:n,type:o,onClose:i,onCreateSuccess:s}){const[l,c]=oe.useState({name:"",description:""}),[d,p]=oe.useState(""),[g,y]=oe.useState([]),[v,x]=oe.useState(""),E=gr(S=>S.users),M=xr(S=>S.binaryContents),{currentUser:j}=mt(),b=oe.useMemo(()=>E.filter(S=>S.id!==(j==null?void 0:j.id)).filter(S=>S.username.toLowerCase().includes(d.toLowerCase())||S.email.toLowerCase().includes(d.toLowerCase())),[d,E,j]),T=yr(S=>S.createPublicChannel),G=yr(S=>S.createPrivateChannel),A=S=>{const{name:U,value:D}=S.target;c(L=>({...L,[U]:D}))},R=S=>{y(U=>U.includes(S)?U.filter(D=>D!==S):[...U,S])},k=async S=>{var U,D;S.preventDefault(),x("");try{let L;if(o==="PUBLIC"){if(!l.name.trim()){x("채널 이름을 입력해주세요.");return}const P={name:l.name,description:l.description};L=await T(P)}else{if(g.length===0){x("대화 상대를 선택해주세요.");return}const P=(j==null?void 0:j.id)&&[...g,j.id]||g;L=await G(P)}s(L)}catch(L){console.error("채널 생성 실패:",L),x(((D=(U=L.response)==null?void 0:U.data)==null?void 0:D.message)||"채널 생성에 실패했습니다. 다시 시도해주세요.")}};return n?m.jsx(xy,{onClick:i,children:m.jsxs(wy,{onClick:S=>S.stopPropagation(),children:[m.jsxs(Sy,{children:[m.jsx(Ey,{children:o==="PUBLIC"?"채널 만들기":"개인 메시지 시작하기"}),m.jsx(Ry,{onClick:i,children:"×"})]}),m.jsx(Cy,{children:m.jsxs(ky,{onSubmit:k,children:[v&&m.jsx(jy,{children:v}),o==="PUBLIC"?m.jsxs(m.Fragment,{children:[m.jsxs(Ei,{children:[m.jsx(Ci,{children:"채널 이름"}),m.jsx(Ri,{name:"name",value:l.name,onChange:A,placeholder:"새로운-채널",required:!0})]}),m.jsxs(Ei,{children:[m.jsx(Ci,{children:"채널 설명"}),m.jsx(by,{children:"이 채널의 주제를 설명해주세요."}),m.jsx(Ri,{name:"description",value:l.description,onChange:A,placeholder:"채널 설명을 입력하세요"})]})]}):m.jsxs(Ei,{children:[m.jsx(Ci,{children:"사용자 검색"}),m.jsx(jS,{type:"text",value:d,onChange:S=>p(S.target.value),placeholder:"사용자명 또는 이메일로 검색"}),m.jsx(TS,{children:b.length>0?b.map(S=>m.jsxs(AS,{children:[m.jsx(OS,{type:"checkbox",checked:g.includes(S.id),onChange:()=>R(S.id)}),S.profile?m.jsx(Kh,{src:M[S.profile.id].url}):m.jsx(Kh,{src:Jt}),m.jsxs(NS,{children:[m.jsx(IS,{children:S.username}),m.jsx(LS,{children:S.email})]})]},S.id)):m.jsx(PS,{children:"검색 결과가 없습니다."})})]}),m.jsx(_y,{type:"submit",children:o==="PUBLIC"?"채널 만들기":"대화 시작하기"})]})})]})}):null}var vi={exports:{}};/** @license + * eventsource.js + * Available under MIT License (MIT) + * https://github.com/Yaffle/EventSource/ + */var BS=vi.exports,Zh;function US(){return Zh||(Zh=1,function(n,o){(function(i){var s=i.setTimeout,l=i.clearTimeout,c=i.XMLHttpRequest,d=i.XDomainRequest,p=i.ActiveXObject,g=i.EventSource,y=i.document,v=i.Promise,x=i.fetch,E=i.Response,M=i.TextDecoder,j=i.TextEncoder,b=i.AbortController;if(typeof window<"u"&&typeof y<"u"&&!("readyState"in y)&&y.body==null&&(y.readyState="loading",window.addEventListener("load",function(Y){y.readyState="complete"},!1)),c==null&&p!=null&&(c=function(){return new p("Microsoft.XMLHTTP")}),Object.create==null&&(Object.create=function(Y){function le(){}return le.prototype=Y,new le}),Date.now||(Date.now=function(){return new Date().getTime()}),b==null){var T=x;x=function(Y,le){var he=le.signal;return T(Y,{headers:le.headers,credentials:le.credentials,cache:le.cache}).then(function(se){var Ee=se.body.getReader();return he._reader=Ee,he._aborted&&he._reader.cancel(),{status:se.status,statusText:se.statusText,headers:se.headers,body:{getReader:function(){return Ee}}}})},b=function(){this.signal={_reader:null,_aborted:!1},this.abort=function(){this.signal._reader!=null&&this.signal._reader.cancel(),this.signal._aborted=!0}}}function G(){this.bitsNeeded=0,this.codePoint=0}G.prototype.decode=function(Y){function le(De,ze,be){if(be===1)return De>=128>>ze&&De<=2048>>ze&&De<=57344>>ze&&De<=65536>>ze&&De<>6>15?3:ze>31?2:1;if(De===6*2)return ze>15?3:2;if(De===6*3)return 3;throw new Error}for(var se=65533,Ee="",ve=this.bitsNeeded,Oe=this.codePoint,We=0;We191||!le(Oe<<6|Pe&63,ve-6,he(ve,Oe)))&&(ve=0,Oe=se,Ee+=String.fromCharCode(Oe)),ve===0?(Pe>=0&&Pe<=127?(ve=0,Oe=Pe):Pe>=192&&Pe<=223?(ve=6*1,Oe=Pe&31):Pe>=224&&Pe<=239?(ve=6*2,Oe=Pe&15):Pe>=240&&Pe<=247?(ve=6*3,Oe=Pe&7):(ve=0,Oe=se),ve!==0&&!le(Oe,ve,he(ve,Oe))&&(ve=0,Oe=se)):(ve-=6,Oe=Oe<<6|Pe&63),ve===0&&(Oe<=65535?Ee+=String.fromCharCode(Oe):(Ee+=String.fromCharCode(55296+(Oe-65535-1>>10)),Ee+=String.fromCharCode(56320+(Oe-65535-1&1023))))}return this.bitsNeeded=ve,this.codePoint=Oe,Ee};var A=function(){try{return new M().decode(new j().encode("test"),{stream:!0})==="test"}catch(Y){console.debug("TextDecoder does not support streaming option. Using polyfill instead: "+Y)}return!1};(M==null||j==null||!A())&&(M=G);var R=function(){};function k(Y){this.withCredentials=!1,this.readyState=0,this.status=0,this.statusText="",this.responseText="",this.onprogress=R,this.onload=R,this.onerror=R,this.onreadystatechange=R,this._contentType="",this._xhr=Y,this._sendTimeout=0,this._abort=R}k.prototype.open=function(Y,le){this._abort(!0);var he=this,se=this._xhr,Ee=1,ve=0;this._abort=function(be){he._sendTimeout!==0&&(l(he._sendTimeout),he._sendTimeout=0),(Ee===1||Ee===2||Ee===3)&&(Ee=4,se.onload=R,se.onerror=R,se.onabort=R,se.onprogress=R,se.onreadystatechange=R,se.abort(),ve!==0&&(l(ve),ve=0),be||(he.readyState=4,he.onabort(null),he.onreadystatechange())),Ee=0};var Oe=function(){if(Ee===1){var be=0,qe="",Zt=void 0;if("contentType"in se)be=200,qe="OK",Zt=se.contentType;else try{be=se.status,qe=se.statusText,Zt=se.getResponseHeader("Content-Type")}catch{be=0,qe="",Zt=void 0}be!==0&&(Ee=2,he.readyState=2,he.status=be,he.statusText=qe,he._contentType=Zt,he.onreadystatechange())}},We=function(){if(Oe(),Ee===2||Ee===3){Ee=3;var be="";try{be=se.responseText}catch{}he.readyState=3,he.responseText=be,he.onprogress()}},Pe=function(be,qe){if((qe==null||qe.preventDefault==null)&&(qe={preventDefault:R}),We(),Ee===1||Ee===2||Ee===3){if(Ee=4,ve!==0&&(l(ve),ve=0),he.readyState=4,be==="load")he.onload(qe);else if(be==="error")he.onerror(qe);else if(be==="abort")he.onabort(qe);else throw new TypeError;he.onreadystatechange()}},De=function(be){se!=null&&(se.readyState===4?(!("onload"in se)||!("onerror"in se)||!("onabort"in se))&&Pe(se.responseText===""?"error":"load",be):se.readyState===3?"onprogress"in se||We():se.readyState===2&&Oe())},ze=function(){ve=s(function(){ze()},500),se.readyState===3&&We()};"onload"in se&&(se.onload=function(be){Pe("load",be)}),"onerror"in se&&(se.onerror=function(be){Pe("error",be)}),"onabort"in se&&(se.onabort=function(be){Pe("abort",be)}),"onprogress"in se&&(se.onprogress=We),"onreadystatechange"in se&&(se.onreadystatechange=function(be){De(be)}),("contentType"in se||!("ontimeout"in c.prototype))&&(le+=(le.indexOf("?")===-1?"?":"&")+"padding=true"),se.open(Y,le,!0),"readyState"in se&&(ve=s(function(){ze()},0))},k.prototype.abort=function(){this._abort(!1)},k.prototype.getResponseHeader=function(Y){return this._contentType},k.prototype.setRequestHeader=function(Y,le){var he=this._xhr;"setRequestHeader"in he&&he.setRequestHeader(Y,le)},k.prototype.getAllResponseHeaders=function(){return this._xhr.getAllResponseHeaders!=null&&this._xhr.getAllResponseHeaders()||""},k.prototype.send=function(){if((!("ontimeout"in c.prototype)||!("sendAsBinary"in c.prototype)&&!("mozAnon"in c.prototype))&&y!=null&&y.readyState!=null&&y.readyState!=="complete"){var Y=this;Y._sendTimeout=s(function(){Y._sendTimeout=0,Y.send()},4);return}var le=this._xhr;"withCredentials"in le&&(le.withCredentials=this.withCredentials);try{le.send(void 0)}catch(he){throw he}};function S(Y){return Y.replace(/[A-Z]/g,function(le){return String.fromCharCode(le.charCodeAt(0)+32)})}function U(Y){for(var le=Object.create(null),he=Y.split(`\r +`),se=0;se"u"?typeof window<"u"?window:typeof self<"u"?self:BS:globalThis)}(vi,vi.exports)),vi.exports}var em=US();const Ii=zn((n,o)=>({eventSource:null,isConnected:!1,isConnecting:!1,subscriptions:new Map,connect:async()=>{const{isConnected:i,isConnecting:s}=o();if(i||s)return;n({isConnecting:!0});const l=mt.getState().accessToken;if(!l){n({isConnected:!1,isConnecting:!1});return}try{const c=new em.EventSourcePolyfill(`${$a.sseBaseUrl}`,{headers:{Authorization:`Bearer ${l}`},withCredentials:!0});c.onopen=()=>{n({eventSource:c,isConnected:!0,isConnecting:!1}),console.log("SSE 연결 성공")},c.onerror=d=>{console.error("SSE 에러:",{error:d,readyState:c.readyState}),n({isConnected:!1,isConnecting:c.readyState===em.EventSourcePolyfill.CONNECTING,eventSource:null})}}catch(c){console.error("SSE 연결 시도 중 에러:",c),n({isConnected:!1,isConnecting:!1,eventSource:null})}},disconnect:()=>{const{eventSource:i,isConnected:s,subscriptions:l}=o();i&&s&&(l.forEach((c,d)=>{i.removeEventListener(d,c)}),i.close(),n({eventSource:null,isConnected:!1}))},subscribe:(i,s)=>{const{eventSource:l,isConnected:c,subscriptions:d}=o();if(d.has(i)){console.log("already subscribed",i);return}const p=g=>{try{const y=JSON.parse(g.data);s(y)}catch(y){console.error("SSE 메시지 파싱 에러:",y),s(g.data)}};l&&c&&(console.log("eventSource.subscribe",i),l.addEventListener(i,p),d.set(i,p),n({subscriptions:d}))},unsubscribe:i=>{const{eventSource:s,isConnected:l,subscriptions:c}=o();if(s&&l){const d=c.get(i);d&&s.removeEventListener(i,d)}c.delete(i),n({subscriptions:c})}}));function FS({currentUser:n,activeChannel:o,onChannelSelect:i}){var D,L;const[s,l]=oe.useState({PUBLIC:!1,PRIVATE:!1}),[c,d]=oe.useState({isOpen:!1,type:null}),p=yr(P=>P.channels),g=yr(P=>P.fetchChannels),y=yr(P=>P.replaceChannel),v=yr(P=>P.removeChannel),x=yo(P=>P.fetchReadStatuses),E=yo(P=>P.updateReadStatus),M=yo(P=>P.hasUnreadMessages),{subscribe:j,unsubscribe:b,isConnected:T}=Ii();oe.useEffect(()=>{n&&(g(n.id),x())},[n,g,x]),oe.useEffect(()=>(T&&(j("channels.created",P=>{y(P),(o==null?void 0:o.id)===P.id&&i(P)}),j("channels.updated",P=>{y(P),(o==null?void 0:o.id)===P.id&&i(P)}),j("channels.deleted",P=>{v(P.id),(o==null?void 0:o.id)===P.id&&i(null)})),()=>{b("channels.created"),b("channels.updated"),b("channels.deleted")}),[j,T,g,n]),oe.useEffect(()=>{if(o){const P=p.find(X=>X.id===o.id);i(P||null)}},[p]);const G=P=>{l(X=>({...X,[P]:!X[P]}))},A=(P,X)=>{X.stopPropagation(),d({isOpen:!0,type:P})},R=()=>{d({isOpen:!1,type:null})},k=async P=>{try{const re=(await g(n.id)).find(Ce=>Ce.id===P.id);re&&i(re),R()}catch(X){console.error("채널 생성 실패:",X)}},S=P=>{i(P),E(P.id)},U=p.reduce((P,X)=>(P[X.type]||(P[X.type]=[]),P[X.type].push(X),P),{});return m.jsxs(ES,{children:[m.jsx(MS,{}),m.jsxs(CS,{children:[m.jsxs(Wh,{children:[m.jsxs(rd,{onClick:()=>G("PUBLIC"),children:[m.jsx(Vh,{$folded:s.PUBLIC,children:"▼"}),m.jsx("span",{children:"일반 채널"}),m.jsx(Xh,{onClick:P=>A("PUBLIC",P),children:"+"})]}),m.jsx(Yh,{$folded:s.PUBLIC,children:(D=U.PUBLIC)==null?void 0:D.map(P=>m.jsx(Jh,{channel:P,isActive:(o==null?void 0:o.id)===P.id,hasUnread:M(P.id,P.lastMessageAt),onClick:()=>S(P)},P.id))})]}),m.jsxs(Wh,{children:[m.jsxs(rd,{onClick:()=>G("PRIVATE"),children:[m.jsx(Vh,{$folded:s.PRIVATE,children:"▼"}),m.jsx("span",{children:"개인 메시지"}),m.jsx(Xh,{onClick:P=>A("PRIVATE",P),children:"+"})]}),m.jsx(Yh,{$folded:s.PRIVATE,children:(L=U.PRIVATE)==null?void 0:L.map(P=>m.jsx(Jh,{channel:P,isActive:(o==null?void 0:o.id)===P.id,hasUnread:M(P.id,P.lastMessageAt),onClick:()=>S(P)},P.id))})]})]}),m.jsx(zS,{children:m.jsx(SS,{user:n})}),m.jsx($S,{isOpen:c.isOpen,type:c.type,onClose:R,onCreateSuccess:k})]})}const zS=I.div` + margin-top: auto; + border-top: 1px solid ${({theme:n})=>n.colors.border.primary}; + background-color: ${({theme:n})=>n.colors.background.tertiary}; +`,HS=I.div` + flex: 1; + display: flex; + flex-direction: column; + background: ${({theme:n})=>n.colors.background.primary}; +`,qS=I.div` + display: flex; + flex-direction: column; + height: 100%; + background: ${({theme:n})=>n.colors.background.primary}; +`,WS=I(qS)` + justify-content: center; + align-items: center; + flex: 1; + padding: 0 20px; +`,VS=I.div` + text-align: center; + max-width: 400px; + padding: 20px; + margin-bottom: 80px; +`,YS=I.div` + font-size: 48px; + margin-bottom: 16px; + animation: wave 2s infinite; + transform-origin: 70% 70%; + + @keyframes wave { + 0% { transform: rotate(0deg); } + 10% { transform: rotate(14deg); } + 20% { transform: rotate(-8deg); } + 30% { transform: rotate(14deg); } + 40% { transform: rotate(-4deg); } + 50% { transform: rotate(10deg); } + 60% { transform: rotate(0deg); } + 100% { transform: rotate(0deg); } + } +`,GS=I.h2` + color: ${({theme:n})=>n.colors.text.primary}; + font-size: 28px; + font-weight: 700; + margin-bottom: 16px; +`,XS=I.p` + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 16px; + line-height: 1.6; + word-break: keep-all; +`,tm=I.div` + height: 48px; + padding: 0 16px; + background: ${ue.colors.background.primary}; + border-bottom: 1px solid ${ue.colors.border.primary}; + display: flex; + align-items: center; +`,nm=I.div` + display: flex; + align-items: center; + gap: 8px; + height: 100%; +`,QS=I.div` + display: flex; + align-items: center; + gap: 12px; + height: 100%; +`,KS=I(_o)` + width: 24px; + height: 24px; +`;I.img` + width: 24px; + height: 24px; + border-radius: 50%; +`;const JS=I.div` + position: relative; + width: 40px; + height: 24px; + flex-shrink: 0; +`,ZS=I(Ni)` + border-color: ${ue.colors.background.primary}; + bottom: -3px; + right: -3px; +`,eE=I.div` + font-size: 12px; + color: ${ue.colors.text.muted}; + line-height: 13px; +`,rm=I.div` + font-weight: bold; + color: ${ue.colors.text.primary}; + line-height: 20px; + font-size: 16px; +`,tE=I.div` + flex: 1; + display: flex; + flex-direction: column-reverse; + overflow-y: auto; + position: relative; +`,nE=I.div` + padding: 16px; + display: flex; + flex-direction: column; +`,Ty=I.div` + margin-bottom: 16px; + display: flex; + align-items: flex-start; + position: relative; + z-index: 1; +`,rE=I(_o)` + margin-right: 16px; + width: 40px; + height: 40px; +`;I.img` + width: 40px; + height: 40px; + border-radius: 50%; +`;const oE=I.div` + display: flex; + align-items: center; + margin-bottom: 4px; + position: relative; +`,iE=I.span` + font-weight: bold; + color: ${ue.colors.text.primary}; + margin-right: 8px; +`,sE=I.span` + font-size: 0.75rem; + color: ${ue.colors.text.muted}; +`,aE=I.div` + color: ${ue.colors.text.secondary}; + margin-top: 4px; +`,lE=I.form` + display: flex; + align-items: center; + gap: 8px; + padding: 16px; + background: ${({theme:n})=>n.colors.background.secondary}; + position: relative; + z-index: 1; +`,uE=I.textarea` + flex: 1; + padding: 12px; + background: ${({theme:n})=>n.colors.background.tertiary}; + border: none; + border-radius: 4px; + color: ${({theme:n})=>n.colors.text.primary}; + font-size: 14px; + resize: none; + min-height: 44px; + max-height: 144px; + + &:focus { + outline: none; + } + + &::placeholder { + color: ${({theme:n})=>n.colors.text.muted}; + } +`,cE=I.button` + background: none; + border: none; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px 8px; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + color: ${({theme:n})=>n.colors.text.primary}; + } +`;I.div` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + color: ${ue.colors.text.muted}; + font-size: 16px; + font-weight: 500; + padding: 20px; + text-align: center; +`;const Zs=I.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 8px; + width: 100%; +`,dE=I.a` + display: block; + border-radius: 4px; + overflow: hidden; + max-width: 300px; + + img { + width: 100%; + height: auto; + display: block; + } +`,Uu=I.a` + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background: ${({theme:n})=>n.colors.background.tertiary}; + border-radius: 8px; + text-decoration: none; + width: fit-content; + + &:hover { + background: ${({theme:n})=>n.colors.background.hover}; + } +`,Fu=I.div` + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; + color: #0B93F6; +`,zu=I.div` + display: flex; + flex-direction: column; + gap: 2px; +`,Hu=I.span` + font-size: 14px; + color: #0B93F6; + font-weight: 500; +`,qu=I.span` + font-size: 13px; + color: ${({theme:n})=>n.colors.text.muted}; +`,fE=I.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 8px 0; +`,Ay=I.div` + position: relative; + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: ${({theme:n})=>n.colors.background.tertiary}; + border-radius: 4px; + max-width: 300px; +`,pE=I(Ay)` + padding: 0; + overflow: hidden; + width: 200px; + height: 120px; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +`,hE=I.div` + color: #0B93F6; + font-size: 20px; +`,mE=I.div` + font-size: 13px; + color: ${({theme:n})=>n.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,om=I.button` + position: absolute; + top: -6px; + right: -6px; + width: 20px; + height: 20px; + border-radius: 50%; + background: ${({theme:n})=>n.colors.background.secondary}; + border: none; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 16px; + line-height: 1; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + padding: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + + &:hover { + color: ${({theme:n})=>n.colors.text.primary}; + } +`,gE=I.div` + width: 16px; + height: 16px; + border: 2px solid ${({theme:n})=>n.colors.background.tertiary}; + border-top: 2px solid ${({theme:n})=>n.colors.brand.primary}; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-right: 8px; + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } +`,yE=I.div` + position: relative; + margin-left: auto; + z-index: 99999; +`,vE=I.button` + background: none; + border: none; + color: ${({theme:n})=>n.colors.text.muted}; + font-size: 16px; + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.2s ease; + + &:hover { + color: ${({theme:n})=>n.colors.text.primary}; + background: ${({theme:n})=>n.colors.background.hover}; + } + + ${Ty}:hover & { + opacity: 1; + } +`,xE=I.div` + position: absolute; + top: 0; + background: ${({theme:n})=>n.colors.background.primary}; + border: 1px solid ${({theme:n})=>n.colors.border.primary}; + border-radius: 6px; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15); + width: 80px; + z-index: 99999; + overflow: hidden; +`,im=I.button` + display: flex; + align-items: center; + gap: 8px; + width: fit-content; + background: none; + border: none; + color: ${({theme:n})=>n.colors.text.primary}; + font-size: 14px; + cursor: pointer; + text-align: center ; + + &:hover { + background: ${({theme:n})=>n.colors.background.hover}; + } + + &:first-child { + border-radius: 6px 6px 0 0; + } + + &:last-child { + border-radius: 0 0 6px 6px; + } +`,wE=I.div` + margin-top: 4px; +`,SE=I.textarea` + width: 100%; + max-width: 600px; + min-height: 80px; + padding: 12px 16px; + background: ${({theme:n})=>n.colors.background.tertiary}; + border: 1px solid ${({theme:n})=>n.colors.border.primary}; + border-radius: 4px; + color: ${({theme:n})=>n.colors.text.primary}; + font-size: 14px; + font-family: inherit; + resize: vertical; + outline: none; + box-sizing: border-box; + + &:focus { + border-color: ${({theme:n})=>n.colors.primary}; + } + + &::placeholder { + color: ${({theme:n})=>n.colors.text.muted}; + } +`,EE=I.div` + display: flex; + gap: 8px; + margin-top: 8px; +`,sm=I.button` + padding: 6px 12px; + border-radius: 4px; + font-size: 12px; + font-weight: 500; + cursor: pointer; + border: none; + transition: background-color 0.2s ease; + + ${({variant:n,theme:o})=>n==="primary"?` + background: ${o.colors.primary}; + color: white; + + &:hover { + background: ${o.colors.primaryHover||o.colors.primary}; + } + `:` + background: ${o.colors.background.secondary}; + color: ${o.colors.text.secondary}; + + &:hover { + background: ${o.colors.background.hover}; + } + `} +`,am=I.button` + background: none; + border: none; + padding: 8px; + cursor: pointer; + color: ${({theme:n,$enabled:o})=>o?n.colors.brand.primary:n.colors.text.muted}; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + + &:hover { + background: ${({theme:n})=>n.colors.background.hover}; + color: ${({theme:n})=>n.colors.brand.primary}; + } +`;function CE({channel:n}){var M;const{currentUser:o}=mt(),i=gr(j=>j.users),s=xr(j=>j.binaryContents),{readStatuses:l,updateNotificationEnabled:c}=yo(),[d,p]=oe.useState(!1);oe.useEffect(()=>{l[n==null?void 0:n.id]&&p(l[n.id].notificationEnabled)},[l,n]);const g=oe.useCallback(async()=>{if(!o||!n)return;const j=!d;p(j);try{await c(n.id,j)}catch(b){console.error("알림 설정 업데이트 실패:",b),p(d)}},[o,n,d,c]);if(!n)return null;if(n.type==="PUBLIC")return m.jsxs(tm,{children:[m.jsx(nm,{children:m.jsxs(rm,{children:["# ",n.name]})}),m.jsx(am,{onClick:g,$enabled:d,children:m.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[m.jsx("path",{d:"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"}),m.jsx("path",{d:"M13.73 21a2 2 0 0 1-3.46 0"})]})})]});const y=n.participants.map(j=>i.find(b=>b.id===j.id)).filter(Boolean),v=y.filter(j=>j.id!==(o==null?void 0:o.id)),x=y.length>2,E=y.filter(j=>j.id!==(o==null?void 0:o.id)).map(j=>j.username).join(", ");return m.jsxs(tm,{children:[m.jsx(nm,{children:m.jsxs(QS,{children:[x?m.jsx(JS,{children:v.slice(0,2).map((j,b)=>{var T;return m.jsx(Fn,{src:j.profile?(T=s[j.profile.id])==null?void 0:T.url:Jt,style:{position:"absolute",left:b*16,zIndex:2-b,width:"24px",height:"24px"}},j.id)})}):m.jsxs(KS,{children:[m.jsx(Fn,{src:v[0].profile?(M=s[v[0].profile.id])==null?void 0:M.url:Jt}),m.jsx(ZS,{$online:v[0].online})]}),m.jsxs("div",{children:[m.jsx(rm,{children:E}),x&&m.jsxs(eE,{children:["멤버 ",y.length,"명"]})]})]})}),m.jsx(am,{onClick:g,$enabled:d,children:m.jsxs("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[m.jsx("path",{d:"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"}),m.jsx("path",{d:"M13.73 21a2 2 0 0 1-3.46 0"})]})})]})}const kE=async(n,o,i)=>{var l;return(await Ze.get("/messages",{params:{channelId:n,cursor:o,size:i.size,sort:(l=i.sort)==null?void 0:l.join(",")}})).data},bE=async(n,o)=>{const i=new FormData,s={content:n.content,channelId:n.channelId,authorId:n.authorId};return i.append("messageCreateRequest",new Blob([JSON.stringify(s)],{type:"application/json"})),o&&o.length>0&&o.forEach(c=>{i.append("attachments",c)}),(await Ze.post("/messages",i,{headers:{"Content-Type":"multipart/form-data"}})).data},_E=async(n,o)=>(await Ze.patch(`/messages/${n}`,o)).data,RE=async n=>{await Ze.delete(`/messages/${n}`)},lm={size:50,sort:["createdAt,desc"]},Oy=zn((n,o)=>({messages:[],newMessages:[],lastMessageId:null,pagination:{nextCursor:null,pageSize:50,hasNext:!1},isCreating:!1,fetchMessages:async(i,s,l=lm)=>{try{if(o().isCreating)return Promise.resolve(!0);const c=await kE(i,s,l),d=c.content,p=d.length>0?d[0]:null,g=(p==null?void 0:p.id)!==o().lastMessageId;return n(y=>{const v=new Set(y.messages.map(j=>j.id)),x=d.filter(j=>!v.has(j.id)),E=[...y.messages,...x],M={nextCursor:c.nextCursor,pageSize:c.size,hasNext:c.hasNext};return{messages:E,lastMessageId:(p==null?void 0:p.id)||null,pagination:M}}),g}catch(c){return console.error("메시지 목록 조회 실패:",c),!1}},loadMoreMessages:async i=>{const{pagination:s}=o();s.hasNext&&await o().fetchMessages(i,s.nextCursor,{...lm})},addNewMessage:i=>{n(s=>({newMessages:[...s.newMessages,i]}))},createMessage:async(i,s)=>{try{n({isCreating:!0});const l=await bE(i,s),c=yo.getState().updateReadStatus;return await c(i.channelId),n(d=>d.messages.some(g=>g.id===l.id)?d:{...d,lastMessageId:l.id}),l}catch(l){throw console.error("메시지 생성 실패:",l),l}finally{n({isCreating:!1})}},updateMessage:async(i,s)=>{try{const l=await _E(i,{newContent:s});return n(c=>({messages:c.messages.map(d=>d.id===i?{...d,content:s}:d)})),l}catch(l){throw console.error("메시지 업데이트 실패:",l),l}},deleteMessage:async i=>{try{await RE(i),n(s=>({messages:s.messages.filter(l=>l.id!==i)}))}catch(s){throw console.error("메시지 삭제 실패:",s),s}},clear:()=>{n({messages:[],newMessages:[],pagination:{nextCursor:null,pageSize:50,hasNext:!1}})}}));function jE(n,o){n.terminate=function(){const i=()=>{};this.onerror=i,this.onmessage=i,this.onopen=i;const s=new Date,l=Math.random().toString().substring(2,8),c=this.onclose;this.onclose=d=>{const p=new Date().getTime()-s.getTime();o(`Discarded socket (#${l}) closed after ${p}ms, with code/reason: ${d.code}/${d.reason}`)},this.close(),c==null||c.call(n,{code:4001,reason:`Quick discarding socket (#${l}) without waiting for the shutdown sequence.`,wasClean:!1})}}const xi={LF:` +`,NULL:"\0"};class hr{get body(){return!this._body&&this.isBinaryBody&&(this._body=new TextDecoder().decode(this._binaryBody)),this._body||""}get binaryBody(){return!this._binaryBody&&!this.isBinaryBody&&(this._binaryBody=new TextEncoder().encode(this._body)),this._binaryBody}constructor(o){const{command:i,headers:s,body:l,binaryBody:c,escapeHeaderValues:d,skipContentLengthHeader:p}=o;this.command=i,this.headers=Object.assign({},s||{}),c?(this._binaryBody=c,this.isBinaryBody=!0):(this._body=l||"",this.isBinaryBody=!1),this.escapeHeaderValues=d||!1,this.skipContentLengthHeader=p||!1}static fromRawFrame(o,i){const s={},l=c=>c.replace(/^\s+|\s+$/g,"");for(const c of o.headers.reverse()){c.indexOf(":");const d=l(c[0]);let p=l(c[1]);i&&o.command!=="CONNECT"&&o.command!=="CONNECTED"&&(p=hr.hdrValueUnEscape(p)),s[d]=p}return new hr({command:o.command,headers:s,binaryBody:o.binaryBody,escapeHeaderValues:i})}toString(){return this.serializeCmdAndHeaders()}serialize(){const o=this.serializeCmdAndHeaders();return this.isBinaryBody?hr.toUnit8Array(o,this._binaryBody).buffer:o+this._body+xi.NULL}serializeCmdAndHeaders(){const o=[this.command];this.skipContentLengthHeader&&delete this.headers["content-length"];for(const i of Object.keys(this.headers||{})){const s=this.headers[i];this.escapeHeaderValues&&this.command!=="CONNECT"&&this.command!=="CONNECTED"?o.push(`${i}:${hr.hdrValueEscape(`${s}`)}`):o.push(`${i}:${s}`)}return(this.isBinaryBody||!this.isBodyEmpty()&&!this.skipContentLengthHeader)&&o.push(`content-length:${this.bodyLength()}`),o.join(xi.LF)+xi.LF+xi.LF}isBodyEmpty(){return this.bodyLength()===0}bodyLength(){const o=this.binaryBody;return o?o.length:0}static sizeOfUTF8(o){return o?new TextEncoder().encode(o).length:0}static toUnit8Array(o,i){const s=new TextEncoder().encode(o),l=new Uint8Array([0]),c=new Uint8Array(s.length+i.length+l.length);return c.set(s),c.set(i,s.length),c.set(l,s.length+i.length),c}static marshall(o){return new hr(o).serialize()}static hdrValueEscape(o){return o.replace(/\\/g,"\\\\").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/:/g,"\\c")}static hdrValueUnEscape(o){return o.replace(/\\r/g,"\r").replace(/\\n/g,` +`).replace(/\\c/g,":").replace(/\\\\/g,"\\")}}const um=0,ea=10,ta=13,TE=58;class AE{constructor(o,i){this.onFrame=o,this.onIncomingPing=i,this._encoder=new TextEncoder,this._decoder=new TextDecoder,this._token=[],this._initState()}parseChunk(o,i=!1){let s;if(typeof o=="string"?s=this._encoder.encode(o):s=new Uint8Array(o),i&&s[s.length-1]!==0){const l=new Uint8Array(s.length+1);l.set(s,0),l[s.length]=0,s=l}for(let l=0;li[0]==="content-length")[0];o?(this._bodyBytesRemaining=parseInt(o[1],10),this._onByte=this._collectBodyFixedSize):this._onByte=this._collectBodyNullTerminated}_collectBodyNullTerminated(o){if(o===um){this._retrievedBody();return}this._consumeByte(o)}_collectBodyFixedSize(o){if(this._bodyBytesRemaining--===0){this._retrievedBody();return}this._consumeByte(o)}_retrievedBody(){this._results.binaryBody=this._consumeTokenAsRaw();try{this.onFrame(this._results)}catch(o){console.log("Ignoring an exception thrown by a frame handler. Original exception: ",o)}this._initState()}_consumeByte(o){this._token.push(o)}_consumeTokenAsUTF8(){return this._decoder.decode(this._consumeTokenAsRaw())}_consumeTokenAsRaw(){const o=new Uint8Array(this._token);return this._token=[],o}_initState(){this._results={command:void 0,headers:[],binaryBody:void 0},this._token=[],this._headerKey=void 0,this._onByte=this._collectFrame}}var mr;(function(n){n[n.CONNECTING=0]="CONNECTING",n[n.OPEN=1]="OPEN",n[n.CLOSING=2]="CLOSING",n[n.CLOSED=3]="CLOSED"})(mr||(mr={}));var Sn;(function(n){n[n.ACTIVE=0]="ACTIVE",n[n.DEACTIVATING=1]="DEACTIVATING",n[n.INACTIVE=2]="INACTIVE"})(Sn||(Sn={}));var ka;(function(n){n[n.LINEAR=0]="LINEAR",n[n.EXPONENTIAL=1]="EXPONENTIAL"})(ka||(ka={}));var ji;(function(n){n.Interval="interval",n.Worker="worker"})(ji||(ji={}));class OE{constructor(o,i=ji.Interval,s){this._interval=o,this._strategy=i,this._debug=s,this._workerScript=` + var startTime = Date.now(); + setInterval(function() { + self.postMessage(Date.now() - startTime); + }, ${this._interval}); + `}start(o){this.stop(),this.shouldUseWorker()?this.runWorker(o):this.runInterval(o)}stop(){this.disposeWorker(),this.disposeInterval()}shouldUseWorker(){return typeof Worker<"u"&&this._strategy===ji.Worker}runWorker(o){this._debug("Using runWorker for outgoing pings"),this._worker||(this._worker=new Worker(URL.createObjectURL(new Blob([this._workerScript],{type:"text/javascript"}))),this._worker.onmessage=i=>o(i.data))}runInterval(o){if(this._debug("Using runInterval for outgoing pings"),!this._timer){const i=Date.now();this._timer=setInterval(()=>{o(Date.now()-i)},this._interval)}}disposeWorker(){this._worker&&(this._worker.terminate(),delete this._worker,this._debug("Outgoing ping disposeWorker"))}disposeInterval(){this._timer&&(clearInterval(this._timer),delete this._timer,this._debug("Outgoing ping disposeInterval"))}}class Lt{constructor(o){this.versions=o}supportedVersions(){return this.versions.join(",")}protocolVersions(){return this.versions.map(o=>`v${o.replace(".","")}.stomp`)}}Lt.V1_0="1.0";Lt.V1_1="1.1";Lt.V1_2="1.2";Lt.default=new Lt([Lt.V1_2,Lt.V1_1,Lt.V1_0]);class NE{get connectedVersion(){return this._connectedVersion}get connected(){return this._connected}constructor(o,i,s){this._client=o,this._webSocket=i,this._connected=!1,this._serverFrameHandlers={CONNECTED:l=>{this.debug(`connected to server ${l.headers.server}`),this._connected=!0,this._connectedVersion=l.headers.version,this._connectedVersion===Lt.V1_2&&(this._escapeHeaderValues=!0),this._setupHeartbeat(l.headers),this.onConnect(l)},MESSAGE:l=>{const c=l.headers.subscription,d=this._subscriptions[c]||this.onUnhandledMessage,p=l,g=this,y=this._connectedVersion===Lt.V1_2?p.headers.ack:p.headers["message-id"];p.ack=(v={})=>g.ack(y,c,v),p.nack=(v={})=>g.nack(y,c,v),d(p)},RECEIPT:l=>{const c=this._receiptWatchers[l.headers["receipt-id"]];c?(c(l),delete this._receiptWatchers[l.headers["receipt-id"]]):this.onUnhandledReceipt(l)},ERROR:l=>{this.onStompError(l)}},this._counter=0,this._subscriptions={},this._receiptWatchers={},this._partialData="",this._escapeHeaderValues=!1,this._lastServerActivityTS=Date.now(),this.debug=s.debug,this.stompVersions=s.stompVersions,this.connectHeaders=s.connectHeaders,this.disconnectHeaders=s.disconnectHeaders,this.heartbeatIncoming=s.heartbeatIncoming,this.heartbeatOutgoing=s.heartbeatOutgoing,this.splitLargeFrames=s.splitLargeFrames,this.maxWebSocketChunkSize=s.maxWebSocketChunkSize,this.forceBinaryWSFrames=s.forceBinaryWSFrames,this.logRawCommunication=s.logRawCommunication,this.appendMissingNULLonIncoming=s.appendMissingNULLonIncoming,this.discardWebsocketOnCommFailure=s.discardWebsocketOnCommFailure,this.onConnect=s.onConnect,this.onDisconnect=s.onDisconnect,this.onStompError=s.onStompError,this.onWebSocketClose=s.onWebSocketClose,this.onWebSocketError=s.onWebSocketError,this.onUnhandledMessage=s.onUnhandledMessage,this.onUnhandledReceipt=s.onUnhandledReceipt,this.onUnhandledFrame=s.onUnhandledFrame}start(){const o=new AE(i=>{const s=hr.fromRawFrame(i,this._escapeHeaderValues);this.logRawCommunication||this.debug(`<<< ${s}`),(this._serverFrameHandlers[s.command]||this.onUnhandledFrame)(s)},()=>{this.debug("<<< PONG")});this._webSocket.onmessage=i=>{if(this.debug("Received data"),this._lastServerActivityTS=Date.now(),this.logRawCommunication){const s=i.data instanceof ArrayBuffer?new TextDecoder().decode(i.data):i.data;this.debug(`<<< ${s}`)}o.parseChunk(i.data,this.appendMissingNULLonIncoming)},this._webSocket.onclose=i=>{this.debug(`Connection closed to ${this._webSocket.url}`),this._cleanUp(),this.onWebSocketClose(i)},this._webSocket.onerror=i=>{this.onWebSocketError(i)},this._webSocket.onopen=()=>{const i=Object.assign({},this.connectHeaders);this.debug("Web Socket Opened..."),i["accept-version"]=this.stompVersions.supportedVersions(),i["heart-beat"]=[this.heartbeatOutgoing,this.heartbeatIncoming].join(","),this._transmit({command:"CONNECT",headers:i})}}_setupHeartbeat(o){if(o.version!==Lt.V1_1&&o.version!==Lt.V1_2||!o["heart-beat"])return;const[i,s]=o["heart-beat"].split(",").map(l=>parseInt(l,10));if(this.heartbeatOutgoing!==0&&s!==0){const l=Math.max(this.heartbeatOutgoing,s);this.debug(`send PING every ${l}ms`),this._pinger=new OE(l,this._client.heartbeatStrategy,this.debug),this._pinger.start(()=>{this._webSocket.readyState===mr.OPEN&&(this._webSocket.send(xi.LF),this.debug(">>> PING"))})}if(this.heartbeatIncoming!==0&&i!==0){const l=Math.max(this.heartbeatIncoming,i);this.debug(`check PONG every ${l}ms`),this._ponger=setInterval(()=>{const c=Date.now()-this._lastServerActivityTS;c>l*2&&(this.debug(`did not receive server activity for the last ${c}ms`),this._closeOrDiscardWebsocket())},l)}}_closeOrDiscardWebsocket(){this.discardWebsocketOnCommFailure?(this.debug("Discarding websocket, the underlying socket may linger for a while"),this.discardWebsocket()):(this.debug("Issuing close on the websocket"),this._closeWebsocket())}forceDisconnect(){this._webSocket&&(this._webSocket.readyState===mr.CONNECTING||this._webSocket.readyState===mr.OPEN)&&this._closeOrDiscardWebsocket()}_closeWebsocket(){this._webSocket.onmessage=()=>{},this._webSocket.close()}discardWebsocket(){typeof this._webSocket.terminate!="function"&&jE(this._webSocket,o=>this.debug(o)),this._webSocket.terminate()}_transmit(o){const{command:i,headers:s,body:l,binaryBody:c,skipContentLengthHeader:d}=o,p=new hr({command:i,headers:s,body:l,binaryBody:c,escapeHeaderValues:this._escapeHeaderValues,skipContentLengthHeader:d});let g=p.serialize();if(this.logRawCommunication?this.debug(`>>> ${g}`):this.debug(`>>> ${p}`),this.forceBinaryWSFrames&&typeof g=="string"&&(g=new TextEncoder().encode(g)),typeof g!="string"||!this.splitLargeFrames)this._webSocket.send(g);else{let y=g;for(;y.length>0;){const v=y.substring(0,this.maxWebSocketChunkSize);y=y.substring(this.maxWebSocketChunkSize),this._webSocket.send(v),this.debug(`chunk sent = ${v.length}, remaining = ${y.length}`)}}}dispose(){if(this.connected)try{const o=Object.assign({},this.disconnectHeaders);o.receipt||(o.receipt=`close-${this._counter++}`),this.watchForReceipt(o.receipt,i=>{this._closeWebsocket(),this._cleanUp(),this.onDisconnect(i)}),this._transmit({command:"DISCONNECT",headers:o})}catch(o){this.debug(`Ignoring error during disconnect ${o}`)}else(this._webSocket.readyState===mr.CONNECTING||this._webSocket.readyState===mr.OPEN)&&this._closeWebsocket()}_cleanUp(){this._connected=!1,this._pinger&&(this._pinger.stop(),this._pinger=void 0),this._ponger&&(clearInterval(this._ponger),this._ponger=void 0)}publish(o){const{destination:i,headers:s,body:l,binaryBody:c,skipContentLengthHeader:d}=o,p=Object.assign({destination:i},s);this._transmit({command:"SEND",headers:p,body:l,binaryBody:c,skipContentLengthHeader:d})}watchForReceipt(o,i){this._receiptWatchers[o]=i}subscribe(o,i,s={}){s=Object.assign({},s),s.id||(s.id=`sub-${this._counter++}`),s.destination=o,this._subscriptions[s.id]=i,this._transmit({command:"SUBSCRIBE",headers:s});const l=this;return{id:s.id,unsubscribe(c){return l.unsubscribe(s.id,c)}}}unsubscribe(o,i={}){i=Object.assign({},i),delete this._subscriptions[o],i.id=o,this._transmit({command:"UNSUBSCRIBE",headers:i})}begin(o){const i=o||`tx-${this._counter++}`;this._transmit({command:"BEGIN",headers:{transaction:i}});const s=this;return{id:i,commit(){s.commit(i)},abort(){s.abort(i)}}}commit(o){this._transmit({command:"COMMIT",headers:{transaction:o}})}abort(o){this._transmit({command:"ABORT",headers:{transaction:o}})}ack(o,i,s={}){s=Object.assign({},s),this._connectedVersion===Lt.V1_2?s.id=o:s["message-id"]=o,s.subscription=i,this._transmit({command:"ACK",headers:s})}nack(o,i,s={}){return s=Object.assign({},s),this._connectedVersion===Lt.V1_2?s.id=o:s["message-id"]=o,s.subscription=i,this._transmit({command:"NACK",headers:s})}}class IE{get webSocket(){var o;return(o=this._stompHandler)==null?void 0:o._webSocket}get disconnectHeaders(){return this._disconnectHeaders}set disconnectHeaders(o){this._disconnectHeaders=o,this._stompHandler&&(this._stompHandler.disconnectHeaders=this._disconnectHeaders)}get connected(){return!!this._stompHandler&&this._stompHandler.connected}get connectedVersion(){return this._stompHandler?this._stompHandler.connectedVersion:void 0}get active(){return this.state===Sn.ACTIVE}_changeState(o){this.state=o,this.onChangeState(o)}constructor(o={}){this.stompVersions=Lt.default,this.connectionTimeout=0,this.reconnectDelay=5e3,this._nextReconnectDelay=0,this.maxReconnectDelay=15*60*1e3,this.reconnectTimeMode=ka.LINEAR,this.heartbeatIncoming=1e4,this.heartbeatOutgoing=1e4,this.heartbeatStrategy=ji.Interval,this.splitLargeFrames=!1,this.maxWebSocketChunkSize=8*1024,this.forceBinaryWSFrames=!1,this.appendMissingNULLonIncoming=!1,this.discardWebsocketOnCommFailure=!1,this.state=Sn.INACTIVE;const i=()=>{};this.debug=i,this.beforeConnect=i,this.onConnect=i,this.onDisconnect=i,this.onUnhandledMessage=i,this.onUnhandledReceipt=i,this.onUnhandledFrame=i,this.onStompError=i,this.onWebSocketClose=i,this.onWebSocketError=i,this.logRawCommunication=!1,this.onChangeState=i,this.connectHeaders={},this._disconnectHeaders={},this.configure(o)}configure(o){Object.assign(this,o),this.maxReconnectDelay>0&&this.maxReconnectDelay{if(this.active){this.debug("Already ACTIVE, ignoring request to activate");return}this._changeState(Sn.ACTIVE),this._nextReconnectDelay=this.reconnectDelay,this._connect()};this.state===Sn.DEACTIVATING?(this.debug("Waiting for deactivation to finish before activating"),this.deactivate().then(()=>{o()})):o()}async _connect(){if(await this.beforeConnect(this),this._stompHandler){this.debug("There is already a stompHandler, skipping the call to connect");return}if(!this.active){this.debug("Client has been marked inactive, will not attempt to connect");return}this.connectionTimeout>0&&(this._connectionWatcher&&clearTimeout(this._connectionWatcher),this._connectionWatcher=setTimeout(()=>{this.connected||(this.debug(`Connection not established in ${this.connectionTimeout}ms, closing socket`),this.forceDisconnect())},this.connectionTimeout)),this.debug("Opening Web Socket...");const o=this._createWebSocket();this._stompHandler=new NE(this,o,{debug:this.debug,stompVersions:this.stompVersions,connectHeaders:this.connectHeaders,disconnectHeaders:this._disconnectHeaders,heartbeatIncoming:this.heartbeatIncoming,heartbeatOutgoing:this.heartbeatOutgoing,heartbeatStrategy:this.heartbeatStrategy,splitLargeFrames:this.splitLargeFrames,maxWebSocketChunkSize:this.maxWebSocketChunkSize,forceBinaryWSFrames:this.forceBinaryWSFrames,logRawCommunication:this.logRawCommunication,appendMissingNULLonIncoming:this.appendMissingNULLonIncoming,discardWebsocketOnCommFailure:this.discardWebsocketOnCommFailure,onConnect:i=>{if(this._connectionWatcher&&(clearTimeout(this._connectionWatcher),this._connectionWatcher=void 0),!this.active){this.debug("STOMP got connected while deactivate was issued, will disconnect now"),this._disposeStompHandler();return}this.onConnect(i)},onDisconnect:i=>{this.onDisconnect(i)},onStompError:i=>{this.onStompError(i)},onWebSocketClose:i=>{this._stompHandler=void 0,this.state===Sn.DEACTIVATING&&this._changeState(Sn.INACTIVE),this.onWebSocketClose(i),this.active&&this._schedule_reconnect()},onWebSocketError:i=>{this.onWebSocketError(i)},onUnhandledMessage:i=>{this.onUnhandledMessage(i)},onUnhandledReceipt:i=>{this.onUnhandledReceipt(i)},onUnhandledFrame:i=>{this.onUnhandledFrame(i)}}),this._stompHandler.start()}_createWebSocket(){let o;if(this.webSocketFactory)o=this.webSocketFactory();else if(this.brokerURL)o=new WebSocket(this.brokerURL,this.stompVersions.protocolVersions());else throw new Error("Either brokerURL or webSocketFactory must be provided");return o.binaryType="arraybuffer",o}_schedule_reconnect(){this._nextReconnectDelay>0&&(this.debug(`STOMP: scheduling reconnection in ${this._nextReconnectDelay}ms`),this._reconnector=setTimeout(()=>{this.reconnectTimeMode===ka.EXPONENTIAL&&(this._nextReconnectDelay=this._nextReconnectDelay*2,this.maxReconnectDelay!==0&&(this._nextReconnectDelay=Math.min(this._nextReconnectDelay,this.maxReconnectDelay))),this._connect()},this._nextReconnectDelay))}async deactivate(o={}){var c;const i=o.force||!1,s=this.active;let l;if(this.state===Sn.INACTIVE)return this.debug("Already INACTIVE, nothing more to do"),Promise.resolve();if(this._changeState(Sn.DEACTIVATING),this._nextReconnectDelay=0,this._reconnector&&(clearTimeout(this._reconnector),this._reconnector=void 0),this._stompHandler&&this.webSocket.readyState!==mr.CLOSED){const d=this._stompHandler.onWebSocketClose;l=new Promise((p,g)=>{this._stompHandler.onWebSocketClose=y=>{d(y),p()}})}else return this._changeState(Sn.INACTIVE),Promise.resolve();return i?(c=this._stompHandler)==null||c.discardWebsocket():s&&this._disposeStompHandler(),l}forceDisconnect(){this._stompHandler&&this._stompHandler.forceDisconnect()}_disposeStompHandler(){this._stompHandler&&this._stompHandler.dispose()}publish(o){this._checkConnection(),this._stompHandler.publish(o)}_checkConnection(){if(!this.connected)throw new TypeError("There is no underlying STOMP connection")}watchForReceipt(o,i){this._checkConnection(),this._stompHandler.watchForReceipt(o,i)}subscribe(o,i,s={}){return this._checkConnection(),this._stompHandler.subscribe(o,i,s)}unsubscribe(o,i={}){this._checkConnection(),this._stompHandler.unsubscribe(o,i)}begin(o){return this._checkConnection(),this._stompHandler.begin(o)}commit(o){this._checkConnection(),this._stompHandler.commit(o)}abort(o){this._checkConnection(),this._stompHandler.abort(o)}ack(o,i,s={}){this._checkConnection(),this._stompHandler.ack(o,i,s)}nack(o,i,s={}){this._checkConnection(),this._stompHandler.nack(o,i,s)}}var Wu={exports:{}},na={},cm;function LE(){return cm||(cm=1,ie.crypto&&ie.crypto.getRandomValues?na.randomBytes=function(n){var o=new Uint8Array(n);return ie.crypto.getRandomValues(o),o}:na.randomBytes=function(n){for(var o=new Array(n),i=0;i=2&&(P=P.slice(2)):E(S)?P=k[4]:S?U&&(P=P.slice(2)):L>=2&&E(R.protocol)&&(P=k[4]),{protocol:S,slashes:U||E(S),slashesCount:L,rest:P}}function j(A,R){if(A==="")return R;for(var k=(R||"/").split("/").slice(0,-1).concat(A.split("/")),S=k.length,U=k[S-1],D=!1,L=0;S--;)k[S]==="."?k.splice(S,1):k[S]===".."?(k.splice(S,1),L++):L&&(S===0&&(D=!0),k.splice(S,1),L--);return D&&k.unshift(""),(U==="."||U==="..")&&k.push(""),k.join("/")}function b(A,R,k){if(A=g(A),A=A.replace(s,""),!(this instanceof b))return new b(A,R,k);var S,U,D,L,P,X,re=y.slice(),Ce=typeof R,te=this,ae=0;for(Ce!=="object"&&Ce!=="string"&&(k=R,R=null),k&&typeof k!="function"&&(k=o.parse),R=x(R),U=M(A||"",R),S=!U.protocol&&!U.slashes,te.slashes=U.slashes||S&&R.slashes,te.protocol=U.protocol||R.protocol||"",A=U.rest,(U.protocol==="file:"&&(U.slashesCount!==2||p.test(A))||!U.slashes&&(U.protocol||U.slashesCount<2||!E(te.protocol)))&&(re[3]=[/(.*)/,"pathname"]);ae1?this._listeners[o]=s.slice(0,l).concat(s.slice(l+1)):delete this._listeners[o];return}}},n.prototype.dispatchEvent=function(){var o=arguments[0],i=o.type,s=arguments.length===1?[o]:Array.apply(null,arguments);if(this["on"+i]&&this["on"+i].apply(this,s),i in this._listeners)for(var l=this._listeners[i],c=0;c0){var c="["+this.sendBuffer.join(",")+"]";this.sendStop=this.sender(this.url,c,function(d){l.sendStop=null,d?(l.emit("close",d.code||1006,"Sending error: "+d),l.close()):l.sendScheduleWait()}),this.sendBuffer=[]}},s.prototype._cleanup=function(){this.removeAllListeners()},s.prototype.close=function(){this._cleanup(),this.sendStop&&(this.sendStop(),this.sendStop=null)},Zu=s,Zu}var ec,Cm;function UE(){if(Cm)return ec;Cm=1;var n=Be(),o=Pt().EventEmitter,i=function(){};function s(l,c,d){o.call(this),this.Receiver=l,this.receiveUrl=c,this.AjaxObject=d,this._scheduleReceiver()}return n(s,o),s.prototype._scheduleReceiver=function(){var l=this,c=this.poll=new this.Receiver(this.receiveUrl,this.AjaxObject);c.on("message",function(d){l.emit("message",d)}),c.once("close",function(d,p){i("close",d,p,l.pollIsClosing),l.poll=c=null,l.pollIsClosing||(p==="network"?l._scheduleReceiver():(l.emit("close",d||1006,p),l.removeAllListeners()))})},s.prototype.abort=function(){this.removeAllListeners(),this.pollIsClosing=!0,this.poll&&this.poll.abort()},ec=s,ec}var tc,km;function Ly(){if(km)return tc;km=1;var n=Be(),o=un(),i=BE(),s=UE();function l(c,d,p,g,y){var v=o.addPath(c,d),x=this;i.call(this,c,p),this.poll=new s(g,v,y),this.poll.on("message",function(E){x.emit("message",E)}),this.poll.once("close",function(E,M){x.poll=null,x.emit("close",E,M),x.close()})}return n(l,i),l.prototype.close=function(){i.prototype.close.call(this),this.removeAllListeners(),this.poll&&(this.poll.abort(),this.poll=null)},tc=l,tc}var nc,bm;function jo(){if(bm)return nc;bm=1;var n=Be(),o=un(),i=Ly();function s(c){return function(d,p,g){var y={};typeof p=="string"&&(y.headers={"Content-type":"text/plain"});var v=o.addPath(d,"/xhr_send"),x=new c("POST",v,p,y);return x.once("finish",function(E){if(x=null,E!==200&&E!==204)return g(new Error("http status "+E));g()}),function(){x.close(),x=null;var E=new Error("Aborted");E.code=1e3,g(E)}}}function l(c,d,p,g){i.call(this,c,d,s(g),p,g)}return n(l,i),nc=l,nc}var rc,_m;function Ba(){if(_m)return rc;_m=1;var n=Be(),o=Pt().EventEmitter;function i(s,l){o.call(this);var c=this;this.bufferPosition=0,this.xo=new l("POST",s,null),this.xo.on("chunk",this._chunkHandler.bind(this)),this.xo.once("finish",function(d,p){c._chunkHandler(d,p),c.xo=null;var g=d===200?"network":"permanent";c.emit("close",null,g),c._cleanup()})}return n(i,o),i.prototype._chunkHandler=function(s,l){if(!(s!==200||!l))for(var c=-1;;this.bufferPosition+=c+1){var d=l.slice(this.bufferPosition);if(c=d.indexOf(` +`),c===-1)break;var p=d.slice(0,c);p&&this.emit("message",p)}},i.prototype._cleanup=function(){this.removeAllListeners()},i.prototype.abort=function(){this.xo&&(this.xo.close(),this.emit("close",null,"user"),this.xo=null),this._cleanup()},rc=i,rc}var oc,Rm;function Py(){if(Rm)return oc;Rm=1;var n=Pt().EventEmitter,o=Be(),i=wr(),s=un(),l=ie.XMLHttpRequest,c=function(){};function d(y,v,x,E){var M=this;n.call(this),setTimeout(function(){M._start(y,v,x,E)},0)}o(d,n),d.prototype._start=function(y,v,x,E){var M=this;try{this.xhr=new l}catch{}if(!this.xhr){this.emit("finish",0,"no xhr support"),this._cleanup();return}v=s.addQuery(v,"t="+ +new Date),this.unloadRef=i.unloadAdd(function(){M._cleanup(!0)});try{this.xhr.open(y,v,!0),this.timeout&&"timeout"in this.xhr&&(this.xhr.timeout=this.timeout,this.xhr.ontimeout=function(){c("xhr timeout"),M.emit("finish",0,""),M._cleanup(!1)})}catch{this.emit("finish",0,""),this._cleanup(!1);return}if((!E||!E.noCredentials)&&d.supportsCORS&&(this.xhr.withCredentials=!0),E&&E.headers)for(var j in E.headers)this.xhr.setRequestHeader(j,E.headers[j]);this.xhr.onreadystatechange=function(){if(M.xhr){var b=M.xhr,T,G;switch(c("readyState",b.readyState),b.readyState){case 3:try{G=b.status,T=b.responseText}catch{}G===1223&&(G=204),G===200&&T&&T.length>0&&M.emit("chunk",G,T);break;case 4:G=b.status,G===1223&&(G=204),(G===12005||G===12029)&&(G=0),c("finish",G,b.responseText),M.emit("finish",G,b.responseText),M._cleanup(!1);break}}};try{M.xhr.send(x)}catch{M.emit("finish",0,""),M._cleanup(!1)}},d.prototype._cleanup=function(y){if(this.xhr){if(this.removeAllListeners(),i.unloadDel(this.unloadRef),this.xhr.onreadystatechange=function(){},this.xhr.ontimeout&&(this.xhr.ontimeout=null),y)try{this.xhr.abort()}catch{}this.unloadRef=this.xhr=null}},d.prototype.close=function(){this._cleanup(!0)},d.enabled=!!l;var p=["Active"].concat("Object").join("X");!d.enabled&&p in ie&&(l=function(){try{return new ie[p]("Microsoft.XMLHTTP")}catch{return null}},d.enabled=!!new l);var g=!1;try{g="withCredentials"in new l}catch{}return d.supportsCORS=g,oc=d,oc}var ic,jm;function Ua(){if(jm)return ic;jm=1;var n=Be(),o=Py();function i(s,l,c,d){o.call(this,s,l,c,d)}return n(i,o),i.enabled=o.enabled&&o.supportsCORS,ic=i,ic}var sc,Tm;function Li(){if(Tm)return sc;Tm=1;var n=Be(),o=Py();function i(s,l,c){o.call(this,s,l,c,{noCredentials:!0})}return n(i,o),i.enabled=o.enabled,sc=i,sc}var ac,Am;function Pi(){return Am||(Am=1,ac={isOpera:function(){return ie.navigator&&/opera/i.test(ie.navigator.userAgent)},isKonqueror:function(){return ie.navigator&&/konqueror/i.test(ie.navigator.userAgent)},hasDomain:function(){if(!ie.document)return!0;try{return!!ie.document.domain}catch{return!1}}}),ac}var lc,Om;function FE(){if(Om)return lc;Om=1;var n=Be(),o=jo(),i=Ba(),s=Ua(),l=Li(),c=Pi();function d(p){if(!l.enabled&&!s.enabled)throw new Error("Transport created when disabled");o.call(this,p,"/xhr_streaming",i,s)}return n(d,o),d.enabled=function(p){return p.nullOrigin||c.isOpera()?!1:s.enabled},d.transportName="xhr-streaming",d.roundTrips=2,d.needBody=!!ie.document,lc=d,lc}var uc,Nm;function yd(){if(Nm)return uc;Nm=1;var n=Pt().EventEmitter,o=Be(),i=wr(),s=Pi(),l=un(),c=function(){};function d(p,g,y){var v=this;n.call(this),setTimeout(function(){v._start(p,g,y)},0)}return o(d,n),d.prototype._start=function(p,g,y){var v=this,x=new ie.XDomainRequest;g=l.addQuery(g,"t="+ +new Date),x.onerror=function(){v._error()},x.ontimeout=function(){v._error()},x.onprogress=function(){c("progress",x.responseText),v.emit("chunk",200,x.responseText)},x.onload=function(){v.emit("finish",200,x.responseText),v._cleanup(!1)},this.xdr=x,this.unloadRef=i.unloadAdd(function(){v._cleanup(!0)});try{this.xdr.open(p,g),this.timeout&&(this.xdr.timeout=this.timeout),this.xdr.send(y)}catch{this._error()}},d.prototype._error=function(){this.emit("finish",0,""),this._cleanup(!1)},d.prototype._cleanup=function(p){if(this.xdr){if(this.removeAllListeners(),i.unloadDel(this.unloadRef),this.xdr.ontimeout=this.xdr.onerror=this.xdr.onprogress=this.xdr.onload=null,p)try{this.xdr.abort()}catch{}this.unloadRef=this.xdr=null}},d.prototype.close=function(){this._cleanup(!0)},d.enabled=!!(ie.XDomainRequest&&s.hasDomain()),uc=d,uc}var cc,Im;function My(){if(Im)return cc;Im=1;var n=Be(),o=jo(),i=Ba(),s=yd();function l(c){if(!s.enabled)throw new Error("Transport created when disabled");o.call(this,c,"/xhr_streaming",i,s)}return n(l,o),l.enabled=function(c){return c.cookie_needed||c.nullOrigin?!1:s.enabled&&c.sameScheme},l.transportName="xdr-streaming",l.roundTrips=2,cc=l,cc}var dc,Lm;function Dy(){return Lm||(Lm=1,dc=ie.EventSource),dc}var fc,Pm;function zE(){if(Pm)return fc;Pm=1;var n=Be(),o=Pt().EventEmitter,i=Dy(),s=function(){};function l(c){o.call(this);var d=this,p=this.es=new i(c);p.onmessage=function(g){s("message",g.data),d.emit("message",decodeURI(g.data))},p.onerror=function(g){s("error",p.readyState);var y=p.readyState!==2?"network":"permanent";d._cleanup(),d._close(y)}}return n(l,o),l.prototype.abort=function(){this._cleanup(),this._close("user")},l.prototype._cleanup=function(){var c=this.es;c&&(c.onmessage=c.onerror=null,c.close(),this.es=null)},l.prototype._close=function(c){var d=this;setTimeout(function(){d.emit("close",null,c),d.removeAllListeners()},200)},fc=l,fc}var pc,Mm;function Dm(){if(Mm)return pc;Mm=1;var n=Be(),o=jo(),i=zE(),s=Ua(),l=Dy();function c(d){if(!c.enabled())throw new Error("Transport created when disabled");o.call(this,d,"/eventsource",i,s)}return n(c,o),c.enabled=function(){return!!l},c.transportName="eventsource",c.roundTrips=2,pc=c,pc}var hc,$m;function $y(){return $m||($m=1,hc="1.6.1"),hc}var mc={exports:{}},Bm;function Mi(){return Bm||(Bm=1,function(n){var o=wr(),i=Pi();n.exports={WPrefix:"_jp",currentWindowId:null,polluteGlobalNamespace:function(){n.exports.WPrefix in ie||(ie[n.exports.WPrefix]={})},postMessage:function(s,l){ie.parent!==ie&&ie.parent.postMessage(JSON.stringify({windowId:n.exports.currentWindowId,type:s,data:l||""}),"*")},createIframe:function(s,l){var c=ie.document.createElement("iframe"),d,p,g=function(){clearTimeout(d);try{c.onload=null}catch{}c.onerror=null},y=function(){c&&(g(),setTimeout(function(){c&&c.parentNode.removeChild(c),c=null},0),o.unloadDel(p))},v=function(E){c&&(y(),l(E))},x=function(E,M){setTimeout(function(){try{c&&c.contentWindow&&c.contentWindow.postMessage(E,M)}catch{}},0)};return c.src=s,c.style.display="none",c.style.position="absolute",c.onerror=function(){v("onerror")},c.onload=function(){clearTimeout(d),d=setTimeout(function(){v("onload timeout")},2e3)},ie.document.body.appendChild(c),d=setTimeout(function(){v("timeout")},15e3),p=o.unloadAdd(y),{post:x,cleanup:y,loaded:g}},createHtmlfile:function(s,l){var c=["Active"].concat("Object").join("X"),d=new ie[c]("htmlfile"),p,g,y,v=function(){clearTimeout(p),y.onerror=null},x=function(){d&&(v(),o.unloadDel(g),y.parentNode.removeChild(y),y=d=null,CollectGarbage())},E=function(b){d&&(x(),l(b))},M=function(b,T){try{setTimeout(function(){y&&y.contentWindow&&y.contentWindow.postMessage(b,T)},0)}catch{}};d.open(),d.write(' +
+