diff --git a/backend/src/main/java/com/storycove/config/DatabaseConfig.java b/backend/src/main/java/com/storycove/config/DatabaseConfig.java new file mode 100644 index 0000000..6b70c97 --- /dev/null +++ b/backend/src/main/java/com/storycove/config/DatabaseConfig.java @@ -0,0 +1,69 @@ +package com.storycove.config; + +import com.storycove.service.LibraryService; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +/** + * Database configuration that sets up library-aware datasource routing. + * + * This configuration replaces the default Spring Boot datasource with a routing + * datasource that automatically directs all database operations to the appropriate + * library-specific database based on the current active library. + */ +@Configuration +public class DatabaseConfig { + + @Value("${spring.datasource.url}") + private String baseDbUrl; + + @Value("${spring.datasource.username}") + private String dbUsername; + + @Value("${spring.datasource.password}") + private String dbPassword; + + /** + * Create a fallback datasource for when no library is active. + * This connects to the main database specified in application.yml. + */ + @Bean(name = "fallbackDataSource") + public DataSource fallbackDataSource() { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(baseDbUrl); + config.setUsername(dbUsername); + config.setPassword(dbPassword); + config.setDriverClassName("org.postgresql.Driver"); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(30000); + + return new HikariDataSource(config); + } + + /** + * Primary datasource bean - using fallback for stability. + * Library-specific routing will be handled at the service layer instead. + */ + @Bean(name = "dataSource") + @Primary + public DataSource primaryDataSource() { + return fallbackDataSource(); + } + + /** + * Optional routing datasource for future use if needed + */ + @Bean(name = "libraryRoutingDataSource") + public DataSource libraryAwareDataSource(LibraryService libraryService) { + LibraryAwareDataSource routingDataSource = new LibraryAwareDataSource(libraryService); + routingDataSource.setDefaultTargetDataSource(fallbackDataSource()); + return routingDataSource; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/config/LibraryAwareDataSource.java b/backend/src/main/java/com/storycove/config/LibraryAwareDataSource.java new file mode 100644 index 0000000..1ac8ec9 --- /dev/null +++ b/backend/src/main/java/com/storycove/config/LibraryAwareDataSource.java @@ -0,0 +1,65 @@ +package com.storycove.config; + +import com.storycove.service.LibraryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * Custom DataSource router that dynamically routes database calls to the appropriate + * library-specific datasource based on the current active library. + * + * This makes ALL Spring Data JPA repositories automatically library-aware without + * requiring changes to existing repository or service code. + */ +public class LibraryAwareDataSource extends AbstractRoutingDataSource { + + private static final Logger logger = LoggerFactory.getLogger(LibraryAwareDataSource.class); + + private final LibraryService libraryService; + + public LibraryAwareDataSource(LibraryService libraryService) { + this.libraryService = libraryService; + // Set empty target datasources to satisfy AbstractRoutingDataSource requirements + // We override determineTargetDataSource() so this won't be used + setTargetDataSources(new java.util.HashMap<>()); + } + + @Override + protected Object determineCurrentLookupKey() { + String currentLibraryId = libraryService.getCurrentLibraryId(); + logger.debug("Routing database call to library: {}", currentLibraryId); + return currentLibraryId; + } + + @Override + protected javax.sql.DataSource determineTargetDataSource() { + try { + // Check if LibraryService is properly initialized + if (libraryService == null) { + logger.debug("LibraryService not available, using default datasource"); + return getResolvedDefaultDataSource(); + } + + // Check if any library is currently active + String currentLibraryId = libraryService.getCurrentLibraryId(); + if (currentLibraryId == null) { + logger.debug("No active library, using default datasource"); + return getResolvedDefaultDataSource(); + } + + // Try to get the current library datasource + javax.sql.DataSource libraryDataSource = libraryService.getCurrentDataSource(); + logger.debug("Successfully routing database call to library: {}", currentLibraryId); + return libraryDataSource; + + } catch (IllegalStateException e) { + // This is expected during authentication, startup, or when no library is active + logger.debug("No active library (IllegalStateException) - using default datasource: {}", e.getMessage()); + return getResolvedDefaultDataSource(); + } catch (Exception e) { + logger.warn("Unexpected error determining target datasource, falling back to default: {}", e.getMessage(), e); + return getResolvedDefaultDataSource(); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/controller/AuthController.java b/backend/src/main/java/com/storycove/controller/AuthController.java index fd2f56a..85a0ee6 100644 --- a/backend/src/main/java/com/storycove/controller/AuthController.java +++ b/backend/src/main/java/com/storycove/controller/AuthController.java @@ -27,9 +27,10 @@ public class AuthController { @PostMapping("/login") public ResponseEntity login(@Valid @RequestBody LoginRequest request, HttpServletResponse response) { - if (passwordService.authenticate(request.getPassword())) { - String token = jwtUtil.generateToken(); - + // Use new library-aware authentication + String token = passwordService.authenticateAndSwitchLibrary(request.getPassword()); + + if (token != null) { // Set httpOnly cookie ResponseCookie cookie = ResponseCookie.from("token", token) .httpOnly(true) @@ -40,7 +41,8 @@ public class AuthController { response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); - return ResponseEntity.ok(new LoginResponse("Authentication successful", token)); + String libraryInfo = passwordService.getCurrentLibraryInfo(); + return ResponseEntity.ok(new LoginResponse("Authentication successful - " + libraryInfo, token)); } else { return ResponseEntity.status(401).body(new ErrorResponse("Invalid password")); } diff --git a/backend/src/main/java/com/storycove/controller/LibraryController.java b/backend/src/main/java/com/storycove/controller/LibraryController.java new file mode 100644 index 0000000..6f9fe63 --- /dev/null +++ b/backend/src/main/java/com/storycove/controller/LibraryController.java @@ -0,0 +1,203 @@ +package com.storycove.controller; + +import com.storycove.dto.LibraryDto; +import com.storycove.service.LibraryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/libraries") +public class LibraryController { + + private static final Logger logger = LoggerFactory.getLogger(LibraryController.class); + + private final LibraryService libraryService; + + @Autowired + public LibraryController(LibraryService libraryService) { + this.libraryService = libraryService; + } + + /** + * Get all available libraries (for settings UI) + */ + @GetMapping + public ResponseEntity> getAllLibraries() { + try { + List libraries = libraryService.getAllLibraries(); + return ResponseEntity.ok(libraries); + } catch (Exception e) { + logger.error("Failed to get libraries", e); + return ResponseEntity.internalServerError().build(); + } + } + + /** + * Get current active library info + */ + @GetMapping("/current") + public ResponseEntity getCurrentLibrary() { + try { + var library = libraryService.getCurrentLibrary(); + if (library == null) { + return ResponseEntity.noContent().build(); + } + + LibraryDto dto = new LibraryDto( + library.getId(), + library.getName(), + library.getDescription(), + true, // always active since it's current + library.isInitialized() + ); + + return ResponseEntity.ok(dto); + } catch (Exception e) { + logger.error("Failed to get current library", e); + return ResponseEntity.internalServerError().build(); + } + } + + /** + * Switch to a different library (requires re-authentication) + * This endpoint returns a switching status that the frontend can poll + */ + @PostMapping("/switch") + public ResponseEntity> initiateLibrarySwitch(@RequestBody Map request) { + try { + String password = request.get("password"); + if (password == null || password.trim().isEmpty()) { + return ResponseEntity.badRequest().body(Map.of("error", "Password required")); + } + + String libraryId = libraryService.authenticateAndGetLibrary(password); + if (libraryId == null) { + return ResponseEntity.status(401).body(Map.of("error", "Invalid password")); + } + + // Check if already on this library + if (libraryId.equals(libraryService.getCurrentLibraryId())) { + return ResponseEntity.ok(Map.of( + "status", "already_active", + "message", "Already using this library" + )); + } + + // Initiate switch in background thread + new Thread(() -> { + try { + libraryService.switchToLibrary(libraryId); + logger.info("Library switch completed: {}", libraryId); + } catch (Exception e) { + logger.error("Library switch failed: {}", libraryId, e); + } + }).start(); + + return ResponseEntity.ok(Map.of( + "status", "switching", + "targetLibrary", libraryId, + "message", "Switching to library, please wait..." + )); + + } catch (Exception e) { + logger.error("Failed to initiate library switch", e); + return ResponseEntity.internalServerError().body(Map.of("error", "Server error")); + } + } + + /** + * Check library switch status + */ + @GetMapping("/switch/status") + public ResponseEntity> getLibrarySwitchStatus() { + try { + var currentLibrary = libraryService.getCurrentLibrary(); + boolean isReady = currentLibrary != null; + + Map response = new HashMap<>(); + response.put("ready", isReady); + if (isReady) { + response.put("currentLibrary", currentLibrary.getId()); + response.put("currentLibraryName", currentLibrary.getName()); + } else { + response.put("currentLibrary", null); + response.put("currentLibraryName", null); + } + + return ResponseEntity.ok(response); + } catch (Exception e) { + logger.error("Failed to get switch status", e); + return ResponseEntity.ok(Map.of("ready", false, "error", "Status check failed")); + } + } + + /** + * Change password for current library + */ + @PostMapping("/password") + public ResponseEntity> changePassword(@RequestBody Map request) { + try { + String currentPassword = request.get("currentPassword"); + String newPassword = request.get("newPassword"); + + if (currentPassword == null || newPassword == null) { + return ResponseEntity.badRequest().body(Map.of("error", "Current and new passwords required")); + } + + String currentLibraryId = libraryService.getCurrentLibraryId(); + if (currentLibraryId == null) { + return ResponseEntity.badRequest().body(Map.of("error", "No active library")); + } + + boolean success = libraryService.changeLibraryPassword(currentLibraryId, currentPassword, newPassword); + if (success) { + return ResponseEntity.ok(Map.of("success", true, "message", "Password changed successfully")); + } else { + return ResponseEntity.badRequest().body(Map.of("error", "Current password is incorrect")); + } + + } catch (Exception e) { + logger.error("Failed to change password", e); + return ResponseEntity.internalServerError().body(Map.of("error", "Server error")); + } + } + + /** + * Create a new library + */ + @PostMapping("/create") + public ResponseEntity> createLibrary(@RequestBody Map request) { + try { + String name = request.get("name"); + String description = request.get("description"); + String password = request.get("password"); + + if (name == null || name.trim().isEmpty() || password == null || password.trim().isEmpty()) { + return ResponseEntity.badRequest().body(Map.of("error", "Name and password are required")); + } + + var newLibrary = libraryService.createNewLibrary(name.trim(), description, password); + + return ResponseEntity.ok(Map.of( + "success", true, + "library", Map.of( + "id", newLibrary.getId(), + "name", newLibrary.getName(), + "description", newLibrary.getDescription() + ), + "message", "Library created successfully. You can now log in with the new password to access it." + )); + + } catch (Exception e) { + logger.error("Failed to create library", e); + return ResponseEntity.internalServerError().body(Map.of("error", "Server error")); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/dto/LibraryDto.java b/backend/src/main/java/com/storycove/dto/LibraryDto.java new file mode 100644 index 0000000..0b94939 --- /dev/null +++ b/backend/src/main/java/com/storycove/dto/LibraryDto.java @@ -0,0 +1,61 @@ +package com.storycove.dto; + +public class LibraryDto { + private String id; + private String name; + private String description; + private boolean isActive; + private boolean isInitialized; + + // Constructors + public LibraryDto() {} + + public LibraryDto(String id, String name, String description, boolean isActive, boolean isInitialized) { + this.id = id; + this.name = name; + this.description = description; + this.isActive = isActive; + this.isInitialized = isInitialized; + } + + // Getters and Setters + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } + + public boolean isInitialized() { + return isInitialized; + } + + public void setInitialized(boolean initialized) { + isInitialized = initialized; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/entity/Library.java b/backend/src/main/java/com/storycove/entity/Library.java new file mode 100644 index 0000000..03ad6a5 --- /dev/null +++ b/backend/src/main/java/com/storycove/entity/Library.java @@ -0,0 +1,93 @@ +package com.storycove.entity; + +public class Library { + private String id; + private String name; + private String description; + private String passwordHash; + private String dbName; + private String typesenseCollection; + private String imagePath; + private boolean initialized; + + // Constructors + public Library() {} + + public Library(String id, String name, String description, String passwordHash, String dbName) { + this.id = id; + this.name = name; + this.description = description; + this.passwordHash = passwordHash; + this.dbName = dbName; + this.typesenseCollection = "stories_" + id; + this.imagePath = "/images/" + id; + this.initialized = false; + } + + // Getters and Setters + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + this.typesenseCollection = "stories_" + id; + this.imagePath = "/images/" + id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPasswordHash() { + return passwordHash; + } + + public void setPasswordHash(String passwordHash) { + this.passwordHash = passwordHash; + } + + public String getDbName() { + return dbName; + } + + public void setDbName(String dbName) { + this.dbName = dbName; + } + + public String getTypesenseCollection() { + return typesenseCollection; + } + + public void setTypesenseCollection(String typesenseCollection) { + this.typesenseCollection = typesenseCollection; + } + + public String getImagePath() { + return imagePath; + } + + public void setImagePath(String imagePath) { + this.imagePath = imagePath; + } + + public boolean isInitialized() { + return initialized; + } + + public void setInitialized(boolean initialized) { + this.initialized = initialized; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/security/JwtAuthenticationFilter.java b/backend/src/main/java/com/storycove/security/JwtAuthenticationFilter.java index 0f3c02b..776fc83 100644 --- a/backend/src/main/java/com/storycove/security/JwtAuthenticationFilter.java +++ b/backend/src/main/java/com/storycove/security/JwtAuthenticationFilter.java @@ -3,6 +3,7 @@ package com.storycove.security; import com.storycove.util.JwtUtil; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -28,13 +29,27 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String authHeader = request.getHeader("Authorization"); String token = null; + // First try to get token from Authorization header + String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { token = authHeader.substring(7); } + // If no token in header, try to get from cookies + if (token == null) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if ("token".equals(cookie.getName())) { + token = cookie.getValue(); + break; + } + } + } + } + if (token != null && jwtUtil.validateToken(token) && !jwtUtil.isTokenExpired(token)) { String subject = jwtUtil.getSubjectFromToken(token); diff --git a/backend/src/main/java/com/storycove/service/AuthorService.java b/backend/src/main/java/com/storycove/service/AuthorService.java index 76173d3..275e7c7 100644 --- a/backend/src/main/java/com/storycove/service/AuthorService.java +++ b/backend/src/main/java/com/storycove/service/AuthorService.java @@ -15,6 +15,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -29,11 +31,13 @@ public class AuthorService { private final AuthorRepository authorRepository; private final TypesenseService typesenseService; + private final LibraryAwareService libraryAwareService; @Autowired - public AuthorService(AuthorRepository authorRepository, @Autowired(required = false) TypesenseService typesenseService) { + public AuthorService(AuthorRepository authorRepository, @Autowired(required = false) TypesenseService typesenseService, LibraryAwareService libraryAwareService) { this.authorRepository = authorRepository; this.typesenseService = typesenseService; + this.libraryAwareService = libraryAwareService; } @Transactional(readOnly = true) @@ -63,8 +67,36 @@ public class AuthorService { @Transactional(readOnly = true) public Author findById(UUID id) { - return authorRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Author", id.toString())); + // Smart routing: use library-specific database if available, otherwise use repository + if (libraryAwareService.hasActiveLibrary()) { + return findByIdFromCurrentLibrary(id); + } else { + return authorRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Author", id.toString())); + } + } + + /** + * Find author by ID using the current library's database connection + */ + private Author findByIdFromCurrentLibrary(UUID id) { + try (var connection = libraryAwareService.getCurrentLibraryConnection()) { + String query = "SELECT id, name, notes, avatar_image_path, author_rating, created_at, updated_at FROM authors WHERE id = ?"; + + try (var stmt = connection.prepareStatement(query)) { + stmt.setObject(1, id); + try (var rs = stmt.executeQuery()) { + if (rs.next()) { + return createAuthorFromResultSet(rs); + } else { + throw new ResourceNotFoundException("Author", id.toString()); + } + } + } + } catch (Exception e) { + logger.error("Failed to find author by ID from current library: {}", id, e); + throw new RuntimeException("Database error while fetching author", e); + } } @Transactional(readOnly = true) @@ -362,4 +394,32 @@ public class AuthorService { existing.getUrls().addAll(urlsCopy); } } + + /** + * Create an Author entity from ResultSet for library-aware queries + */ + private Author createAuthorFromResultSet(ResultSet rs) throws SQLException { + var author = new Author(); + author.setId(UUID.fromString(rs.getString("id"))); + author.setName(rs.getString("name")); + author.setNotes(rs.getString("notes")); + author.setAvatarImagePath(rs.getString("avatar_image_path")); + + Integer rating = rs.getInt("author_rating"); + if (!rs.wasNull()) { + author.setAuthorRating(rating); + } + + var createdAtTimestamp = rs.getTimestamp("created_at"); + if (createdAtTimestamp != null) { + author.setCreatedAt(createdAtTimestamp.toLocalDateTime()); + } + + var updatedAtTimestamp = rs.getTimestamp("updated_at"); + if (updatedAtTimestamp != null) { + author.setUpdatedAt(updatedAtTimestamp.toLocalDateTime()); + } + + return author; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/CollectionService.java b/backend/src/main/java/com/storycove/service/CollectionService.java index 495eebd..48058a6 100644 --- a/backend/src/main/java/com/storycove/service/CollectionService.java +++ b/backend/src/main/java/com/storycove/service/CollectionService.java @@ -33,6 +33,7 @@ public class CollectionService { private final TagRepository tagRepository; private final TypesenseService typesenseService; private final ReadingTimeService readingTimeService; + private final LibraryAwareService libraryAwareService; @Autowired public CollectionService(CollectionRepository collectionRepository, @@ -40,13 +41,15 @@ public class CollectionService { StoryRepository storyRepository, TagRepository tagRepository, @Autowired(required = false) TypesenseService typesenseService, - ReadingTimeService readingTimeService) { + ReadingTimeService readingTimeService, + LibraryAwareService libraryAwareService) { this.collectionRepository = collectionRepository; this.collectionStoryRepository = collectionStoryRepository; this.storyRepository = storyRepository; this.tagRepository = tagRepository; this.typesenseService = typesenseService; this.readingTimeService = readingTimeService; + this.libraryAwareService = libraryAwareService; } /** diff --git a/backend/src/main/java/com/storycove/service/DatabaseManagementService.java b/backend/src/main/java/com/storycove/service/DatabaseManagementService.java index 759fef8..f0dc824 100644 --- a/backend/src/main/java/com/storycove/service/DatabaseManagementService.java +++ b/backend/src/main/java/com/storycove/service/DatabaseManagementService.java @@ -24,8 +24,10 @@ import java.util.zip.ZipOutputStream; @Service public class DatabaseManagementService { - @Autowired - private DataSource dataSource; + // DataSource is now dynamic based on active library + private DataSource getDataSource() { + return libraryService.getCurrentDataSource(); + } @Autowired private StoryRepository storyRepository; @@ -44,6 +46,9 @@ public class DatabaseManagementService { @Autowired private TypesenseService typesenseService; + + @Autowired + private LibraryService libraryService; @Autowired private ReadingPositionRepository readingPositionRepository; @@ -79,7 +84,12 @@ public class DatabaseManagementService { * Restore from complete backup (ZIP format) */ public void restoreFromCompleteBackup(InputStream backupStream) throws IOException, SQLException { - System.err.println("Starting complete backup restore..."); + String currentLibraryId = libraryService.getCurrentLibraryId(); + System.err.println("Starting complete backup restore for library: " + currentLibraryId); + if (currentLibraryId == null) { + throw new IllegalStateException("No current library active - please authenticate and select a library first"); + } + Path tempDir = Files.createTempDirectory("storycove-restore"); System.err.println("Created temp directory: " + tempDir); @@ -138,7 +148,7 @@ public class DatabaseManagementService { public Resource createBackup() throws SQLException, IOException { StringBuilder sqlDump = new StringBuilder(); - try (Connection connection = dataSource.getConnection()) { + try (Connection connection = getDataSource().getConnection()) { // Add header sqlDump.append("-- StoryCove Database Backup\n"); sqlDump.append("-- Generated at: ").append(new java.util.Date()).append("\n\n"); @@ -224,10 +234,13 @@ public class DatabaseManagementService { } // Execute the SQL statements - try (Connection connection = dataSource.getConnection()) { + try (Connection connection = getDataSource().getConnection()) { connection.setAutoCommit(false); try { + // Ensure database schema exists before restoring data + ensureDatabaseSchemaExists(connection); + // Parse SQL statements properly (handle semicolons inside string literals) List statements = parseStatements(sqlContent.toString()); @@ -260,11 +273,19 @@ public class DatabaseManagementService { // Reindex search after successful restore try { - System.err.println("Starting Typesense reindex after successful restore..."); - typesenseService.recreateStoriesCollection(); - typesenseService.recreateAuthorsCollection(); + String currentLibraryId = libraryService.getCurrentLibraryId(); + System.err.println("Starting Typesense reindex after successful restore for library: " + currentLibraryId); + if (currentLibraryId == null) { + System.err.println("ERROR: No current library set during restore - cannot reindex Typesense!"); + throw new IllegalStateException("No current library active during restore"); + } + + // Manually trigger reindexing using the correct database connection + System.err.println("Triggering manual reindex from library-specific database for library: " + currentLibraryId); + reindexStoriesAndAuthorsFromCurrentDatabase(); + // Note: Collections collection will be recreated when needed by the service - System.err.println("Typesense reindex completed successfully."); + System.err.println("Typesense reindex completed successfully for library: " + currentLibraryId); } catch (Exception e) { // Log the error but don't fail the restore System.err.println("Warning: Failed to reindex Typesense after restore: " + e.getMessage()); @@ -418,10 +439,14 @@ public class DatabaseManagementService { } /** - * Clear all uploaded files + * Clear all uploaded files for the current library */ private void clearAllFiles() { - Path imagesPath = Paths.get(uploadDir); + // Use library-specific image path + String libraryImagePath = libraryService.getCurrentImagePath(); + Path imagesPath = Paths.get(uploadDir + libraryImagePath); + + System.err.println("Clearing files for library: " + libraryService.getCurrentLibraryId() + " at path: " + imagesPath); if (Files.exists(imagesPath)) { try { @@ -430,6 +455,7 @@ public class DatabaseManagementService { .forEach(filePath -> { try { Files.deleteIfExists(filePath); + System.err.println("Deleted file: " + filePath); } catch (IOException e) { System.err.println("Warning: Failed to delete file: " + filePath + " - " + e.getMessage()); } @@ -437,19 +463,28 @@ public class DatabaseManagementService { } catch (IOException e) { System.err.println("Warning: Failed to clear files directory: " + e.getMessage()); } + } else { + System.err.println("Library image directory does not exist: " + imagesPath); } } /** - * Clear search indexes + * Clear search indexes (recreate empty collections) */ private void clearSearchIndexes() { try { - System.err.println("Clearing search indexes after complete clear..."); + String currentLibraryId = libraryService.getCurrentLibraryId(); + System.err.println("Clearing search indexes after complete clear for library: " + currentLibraryId); + if (currentLibraryId == null) { + System.err.println("WARNING: No current library set during clear - skipping search index clear"); + return; + } + + // For clearing, we only want to recreate empty collections (no data to index) typesenseService.recreateStoriesCollection(); typesenseService.recreateAuthorsCollection(); // Note: Collections collection will be recreated when needed by the service - System.err.println("Search indexes cleared successfully."); + System.err.println("Search indexes cleared successfully for library: " + currentLibraryId); } catch (Exception e) { // Log the error but don't fail the clear operation System.err.println("Warning: Failed to clear search indexes: " + e.getMessage()); @@ -457,6 +492,219 @@ public class DatabaseManagementService { } } + /** + * Ensure database schema exists before restoring backup data. + * This creates all necessary tables, indexes, and constraints if they don't exist. + */ + private void ensureDatabaseSchemaExists(Connection connection) throws SQLException { + try { + // Check if a key table exists to determine if schema is already created + String checkTableQuery = "SELECT 1 FROM information_schema.tables WHERE table_name = 'stories' LIMIT 1"; + try (PreparedStatement stmt = connection.prepareStatement(checkTableQuery); + var resultSet = stmt.executeQuery()) { + if (resultSet.next()) { + System.err.println("Database schema already exists, skipping schema creation."); + return; // Schema exists + } + } + + System.err.println("Creating database schema for restore in library: " + libraryService.getCurrentLibraryId()); + + // Create the schema using the same DDL as LibraryService + String[] createTableStatements = { + // Authors table + """ + CREATE TABLE authors ( + author_rating integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + avatar_image_path varchar(255), + name varchar(255) not null, + notes TEXT, + primary key (id) + ) + """, + + // Author URLs table + """ + CREATE TABLE author_urls ( + author_id uuid not null, + url varchar(255) + ) + """, + + // Series table + """ + CREATE TABLE series ( + created_at timestamp(6) not null, + id uuid not null, + description varchar(1000), + name varchar(255) not null, + primary key (id) + ) + """, + + // Tags table + """ + CREATE TABLE tags ( + color varchar(7), + created_at timestamp(6) not null, + id uuid not null, + description varchar(500), + name varchar(255) not null unique, + primary key (id) + ) + """, + + // Tag aliases table + """ + CREATE TABLE tag_aliases ( + created_from_merge boolean not null, + created_at timestamp(6) not null, + canonical_tag_id uuid not null, + id uuid not null, + alias_name varchar(255) not null unique, + primary key (id) + ) + """, + + // Collections table + """ + CREATE TABLE collections ( + is_archived boolean not null, + rating integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + cover_image_path varchar(500), + name varchar(500) not null, + description TEXT, + primary key (id) + ) + """, + + // Stories table + """ + CREATE TABLE stories ( + is_read boolean, + rating integer, + reading_position integer, + volume integer, + word_count integer, + created_at timestamp(6) not null, + last_read_at timestamp(6), + updated_at timestamp(6) not null, + author_id uuid, + id uuid not null, + series_id uuid, + description varchar(1000), + content_html TEXT, + content_plain TEXT, + cover_path varchar(255), + source_url varchar(255), + summary TEXT, + title varchar(255) not null, + primary key (id) + ) + """, + + // Reading positions table + """ + CREATE TABLE reading_positions ( + chapter_index integer, + character_position integer, + percentage_complete float(53), + word_position integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + story_id uuid not null, + context_after varchar(500), + context_before varchar(500), + chapter_title varchar(255), + epub_cfi TEXT, + primary key (id) + ) + """, + + // Junction tables + """ + CREATE TABLE story_tags ( + story_id uuid not null, + tag_id uuid not null, + primary key (story_id, tag_id) + ) + """, + + """ + CREATE TABLE collection_stories ( + position integer not null, + added_at timestamp(6) not null, + collection_id uuid not null, + story_id uuid not null, + primary key (collection_id, story_id), + unique (collection_id, position) + ) + """, + + """ + CREATE TABLE collection_tags ( + collection_id uuid not null, + tag_id uuid not null, + primary key (collection_id, tag_id) + ) + """ + }; + + String[] createIndexStatements = { + "CREATE INDEX idx_reading_position_story ON reading_positions (story_id)" + }; + + String[] createConstraintStatements = { + // Foreign key constraints + "ALTER TABLE author_urls ADD CONSTRAINT FKdqhp51m0uveybsts098gd79uo FOREIGN KEY (author_id) REFERENCES authors", + "ALTER TABLE stories ADD CONSTRAINT FKhwecpqeaxy40ftrctef1u7gw7 FOREIGN KEY (author_id) REFERENCES authors", + "ALTER TABLE stories ADD CONSTRAINT FK1kulyvy7wwcolp2gkndt57cp7 FOREIGN KEY (series_id) REFERENCES series", + "ALTER TABLE reading_positions ADD CONSTRAINT FKglfhdhflan3pgyr2u0gxi21i5 FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE story_tags ADD CONSTRAINT FKmans33ijt0nf65t0sng2r848j FOREIGN KEY (tag_id) REFERENCES tags", + "ALTER TABLE story_tags ADD CONSTRAINT FKq9guid7swnjxwdpgxj3jo1rsi FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE tag_aliases ADD CONSTRAINT FKqfsawmcj3ey4yycb6958y24ch FOREIGN KEY (canonical_tag_id) REFERENCES tags", + "ALTER TABLE collection_stories ADD CONSTRAINT FKr55ho4vhj0wp03x13iskr1jds FOREIGN KEY (collection_id) REFERENCES collections", + "ALTER TABLE collection_stories ADD CONSTRAINT FK7n41tbbrt7r2e81hpu3612r1o FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE collection_tags ADD CONSTRAINT FKceq7ggev8n8ibjui1x5yo4x67 FOREIGN KEY (tag_id) REFERENCES tags", + "ALTER TABLE collection_tags ADD CONSTRAINT FKq9sa5s8csdpbphrvb48tts8jt FOREIGN KEY (collection_id) REFERENCES collections" + }; + + // Create tables + for (String sql : createTableStatements) { + try (var statement = connection.createStatement()) { + statement.executeUpdate(sql); + } + } + + // Create indexes + for (String sql : createIndexStatements) { + try (var statement = connection.createStatement()) { + statement.executeUpdate(sql); + } + } + + // Create constraints + for (String sql : createConstraintStatements) { + try (var statement = connection.createStatement()) { + statement.executeUpdate(sql); + } + } + + System.err.println("Database schema created successfully for restore."); + + } catch (SQLException e) { + System.err.println("Error creating database schema: " + e.getMessage()); + throw e; + } + } + /** * Add database dump to ZIP archive */ @@ -478,12 +726,17 @@ public class DatabaseManagementService { } /** - * Add all files to ZIP archive + * Add all files to ZIP archive for the current library */ private void addFilesToZip(ZipOutputStream zipOut) throws IOException { - Path imagesPath = Paths.get(uploadDir); + // Use library-specific image path + String libraryImagePath = libraryService.getCurrentImagePath(); + Path imagesPath = Paths.get(uploadDir + libraryImagePath); + + System.err.println("Adding files to backup for library: " + libraryService.getCurrentLibraryId() + " from path: " + imagesPath); if (!Files.exists(imagesPath)) { + System.err.println("Library image directory does not exist, skipping file backup: " + imagesPath); return; } @@ -498,6 +751,7 @@ public class DatabaseManagementService { zipOut.putNextEntry(entry); Files.copy(filePath, zipOut); zipOut.closeEntry(); + System.err.println("Added file to backup: " + zipEntryName); } catch (IOException e) { throw new RuntimeException("Failed to add file to backup: " + filePath, e); } @@ -514,9 +768,19 @@ public class DatabaseManagementService { metadata.put("timestamp", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); metadata.put("generator", "StoryCove Database Management Service"); + // Add library information + var currentLibrary = libraryService.getCurrentLibrary(); + if (currentLibrary != null) { + Map libraryInfo = new HashMap<>(); + libraryInfo.put("id", currentLibrary.getId()); + libraryInfo.put("name", currentLibrary.getName()); + libraryInfo.put("description", currentLibrary.getDescription()); + metadata.put("library", libraryInfo); + } + // Add statistics Map stats = new HashMap<>(); - try (Connection connection = dataSource.getConnection()) { + try (Connection connection = getDataSource().getConnection()) { stats.put("stories", getTableCount(connection, "stories")); stats.put("authors", getTableCount(connection, "authors")); stats.put("collections", getTableCount(connection, "collections")); @@ -525,8 +789,9 @@ public class DatabaseManagementService { } metadata.put("statistics", stats); - // Count files - Path imagesPath = Paths.get(uploadDir); + // Count files for current library + String libraryImagePath = libraryService.getCurrentImagePath(); + Path imagesPath = Paths.get(uploadDir + libraryImagePath); int fileCount = 0; if (Files.exists(imagesPath)) { fileCount = (int) Files.walk(imagesPath).filter(Files::isRegularFile).count(); @@ -605,10 +870,14 @@ public class DatabaseManagementService { } /** - * Restore files from backup + * Restore files from backup to the current library's directory */ private void restoreFiles(Path filesDir) throws IOException { - Path targetDir = Paths.get(uploadDir); + // Use library-specific image path + String libraryImagePath = libraryService.getCurrentImagePath(); + Path targetDir = Paths.get(uploadDir + libraryImagePath); + + System.err.println("Restoring files for library: " + libraryService.getCurrentLibraryId() + " to path: " + targetDir); Files.createDirectories(targetDir); Files.walk(filesDir) @@ -620,6 +889,7 @@ public class DatabaseManagementService { Files.createDirectories(targetFile.getParent()); Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING); + System.err.println("Restored file: " + relativePath + " to " + targetFile); } catch (IOException e) { throw new RuntimeException("Failed to restore file: " + sourceFile, e); } @@ -655,4 +925,169 @@ public class DatabaseManagementService { return 0; } } + + /** + * Manually reindex stories and authors from the current library's database + * This bypasses the repository layer and uses direct database access + */ + private void reindexStoriesAndAuthorsFromCurrentDatabase() throws SQLException { + try (Connection connection = getDataSource().getConnection()) { + // First, recreate empty collections + try { + typesenseService.recreateStoriesCollection(); + typesenseService.recreateAuthorsCollection(); + } catch (Exception e) { + throw new SQLException("Failed to recreate Typesense collections", e); + } + + // Count and reindex stories with full author and series information + int storyCount = 0; + String storyQuery = "SELECT s.id, s.title, s.summary, s.description, s.content_html, s.content_plain, s.source_url, s.cover_path, " + + "s.word_count, s.rating, s.volume, s.is_read, s.reading_position, s.last_read_at, s.author_id, s.series_id, " + + "s.created_at, s.updated_at, " + + "a.name as author_name, a.notes as author_notes, a.avatar_image_path as author_avatar, a.author_rating, " + + "a.created_at as author_created_at, a.updated_at as author_updated_at, " + + "ser.name as series_name, ser.description as series_description, " + + "ser.created_at as series_created_at " + + "FROM stories s " + + "LEFT JOIN authors a ON s.author_id = a.id " + + "LEFT JOIN series ser ON s.series_id = ser.id"; + + try (PreparedStatement stmt = connection.prepareStatement(storyQuery); + ResultSet rs = stmt.executeQuery()) { + + while (rs.next()) { + // Create a complete Story object for indexing + var story = createStoryFromResultSet(rs); + typesenseService.indexStory(story); + storyCount++; + } + } + + // Count and reindex authors + int authorCount = 0; + String authorQuery = "SELECT id, name, notes, avatar_image_path, author_rating, created_at, updated_at FROM authors"; + + try (PreparedStatement stmt = connection.prepareStatement(authorQuery); + ResultSet rs = stmt.executeQuery()) { + + while (rs.next()) { + // Create a minimal Author object for indexing + var author = createAuthorFromResultSet(rs); + typesenseService.indexAuthor(author); + authorCount++; + } + } + + System.err.println("Reindexed " + storyCount + " stories and " + authorCount + " authors from library database"); + } + } + + /** + * Create a Story entity from ResultSet for indexing purposes (includes joined author/series data) + */ + private com.storycove.entity.Story createStoryFromResultSet(ResultSet rs) throws SQLException { + var story = new com.storycove.entity.Story(); + story.setId(UUID.fromString(rs.getString("id"))); + story.setTitle(rs.getString("title")); + story.setSummary(rs.getString("summary")); + story.setDescription(rs.getString("description")); + story.setContentHtml(rs.getString("content_html")); + // Note: contentPlain will be auto-generated from contentHtml by the entity + story.setSourceUrl(rs.getString("source_url")); + story.setCoverPath(rs.getString("cover_path")); + story.setWordCount(rs.getInt("word_count")); + story.setRating(rs.getInt("rating")); + story.setVolume(rs.getInt("volume")); + story.setIsRead(rs.getBoolean("is_read")); + story.setReadingPosition(rs.getInt("reading_position")); + + var lastReadAtTimestamp = rs.getTimestamp("last_read_at"); + if (lastReadAtTimestamp != null) { + story.setLastReadAt(lastReadAtTimestamp.toLocalDateTime()); + } + + var createdAtTimestamp = rs.getTimestamp("created_at"); + if (createdAtTimestamp != null) { + story.setCreatedAt(createdAtTimestamp.toLocalDateTime()); + } + + var updatedAtTimestamp = rs.getTimestamp("updated_at"); + if (updatedAtTimestamp != null) { + story.setUpdatedAt(updatedAtTimestamp.toLocalDateTime()); + } + + // Set complete author information + String authorIdStr = rs.getString("author_id"); + if (authorIdStr != null) { + var author = new com.storycove.entity.Author(); + author.setId(UUID.fromString(authorIdStr)); + author.setName(rs.getString("author_name")); + author.setNotes(rs.getString("author_notes")); + author.setAvatarImagePath(rs.getString("author_avatar")); + + Integer authorRating = rs.getInt("author_rating"); + if (!rs.wasNull()) { + author.setAuthorRating(authorRating); + } + + var authorCreatedAt = rs.getTimestamp("author_created_at"); + if (authorCreatedAt != null) { + author.setCreatedAt(authorCreatedAt.toLocalDateTime()); + } + + var authorUpdatedAt = rs.getTimestamp("author_updated_at"); + if (authorUpdatedAt != null) { + author.setUpdatedAt(authorUpdatedAt.toLocalDateTime()); + } + + story.setAuthor(author); + } + + // Set complete series information + String seriesIdStr = rs.getString("series_id"); + if (seriesIdStr != null) { + var series = new com.storycove.entity.Series(); + series.setId(UUID.fromString(seriesIdStr)); + series.setName(rs.getString("series_name")); + series.setDescription(rs.getString("series_description")); + + var seriesCreatedAt = rs.getTimestamp("series_created_at"); + if (seriesCreatedAt != null) { + series.setCreatedAt(seriesCreatedAt.toLocalDateTime()); + } + + story.setSeries(series); + } + + return story; + } + + /** + * Create an Author entity from ResultSet for indexing purposes + */ + private com.storycove.entity.Author createAuthorFromResultSet(ResultSet rs) throws SQLException { + var author = new com.storycove.entity.Author(); + author.setId(UUID.fromString(rs.getString("id"))); + author.setName(rs.getString("name")); + author.setNotes(rs.getString("notes")); + author.setAvatarImagePath(rs.getString("avatar_image_path")); + + Integer rating = rs.getInt("author_rating"); + if (!rs.wasNull()) { + author.setAuthorRating(rating); + } + + var createdAtTimestamp = rs.getTimestamp("created_at"); + if (createdAtTimestamp != null) { + author.setCreatedAt(createdAtTimestamp.toLocalDateTime()); + } + + var updatedAtTimestamp = rs.getTimestamp("updated_at"); + if (updatedAtTimestamp != null) { + author.setUpdatedAt(updatedAtTimestamp.toLocalDateTime()); + } + + return author; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/ImageService.java b/backend/src/main/java/com/storycove/service/ImageService.java index 17dc922..ac1d6fd 100644 --- a/backend/src/main/java/com/storycove/service/ImageService.java +++ b/backend/src/main/java/com/storycove/service/ImageService.java @@ -1,5 +1,6 @@ package com.storycove.service; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -28,7 +29,15 @@ public class ImageService { ); @Value("${storycove.images.upload-dir:/app/images}") - private String uploadDir; + private String baseUploadDir; + + @Autowired + private LibraryService libraryService; + + private String getUploadDir() { + String libraryPath = libraryService.getCurrentImagePath(); + return baseUploadDir + libraryPath; + } @Value("${storycove.images.cover.max-width:800}") private int coverMaxWidth; @@ -61,7 +70,7 @@ public class ImageService { validateFile(file); // Create directories if they don't exist - Path typeDir = Paths.get(uploadDir, imageType.getDirectory()); + Path typeDir = Paths.get(getUploadDir(), imageType.getDirectory()); Files.createDirectories(typeDir); // Generate unique filename @@ -88,7 +97,7 @@ public class ImageService { } try { - Path fullPath = Paths.get(uploadDir, imagePath); + Path fullPath = Paths.get(getUploadDir(), imagePath); return Files.deleteIfExists(fullPath); } catch (IOException e) { return false; @@ -96,7 +105,7 @@ public class ImageService { } public Path getImagePath(String imagePath) { - return Paths.get(uploadDir, imagePath); + return Paths.get(getUploadDir(), imagePath); } public boolean imageExists(String imagePath) { diff --git a/backend/src/main/java/com/storycove/service/LibraryAwareService.java b/backend/src/main/java/com/storycove/service/LibraryAwareService.java new file mode 100644 index 0000000..80c3ba9 --- /dev/null +++ b/backend/src/main/java/com/storycove/service/LibraryAwareService.java @@ -0,0 +1,73 @@ +package com.storycove.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +/** + * Base service class that provides library-aware database access. + * + * This approach is safer than routing at the datasource level because: + * 1. It doesn't interfere with Spring's initialization process + * 2. It allows fine-grained control over which operations are library-aware + * 3. It provides clear separation between authentication (uses default DB) and library operations + */ +@Component +public class LibraryAwareService { + + @Autowired + private LibraryService libraryService; + + @Autowired + @Qualifier("dataSource") + private DataSource defaultDataSource; + + /** + * Get a database connection for the current active library. + * Falls back to default datasource if no library is active. + */ + public Connection getCurrentLibraryConnection() throws SQLException { + try { + // Try to get library-specific connection + DataSource libraryDataSource = libraryService.getCurrentDataSource(); + return libraryDataSource.getConnection(); + } catch (IllegalStateException e) { + // No active library - use default datasource + return defaultDataSource.getConnection(); + } + } + + /** + * Get a database connection for the default/fallback database. + * Use this for authentication and system-level operations. + */ + public Connection getDefaultConnection() throws SQLException { + return defaultDataSource.getConnection(); + } + + /** + * Check if a library is currently active + */ + public boolean hasActiveLibrary() { + try { + return libraryService.getCurrentLibraryId() != null; + } catch (Exception e) { + return false; + } + } + + /** + * Get the current active library ID, or null if none + */ + public String getCurrentLibraryId() { + try { + return libraryService.getCurrentLibraryId(); + } catch (Exception e) { + return null; + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/LibraryService.java b/backend/src/main/java/com/storycove/service/LibraryService.java new file mode 100644 index 0000000..bf9b54d --- /dev/null +++ b/backend/src/main/java/com/storycove/service/LibraryService.java @@ -0,0 +1,702 @@ +package com.storycove.service; + +import com.storycove.entity.Library; +import com.storycove.dto.LibraryDto; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import org.typesense.api.Client; +import org.typesense.resources.Node; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import javax.sql.DataSource; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.SQLException; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Service +public class LibraryService implements ApplicationContextAware { + private static final Logger logger = LoggerFactory.getLogger(LibraryService.class); + + @Value("${spring.datasource.url}") + private String baseDbUrl; + + @Value("${spring.datasource.username}") + private String dbUsername; + + @Value("${spring.datasource.password}") + private String dbPassword; + + @Value("${typesense.host}") + private String typesenseHost; + + @Value("${typesense.port}") + private String typesensePort; + + @Value("${typesense.api-key}") + private String typesenseApiKey; + + private final ObjectMapper objectMapper = new ObjectMapper(); + private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + private final Map libraries = new ConcurrentHashMap<>(); + + // Spring ApplicationContext for accessing other services without circular dependencies + private ApplicationContext applicationContext; + + // Current active resources + private volatile String currentLibraryId; + private volatile DataSource currentDataSource; + private volatile Client currentTypesenseClient; + + private static final String LIBRARIES_CONFIG_PATH = "/app/config/libraries.json"; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + @PostConstruct + public void initialize() { + loadLibrariesFromFile(); + + // If no libraries exist, create a default one + if (libraries.isEmpty()) { + createDefaultLibrary(); + } + + // Set first library as active if none specified + if (currentLibraryId == null && !libraries.isEmpty()) { + String firstLibraryId = libraries.keySet().iterator().next(); + logger.info("No active library set, defaulting to: {}", firstLibraryId); + try { + switchToLibrary(firstLibraryId); + } catch (Exception e) { + logger.error("Failed to initialize default library: {}", firstLibraryId, e); + } + } + } + + @PreDestroy + public void cleanup() { + closeCurrentResources(); + } + + public String authenticateAndGetLibrary(String password) { + for (Library library : libraries.values()) { + if (passwordEncoder.matches(password, library.getPasswordHash())) { + return library.getId(); + } + } + return null; // Authentication failed + } + + public synchronized void switchToLibrary(String libraryId) throws Exception { + if (libraryId.equals(currentLibraryId)) { + return; // Already active + } + + Library library = libraries.get(libraryId); + if (library == null) { + throw new IllegalArgumentException("Library not found: " + libraryId); + } + + logger.info("Switching to library: {} ({})", library.getName(), libraryId); + + // Close current resources + closeCurrentResources(); + + // Create new resources + currentDataSource = createDataSource(library.getDbName()); + currentTypesenseClient = createTypesenseClient(library.getTypesenseCollection()); + currentLibraryId = libraryId; + + // Initialize Typesense collections for this library if they don't exist + try { + TypesenseService typesenseService = applicationContext.getBean(TypesenseService.class); + typesenseService.initializeCollectionsForCurrentLibrary(); + } catch (Exception e) { + logger.warn("Failed to initialize Typesense collections for library {}: {}", libraryId, e.getMessage()); + // Don't fail the switch - collections can be created later + } + + logger.info("Successfully switched to library: {}", library.getName()); + } + + public DataSource getCurrentDataSource() { + if (currentDataSource == null) { + throw new IllegalStateException("No active library - please authenticate first"); + } + return currentDataSource; + } + + public Client getCurrentTypesenseClient() { + if (currentTypesenseClient == null) { + throw new IllegalStateException("No active library - please authenticate first"); + } + return currentTypesenseClient; + } + + public String getCurrentLibraryId() { + return currentLibraryId; + } + + public Library getCurrentLibrary() { + if (currentLibraryId == null) { + return null; + } + return libraries.get(currentLibraryId); + } + + public List getAllLibraries() { + List result = new ArrayList<>(); + for (Library library : libraries.values()) { + boolean isActive = library.getId().equals(currentLibraryId); + result.add(new LibraryDto( + library.getId(), + library.getName(), + library.getDescription(), + isActive, + library.isInitialized() + )); + } + return result; + } + + public String getCurrentImagePath() { + Library current = getCurrentLibrary(); + return current != null ? current.getImagePath() : "/images/default"; + } + + public boolean changeLibraryPassword(String libraryId, String currentPassword, String newPassword) { + Library library = libraries.get(libraryId); + if (library == null) { + return false; + } + + // Verify current password + if (!passwordEncoder.matches(currentPassword, library.getPasswordHash())) { + return false; + } + + // Update password + library.setPasswordHash(passwordEncoder.encode(newPassword)); + saveLibrariesToFile(); + + logger.info("Password changed for library: {}", library.getName()); + return true; + } + + public Library createNewLibrary(String name, String description, String password) { + // Generate unique ID + String id = name.toLowerCase().replaceAll("[^a-z0-9]", ""); + int counter = 1; + String originalId = id; + while (libraries.containsKey(id)) { + id = originalId + counter++; + } + + Library newLibrary = new Library( + id, + name, + description, + passwordEncoder.encode(password), + "storycove_" + id + ); + + try { + // Test database creation by creating a connection + DataSource testDs = createDataSource(newLibrary.getDbName()); + testDs.getConnection().close(); // This will create the database and schema if it doesn't exist + + // Initialize library resources (image directories) + initializeNewLibraryResources(id); + + newLibrary.setInitialized(true); + logger.info("Database and resources created for library: {}", newLibrary.getDbName()); + } catch (Exception e) { + logger.warn("Database/resource creation failed for library {}: {}", id, e.getMessage()); + // Continue anyway - resources will be created when needed + } + + libraries.put(id, newLibrary); + saveLibrariesToFile(); + + logger.info("Created new library: {} ({})", name, id); + return newLibrary; + } + + private void loadLibrariesFromFile() { + try { + File configFile = new File(LIBRARIES_CONFIG_PATH); + if (configFile.exists()) { + String content = Files.readString(Paths.get(LIBRARIES_CONFIG_PATH)); + Map config = objectMapper.readValue(content, new TypeReference>() {}); + + @SuppressWarnings("unchecked") + Map> librariesData = (Map>) config.get("libraries"); + + for (Map.Entry> entry : librariesData.entrySet()) { + String id = entry.getKey(); + Map data = entry.getValue(); + + Library library = new Library(); + library.setId(id); + library.setName((String) data.get("name")); + library.setDescription((String) data.get("description")); + library.setPasswordHash((String) data.get("passwordHash")); + library.setDbName((String) data.get("dbName")); + library.setInitialized((Boolean) data.getOrDefault("initialized", false)); + + libraries.put(id, library); + logger.info("Loaded library: {} ({})", library.getName(), id); + } + } else { + logger.info("No libraries configuration file found, will create default"); + } + } catch (IOException e) { + logger.error("Failed to load libraries configuration", e); + } + } + + private void createDefaultLibrary() { + // Check if we're migrating from the old single-library system + String existingDbName = extractDatabaseName(baseDbUrl); + + Library defaultLibrary = new Library( + "main", + "Main Library", + "Your existing story collection (migrated)", + passwordEncoder.encode("temp-password-change-me"), // Temporary password + existingDbName // Use existing database name + ); + defaultLibrary.setInitialized(true); // Mark as initialized since it has existing data + + libraries.put("main", defaultLibrary); + saveLibrariesToFile(); + + logger.warn("=".repeat(80)); + logger.warn("MIGRATION: Created 'Main Library' for your existing data"); + logger.warn("Temporary password: 'temp-password-change-me'"); + logger.warn("IMPORTANT: Please set a proper password in Settings > Library Settings"); + logger.warn("=".repeat(80)); + } + + private String extractDatabaseName(String jdbcUrl) { + // Extract database name from JDBC URL like "jdbc:postgresql://db:5432/storycove" + int lastSlash = jdbcUrl.lastIndexOf('/'); + if (lastSlash != -1 && lastSlash < jdbcUrl.length() - 1) { + String dbPart = jdbcUrl.substring(lastSlash + 1); + // Remove any query parameters + int queryStart = dbPart.indexOf('?'); + return queryStart != -1 ? dbPart.substring(0, queryStart) : dbPart; + } + return "storycove"; // fallback + } + + private void saveLibrariesToFile() { + try { + Map config = new HashMap<>(); + Map> librariesData = new HashMap<>(); + + for (Library library : libraries.values()) { + Map data = new HashMap<>(); + data.put("name", library.getName()); + data.put("description", library.getDescription()); + data.put("passwordHash", library.getPasswordHash()); + data.put("dbName", library.getDbName()); + data.put("initialized", library.isInitialized()); + + librariesData.put(library.getId(), data); + } + + config.put("libraries", librariesData); + + // Ensure config directory exists + new File("/app/config").mkdirs(); + + String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(config); + Files.writeString(Paths.get(LIBRARIES_CONFIG_PATH), json); + + logger.info("Saved libraries configuration"); + } catch (IOException e) { + logger.error("Failed to save libraries configuration", e); + } + } + + private DataSource createDataSource(String dbName) { + String url = baseDbUrl.replaceAll("/[^/]*$", "/" + dbName); + logger.info("Creating DataSource for: {}", url); + + // First, ensure the database exists + ensureDatabaseExists(dbName); + + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(url); + config.setUsername(dbUsername); + config.setPassword(dbPassword); + config.setDriverClassName("org.postgresql.Driver"); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(30000); + + return new HikariDataSource(config); + } + + private void ensureDatabaseExists(String dbName) { + // Connect to the 'postgres' database to create the new database + String adminUrl = baseDbUrl.replaceAll("/[^/]*$", "/postgres"); + + HikariConfig adminConfig = new HikariConfig(); + adminConfig.setJdbcUrl(adminUrl); + adminConfig.setUsername(dbUsername); + adminConfig.setPassword(dbPassword); + adminConfig.setDriverClassName("org.postgresql.Driver"); + adminConfig.setMaximumPoolSize(1); + adminConfig.setConnectionTimeout(30000); + + boolean databaseCreated = false; + + try (HikariDataSource adminDataSource = new HikariDataSource(adminConfig); + var connection = adminDataSource.getConnection(); + var statement = connection.createStatement()) { + + // Check if database exists + String checkQuery = "SELECT 1 FROM pg_database WHERE datname = ?"; + try (var preparedStatement = connection.prepareStatement(checkQuery)) { + preparedStatement.setString(1, dbName); + try (var resultSet = preparedStatement.executeQuery()) { + if (resultSet.next()) { + logger.info("Database {} already exists", dbName); + return; // Database exists, nothing to do + } + } + } + + // Create database if it doesn't exist + // Note: Database names cannot be parameterized, but we validate the name is safe + if (!dbName.matches("^[a-zA-Z][a-zA-Z0-9_]*$")) { + throw new IllegalArgumentException("Invalid database name: " + dbName); + } + + String createQuery = "CREATE DATABASE " + dbName; + statement.executeUpdate(createQuery); + logger.info("Created database: {}", dbName); + databaseCreated = true; + + } catch (SQLException e) { + logger.error("Failed to ensure database {} exists: {}", dbName, e.getMessage()); + throw new RuntimeException("Database creation failed", e); + } + + // If we just created the database, initialize its schema + if (databaseCreated) { + initializeNewDatabaseSchema(dbName); + } + } + + private void initializeNewDatabaseSchema(String dbName) { + logger.info("Initializing schema for new database: {}", dbName); + + // Create a temporary DataSource for the new database to initialize schema + String newDbUrl = baseDbUrl.replaceAll("/[^/]*$", "/" + dbName); + + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(newDbUrl); + config.setUsername(dbUsername); + config.setPassword(dbPassword); + config.setDriverClassName("org.postgresql.Driver"); + config.setMaximumPoolSize(1); + config.setConnectionTimeout(30000); + + try (HikariDataSource tempDataSource = new HikariDataSource(config)) { + // Use Hibernate to create the schema + // This mimics what Spring Boot does during startup + createSchemaUsingHibernate(tempDataSource); + logger.info("Schema initialized for database: {}", dbName); + + } catch (Exception e) { + logger.error("Failed to initialize schema for database {}: {}", dbName, e.getMessage()); + throw new RuntimeException("Schema initialization failed", e); + } + } + + public void initializeNewLibraryResources(String libraryId) { + Library library = libraries.get(libraryId); + if (library == null) { + throw new IllegalArgumentException("Library not found: " + libraryId); + } + + try { + logger.info("Initializing resources for new library: {}", library.getName()); + + // 1. Create image directory structure + initializeImageDirectories(library); + + // 2. Initialize Typesense collections (this will be done when switching to the library) + // The TypesenseService.initializeCollections() will be called automatically + + logger.info("Successfully initialized resources for library: {}", library.getName()); + + } catch (Exception e) { + logger.error("Failed to initialize resources for library {}: {}", libraryId, e.getMessage()); + throw new RuntimeException("Library resource initialization failed", e); + } + } + + private void initializeImageDirectories(Library library) { + try { + // Create the library-specific image directory + String imagePath = "/app/images/" + library.getId(); + java.nio.file.Path libraryImagePath = java.nio.file.Paths.get(imagePath); + + if (!java.nio.file.Files.exists(libraryImagePath)) { + java.nio.file.Files.createDirectories(libraryImagePath); + logger.info("Created image directory: {}", imagePath); + + // Create subdirectories for different image types + java.nio.file.Files.createDirectories(libraryImagePath.resolve("stories")); + java.nio.file.Files.createDirectories(libraryImagePath.resolve("authors")); + java.nio.file.Files.createDirectories(libraryImagePath.resolve("collections")); + + logger.info("Created image subdirectories for library: {}", library.getId()); + } else { + logger.info("Image directory already exists: {}", imagePath); + } + + } catch (Exception e) { + logger.error("Failed to create image directories for library {}: {}", library.getId(), e.getMessage()); + throw new RuntimeException("Image directory creation failed", e); + } + } + + private void createSchemaUsingHibernate(DataSource dataSource) { + // Create the essential tables manually using the same DDL that Hibernate would generate + // This is simpler than setting up a full Hibernate configuration for schema creation + + String[] createTableStatements = { + // Authors table + """ + CREATE TABLE authors ( + author_rating integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + avatar_image_path varchar(255), + name varchar(255) not null, + notes TEXT, + primary key (id) + ) + """, + + // Author URLs table + """ + CREATE TABLE author_urls ( + author_id uuid not null, + url varchar(255) + ) + """, + + // Series table + """ + CREATE TABLE series ( + created_at timestamp(6) not null, + id uuid not null, + description varchar(1000), + name varchar(255) not null, + primary key (id) + ) + """, + + // Tags table + """ + CREATE TABLE tags ( + color varchar(7), + created_at timestamp(6) not null, + id uuid not null, + description varchar(500), + name varchar(255) not null unique, + primary key (id) + ) + """, + + // Tag aliases table + """ + CREATE TABLE tag_aliases ( + created_from_merge boolean not null, + created_at timestamp(6) not null, + canonical_tag_id uuid not null, + id uuid not null, + alias_name varchar(255) not null unique, + primary key (id) + ) + """, + + // Collections table + """ + CREATE TABLE collections ( + is_archived boolean not null, + rating integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + cover_image_path varchar(500), + name varchar(500) not null, + description TEXT, + primary key (id) + ) + """, + + // Stories table + """ + CREATE TABLE stories ( + is_read boolean, + rating integer, + reading_position integer, + volume integer, + word_count integer, + created_at timestamp(6) not null, + last_read_at timestamp(6), + updated_at timestamp(6) not null, + author_id uuid, + id uuid not null, + series_id uuid, + description varchar(1000), + content_html TEXT, + content_plain TEXT, + cover_path varchar(255), + source_url varchar(255), + summary TEXT, + title varchar(255) not null, + primary key (id) + ) + """, + + // Reading positions table + """ + CREATE TABLE reading_positions ( + chapter_index integer, + character_position integer, + percentage_complete float(53), + word_position integer, + created_at timestamp(6) not null, + updated_at timestamp(6) not null, + id uuid not null, + story_id uuid not null, + context_after varchar(500), + context_before varchar(500), + chapter_title varchar(255), + epub_cfi TEXT, + primary key (id) + ) + """, + + // Junction tables + """ + CREATE TABLE story_tags ( + story_id uuid not null, + tag_id uuid not null, + primary key (story_id, tag_id) + ) + """, + + """ + CREATE TABLE collection_stories ( + position integer not null, + added_at timestamp(6) not null, + collection_id uuid not null, + story_id uuid not null, + primary key (collection_id, story_id), + unique (collection_id, position) + ) + """, + + """ + CREATE TABLE collection_tags ( + collection_id uuid not null, + tag_id uuid not null, + primary key (collection_id, tag_id) + ) + """ + }; + + String[] createIndexStatements = { + "CREATE INDEX idx_reading_position_story ON reading_positions (story_id)" + }; + + String[] createConstraintStatements = { + // Foreign key constraints + "ALTER TABLE author_urls ADD CONSTRAINT FKdqhp51m0uveybsts098gd79uo FOREIGN KEY (author_id) REFERENCES authors", + "ALTER TABLE stories ADD CONSTRAINT FKhwecpqeaxy40ftrctef1u7gw7 FOREIGN KEY (author_id) REFERENCES authors", + "ALTER TABLE stories ADD CONSTRAINT FK1kulyvy7wwcolp2gkndt57cp7 FOREIGN KEY (series_id) REFERENCES series", + "ALTER TABLE reading_positions ADD CONSTRAINT FKglfhdhflan3pgyr2u0gxi21i5 FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE story_tags ADD CONSTRAINT FKmans33ijt0nf65t0sng2r848j FOREIGN KEY (tag_id) REFERENCES tags", + "ALTER TABLE story_tags ADD CONSTRAINT FKq9guid7swnjxwdpgxj3jo1rsi FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE tag_aliases ADD CONSTRAINT FKqfsawmcj3ey4yycb6958y24ch FOREIGN KEY (canonical_tag_id) REFERENCES tags", + "ALTER TABLE collection_stories ADD CONSTRAINT FKr55ho4vhj0wp03x13iskr1jds FOREIGN KEY (collection_id) REFERENCES collections", + "ALTER TABLE collection_stories ADD CONSTRAINT FK7n41tbbrt7r2e81hpu3612r1o FOREIGN KEY (story_id) REFERENCES stories", + "ALTER TABLE collection_tags ADD CONSTRAINT FKceq7ggev8n8ibjui1x5yo4x67 FOREIGN KEY (tag_id) REFERENCES tags", + "ALTER TABLE collection_tags ADD CONSTRAINT FKq9sa5s8csdpbphrvb48tts8jt FOREIGN KEY (collection_id) REFERENCES collections" + }; + + try (var connection = dataSource.getConnection(); + var statement = connection.createStatement()) { + + // Create tables + for (String sql : createTableStatements) { + statement.executeUpdate(sql); + } + + // Create indexes + for (String sql : createIndexStatements) { + statement.executeUpdate(sql); + } + + // Create constraints + for (String sql : createConstraintStatements) { + statement.executeUpdate(sql); + } + + logger.info("Successfully created all database tables and constraints"); + + } catch (SQLException e) { + logger.error("Failed to create database schema", e); + throw new RuntimeException("Schema creation failed", e); + } + } + + private Client createTypesenseClient(String collection) { + logger.info("Creating Typesense client for collection: {}", collection); + + List nodes = Arrays.asList( + new Node("http", typesenseHost, typesensePort) + ); + + org.typesense.api.Configuration configuration = new org.typesense.api.Configuration(nodes, Duration.ofSeconds(10), typesenseApiKey); + return new Client(configuration); + } + + private void closeCurrentResources() { + if (currentDataSource instanceof HikariDataSource) { + logger.info("Closing current DataSource"); + ((HikariDataSource) currentDataSource).close(); + } + + // Typesense client doesn't need explicit cleanup + currentDataSource = null; + currentTypesenseClient = null; + currentLibraryId = null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/PasswordAuthenticationService.java b/backend/src/main/java/com/storycove/service/PasswordAuthenticationService.java index 94a9141..dd246e3 100644 --- a/backend/src/main/java/com/storycove/service/PasswordAuthenticationService.java +++ b/backend/src/main/java/com/storycove/service/PasswordAuthenticationService.java @@ -1,36 +1,83 @@ package com.storycove.service; -import org.springframework.beans.factory.annotation.Value; +import com.storycove.util.JwtUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service public class PasswordAuthenticationService { - @Value("${storycove.auth.password}") - private String applicationPassword; + private static final Logger logger = LoggerFactory.getLogger(PasswordAuthenticationService.class); private final PasswordEncoder passwordEncoder; + private final LibraryService libraryService; + private final JwtUtil jwtUtil; - public PasswordAuthenticationService(PasswordEncoder passwordEncoder) { + @Autowired + public PasswordAuthenticationService( + PasswordEncoder passwordEncoder, + LibraryService libraryService, + JwtUtil jwtUtil) { this.passwordEncoder = passwordEncoder; + this.libraryService = libraryService; + this.jwtUtil = jwtUtil; } - public boolean authenticate(String providedPassword) { + /** + * Authenticate user and switch to the appropriate library + * Returns JWT token if authentication successful, null otherwise + */ + public String authenticateAndSwitchLibrary(String providedPassword) { if (providedPassword == null || providedPassword.trim().isEmpty()) { - return false; + return null; } - // If application password starts with {bcrypt}, it's already encoded - if (applicationPassword.startsWith("{bcrypt}") || applicationPassword.startsWith("$2")) { - return passwordEncoder.matches(providedPassword, applicationPassword); + // Find which library this password belongs to + String libraryId = libraryService.authenticateAndGetLibrary(providedPassword); + if (libraryId == null) { + logger.warn("Authentication failed - invalid password"); + return null; } - // Otherwise, compare directly (for development/testing) - return applicationPassword.equals(providedPassword); + try { + // Switch to the authenticated library (may take 2-3 seconds) + libraryService.switchToLibrary(libraryId); + + // Generate JWT token with library context + String token = jwtUtil.generateToken("user", libraryId); + + logger.info("Successfully authenticated and switched to library: {}", libraryId); + return token; + + } catch (Exception e) { + logger.error("Failed to switch to library: {}", libraryId, e); + return null; + } + } + + /** + * Legacy method - kept for backward compatibility + */ + @Deprecated + public boolean authenticate(String providedPassword) { + return authenticateAndSwitchLibrary(providedPassword) != null; } public String encodePassword(String rawPassword) { return passwordEncoder.encode(rawPassword); } + + /** + * Get current library info for authenticated user + */ + public String getCurrentLibraryInfo() { + var library = libraryService.getCurrentLibrary(); + if (library != null) { + return String.format("Library: %s (%s)", library.getName(), library.getId()); + } + return "No library active"; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/StoryService.java b/backend/src/main/java/com/storycove/service/StoryService.java index 2bb9bf4..389a3a5 100644 --- a/backend/src/main/java/com/storycove/service/StoryService.java +++ b/backend/src/main/java/com/storycove/service/StoryService.java @@ -19,6 +19,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.sql.ResultSet; +import java.sql.SQLException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashSet; @@ -43,6 +45,7 @@ public class StoryService { private final SeriesService seriesService; private final HtmlSanitizationService sanitizationService; private final TypesenseService typesenseService; + private final LibraryAwareService libraryAwareService; @Autowired public StoryService(StoryRepository storyRepository, @@ -52,7 +55,8 @@ public class StoryService { TagService tagService, SeriesService seriesService, HtmlSanitizationService sanitizationService, - @Autowired(required = false) TypesenseService typesenseService) { + @Autowired(required = false) TypesenseService typesenseService, + LibraryAwareService libraryAwareService) { this.storyRepository = storyRepository; this.tagRepository = tagRepository; this.readingPositionRepository = readingPositionRepository; @@ -61,6 +65,7 @@ public class StoryService { this.seriesService = seriesService; this.sanitizationService = sanitizationService; this.typesenseService = typesenseService; + this.libraryAwareService = libraryAwareService; } @Transactional(readOnly = true) @@ -80,14 +85,53 @@ public class StoryService { @Transactional(readOnly = true) public Story findById(UUID id) { - return storyRepository.findById(id) - .orElseThrow(() -> new ResourceNotFoundException("Story", id.toString())); + // Smart routing: use library-specific database if available, otherwise use repository + if (libraryAwareService.hasActiveLibrary()) { + return findByIdFromCurrentLibrary(id); + } else { + return storyRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException("Story", id.toString())); + } + } + + /** + * Find story by ID using the current library's database connection + */ + private Story findByIdFromCurrentLibrary(UUID id) { + try (var connection = libraryAwareService.getCurrentLibraryConnection()) { + String query = "SELECT s.id, s.title, s.summary, s.description, s.content_html, s.content_plain, s.source_url, s.cover_path, " + + "s.word_count, s.rating, s.volume, s.is_read, s.reading_position, s.last_read_at, s.author_id, s.series_id, " + + "s.created_at, s.updated_at, " + + "a.name as author_name, a.notes as author_notes, a.avatar_image_path as author_avatar, a.author_rating, " + + "a.created_at as author_created_at, a.updated_at as author_updated_at, " + + "ser.name as series_name, ser.description as series_description, " + + "ser.created_at as series_created_at " + + "FROM stories s " + + "LEFT JOIN authors a ON s.author_id = a.id " + + "LEFT JOIN series ser ON s.series_id = ser.id " + + "WHERE s.id = ?"; + + try (var stmt = connection.prepareStatement(query)) { + stmt.setObject(1, id); + try (var rs = stmt.executeQuery()) { + if (rs.next()) { + return createStoryFromResultSet(rs); + } else { + throw new ResourceNotFoundException("Story", id.toString()); + } + } + } + } catch (Exception e) { + logger.error("Failed to find story by ID from current library: {}", id, e); + throw new RuntimeException("Database error while fetching story", e); + } } @Transactional(readOnly = true) public Optional findByIdOptional(UUID id) { return storyRepository.findById(id); } + @Transactional(readOnly = true) public Optional findByTitle(String title) { @@ -766,4 +810,83 @@ public class StoryService { return randomStory; } + + /** + * Create a Story entity from ResultSet for library-aware queries + */ + private Story createStoryFromResultSet(ResultSet rs) throws SQLException { + var story = new Story(); + story.setId(UUID.fromString(rs.getString("id"))); + story.setTitle(rs.getString("title")); + story.setSummary(rs.getString("summary")); + story.setDescription(rs.getString("description")); + story.setContentHtml(rs.getString("content_html")); + story.setSourceUrl(rs.getString("source_url")); + story.setCoverPath(rs.getString("cover_path")); + story.setWordCount(rs.getInt("word_count")); + story.setRating(rs.getInt("rating")); + story.setVolume(rs.getInt("volume")); + story.setIsRead(rs.getBoolean("is_read")); + story.setReadingPosition(rs.getInt("reading_position")); + + var lastReadAtTimestamp = rs.getTimestamp("last_read_at"); + if (lastReadAtTimestamp != null) { + story.setLastReadAt(lastReadAtTimestamp.toLocalDateTime()); + } + + var createdAtTimestamp = rs.getTimestamp("created_at"); + if (createdAtTimestamp != null) { + story.setCreatedAt(createdAtTimestamp.toLocalDateTime()); + } + + var updatedAtTimestamp = rs.getTimestamp("updated_at"); + if (updatedAtTimestamp != null) { + story.setUpdatedAt(updatedAtTimestamp.toLocalDateTime()); + } + + // Set complete author information + String authorIdStr = rs.getString("author_id"); + if (authorIdStr != null) { + var author = new Author(); + author.setId(UUID.fromString(authorIdStr)); + author.setName(rs.getString("author_name")); + author.setNotes(rs.getString("author_notes")); + author.setAvatarImagePath(rs.getString("author_avatar")); + + Integer authorRating = rs.getInt("author_rating"); + if (!rs.wasNull()) { + author.setAuthorRating(authorRating); + } + + var authorCreatedAt = rs.getTimestamp("author_created_at"); + if (authorCreatedAt != null) { + author.setCreatedAt(authorCreatedAt.toLocalDateTime()); + } + + var authorUpdatedAt = rs.getTimestamp("author_updated_at"); + if (authorUpdatedAt != null) { + author.setUpdatedAt(authorUpdatedAt.toLocalDateTime()); + } + + story.setAuthor(author); + } + + // Set complete series information + String seriesIdStr = rs.getString("series_id"); + if (seriesIdStr != null) { + var series = new Series(); + series.setId(UUID.fromString(seriesIdStr)); + series.setName(rs.getString("series_name")); + series.setDescription(rs.getString("series_description")); + + var seriesCreatedAt = rs.getTimestamp("series_created_at"); + if (seriesCreatedAt != null) { + series.setCreatedAt(seriesCreatedAt.toLocalDateTime()); + } + + story.setSeries(series); + } + + return story; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/storycove/service/TypesenseService.java b/backend/src/main/java/com/storycove/service/TypesenseService.java index 55da73d..0428623 100644 --- a/backend/src/main/java/com/storycove/service/TypesenseService.java +++ b/backend/src/main/java/com/storycove/service/TypesenseService.java @@ -27,19 +27,31 @@ import java.util.stream.Collectors; public class TypesenseService { private static final Logger logger = LoggerFactory.getLogger(TypesenseService.class); - private static final String STORIES_COLLECTION = "stories"; - private static final String AUTHORS_COLLECTION = "authors"; - private static final String COLLECTIONS_COLLECTION = "collections"; + // Collection names are now dynamic based on active library + private String getStoriesCollection() { + var library = libraryService.getCurrentLibrary(); + return library != null ? library.getTypesenseCollection() : "stories"; + } - private final Client typesenseClient; + private String getAuthorsCollection() { + var library = libraryService.getCurrentLibrary(); + return library != null ? "authors_" + library.getId() : "authors"; + } + + private String getCollectionsCollection() { + var library = libraryService.getCurrentLibrary(); + return library != null ? "collections_" + library.getId() : "collections"; + } + + private final LibraryService libraryService; private final CollectionStoryRepository collectionStoryRepository; private final ReadingTimeService readingTimeService; @Autowired - public TypesenseService(Client typesenseClient, + public TypesenseService(LibraryService libraryService, @Autowired(required = false) CollectionStoryRepository collectionStoryRepository, ReadingTimeService readingTimeService) { - this.typesenseClient = typesenseClient; + this.libraryService = libraryService; this.collectionStoryRepository = collectionStoryRepository; this.readingTimeService = readingTimeService; } @@ -55,10 +67,27 @@ public class TypesenseService { } } + /** + * Initialize collections for the current active library + * This is called when switching to a new library to ensure its collections exist + */ + public void initializeCollectionsForCurrentLibrary() { + try { + logger.info("Initializing Typesense collections for current library"); + createStoriesCollectionIfNotExists(); + createAuthorsCollectionIfNotExists(); + createCollectionsCollectionIfNotExists(); + logger.info("Successfully initialized Typesense collections for current library"); + } catch (Exception e) { + logger.error("Failed to initialize Typesense collections for current library", e); + throw new RuntimeException("Typesense collection initialization failed", e); + } + } + private void createStoriesCollectionIfNotExists() throws Exception { try { // Check if collection already exists - typesenseClient.collections(STORIES_COLLECTION).retrieve(); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).retrieve(); logger.info("Stories collection already exists"); } catch (Exception e) { logger.info("Creating stories collection..."); @@ -87,17 +116,17 @@ public class TypesenseService { ); CollectionSchema collectionSchema = new CollectionSchema() - .name(STORIES_COLLECTION) + .name(getStoriesCollection()) .fields(fields); - typesenseClient.collections().create(collectionSchema); + libraryService.getCurrentTypesenseClient().collections().create(collectionSchema); logger.info("Stories collection created successfully"); } private void createAuthorsCollectionIfNotExists() throws Exception { try { // Check if collection already exists - typesenseClient.collections(AUTHORS_COLLECTION).retrieve(); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).retrieve(); logger.info("Authors collection already exists"); } catch (Exception e) { logger.info("Creating authors collection..."); @@ -111,7 +140,7 @@ public class TypesenseService { public void recreateStoriesCollection() throws Exception { try { logger.info("Force deleting stories collection for recreation..."); - typesenseClient.collections(STORIES_COLLECTION).delete(); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).delete(); logger.info("Successfully deleted stories collection"); } catch (Exception e) { logger.debug("Stories collection didn't exist for deletion: {}", e.getMessage()); @@ -131,7 +160,7 @@ public class TypesenseService { public void recreateAuthorsCollection() throws Exception { try { logger.info("Force deleting authors collection for recreation..."); - typesenseClient.collections(AUTHORS_COLLECTION).delete(); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).delete(); logger.info("Successfully deleted authors collection"); } catch (Exception e) { logger.debug("Authors collection didn't exist for deletion: {}", e.getMessage()); @@ -160,17 +189,17 @@ public class TypesenseService { ); CollectionSchema collectionSchema = new CollectionSchema() - .name(AUTHORS_COLLECTION) + .name(getAuthorsCollection()) .fields(fields); - typesenseClient.collections().create(collectionSchema); + libraryService.getCurrentTypesenseClient().collections().create(collectionSchema); logger.info("Authors collection created successfully"); } public void indexStory(Story story) { try { Map document = createStoryDocument(story); - typesenseClient.collections(STORIES_COLLECTION).documents().create(document); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).documents().create(document); logger.debug("Indexed story: {}", story.getTitle()); } catch (Exception e) { logger.error("Failed to index story: " + story.getTitle(), e); @@ -180,7 +209,7 @@ public class TypesenseService { public void updateStory(Story story) { try { Map document = createStoryDocument(story); - typesenseClient.collections(STORIES_COLLECTION).documents(story.getId().toString()).update(document); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).documents(story.getId().toString()).update(document); logger.debug("Updated story index: {}", story.getTitle()); } catch (Exception e) { logger.error("Failed to update story index: " + story.getTitle(), e); @@ -189,7 +218,7 @@ public class TypesenseService { public void deleteStory(String storyId) { try { - typesenseClient.collections(STORIES_COLLECTION).documents(storyId).delete(); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).documents(storyId).delete(); logger.debug("Deleted story from index: {}", storyId); } catch (Exception e) { logger.error("Failed to delete story from index: " + storyId, e); @@ -272,7 +301,7 @@ public class TypesenseService { } else { } - SearchResult searchResult = typesenseClient.collections(STORIES_COLLECTION) + SearchResult searchResult = libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()) .documents() .search(searchParameters); @@ -310,7 +339,7 @@ public class TypesenseService { .collect(Collectors.toList()); for (Map document : documents) { - typesenseClient.collections(STORIES_COLLECTION).documents().create(document); + libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).documents().create(document); } logger.info("Bulk indexed {} stories", stories.size()); @@ -342,7 +371,7 @@ public class TypesenseService { .perPage(limit) .highlightFields("title,authorName"); - SearchResult searchResult = typesenseClient.collections(STORIES_COLLECTION) + SearchResult searchResult = libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()) .documents() .search(searchParameters); @@ -381,7 +410,7 @@ public class TypesenseService { logger.debug("Getting random story with query: '{}', tags: {}", normalizedQuery, tags); - SearchResult countResult = typesenseClient.collections(STORIES_COLLECTION) + SearchResult countResult = libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()) .documents() .search(countParameters); @@ -411,7 +440,7 @@ public class TypesenseService { storyParameters.filterBy(tagFilter); } - SearchResult storyResult = typesenseClient.collections(STORIES_COLLECTION) + SearchResult storyResult = libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()) .documents() .search(storyParameters); @@ -799,7 +828,7 @@ public class TypesenseService { public void indexAuthor(Author author) { try { Map document = createAuthorDocument(author); - typesenseClient.collections(AUTHORS_COLLECTION).documents().create(document); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).documents().create(document); logger.debug("Indexed author: {}", author.getName()); } catch (Exception e) { logger.error("Failed to index author: " + author.getName(), e); @@ -809,7 +838,7 @@ public class TypesenseService { public void updateAuthor(Author author) { try { Map document = createAuthorDocument(author); - typesenseClient.collections(AUTHORS_COLLECTION).documents(author.getId().toString()).update(document); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).documents(author.getId().toString()).update(document); logger.debug("Updated author index: {}", author.getName()); } catch (Exception e) { logger.error("Failed to update author index: " + author.getName(), e); @@ -818,7 +847,7 @@ public class TypesenseService { public void deleteAuthor(String authorId) { try { - typesenseClient.collections(AUTHORS_COLLECTION).documents(authorId).delete(); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).documents(authorId).delete(); logger.debug("Deleted author from index: {}", authorId); } catch (Exception e) { logger.error("Failed to delete author from index: " + authorId, e); @@ -951,7 +980,7 @@ public class TypesenseService { SearchResult searchResult; try { logger.info("AUTHOR SEARCH DEBUG: Executing search with final parameters"); - searchResult = typesenseClient.collections(AUTHORS_COLLECTION) + searchResult = libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()) .documents() .search(searchParameters); logger.info("AUTHOR SEARCH DEBUG: Search completed. Found {} results", searchResult.getHits().size()); @@ -961,7 +990,7 @@ public class TypesenseService { // Try to get collection info for debugging try { - typesenseClient.collections(AUTHORS_COLLECTION).retrieve(); + libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).retrieve(); } catch (Exception debugException) { // Debug collection retrieval failed } @@ -977,7 +1006,7 @@ public class TypesenseService { logger.info("AUTHOR SEARCH DEBUG: Using fallback infix search query: '{}'", fallbackSearchQuery); - searchResult = typesenseClient.collections(AUTHORS_COLLECTION) + searchResult = libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()) .documents() .search(searchParameters); } @@ -1089,7 +1118,7 @@ public class TypesenseService { */ public Map getAuthorsCollectionSchema() { try { - CollectionResponse collection = typesenseClient.collections(AUTHORS_COLLECTION).retrieve(); + CollectionResponse collection = libraryService.getCurrentTypesenseClient().collections(getAuthorsCollection()).retrieve(); return Map.of( "name", collection.getName(), "num_documents", collection.getNumDocuments(), @@ -1107,7 +1136,7 @@ public class TypesenseService { */ public Map getStoriesCollectionSchema() { try { - CollectionResponse collection = typesenseClient.collections(STORIES_COLLECTION).retrieve(); + CollectionResponse collection = libraryService.getCurrentTypesenseClient().collections(getStoriesCollection()).retrieve(); return Map.of( "name", collection.getName(), "num_documents", collection.getNumDocuments(), @@ -1152,7 +1181,7 @@ public class TypesenseService { private void createCollectionsCollectionIfNotExists() throws Exception { try { // Check if collection already exists - typesenseClient.collections(COLLECTIONS_COLLECTION).retrieve(); + libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()).retrieve(); logger.info("Collections collection already exists"); } catch (Exception e) { logger.info("Creating collections collection..."); @@ -1175,11 +1204,11 @@ public class TypesenseService { ); CollectionSchema collectionSchema = new CollectionSchema() - .name(COLLECTIONS_COLLECTION) + .name(getCollectionsCollection()) .fields(fields) .defaultSortingField("updated_at"); - typesenseClient.collections().create(collectionSchema); + libraryService.getCurrentTypesenseClient().collections().create(collectionSchema); logger.info("Collections collection created successfully"); } @@ -1220,7 +1249,7 @@ public class TypesenseService { searchParameters.filterBy(finalFilter); } - SearchResult searchResult = typesenseClient.collections(COLLECTIONS_COLLECTION) + SearchResult searchResult = libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()) .documents() .search(searchParameters); @@ -1248,7 +1277,7 @@ public class TypesenseService { public void indexCollection(Collection collection) { try { Map document = createCollectionDocument(collection); - typesenseClient.collections(COLLECTIONS_COLLECTION).documents().upsert(document); + libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()).documents().upsert(document); logger.debug("Indexed collection: {}", collection.getName()); } catch (Exception e) { logger.error("Failed to index collection: " + collection.getId(), e); @@ -1260,7 +1289,7 @@ public class TypesenseService { */ public void removeCollection(UUID collectionId) { try { - typesenseClient.collections(COLLECTIONS_COLLECTION).documents(collectionId.toString()).delete(); + libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()).documents(collectionId.toString()).delete(); logger.debug("Removed collection from index: {}", collectionId); } catch (Exception e) { logger.error("Failed to remove collection from index: " + collectionId, e); @@ -1281,7 +1310,7 @@ public class TypesenseService { .collect(Collectors.toList()); for (Map document : documents) { - typesenseClient.collections(COLLECTIONS_COLLECTION).documents().create(document); + libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()).documents().create(document); } logger.info("Bulk indexed {} collections", collections.size()); @@ -1297,7 +1326,7 @@ public class TypesenseService { try { // Clear existing collection try { - typesenseClient.collections(COLLECTIONS_COLLECTION).delete(); + libraryService.getCurrentTypesenseClient().collections(getCollectionsCollection()).delete(); } catch (Exception e) { logger.debug("Collection didn't exist for deletion: {}", e.getMessage()); } diff --git a/backend/src/main/java/com/storycove/util/JwtUtil.java b/backend/src/main/java/com/storycove/util/JwtUtil.java index c908671..e587723 100644 --- a/backend/src/main/java/com/storycove/util/JwtUtil.java +++ b/backend/src/main/java/com/storycove/util/JwtUtil.java @@ -23,15 +23,24 @@ public class JwtUtil { } public String generateToken() { + return generateToken("user", null); + } + + public String generateToken(String subject, String libraryId) { Date now = new Date(); Date expiryDate = new Date(now.getTime() + expiration); - return Jwts.builder() - .subject("user") + var builder = Jwts.builder() + .subject(subject) .issuedAt(now) - .expiration(expiryDate) - .signWith(getSigningKey()) - .compact(); + .expiration(expiryDate); + + // Add library context if provided + if (libraryId != null) { + builder.claim("libraryId", libraryId); + } + + return builder.signWith(getSigningKey()).compact(); } public boolean validateToken(String token) { @@ -62,4 +71,13 @@ public class JwtUtil { public String getSubjectFromToken(String token) { return getClaimsFromToken(token).getSubject(); } + + public String getLibraryIdFromToken(String token) { + try { + Claims claims = getClaimsFromToken(token); + return claims.get("libraryId", String.class); + } catch (Exception e) { + return null; + } + } } \ No newline at end of file diff --git a/backend/src/test/java/com/storycove/service/StoryServiceTest.java b/backend/src/test/java/com/storycove/service/StoryServiceTest.java index bab8518..8b3a04d 100644 --- a/backend/src/test/java/com/storycove/service/StoryServiceTest.java +++ b/backend/src/test/java/com/storycove/service/StoryServiceTest.java @@ -53,7 +53,8 @@ class StoryServiceTest { null, // tagService - not needed for reading progress tests null, // seriesService - not needed for reading progress tests null, // sanitizationService - not needed for reading progress tests - null // typesenseService - will test both with and without + null, // typesenseService - will test both with and without + null // libraryAwareService - not needed for these tests ); } diff --git a/docker-compose.yml b/docker-compose.yml index 19d1458..6519b5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,6 +42,7 @@ services: - STORYCOVE_CORS_ALLOWED_ORIGINS=${STORYCOVE_CORS_ALLOWED_ORIGINS:-http://localhost:3000,http://localhost:6925} volumes: - images_data:/app/images + - library_config:/app/config depends_on: - postgres - typesense @@ -75,6 +76,7 @@ volumes: postgres_data: typesense_data: images_data: + library_config: configs: nginx_config: @@ -91,7 +93,7 @@ configs: } server { listen 80; - client_max_body_size 10M; + client_max_body_size 256M; location / { proxy_pass http://frontend; proxy_http_version 1.1; diff --git a/frontend/src/app/settings/page.tsx b/frontend/src/app/settings/page.tsx index 8d98123..76fffda 100644 --- a/frontend/src/app/settings/page.tsx +++ b/frontend/src/app/settings/page.tsx @@ -6,6 +6,7 @@ import { useTheme } from '../../lib/theme'; import Button from '../../components/ui/Button'; import { storyApi, authorApi, databaseApi } from '../../lib/api'; import { useLibraryLayout, LibraryLayoutType } from '../../hooks/useLibraryLayout'; +import LibrarySettings from '../../components/library/LibrarySettings'; type FontFamily = 'serif' | 'sans' | 'mono'; type FontSize = 'small' | 'medium' | 'large' | 'extra-large'; @@ -774,6 +775,9 @@ export default function SettingsPage() { + {/* Library Settings */} + + {/* Tag Management */}

Tag Management

diff --git a/frontend/src/components/library/LibrarySettings.tsx b/frontend/src/components/library/LibrarySettings.tsx new file mode 100644 index 0000000..dd843b7 --- /dev/null +++ b/frontend/src/components/library/LibrarySettings.tsx @@ -0,0 +1,602 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { useRouter } from 'next/navigation'; +import Button from '../ui/Button'; +import { Input } from '../ui/Input'; +import LibrarySwitchLoader from '../ui/LibrarySwitchLoader'; +import { useLibrarySwitch } from '../../hooks/useLibrarySwitch'; + +interface Library { + id: string; + name: string; + description: string; + isActive: boolean; + isInitialized: boolean; +} + +export default function LibrarySettings() { + const router = useRouter(); + const { state: switchState, switchLibrary, clearError, reset } = useLibrarySwitch(); + + const [libraries, setLibraries] = useState([]); + const [currentLibrary, setCurrentLibrary] = useState(null); + const [loading, setLoading] = useState(true); + const [switchPassword, setSwitchPassword] = useState(''); + const [showSwitchForm, setShowSwitchForm] = useState(false); + const [passwordChangeForm, setPasswordChangeForm] = useState({ + currentPassword: '', + newPassword: '', + confirmPassword: '' + }); + const [showPasswordChangeForm, setShowPasswordChangeForm] = useState(false); + const [passwordChangeLoading, setPasswordChangeLoading] = useState(false); + const [passwordChangeMessage, setPasswordChangeMessage] = useState<{type: 'success' | 'error', text: string} | null>(null); + const [createLibraryForm, setCreateLibraryForm] = useState({ + name: '', + description: '', + password: '', + confirmPassword: '' + }); + const [showCreateLibraryForm, setShowCreateLibraryForm] = useState(false); + const [createLibraryLoading, setCreateLibraryLoading] = useState(false); + const [createLibraryMessage, setCreateLibraryMessage] = useState<{type: 'success' | 'error', text: string} | null>(null); + + useEffect(() => { + loadLibraries(); + loadCurrentLibrary(); + }, []); + + const loadLibraries = async () => { + try { + const response = await fetch('/api/libraries'); + if (response.ok) { + const data = await response.json(); + setLibraries(data); + } + } catch (error) { + console.error('Failed to load libraries:', error); + } + }; + + const loadCurrentLibrary = async () => { + try { + const response = await fetch('/api/libraries/current'); + if (response.ok) { + const data = await response.json(); + setCurrentLibrary(data); + } + } catch (error) { + console.error('Failed to load current library:', error); + } finally { + setLoading(false); + } + }; + + const handleSwitchLibrary = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!switchPassword.trim()) { + return; + } + + const success = await switchLibrary(switchPassword); + if (success) { + // The LibrarySwitchLoader will handle the rest + } + }; + + const handleSwitchComplete = () => { + // Refresh the page to reload with new library context + router.refresh(); + window.location.reload(); + }; + + const handleSwitchError = (error: string) => { + console.error('Library switch error:', error); + reset(); + }; + + const handlePasswordChange = async (e: React.FormEvent) => { + e.preventDefault(); + + if (passwordChangeForm.newPassword !== passwordChangeForm.confirmPassword) { + setPasswordChangeMessage({type: 'error', text: 'New passwords do not match'}); + return; + } + + if (passwordChangeForm.newPassword.length < 8) { + setPasswordChangeMessage({type: 'error', text: 'Password must be at least 8 characters long'}); + return; + } + + setPasswordChangeLoading(true); + setPasswordChangeMessage(null); + + try { + const response = await fetch('/api/libraries/password', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + currentPassword: passwordChangeForm.currentPassword, + newPassword: passwordChangeForm.newPassword, + }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + setPasswordChangeMessage({type: 'success', text: 'Password changed successfully'}); + setPasswordChangeForm({ + currentPassword: '', + newPassword: '', + confirmPassword: '' + }); + setShowPasswordChangeForm(false); + } else { + setPasswordChangeMessage({type: 'error', text: data.error || 'Failed to change password'}); + } + } catch (error) { + setPasswordChangeMessage({type: 'error', text: 'Network error occurred'}); + } finally { + setPasswordChangeLoading(false); + } + }; + + const handleCreateLibrary = async (e: React.FormEvent) => { + e.preventDefault(); + + if (createLibraryForm.password !== createLibraryForm.confirmPassword) { + setCreateLibraryMessage({type: 'error', text: 'Passwords do not match'}); + return; + } + + if (createLibraryForm.password.length < 8) { + setCreateLibraryMessage({type: 'error', text: 'Password must be at least 8 characters long'}); + return; + } + + if (createLibraryForm.name.trim().length < 2) { + setCreateLibraryMessage({type: 'error', text: 'Library name must be at least 2 characters long'}); + return; + } + + setCreateLibraryLoading(true); + setCreateLibraryMessage(null); + + try { + const response = await fetch('/api/libraries/create', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + name: createLibraryForm.name.trim(), + description: createLibraryForm.description.trim(), + password: createLibraryForm.password, + }), + }); + + const data = await response.json(); + + if (response.ok && data.success) { + setCreateLibraryMessage({ + type: 'success', + text: `Library "${data.library.name}" created successfully! You can now log out and log in with the new password to access it.` + }); + setCreateLibraryForm({ + name: '', + description: '', + password: '', + confirmPassword: '' + }); + setShowCreateLibraryForm(false); + loadLibraries(); // Refresh the library list + } else { + setCreateLibraryMessage({type: 'error', text: data.error || 'Failed to create library'}); + } + } catch (error) { + setCreateLibraryMessage({type: 'error', text: 'Network error occurred'}); + } finally { + setCreateLibraryLoading(false); + } + }; + + if (loading) { + return ( +
+

+ Library Settings +

+
+
+
+
+
+ ); + } + + return ( + <> +
+

+ Library Settings +

+ + {/* Current Library Info */} + {currentLibrary && ( +
+

+ Active Library +

+

+ {currentLibrary.name} +

+

+ {currentLibrary.description} +

+
+ )} + + {/* Change Password Section */} +
+

+ Change Library Password +

+ + {passwordChangeMessage && ( +
+

+ {passwordChangeMessage.text} +

+
+ )} + + {!showPasswordChangeForm ? ( +
+

+ Change the password for the current library ({currentLibrary?.name}). +

+ +
+ ) : ( +
+
+ + ) => + setPasswordChangeForm(prev => ({ ...prev, currentPassword: e.target.value })) + } + placeholder="Enter current password" + required + /> +
+ +
+ + ) => + setPasswordChangeForm(prev => ({ ...prev, newPassword: e.target.value })) + } + placeholder="Enter new password (min 8 characters)" + required + minLength={8} + /> +
+ +
+ + ) => + setPasswordChangeForm(prev => ({ ...prev, confirmPassword: e.target.value })) + } + placeholder="Confirm new password" + required + minLength={8} + /> +
+ +
+ + +
+
+ )} +
+ + {/* Available Libraries */} +
+

+ Available Libraries +

+
+ {libraries.map((library) => ( +
+
+
+

+ {library.name} + {library.isActive && ( + + Active + + )} +

+

+ {library.description} +

+
+ + {!library.isActive && ( +
+ ID: {library.id} +
+ )} +
+
+ ))} +
+
+ + {/* Switch Library Section */} +
+

+ Switch Library +

+ + {!showSwitchForm ? ( +
+

+ Enter the password for a different library to switch to it. +

+ +
+ ) : ( +
+
+ + ) => setSwitchPassword(e.target.value)} + placeholder="Enter password for the library you want to access" + required + /> +
+ + {switchState.error && ( +
+

+ {switchState.error} +

+
+ )} + +
+ + +
+
+ )} +
+ + {/* Create New Library Section */} +
+

+ Create New Library +

+ + {createLibraryMessage && ( +
+

+ {createLibraryMessage.text} +

+
+ )} + + {!showCreateLibraryForm ? ( +
+

+ Create a completely separate library with its own stories, authors, and password. +

+ +
+ ) : ( +
+
+ + ) => + setCreateLibraryForm(prev => ({ ...prev, name: e.target.value })) + } + placeholder="e.g., Private Stories, Work Collection" + required + minLength={2} + /> +
+ +
+ + ) => + setCreateLibraryForm(prev => ({ ...prev, description: e.target.value })) + } + placeholder="Optional description for this library" + /> +
+ +
+ + ) => + setCreateLibraryForm(prev => ({ ...prev, password: e.target.value })) + } + placeholder="Enter password (min 8 characters)" + required + minLength={8} + /> +
+ +
+ + ) => + setCreateLibraryForm(prev => ({ ...prev, confirmPassword: e.target.value })) + } + placeholder="Confirm password" + required + minLength={8} + /> +
+ +
+ + +
+
+ )} +
+ + {/* Info Box */} +
+

+ Note: Libraries are completely separate datasets. Switching libraries + will reload the application with a different set of stories, authors, and settings. + Each library has its own password for security. +

+
+
+ + {/* Library Switch Loader */} + + + ); +} \ No newline at end of file diff --git a/frontend/src/components/ui/LibrarySwitchLoader.tsx b/frontend/src/components/ui/LibrarySwitchLoader.tsx new file mode 100644 index 0000000..cae0b1f --- /dev/null +++ b/frontend/src/components/ui/LibrarySwitchLoader.tsx @@ -0,0 +1,106 @@ +'use client'; + +import React, { useEffect, useState } from 'react'; +import LoadingSpinner from './LoadingSpinner'; + +interface LibrarySwitchLoaderProps { + isVisible: boolean; + targetLibraryName?: string; + onComplete: () => void; + onError: (error: string) => void; +} + +export default function LibrarySwitchLoader({ + isVisible, + targetLibraryName, + onComplete, + onError +}: LibrarySwitchLoaderProps) { + const [dots, setDots] = useState(''); + const [timeElapsed, setTimeElapsed] = useState(0); + + useEffect(() => { + if (!isVisible) return; + + // Animate dots + const dotsInterval = setInterval(() => { + setDots(prev => prev.length >= 3 ? '' : prev + '.'); + }, 500); + + // Track time elapsed + const timeInterval = setInterval(() => { + setTimeElapsed(prev => prev + 1); + }, 1000); + + // Poll for completion + const pollInterval = setInterval(async () => { + try { + const response = await fetch('/api/libraries/switch/status'); + if (response.ok) { + const data = await response.json(); + if (data.ready) { + clearInterval(pollInterval); + clearInterval(dotsInterval); + clearInterval(timeInterval); + onComplete(); + } + } + } catch (error) { + console.error('Error polling switch status:', error); + } + }, 1000); + + // Timeout after 30 seconds + const timeout = setTimeout(() => { + clearInterval(pollInterval); + clearInterval(dotsInterval); + clearInterval(timeInterval); + onError('Library switch timed out. Please try again.'); + }, 30000); + + return () => { + clearInterval(dotsInterval); + clearInterval(timeInterval); + clearInterval(pollInterval); + clearTimeout(timeout); + }; + }, [isVisible, onComplete, onError]); + + if (!isVisible) return null; + + return ( +
+
+
+ +
+ +

+ Switching Libraries +

+ +

+ {targetLibraryName ? + `Loading "${targetLibraryName}"${dots}` : + `Preparing your library${dots}` + } +

+ +
+

This may take a few seconds...

+ {timeElapsed > 5 && ( +

+ Still working ({timeElapsed}s) +

+ )} +
+ +
+

+ 💡 Libraries are completely separate datasets with their own stories, authors, and settings. +

+
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/hooks/useLibrarySwitch.ts b/frontend/src/hooks/useLibrarySwitch.ts new file mode 100644 index 0000000..fa23b2f --- /dev/null +++ b/frontend/src/hooks/useLibrarySwitch.ts @@ -0,0 +1,118 @@ +'use client'; + +import { useState, useCallback } from 'react'; + +interface LibrarySwitchState { + isLoading: boolean; + targetLibraryName: string | null; + error: string | null; +} + +interface LibrarySwitchResult { + state: LibrarySwitchState; + switchLibrary: (password: string) => Promise; + clearError: () => void; + reset: () => void; +} + +export function useLibrarySwitch(): LibrarySwitchResult { + const [state, setState] = useState({ + isLoading: false, + targetLibraryName: null, + error: null, + }); + + const switchLibrary = useCallback(async (password: string): Promise => { + setState({ + isLoading: true, + targetLibraryName: null, + error: null, + }); + + try { + const response = await fetch('/api/libraries/switch', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ password }), + }); + + const data = await response.json(); + + if (!response.ok) { + setState(prev => ({ + ...prev, + isLoading: false, + error: data.error || 'Failed to switch library', + })); + return false; + } + + if (data.status === 'already_active') { + setState(prev => ({ + ...prev, + isLoading: false, + error: data.message, + })); + return false; + } + + if (data.status === 'switching') { + // Get library name if available + try { + const librariesResponse = await fetch('/api/libraries'); + if (librariesResponse.ok) { + const libraries = await librariesResponse.json(); + const targetLibrary = libraries.find((lib: any) => lib.id === data.targetLibrary); + setState(prev => ({ + ...prev, + targetLibraryName: targetLibrary?.name || data.targetLibrary, + })); + } + } catch (e) { + // Continue without library name + } + + return true; // Switch initiated successfully + } + + setState(prev => ({ + ...prev, + isLoading: false, + error: 'Unexpected response from server', + })); + return false; + + } catch (error) { + setState(prev => ({ + ...prev, + isLoading: false, + error: 'Network error occurred', + })); + return false; + } + }, []); + + const clearError = useCallback(() => { + setState(prev => ({ + ...prev, + error: null, + })); + }, []); + + const reset = useCallback(() => { + setState({ + isLoading: false, + targetLibraryName: null, + error: null, + }); + }, []); + + return { + state, + switchLibrary, + clearError, + reset, + }; +} \ No newline at end of file diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo index 0bcf727..469a60f 100644 --- a/frontend/tsconfig.tsbuildinfo +++ b/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/static-generation-bailout.d.ts","./node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.d.ts","./node_modules/next/dist/client/components/searchparams-bailout-proxy.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./src/lib/scraper/types.ts","./src/lib/scraper/utils/ratelimit.ts","./src/lib/scraper/utils/cache.ts","./src/lib/scraper/utils/urlparser.ts","./node_modules/domelementtype/lib/esm/index.d.ts","./node_modules/domhandler/lib/esm/node.d.ts","./node_modules/domhandler/lib/esm/index.d.ts","./node_modules/htmlparser2/lib/esm/tokenizer.d.ts","./node_modules/htmlparser2/lib/esm/parser.d.ts","./node_modules/dom-serializer/lib/esm/index.d.ts","./node_modules/domutils/lib/esm/stringify.d.ts","./node_modules/domutils/lib/esm/traversal.d.ts","./node_modules/domutils/lib/esm/manipulation.d.ts","./node_modules/domutils/lib/esm/querying.d.ts","./node_modules/domutils/lib/esm/legacy.d.ts","./node_modules/domutils/lib/esm/helpers.d.ts","./node_modules/domutils/lib/esm/feeds.d.ts","./node_modules/domutils/lib/esm/index.d.ts","./node_modules/htmlparser2/lib/esm/index.d.ts","./node_modules/css-what/lib/es/types.d.ts","./node_modules/css-what/lib/es/parse.d.ts","./node_modules/css-what/lib/es/stringify.d.ts","./node_modules/css-what/lib/es/index.d.ts","./node_modules/css-select/lib/esm/types.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/filters.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/pseudos.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/aliases.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/index.d.ts","./node_modules/css-select/lib/esm/index.d.ts","./node_modules/cheerio-select/lib/esm/index.d.ts","./node_modules/cheerio/lib/esm/options.d.ts","./node_modules/cheerio/lib/esm/types.d.ts","./node_modules/cheerio/lib/esm/api/attributes.d.ts","./node_modules/cheerio/lib/esm/api/traversing.d.ts","./node_modules/cheerio/lib/esm/api/manipulation.d.ts","./node_modules/cheerio/lib/esm/api/css.d.ts","./node_modules/cheerio/lib/esm/api/forms.d.ts","./node_modules/cheerio/lib/esm/cheerio.d.ts","./node_modules/cheerio/lib/esm/static.d.ts","./node_modules/cheerio/lib/esm/load.d.ts","./node_modules/cheerio/lib/esm/index.d.ts","./src/lib/scraper/strategies/textextractor.ts","./src/lib/scraper/strategies/linkextractor.ts","./src/lib/scraper/strategies/contentcleaner.ts","./src/lib/scraper/strategies/index.ts","./src/lib/scraper/config/sites.json","./node_modules/axios/index.d.ts","./src/types/api.ts","./src/lib/api.ts","./src/lib/scraper/scraper.ts","./src/app/scrape/author/route.ts","./src/app/scrape/bulk/progress/route.ts","./src/app/scrape/bulk/route.ts","./src/app/scrape/story/route.ts","./src/hooks/uselibrarylayout.ts","./node_modules/@types/trusted-types/lib/index.d.ts","./node_modules/dompurify/dist/purify.es.d.mts","./src/lib/sanitization.ts","./src/lib/settings.ts","./src/lib/theme.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./src/contexts/authcontext.tsx","./src/app/layout.tsx","./src/components/ui/loadingspinner.tsx","./src/app/page.tsx","./src/components/ui/button.tsx","./node_modules/@heroicons/react/24/outline/academiccapicon.d.ts","./node_modules/@heroicons/react/24/outline/adjustmentshorizontalicon.d.ts","./node_modules/@heroicons/react/24/outline/adjustmentsverticalicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxxmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdowncircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownonsquarestackicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownonsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdowntrayicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftendonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftstartonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlonglefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowpathroundedsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowpathicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightendonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightstartonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmalldownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmalllefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmallrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmallupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtoprightonsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtrendingdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtrendingupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturndownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturndownrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnleftdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnleftupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnrightdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnrightupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnuplefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowupcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuplefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuponsquarestackicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuponsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuptrayicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturndownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowspointinginicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowspointingouticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsrightlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsupdownicon.d.ts","./node_modules/@heroicons/react/24/outline/atsymbolicon.d.ts","./node_modules/@heroicons/react/24/outline/backspaceicon.d.ts","./node_modules/@heroicons/react/24/outline/backwardicon.d.ts","./node_modules/@heroicons/react/24/outline/banknotesicon.d.ts","./node_modules/@heroicons/react/24/outline/bars2icon.d.ts","./node_modules/@heroicons/react/24/outline/bars3bottomlefticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3bottomrighticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3centerlefticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3icon.d.ts","./node_modules/@heroicons/react/24/outline/bars4icon.d.ts","./node_modules/@heroicons/react/24/outline/barsarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/barsarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/battery0icon.d.ts","./node_modules/@heroicons/react/24/outline/battery100icon.d.ts","./node_modules/@heroicons/react/24/outline/battery50icon.d.ts","./node_modules/@heroicons/react/24/outline/beakericon.d.ts","./node_modules/@heroicons/react/24/outline/bellalerticon.d.ts","./node_modules/@heroicons/react/24/outline/bellslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bellsnoozeicon.d.ts","./node_modules/@heroicons/react/24/outline/bellicon.d.ts","./node_modules/@heroicons/react/24/outline/boldicon.d.ts","./node_modules/@heroicons/react/24/outline/boltslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bolticon.d.ts","./node_modules/@heroicons/react/24/outline/bookopenicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarkslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarksquareicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/briefcaseicon.d.ts","./node_modules/@heroicons/react/24/outline/buganticon.d.ts","./node_modules/@heroicons/react/24/outline/buildinglibraryicon.d.ts","./node_modules/@heroicons/react/24/outline/buildingoffice2icon.d.ts","./node_modules/@heroicons/react/24/outline/buildingofficeicon.d.ts","./node_modules/@heroicons/react/24/outline/buildingstorefronticon.d.ts","./node_modules/@heroicons/react/24/outline/cakeicon.d.ts","./node_modules/@heroicons/react/24/outline/calculatoricon.d.ts","./node_modules/@heroicons/react/24/outline/calendardaterangeicon.d.ts","./node_modules/@heroicons/react/24/outline/calendardaysicon.d.ts","./node_modules/@heroicons/react/24/outline/calendaricon.d.ts","./node_modules/@heroicons/react/24/outline/cameraicon.d.ts","./node_modules/@heroicons/react/24/outline/chartbarsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/chartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/chartpieicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblebottomcentertexticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblebottomcentericon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleleftellipsisicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleleftrighticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblelefticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleovalleftellipsisicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleovallefticon.d.ts","./node_modules/@heroicons/react/24/outline/checkbadgeicon.d.ts","./node_modules/@heroicons/react/24/outline/checkcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/checkicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoubledownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoublelefticon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoublerighticon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoubleupicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevronlefticon.d.ts","./node_modules/@heroicons/react/24/outline/chevronrighticon.d.ts","./node_modules/@heroicons/react/24/outline/chevronupdownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevronupicon.d.ts","./node_modules/@heroicons/react/24/outline/circlestackicon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumentcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumentlisticon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumenticon.d.ts","./node_modules/@heroicons/react/24/outline/clipboardicon.d.ts","./node_modules/@heroicons/react/24/outline/clockicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudicon.d.ts","./node_modules/@heroicons/react/24/outline/codebracketsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/codebracketicon.d.ts","./node_modules/@heroicons/react/24/outline/cog6toothicon.d.ts","./node_modules/@heroicons/react/24/outline/cog8toothicon.d.ts","./node_modules/@heroicons/react/24/outline/cogicon.d.ts","./node_modules/@heroicons/react/24/outline/commandlineicon.d.ts","./node_modules/@heroicons/react/24/outline/computerdesktopicon.d.ts","./node_modules/@heroicons/react/24/outline/cpuchipicon.d.ts","./node_modules/@heroicons/react/24/outline/creditcardicon.d.ts","./node_modules/@heroicons/react/24/outline/cubetransparenticon.d.ts","./node_modules/@heroicons/react/24/outline/cubeicon.d.ts","./node_modules/@heroicons/react/24/outline/currencybangladeshiicon.d.ts","./node_modules/@heroicons/react/24/outline/currencydollaricon.d.ts","./node_modules/@heroicons/react/24/outline/currencyeuroicon.d.ts","./node_modules/@heroicons/react/24/outline/currencypoundicon.d.ts","./node_modules/@heroicons/react/24/outline/currencyrupeeicon.d.ts","./node_modules/@heroicons/react/24/outline/currencyyenicon.d.ts","./node_modules/@heroicons/react/24/outline/cursorarrowraysicon.d.ts","./node_modules/@heroicons/react/24/outline/cursorarrowrippleicon.d.ts","./node_modules/@heroicons/react/24/outline/devicephonemobileicon.d.ts","./node_modules/@heroicons/react/24/outline/devicetableticon.d.ts","./node_modules/@heroicons/react/24/outline/divideicon.d.ts","./node_modules/@heroicons/react/24/outline/documentarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/documentarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/documentchartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/documentcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencybangladeshiicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencydollaricon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyeuroicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencypoundicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyrupeeicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyyenicon.d.ts","./node_modules/@heroicons/react/24/outline/documentduplicateicon.d.ts","./node_modules/@heroicons/react/24/outline/documentmagnifyingglassicon.d.ts","./node_modules/@heroicons/react/24/outline/documentminusicon.d.ts","./node_modules/@heroicons/react/24/outline/documentplusicon.d.ts","./node_modules/@heroicons/react/24/outline/documenttexticon.d.ts","./node_modules/@heroicons/react/24/outline/documenticon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsishorizontalcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsishorizontalicon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsisverticalicon.d.ts","./node_modules/@heroicons/react/24/outline/envelopeopenicon.d.ts","./node_modules/@heroicons/react/24/outline/envelopeicon.d.ts","./node_modules/@heroicons/react/24/outline/equalsicon.d.ts","./node_modules/@heroicons/react/24/outline/exclamationcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/exclamationtriangleicon.d.ts","./node_modules/@heroicons/react/24/outline/eyedroppericon.d.ts","./node_modules/@heroicons/react/24/outline/eyeslashicon.d.ts","./node_modules/@heroicons/react/24/outline/eyeicon.d.ts","./node_modules/@heroicons/react/24/outline/facefrownicon.d.ts","./node_modules/@heroicons/react/24/outline/facesmileicon.d.ts","./node_modules/@heroicons/react/24/outline/filmicon.d.ts","./node_modules/@heroicons/react/24/outline/fingerprinticon.d.ts","./node_modules/@heroicons/react/24/outline/fireicon.d.ts","./node_modules/@heroicons/react/24/outline/flagicon.d.ts","./node_modules/@heroicons/react/24/outline/folderarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/folderminusicon.d.ts","./node_modules/@heroicons/react/24/outline/folderopenicon.d.ts","./node_modules/@heroicons/react/24/outline/folderplusicon.d.ts","./node_modules/@heroicons/react/24/outline/foldericon.d.ts","./node_modules/@heroicons/react/24/outline/forwardicon.d.ts","./node_modules/@heroicons/react/24/outline/funnelicon.d.ts","./node_modules/@heroicons/react/24/outline/gificon.d.ts","./node_modules/@heroicons/react/24/outline/gifttopicon.d.ts","./node_modules/@heroicons/react/24/outline/gifticon.d.ts","./node_modules/@heroicons/react/24/outline/globealticon.d.ts","./node_modules/@heroicons/react/24/outline/globeamericasicon.d.ts","./node_modules/@heroicons/react/24/outline/globeasiaaustraliaicon.d.ts","./node_modules/@heroicons/react/24/outline/globeeuropeafricaicon.d.ts","./node_modules/@heroicons/react/24/outline/h1icon.d.ts","./node_modules/@heroicons/react/24/outline/h2icon.d.ts","./node_modules/@heroicons/react/24/outline/h3icon.d.ts","./node_modules/@heroicons/react/24/outline/handraisedicon.d.ts","./node_modules/@heroicons/react/24/outline/handthumbdownicon.d.ts","./node_modules/@heroicons/react/24/outline/handthumbupicon.d.ts","./node_modules/@heroicons/react/24/outline/hashtagicon.d.ts","./node_modules/@heroicons/react/24/outline/hearticon.d.ts","./node_modules/@heroicons/react/24/outline/homemodernicon.d.ts","./node_modules/@heroicons/react/24/outline/homeicon.d.ts","./node_modules/@heroicons/react/24/outline/identificationicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxstackicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxicon.d.ts","./node_modules/@heroicons/react/24/outline/informationcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/italicicon.d.ts","./node_modules/@heroicons/react/24/outline/keyicon.d.ts","./node_modules/@heroicons/react/24/outline/languageicon.d.ts","./node_modules/@heroicons/react/24/outline/lifebuoyicon.d.ts","./node_modules/@heroicons/react/24/outline/lightbulbicon.d.ts","./node_modules/@heroicons/react/24/outline/linkslashicon.d.ts","./node_modules/@heroicons/react/24/outline/linkicon.d.ts","./node_modules/@heroicons/react/24/outline/listbulleticon.d.ts","./node_modules/@heroicons/react/24/outline/lockclosedicon.d.ts","./node_modules/@heroicons/react/24/outline/lockopenicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglasscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassminusicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassplusicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassicon.d.ts","./node_modules/@heroicons/react/24/outline/mappinicon.d.ts","./node_modules/@heroicons/react/24/outline/mapicon.d.ts","./node_modules/@heroicons/react/24/outline/megaphoneicon.d.ts","./node_modules/@heroicons/react/24/outline/microphoneicon.d.ts","./node_modules/@heroicons/react/24/outline/minuscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/minussmallicon.d.ts","./node_modules/@heroicons/react/24/outline/minusicon.d.ts","./node_modules/@heroicons/react/24/outline/moonicon.d.ts","./node_modules/@heroicons/react/24/outline/musicalnoteicon.d.ts","./node_modules/@heroicons/react/24/outline/newspapericon.d.ts","./node_modules/@heroicons/react/24/outline/nosymbolicon.d.ts","./node_modules/@heroicons/react/24/outline/numberedlisticon.d.ts","./node_modules/@heroicons/react/24/outline/paintbrushicon.d.ts","./node_modules/@heroicons/react/24/outline/paperairplaneicon.d.ts","./node_modules/@heroicons/react/24/outline/paperclipicon.d.ts","./node_modules/@heroicons/react/24/outline/pausecircleicon.d.ts","./node_modules/@heroicons/react/24/outline/pauseicon.d.ts","./node_modules/@heroicons/react/24/outline/pencilsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/pencilicon.d.ts","./node_modules/@heroicons/react/24/outline/percentbadgeicon.d.ts","./node_modules/@heroicons/react/24/outline/phonearrowdownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/phonearrowuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/phonexmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/phoneicon.d.ts","./node_modules/@heroicons/react/24/outline/photoicon.d.ts","./node_modules/@heroicons/react/24/outline/playcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/playpauseicon.d.ts","./node_modules/@heroicons/react/24/outline/playicon.d.ts","./node_modules/@heroicons/react/24/outline/pluscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/plussmallicon.d.ts","./node_modules/@heroicons/react/24/outline/plusicon.d.ts","./node_modules/@heroicons/react/24/outline/powericon.d.ts","./node_modules/@heroicons/react/24/outline/presentationchartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/presentationchartlineicon.d.ts","./node_modules/@heroicons/react/24/outline/printericon.d.ts","./node_modules/@heroicons/react/24/outline/puzzlepieceicon.d.ts","./node_modules/@heroicons/react/24/outline/qrcodeicon.d.ts","./node_modules/@heroicons/react/24/outline/questionmarkcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/queuelisticon.d.ts","./node_modules/@heroicons/react/24/outline/radioicon.d.ts","./node_modules/@heroicons/react/24/outline/receiptpercenticon.d.ts","./node_modules/@heroicons/react/24/outline/receiptrefundicon.d.ts","./node_modules/@heroicons/react/24/outline/rectanglegroupicon.d.ts","./node_modules/@heroicons/react/24/outline/rectanglestackicon.d.ts","./node_modules/@heroicons/react/24/outline/rocketlaunchicon.d.ts","./node_modules/@heroicons/react/24/outline/rssicon.d.ts","./node_modules/@heroicons/react/24/outline/scaleicon.d.ts","./node_modules/@heroicons/react/24/outline/scissorsicon.d.ts","./node_modules/@heroicons/react/24/outline/serverstackicon.d.ts","./node_modules/@heroicons/react/24/outline/servericon.d.ts","./node_modules/@heroicons/react/24/outline/shareicon.d.ts","./node_modules/@heroicons/react/24/outline/shieldcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/shieldexclamationicon.d.ts","./node_modules/@heroicons/react/24/outline/shoppingbagicon.d.ts","./node_modules/@heroicons/react/24/outline/shoppingcarticon.d.ts","./node_modules/@heroicons/react/24/outline/signalslashicon.d.ts","./node_modules/@heroicons/react/24/outline/signalicon.d.ts","./node_modules/@heroicons/react/24/outline/slashicon.d.ts","./node_modules/@heroicons/react/24/outline/sparklesicon.d.ts","./node_modules/@heroicons/react/24/outline/speakerwaveicon.d.ts","./node_modules/@heroicons/react/24/outline/speakerxmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/square2stackicon.d.ts","./node_modules/@heroicons/react/24/outline/square3stack3dicon.d.ts","./node_modules/@heroicons/react/24/outline/squares2x2icon.d.ts","./node_modules/@heroicons/react/24/outline/squaresplusicon.d.ts","./node_modules/@heroicons/react/24/outline/staricon.d.ts","./node_modules/@heroicons/react/24/outline/stopcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/stopicon.d.ts","./node_modules/@heroicons/react/24/outline/strikethroughicon.d.ts","./node_modules/@heroicons/react/24/outline/sunicon.d.ts","./node_modules/@heroicons/react/24/outline/swatchicon.d.ts","./node_modules/@heroicons/react/24/outline/tablecellsicon.d.ts","./node_modules/@heroicons/react/24/outline/tagicon.d.ts","./node_modules/@heroicons/react/24/outline/ticketicon.d.ts","./node_modules/@heroicons/react/24/outline/trashicon.d.ts","./node_modules/@heroicons/react/24/outline/trophyicon.d.ts","./node_modules/@heroicons/react/24/outline/truckicon.d.ts","./node_modules/@heroicons/react/24/outline/tvicon.d.ts","./node_modules/@heroicons/react/24/outline/underlineicon.d.ts","./node_modules/@heroicons/react/24/outline/usercircleicon.d.ts","./node_modules/@heroicons/react/24/outline/usergroupicon.d.ts","./node_modules/@heroicons/react/24/outline/userminusicon.d.ts","./node_modules/@heroicons/react/24/outline/userplusicon.d.ts","./node_modules/@heroicons/react/24/outline/usericon.d.ts","./node_modules/@heroicons/react/24/outline/usersicon.d.ts","./node_modules/@heroicons/react/24/outline/variableicon.d.ts","./node_modules/@heroicons/react/24/outline/videocameraslashicon.d.ts","./node_modules/@heroicons/react/24/outline/videocameraicon.d.ts","./node_modules/@heroicons/react/24/outline/viewcolumnsicon.d.ts","./node_modules/@heroicons/react/24/outline/viewfindercircleicon.d.ts","./node_modules/@heroicons/react/24/outline/walleticon.d.ts","./node_modules/@heroicons/react/24/outline/wifiicon.d.ts","./node_modules/@heroicons/react/24/outline/windowicon.d.ts","./node_modules/@heroicons/react/24/outline/wrenchscrewdrivericon.d.ts","./node_modules/@heroicons/react/24/outline/wrenchicon.d.ts","./node_modules/@heroicons/react/24/outline/xcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/xmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/index.d.ts","./src/components/ui/dropdown.tsx","./src/components/layout/header.tsx","./src/components/layout/protectedroute.tsx","./src/components/layout/applayout.tsx","./src/components/layout/importlayout.tsx","./src/components/ui/input.tsx","./src/components/stories/taginput.tsx","./src/components/stories/richtexteditor.tsx","./node_modules/file-selector/dist/file.d.ts","./node_modules/file-selector/dist/file-selector.d.ts","./node_modules/file-selector/dist/index.d.ts","./node_modules/react-dropzone/typings/react-dropzone.d.ts","./src/components/ui/imageupload.tsx","./src/components/stories/authorselector.tsx","./src/components/stories/seriesselector.tsx","./src/app/add-story/page.tsx","./src/app/authors/page.tsx","./src/components/tags/tagdisplay.tsx","./src/components/stories/storycard.tsx","./src/app/authors/[id]/page.tsx","./src/app/authors/[id]/edit/page.tsx","./src/components/collections/collectioncard.tsx","./src/components/collections/collectiongrid.tsx","./src/components/stories/tagfilter.tsx","./src/app/collections/page.tsx","./src/components/collections/storyreorderlist.tsx","./src/components/collections/addtocollectionmodal.tsx","./src/components/collections/collectiondetailview.tsx","./src/app/collections/[id]/page.tsx","./src/components/collections/collectionform.tsx","./src/app/collections/[id]/edit/page.tsx","./src/components/collections/collectionreadingview.tsx","./src/app/collections/[id]/read/[storyid]/page.tsx","./src/app/collections/new/page.tsx","./src/app/import/page.tsx","./src/components/bulkimportprogress.tsx","./src/app/import/bulk/page.tsx","./src/app/import/epub/page.tsx","./src/components/stories/storyselectiontoolbar.tsx","./src/components/stories/storymultiselect.tsx","./src/components/library/sidebarlayout.tsx","./src/components/library/toolbarlayout.tsx","./src/components/library/minimallayout.tsx","./src/app/library/page.tsx","./src/app/login/page.tsx","./src/app/settings/page.tsx","./src/components/ui/colorpicker.tsx","./src/components/tags/tageditmodal.tsx","./src/app/settings/tag-maintenance/page.tsx","./src/app/stories/page.tsx","./src/components/stories/storyrating.tsx","./src/app/stories/[id]/page.tsx","./src/app/stories/[id]/detail/page.tsx","./src/components/tags/tagsuggestions.tsx","./src/app/stories/[id]/edit/page.tsx","./src/app/stories/import/page.tsx","./src/app/stories/import/bulk/page.tsx","./src/app/stories/import/epub/page.tsx","./node_modules/@types/trusted-types/index.d.ts","./node_modules/@types/dompurify/index.d.ts","./node_modules/@types/json5/index.d.ts"],"fileIdsList":[[64,106,348,349],[52,64,106],[64,106,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742],[64,106],[64,106,802],[64,103,106],[64,105,106],[106],[64,106,111,140],[64,106,107,112,118,119,126,137,148],[64,106,107,108,118,126],[59,60,61,64,106],[64,106,109,149],[64,106,110,111,119,127],[64,106,111,137,145],[64,106,112,114,118,126],[64,105,106,113],[64,106,114,115],[64,106,116,118],[64,105,106,118],[64,106,118,119,120,137,148],[64,106,118,119,120,133,137,140],[64,101,106],[64,106,114,118,121,126,137,148],[64,106,118,119,121,122,126,137,145,148],[64,106,121,123,137,145,148],[62,63,64,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[64,106,118,124],[64,106,125,148,153],[64,106,114,118,126,137],[64,106,127],[64,106,128],[64,105,106,129],[64,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[64,106,131],[64,106,132],[64,106,118,133,134],[64,106,133,135,149,151],[64,106,118,137,138,140],[64,106,139,140],[64,106,137,138],[64,106,140],[64,106,141],[64,103,106,137,142],[64,106,118,143,144],[64,106,143,144],[64,106,111,126,137,145],[64,106,146],[64,106,126,147],[64,106,121,132,148],[64,106,111,149],[64,106,137,150],[64,106,125,151],[64,106,152],[64,106,118,120,129,137,140,148,151,153],[64,106,137,154],[52,64,106,159,160,161],[52,64,106,159,160],[52,56,64,106,158,305,344],[52,56,64,106,157,305,344],[49,50,51,64,106],[64,106,406],[64,106,357,379],[64,106,357,388],[64,106,357,382,388],[64,106,155,357,381,382,383,384,385,386,387],[64,106,155,357,381,382,388,389,390],[64,106,155,357,381,382,388,389],[64,106,155,357,369,380],[64,106,357,381,382,391],[64,106,373,374,378],[64,106,374],[64,106,373,374,375,376,377],[64,106,373,374],[64,106,373],[64,106,370,371,372],[64,106,370],[64,106,357],[64,106,356],[64,106,355],[64,106,357,361,362,363,364,365,366,367],[64,106,355,357],[64,106,357,360],[64,106,752],[64,106,752,753],[64,106,355,357,358,359,368],[64,106,358],[57,64,106],[64,106,309],[64,106,311,312,313,314],[64,106,316],[64,106,164,173,180,305],[64,106,164,171,175,182],[64,106,173,282],[64,106,230,240,253,347],[64,106,261],[64,106,164,173,179,217,227,280,347],[64,106,179,347],[64,106,173,227,228,347],[64,106,173,179,217,347],[64,106,347],[64,106,179,180,347],[64,105,106,155],[52,64,106,241,242,258],[52,64,106,158],[52,64,106,241,256],[64,106,237,259,332,333],[64,106,194],[64,105,106,155,194,231,232,233],[52,64,106,256,259],[64,106,256,258],[52,64,106,256,257,259],[64,105,106,155,174,187,188],[52,64,106,165,326],[52,64,106,148,155],[52,64,106,179,215],[52,64,106,179],[64,106,213,218],[52,64,106,214,308],[64,106,411],[52,56,64,106,121,155,157,158,305,342,343],[64,106,163],[64,106,298,299,300,301,302,303],[64,106,300],[52,64,106,306,308],[52,64,106,308],[64,106,121,155,174,308],[64,106,121,155,172,189,190,205,234,235,255,256],[64,106,188,189,234,243,244,245,246,247,248,249,250,251,252,347],[52,64,106,132,155,173,187,205,207,209,255,305,347],[64,106,121,155,174,175,194,195,231],[64,106,121,155,173,175],[64,106,121,137,155,172,174,175],[64,106,121,132,148,155,163,165,172,173,174,175,179,182,184,186,187,190,191,199,201,204,205,207,208,209,256,264,266,269,271,272,273,305],[64,106,121,137,155],[64,106,164,165,166,172,305,308,347],[64,106,173],[64,106,121,137,148,155,169,281,283,284,347],[64,106,132,148,155,169,172,174,187,198,199,201,202,203,207,269,274,276,294,295],[64,106,173,177,187],[64,106,172,173],[64,106,191,270],[64,106,270],[64,106,168,169],[64,106,168,210],[64,106,168],[64,106,170,191,268],[64,106,267],[64,106,169,170],[64,106,170,265],[64,106,169],[64,106,255],[64,106,121,155,172,190,206,225,230,236,239,254,256],[64,106,219,220,221,222,223,224,237,238,259,306],[64,106,263],[64,106,121,155,172,190,206,211,260,262,264,305,308],[64,106,121,148,155,165,172,173,186],[64,106,229],[64,106,121,155,287,293],[64,106,184,186,308],[64,106,288,294,297],[64,106,121,177,287,289],[64,106,164,173,184,208,291],[64,106,121,155,173,179,208,277,285,286,290,291,292],[64,106,156,205,206,305,308],[64,106,121,132,148,155,170,172,174,177,181,182,184,186,187,190,198,199,201,202,203,204,207,266,274,275,308],[64,106,121,155,172,173,177,276,296],[64,106,121,155,182,189],[52,64,106,121,132,155,163,165,172,175,190,204,205,207,209,263,305,308],[64,106,121,132,148,155,167,170,171,174],[64,106,185],[64,106,121,155,182,190],[64,106,121,155,173,191],[64,106,121,155],[64,106,193],[64,106,195],[64,106,173,192,194,198],[64,106,173,192,194],[64,106,121,155,167,173,174,195,196,197],[52,64,106,256,257,258],[64,106,226],[52,64,106,165],[52,64,106,201],[52,64,106,156,204,209,305,308],[64,106,165,326,327],[52,64,106,218],[52,64,106,132,148,155,163,212,214,216,217,308],[64,106,174,179,201],[64,106,132,155],[64,106,200],[52,64,106,119,121,132,155,163,218,227,305,306,307],[48,52,53,54,55,64,106,157,158,305,344],[64,106,111],[64,106,278,279],[64,106,278],[64,106,318],[64,106,320],[64,106,322],[64,106,412],[64,106,324],[64,106,328],[56,58,64,106,305,310,315,317,319,321,323,325,329,331,335,336,338,345,346,347],[64,106,330],[64,106,334],[64,106,214],[64,106,337],[64,105,106,195,196,197,198,339,340,341,344],[64,106,155],[52,56,64,106,121,123,132,155,157,158,159,161,163,175,297,304,308,344],[52,64,106,754],[64,73,77,106,148],[64,73,106,137,148],[64,68,106],[64,70,73,106,145,148],[64,106,126,145],[64,68,106,155],[64,70,73,106,126,148],[64,65,66,69,72,106,118,137,148],[64,73,80,106],[64,65,71,106],[64,73,94,95,106],[64,69,73,106,140,148,155],[64,94,106,155],[64,67,68,106,155],[64,73,106],[64,67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,106],[64,73,88,106],[64,73,80,81,106],[64,71,73,81,82,106],[64,72,106],[64,65,68,73,106],[64,73,77,81,82,106],[64,77,106],[64,71,73,76,106,148],[64,65,70,73,80,106],[64,106,137],[64,68,73,94,106,153,155],[52,64,106,335,399,414,418,748,749,750,751,756,757,758],[52,64,106,329,335,398,399,416,418,747,749,756],[52,64,106,329,331,335,398,399,416,418,747,762],[52,64,106,329,331,398,399,416,418,747,749],[52,64,106,335,398,399,416,747,773],[52,64,106,335,398,399,416,747,771],[52,64,106,335,398,399,416,747,775],[52,64,106,335,398,399,747,773],[52,64,106,398,399,416,418,747,749,766,767],[52,64,106,331,335,418,748,749,779],[52,64,106,335,418,743,748,749],[52,64,106,335,418,748,749],[64,106,348,413,414],[52,64,106,335,398,399,405,416,418,747,749,767,783,784,785,786],[52,64,106,329,335,410,414,418,749],[52,64,106,335,414,416],[64,106,345,400],[64,106,345],[64,106,345,400,402],[64,106,345,351,400],[52,64,106,399,405,410,418,747],[52,64,106,398,399,416,418,747,749,761,791],[52,64,106,329,331,335,398,399,409,416,418,747,761],[52,64,106,335,398,399,416,418,747,749,750,751,756,757,758,797],[52,64,106,331,335,398,399,408,416,418,761,794],[52,64,106,335],[52,64,106,335,416],[52,64,106,398,399,416,418,749],[64,106,331,398,399],[52,64,106,331,335,398,399,416,418,769,770],[64,106,398,765],[52,64,106,331,398,399,418,761],[52,64,106,331,398,399,418],[64,106,745,746],[52,64,106,329,331,335,410,414,418,744],[52,64,106,331,335,747],[52,64,106,398,418,749,761],[52,64,106,398,399],[52,64,106,408,418,749],[52,64,106,329,331,398,399,418,761],[52,64,106,398,762,782],[52,64,106,398,399,416,418],[64,106,398],[52,64,106,398],[52,64,106,398,399,418,749,790],[52,64,106,399,416,418],[52,64,106,331,416],[52,64,106,418],[52,64,106,331,743],[52,64,106,329,755],[52,64,106,335,399,408],[64,106,397,398],[64,106,399,407],[64,106,351,352,353,354,391,395,396,399],[64,106,351,391],[64,106,392,393,394],[64,106,351]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"472f5aab7edc498a0a761096e8e254c5bc3323d07a1e7f5f8b8ec0d6395b60a0","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0dbcebe2126d03936c70545e96a6e41007cf065be38a1ce4d32a39fcedefead4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"3609e455ffcba8176c8ce0aa57f8258fe10cf03987e27f1fab68f702b4426521","impliedFormat":1},{"version":"d1bd4e51810d159899aad1660ccb859da54e27e08b8c9862b40cd36c1d9ff00f","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3b8f725c3d5ffb64bf876c87409686875102c6f7450b268d8f5188b6920f7c25","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"37f7b8e560025858aae5195ca74a3e95ecd55591e2babc0acd57bc1dab4ea8ea","impliedFormat":1},{"version":"e2d5483c9a79900ba9d6012135f18b662b3ca1d33fde4f5e39b71f74e47d6331","impliedFormat":1},{"version":"22b9fab85e85b95f6378b5a2bd43c9d2e15106d760e0e58111c416fe224cc76f","impliedFormat":1},{"version":"fc46f093d1b754a8e3e34a071a1dd402f42003927676757a9a10c6f1d195a35b","impliedFormat":1},{"version":"b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"49e567e0aa388ab416eeb7a7de9bce5045a7b628bad18d1f6fa9d3eacee7bc3f","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"87eaecac33864ecec8972b1773c5d897f0f589deb7ac8fe0dcdf4b721b06e28d","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","impliedFormat":1},{"version":"fa1ea09d3e073252eccff2f6630a4ce5633cc2ff963ba672dd8fd6783108ea83","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"309816cd6e597f4d4b080bc5e36215c6b78196f744d578adf61589bee5fd7eea","impliedFormat":1},{"version":"bdb44eca306ff5b62bcf2b4e70e96a40987e018029d95565e2f234aad80830cf","impliedFormat":1},{"version":"edaa0bbf2891b17f904a67aef7f9d53371c993fe3ff6dec708c2aff6083b01af","impliedFormat":1},{"version":"89aece12f9cd6d736ae7c350800f257a2363f6322ae8f998da73153fb405d8af","impliedFormat":1},{"version":"d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","impliedFormat":1},{"version":"aa9a92be255ec97f669ea89678fafcbd35d165f65b68ff22685263f6eaeb3c9c","impliedFormat":1},{"version":"fa8b514302736759e491d3df074a61f54ed1a6a69b4aadee05dbcdda53f881c3","impliedFormat":1},{"version":"e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"c9d71f340f1a4576cd2a572f73a54dc7212161fa172dfe3dea64ac627c8fcb50","impliedFormat":1},{"version":"3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","impliedFormat":1},{"version":"6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","impliedFormat":1},{"version":"b9750fe7235da7d8bf75cb171bf067b7350380c74271d3f80f49aea7466b55b5","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"f79e0681538ef94c273a46bb1a073b4fe9fdc93ef7f40cc2c3abd683b85f51fc","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"17ace83a5bea3f1da7e0aef7aab0f52bca22619e243537a83a89352a611b837d","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"6cf2d240d4e449ccfee82aff7ce0fd1890c1b6d4f144ec003aa51f7f70f68935","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3","impliedFormat":1},{"version":"9deab571c42ed535c17054f35da5b735d93dc454d83c9a5330ecc7a4fb184e9e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"8945919709e0c6069c32ca26a675a0de90fd2ad70d5bc3ba281c628729a0c39d","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"763ee3998716d599321e34b7f7e93a8e57bef751206325226ebf088bf75ea460","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"606e6f841ba9667de5d83ca458449f0ed8c511ba635f753eaa731e532dea98c7","impliedFormat":1},{"version":"7c0d4fc71fe32cedb758c7e3c08715235a51e5a22d184306a59dae10a9c7ffaa","impliedFormat":1},{"version":"ce8a0b21e80cf5f10adc9336b46ffc666696d1373a763b170baf69a722f85d67","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"baeffe1b7d836196d497eb755699718deb729a2033078a018f037a14ecaeb9a7","impliedFormat":1},{"version":"39da0a8478aede3a55308089e231c5966b2196e7201494280b1e19f8ec8e24d4","impliedFormat":1},{"version":"90be1a7f573bad71331ff10deeadce25b09034d3d27011c2155bcb9cb9800b7f","impliedFormat":1},{"version":"bc7221c9a8dc71587ff784120f7707985627282dad0a99439e893a1588651ef0","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"ad444a874f011d3a797f1a41579dbfcc6b246623f49c20009f60e211dbd5315e","impliedFormat":1},{"version":"1124613ba0669e7ea5fb785ede1c3f254ed1968335468b048b8fc35c172393de","impliedFormat":1},{"version":"5fa139523e35fd907f3dd6c2e38ef2066687b27ed88e2680783e05662355ac04","impliedFormat":1},{"version":"9c250db4bab4f78fad08be7f4e43e962cc143e0f78763831653549ceb477344a","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"db7c948e2e69559324be7628cb63296ec8986d60f26173f9e324aeb8a2fe23d8","impliedFormat":1},{"version":"9c2353ef1fb353a1c8f30af2cf104f0bc64ebc2fcdb98c2834d451bd654664ab","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"7fda4c0e3f50513286029633c458ee82cee563cd6af20b92e43b4425c969c146","impliedFormat":1},{"version":"cda4052f66b1e6cb7cf1fdfd96335d1627aa24a3b8b82ba4a9f873ec3a7bcde8","impliedFormat":1},{"version":"703733dde084b7e856f5940f9c3c12007ca62858accb9482c2b65e030877702d","impliedFormat":1},{"version":"413cb597cc5933562ec064bfb1c3a9164ef5d2f09e5f6b7bd19f483d5352449e","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"6cc79183c88040697e1552ba81c5245b0c701b965623774587c4b9d1e7497278","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"82c27d4cf380b0e6cd62628f069b850298d20051f0b7b0a1904fdb38c53fa7a6","impliedFormat":1},{"version":"c97b9278c8ce212c1bdf4fae9c77d58c15565d4ebf663d761a9deb924b6ca8b3","impliedFormat":1},{"version":"8bb6e7ce91ec84336203e87010b1198514548c2e44789752c1741eaac02f2431","impliedFormat":1},{"version":"b33ac7d8d7d1bfc8cc06c75d1ee186d21577ab2026f482e29babe32b10b26512","impliedFormat":1},{"version":"24f8f342c14c911eedfee43074c6a0d0a5ebb5ec984353bffaeadddb3f6a6b1c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"03d4a10c21ac451b682246f3261b769247baf774c4878551c02256ae98299b1c","impliedFormat":1},{"version":"2d9b710fee8c3d7eabee626af8fd6ec2cf6f71e6b7429b307b8f67d70b1707c5","impliedFormat":1},{"version":"652a4bbefba6aa309bfc3063f59ed1a2e739c1d802273b0e6e0aa7082659f3b3","impliedFormat":1},{"version":"d7ca19bfb1ba4c3ef59d43bd7cd3719d8c5ffb60a9b6f402dee4e229f4d921aa","impliedFormat":1},{"version":"0c0a85a19b60f2ec18a32ff051bb1423860977a16b645dbf159baa7202bc633b","impliedFormat":1},{"version":"fc5bdc1d13667041055811568043956c75150923d8b9a32b989ac7588418ce47","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"d3b290cc3c08cbde2b463df2616b948fb32733dafe3ac29b9e6ded26baee5489","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"9558d365d0e72b6d9bd8c1742fe1185f983965c6d2eff88a117a59b9f51d3c5f","impliedFormat":1},{"version":"6cc2961fbe8d32e34fd4c7f1b7045353016fff50df98bc31af7c7d1b4b6eb552","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"a2e1f7010ae5f746b937621840cb87dee9eeb69188d32880bd9752029084212c","impliedFormat":1},{"version":"dd30eb34b5c4597a568de0efb8b34e328c224648c258759ac541beb16256ffb6","impliedFormat":1},{"version":"6129bd7098131a0e346352901bc8d461a76d0568686bb0e1f8499df91fde8a1f","impliedFormat":1},{"version":"7cd7923a36835c1194a92b808068a524c4e7c0ff7bdc8712865800e6963d75da","impliedFormat":1},{"version":"82200d39d66c91f502f74c85db8c7a8d56cfc361c20d7da6d7b68a4eeaaefbf4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","impliedFormat":1},{"version":"131b1475d2045f20fb9f43b7aa6b7cb51f25250b5e4c6a1d4aa3cf4dd1a68793","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"76264a4df0b7c78b7b12dfaedc05d9f1016f27be1f3d0836417686ff6757f659","impliedFormat":1},{"version":"c0fabd699e6e0b6bfc1728c048e52737b73fb6609eeeae0f7f4775ff14ff2df6","affectsGlobalScope":true,"impliedFormat":1},{"version":"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"4dd4f6e28afc1ee30ce76ffc659d19e14dff29cb19b7747610ada3535b7409af","impliedFormat":1},{"version":"1640728521f6ab040fc4a85edd2557193839d0cd0e41c02004fc8d415363d4e2","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","impliedFormat":1},{"version":"5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","impliedFormat":1},{"version":"9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","impliedFormat":1},{"version":"e81bf06c0600517d8f04cc5de398c28738bfdf04c91fb42ad835bfe6b0d63a23","impliedFormat":1},{"version":"363996fe13c513a7793aa28ffb05b5d0230db2b3d21b7bfaf21f79e4cde54b4e","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"7f6c48cacd08c1b1e29737b8221b7661e6b855767f8778f9a181fa2f74c09d21","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"f72ee46ae3f73e6c5ff0da682177251d80500dd423bfd50286124cd0ca11e160","impliedFormat":1},{"version":"898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","impliedFormat":1},{"version":"d707fb7ca32930495019a4c85500385f6850c785ee0987a1b6bcad6ade95235e","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"5d26aae738fa3efc87c24f6e5ec07c54694e6bcf431cc38d3da7576d6bb35bd6","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"e0aa1079d58134e55ad2f73508ad1be565a975f2247245d76c64c1ca9e5e5b26","impliedFormat":1},{"version":"cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","impliedFormat":1},{"version":"68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"94fd3ce628bd94a2caf431e8d85901dbe3a64ab52c0bd1dbe498f63ca18789f7","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0","impliedFormat":99},{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"521fc35a732f1a19f5d52024c2c22e257aa63258554968f7806a823be2f82b03","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf",{"version":"5fe5261888f807e5313cba55b93a4778b1d30c1cdafd5ee5968f58db09264438","signature":"1e8d749e23750475a16578786160132ddfacbdb19a58dae84c217f55b7bd0781"},{"version":"75572a14d49d5857e480f2a397c3df9624eaa05ba25e5c75ad0a364ead3f3e52","signature":"e6add220edf9e992868695f8d297ba60d29bfcb10ef148c779a6869186feb0a3"},{"version":"cdd8855391d2cefcfbd7d8cf0cf21fc5fa96f73dedf37ef5083c1504d1f6dfda","signature":"009c713bef2c53ab9257fb5e0a3c6c4447426898364849d4be633de0fad8888d"},{"version":"110902392738bd83f6a49bd474805210a5d5befaccfcba05c146da212c9c7e59","signature":"e4cec98f1ba49c4a6be95a07070daadcf64898a0409396762b8a6006bea02bee"},{"version":"2556e7e8bb7e6f0bb3fe25f3da990d1812cb91f8c9b389354b6a0c8a6d687590","impliedFormat":99},{"version":"ad1c91ca536e0962dcbfcdff40073e3dd18da839e0baad3fe990cf0d10c93065","impliedFormat":99},{"version":"19cf605ba2a4e8fba017edebdddbbc45aea897ddc58b4aae4c55f382b570ff53","impliedFormat":99},{"version":"f1cb3052f76b6d3a0bbe97e87a7e8ffa15661ac8ff496079daef778a60acf9ce","impliedFormat":99},{"version":"18852bc9e6c3dfe183573ab1e15f983d8172213969e7c1f51fa5f277ed41dab6","impliedFormat":99},{"version":"7618d2cb769e2093acd4623d645b683ab9fea78c262b3aa354aba9f5afdcaaee","impliedFormat":99},{"version":"029f1ce606891c3f57f4c0c60b8a46c8ced53e719d27a7c9693817f2fe37690b","impliedFormat":99},{"version":"83596c963e276a9c5911412fba37ae7c1fe280f2d77329928828eed5a3bfa9a6","impliedFormat":99},{"version":"81acfd3a01767770e559bc57d32684756989475be6ea32e2fe6255472c3ea116","impliedFormat":99},{"version":"88d0c3eae81868b4749ba5b88f9b6d564ee748321ce19a2f4269a4e9dd46020a","impliedFormat":99},{"version":"8266b39a828bfb2695cabfa403e7c1226d7d94599f21bea9f760e35f4ca7a576","impliedFormat":99},{"version":"c1c1e740195c882a776cf084acbaf963907785ee39e723c6375fec9a59bf2387","impliedFormat":99},{"version":"137f96b78e477e08876f6372072c3b6f1767672bf182013f84f8ae53d987ff86","impliedFormat":99},{"version":"29896c61d09880ff39f8a86873bf72ce4deb910158d3a496122781e29904c615","impliedFormat":99},{"version":"dc1d7cc525fd825a3172b066489eaa2048e8e40ce2a56a6f1372ad05236bc049","impliedFormat":99},{"version":"ed9ce8e6dd5b2d00ab95efc44e4ad9d0eba77362e01619cb21dedfdedbad51b8","impliedFormat":1},{"version":"5520611f997f2b8e62a6e191da45b07813ac2e758304690606604a64ac0ca976","impliedFormat":1},{"version":"00b469cba48c9d772a4555216d21ba41cdb5a732af797ccb57267344f4fc6c3d","impliedFormat":1},{"version":"2766bf77766c85c25ec31586823fefb48344e64556faad7e75a3363e517814f6","impliedFormat":1},{"version":"b7d1eaffd8003e8dc0ec275e58bd24c7b9a4dbae2a2d0d83cf248c88237262ce","impliedFormat":99},{"version":"7a8b08c0521c3a9e1db3c8b14f37e59d838fdc32389f1193b96630b435a8e64e","impliedFormat":99},{"version":"2e54848617fae9eb73654d9cf4295d99dab4b9c759934e5b82e2e57e6aaaef20","impliedFormat":99},{"version":"ae056b7c3f727d492166d4c1169d5905ddd194128a014b5d2d621248ed94b49c","impliedFormat":99},{"version":"edc5d99a04130f066f6e8d31c7c3f9ba4749496356470279408833b4faee3554","impliedFormat":99},{"version":"2f502ac2473a2bbf0d6217f9660e9d5bf40165a2f91067596323898c53dab87c","impliedFormat":99},{"version":"21f27a0c8bc8d9a4e2cf6d9c60140f8b071d0e1ffddb4b7dcf6bbf74d0e8d470","impliedFormat":99},{"version":"deb3f73972ef3525308c943cfe417840e64ccfc3a3e3cebaaed4ad51c241e6b4","impliedFormat":99},{"version":"09f1b5d09fd74c119863dd4fea0c13cac164a5b35d9efa4f0ee6c407310fc1e6","impliedFormat":99},{"version":"49ef40d7a022a3c9060581d2d1783e9a0b6eb398330cf950cf4713214892c5a5","impliedFormat":99},{"version":"5256f5cf585954c773ee01a0272df9e13e0fec1d32ae196619c9a14dd4dcfdc3","impliedFormat":99},{"version":"9cbca8447baaa98288175320c3eaa02135d5370881ee2ca2a1c91cf549b34d81","impliedFormat":99},{"version":"1d6ad75caac5c783a41789d1f9ece0da982b4af600d2ae6a7f2dd025d12aa212","impliedFormat":99},{"version":"7cb7ca9e74d896aa6f51557df37c249605ce93cf855c075a91fabaac331d4a80","impliedFormat":99},{"version":"4274ed938e85b119581cd6c65c7242555567eb55906af839a931f0acf6023982","impliedFormat":99},{"version":"8151f274499e464ac8459cbbaae63e2537d112ca41761f5067a05fb0e98e9291","impliedFormat":99},{"version":"825103c182891d61d14191b0bf64b0666663d4fd1b1468a30c203208297f253a","impliedFormat":99},{"version":"5889044020ca262dfc82a80357d75d715a0b9aa6dc3673f58220aefa36818f87","impliedFormat":99},{"version":"b2fadfb2042b920f9334bf1795d1cfc2afddacc4a4aa4cacbdbf45165966b740","signature":"ba147a0c772b9c0a676215fbcdce099ab6aae9bb0844c61d53373abe2fe4e694"},{"version":"867498b01d8cc8b1f0d51a6ad1f365bd3c65e714b8aa78abfb219658d2595d68","signature":"f4e3f014a94776db30786b918fcd5b3053d070cbd786dd1549cf3e2f578686e3"},"4a14e39855699bd4c5b4057d3f0ccf0b2b05cadff1b6942a4afcfb676635bf1d","bca619a199547e560027f57284812eb1e37475b591a11bdb4425120c030d7a70",{"version":"a6b1af90be57c2134cd57d413e87692c79b58b1db1a56bff18dbea10e57bef0f","signature":"bd10d75fb1b63460389cb095fc4c731b88e5d6bebd38feec0488f0b50fad97e6"},{"version":"1d7ee0c4eb734d59b6d962bc9151f6330895067cd3058ce6a3cd95347ef5c6e8","impliedFormat":99},{"version":"d2d2156516c6cf0fe7f4b20ec8d4771f0f9577d17272e4e9db8026270ad0f534","signature":"d09572b5874b806a61eea45697f2f3de8c5467f7682108789416152013c61970"},"3c945c2cc29086b9460b2dbe6ab3f377f21863b73b425a4366a91b6fe86eb6ea","ff083724d6c285a438384bc6dbb9d18bf75ea2d1ed07e78430066feb0e0fc094","8cb888e04a0093d373958adee1782753ac05cfd9ba2e13d7dfa93f13c0b47e25",{"version":"8198b38947844903ac9436fa1460a4c2badf1bdcbb1f718e2e48e60aac0c266c","signature":"d4a05ab77a048299fe0688addd13111a1b51a0cc2612db67c77500d16a2aa527"},"db16bd7e1e3e16a15b118213afdcd25936845dcf81e0c1b4e573a44e6f1207c2","1dc9da51d09b2b70542a3ea3767af7b97d73380b7ff6869b1ee45bc818de1ece",{"version":"4d1e354d388bd9a61afbb2fc5ef2cc42bdcd38e315214b5829e7288f597b79d0","signature":"a78ca39c2cd068be881b384ced2bf87d6b45dbedb997733e8fef5b16139d0c32"},{"version":"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e","impliedFormat":1},{"version":"42979633ab57d6cc7837b15be8c44c2087a264d5f2ca976afed684bee0925468","impliedFormat":99},"dc46151f659545eae8fc6f85db3a0a3efa005238b75055a44d4949bfa4ff730c",{"version":"b58b573f4e231c54bd58d92276f1ab5ea522d57a91e5872851d605f75f36d00b","signature":"9233c6a47fb6a1b96a6ad7adde996db020aa4cdb0dd702cb3408b5794d440631"},"0fce8a9bd25cb14b8c3e3577883596593a377c3ec2cc775040b625f442b35e38",{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"1b61d562dbf8295515b0f1016ea7b719e46847621988f7420785e5c8668ca790","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},"f2611056758a00c757050a56348333c8cb7a72adee9ca6a24eb6231169e04203","8bf5182f42ea17acad008ff41e3c0943185e67966fb08da0d96851dbd992aa6e","ee46c526e4a0119c3e8e4edc5f2281d4180b8f1ba0cc01c840f7aff9592b299e","8eda331cd98719945603ff749b1fc960c5e75c7b14850c2c6387405e0f6ea3ce","f08c967d1e8618060baaa840dd0e1c8a31cdc682416af116d32fda7d78b76ace",{"version":"c8e857b6224783e90301f09988fb3c237fe24f4ebf04778d0cbe8147a26fffe7","impliedFormat":1},{"version":"df33f22efcbdd885a1ea377b014e0c1dfbe2e42d184d85b26ea38db8ee7834c4","impliedFormat":1},{"version":"f400febd2140549f95c47b2b9a45841c495dfeb51cc1639950fa307cd06a7213","impliedFormat":1},{"version":"7048016c91c6203433420b9e16db56eec9c3f5d5a1301398e9907ac1fed63b58","impliedFormat":1},{"version":"a4234645829a455706bf2d7b85642ee3c96bfe1cfddc9918e25bac9ce2062465","impliedFormat":1},{"version":"9ff2d17592dec933b2b9e423fab8b8bc20feed486f16d35c75edd77c061de6e3","impliedFormat":1},{"version":"fe9fc5b80b53a1982fe8fc0f14a002941b471213717536987d0cf4093a0c90a0","impliedFormat":1},{"version":"4921f21de15ba1e7d1d5c83cf17466d30d4371bc9acf0c2c98015ebc646702ef","impliedFormat":1},{"version":"f728f13a2965aacfb75807a27837509c2ab20a4bb7b0c9242e9b5ca2e5576d22","impliedFormat":1},{"version":"c340ac804b0c549d62956f78a877dda3b150e79954be0673e1fc55f4a415f118","impliedFormat":1},{"version":"2bfe95f5f0ea1a7928d7495c4f3df92cdc7b24872f50b4584e90350255181839","impliedFormat":1},{"version":"9dfe677f6d3a486eebe1101b4cf6d4ec1c4f9ee24cc5b5391f27b1a519c926f7","impliedFormat":1},{"version":"2766c9a60df883b515c418a938f3c8fd932241c89aba12aedf418e02a73017ce","impliedFormat":1},{"version":"394967bc5f7707312a95cd7da0e5b30b736b7ab2f25817a8fea2d73b9398d102","impliedFormat":1},{"version":"014a4afcc1674f40c7d77ca215e68bb3b0a254c2c925bcaa9932b6fb8f1ccd4e","impliedFormat":1},{"version":"f816538db9388ac17bd354cf38d52da6c01d9a83f0589b3ff579af80cff0c8c6","impliedFormat":1},{"version":"d2e0c04dce50f51b98ee32fd461dfa6e416a4b703c3d6d7e7fb7e68eca57a8de","impliedFormat":1},{"version":"a8995e0a2eae0cdcd287dca4cf468ea640a270967ed32678d6fbf89e9f56d76d","impliedFormat":1},{"version":"b151ad192b8e11b5ca8234d589abd2ae9c3fc229cdbe2651e9599f104fe5aa6b","impliedFormat":1},{"version":"c37f352ab276b3cd4117f29e4cc70ed8ac911f3d63758ca45202a1a052fa9d00","impliedFormat":1},{"version":"c97ffd10ec4e8d2ae3da391ca8a7ff71b745594588acc5d5bdef9c6da3e221bc","impliedFormat":1},{"version":"74c373c562b48a0bde3ee68ac563403883b81cabe15c5ada4642a559cbd5d04e","impliedFormat":1},{"version":"d42fe36f52e0ae09274753ed0fdedb32c42c2ad6ad247c81e6bd9982d1762004","impliedFormat":1},{"version":"87f162804c7a5615d3ea9bdb2c828cd1d1f8378d5e2a9c3be1bd45c12f1fc1a5","impliedFormat":1},{"version":"ccb92f285e2f3a3462262945fa59506aebe6ec569e9fec223d45d41c7c6cd447","impliedFormat":1},{"version":"04e45000cf1381e6a84196aa01ca811ab192ca0a09debacc9e75dcfc6777bae1","impliedFormat":1},{"version":"566007f48fa4cc7d29e4cb5cce9c315ccd52b72300d2d45ab0c639889e42d455","impliedFormat":1},{"version":"4c2f8fb8a8f4afce6e05b9c554c012eb50147084933d78f7d218108740afd803","impliedFormat":1},{"version":"6f72b3ebad0276cfcc7291fd2aefd1fbbd229487ec1acbbad03e798e8760e02e","impliedFormat":1},{"version":"096681898d7131c1183f164ccfec478d99a9efa3744a1b6617116bc6713ed7be","impliedFormat":1},{"version":"2c9626288e967ebb03ec2bc27ea504f6f829b1686f65b86fd5074d53e0160d70","impliedFormat":1},{"version":"4de35fb3800a92324c59c1d2ed28a4dc1284d507d27ef2eed680c2f9ebb32cd2","impliedFormat":1},{"version":"4c3cccf01f76ca4292746b6dfebd6df4382eb7a05315724116feacecf952f106","impliedFormat":1},{"version":"492d1d21f79a8fa084e9dfd8fab89247301a49f1a0c12765b99c30a0ad8629ff","impliedFormat":1},{"version":"69872cabf40dd4399939184cd7c5e47da62a9df811d3f56d193a437817a85b21","impliedFormat":1},{"version":"19d00382e69115eeb1214d9b865030b61ec14f1bd5e91fb6e2b75acf5a6bef80","impliedFormat":1},{"version":"3c3045d2661ef44458559f6bd48ebb47ccdfcbc513d859dc60c5e18e0544ac87","impliedFormat":1},{"version":"e1de43a7fb0dda59dd9ed398fa306abdcb99da16b54edd3c7dc5e1a45d7e91df","impliedFormat":1},{"version":"8301449ecbf03d5f893c298863fb66d97f1becb31f157276bdba7c708174a5be","impliedFormat":1},{"version":"a556bdee2de2416a026022aeb260b5d684da34e322b5a95c7503143e51787b4f","impliedFormat":1},{"version":"e8bc04f55c1b3da172412955b2785de54f2e1f2c9cb8949c0748ff143525310e","impliedFormat":1},{"version":"683ad3639d8a96cfc782d672c44797d13c735ca9792d6c57e2fa5ada89e18e0c","impliedFormat":1},{"version":"25b171a82c55909032e85448d89f8409e045a24a2b0458080bf304845b29b6ba","impliedFormat":1},{"version":"ce25751e5374e1f13100276ecf2e2e8aac4d4c7229f762b3dc206639640954b8","impliedFormat":1},{"version":"2f0a5a8ef5c6f5866d3caf04151422d05e64765ee250a7e9defc62908cfe73af","impliedFormat":1},{"version":"79726fbe0854724f5bc3f16d4e40c0b320bbaa7a6296d1d782d70909f3b3a2eb","impliedFormat":1},{"version":"6d391889910947acbe7d110271463ef74e7f65ae372d355756b1a6b0a987168d","impliedFormat":1},{"version":"b3dadc705ad865a3acd5b40561ac0dcbce38fa28872ecb903eb586bd64cfa8b6","impliedFormat":1},{"version":"8181adc6c7145eb6b2596249f3a2e1ff2fa7ebc604e73fe583f98c4b40916d6a","impliedFormat":1},{"version":"dc84bb520982504eb30b09b870b32be8eccff2cd9beb963efd6a78971ae104b6","impliedFormat":1},{"version":"bafdca74b47f54e116a9f2d589d39f1c677c777198b96a677a2d2f628b43c8f5","impliedFormat":1},{"version":"9ccc168fc7cb696b5f60f216c72881db1f6c2d8e39eadd6c68130711f8eddd19","impliedFormat":1},{"version":"6187a2dae6a9d910f272bfae324625437343f43a6ff48a28a5c5dd5e9cfc2d5f","impliedFormat":1},{"version":"f063f87a44b1e92948bd5ef6db5b8cadef75218126e75ff02df83196e2b43c4b","impliedFormat":1},{"version":"333df4996910e46b00aa9b7c8be938f6c5c99bfbf3a306596e56af9fff485acb","impliedFormat":1},{"version":"deaf2e9bfb510a40e9413d5e940f96bf5a98a144b4e09a0e512efe12bfe10e9b","impliedFormat":1},{"version":"de2395fb1d7aa90b75e52395ca02441e3a5ec66aa4283fb9ced22e05c8591159","impliedFormat":1},{"version":"64be79c9e846ee074b3a6fb3becdbb7ac2b0386e1e1c680e43984ec8e2c2bbb9","impliedFormat":1},{"version":"9c09e723f7747efc123e19f0ced5f3e144bbc3f40a6e1644a8c23437c4e3527f","impliedFormat":1},{"version":"36fc129c8e3ad288656ea0e9ba0112728c7ec9507c75c6a3bce6d66f821a31d5","impliedFormat":1},{"version":"3771470dde36546305e0431b0f107e2175d94e11f09b116611156f134364127e","impliedFormat":1},{"version":"18c6715ca6b4304a314ff9adb864bd9266fc73813efd33d2992a7c6a8c6e7f73","impliedFormat":1},{"version":"90cde8ac2173d2008c51996e52db2113e7a277718689f59cd3507f934ced2ac2","impliedFormat":1},{"version":"69d01aac664fe15d1f3135885cd9652cca6d7d3591787124ae88c6264140f4b1","impliedFormat":1},{"version":"55ab3dd3c8452b12f9097653247c83d49530b7ea5fe2cb9ef887434e366aee8c","impliedFormat":1},{"version":"abd2ce77050bfd6da9017f3e4d7661e11f5dc1c5323b780587829c49fcac0d26","impliedFormat":1},{"version":"d9dfcbbd2f1229ce6216cb36c23d106487a66f44d72e68fd9b6cb21186b360cd","impliedFormat":1},{"version":"244abd05ca8a96a813bf46ddb76c46675427dd3a13434d06d55e477021a876ef","impliedFormat":1},{"version":"5298f6656d93b1e49cf9c7828306b8aefc0aa39ac56c0a1226f1d4fba50a2019","impliedFormat":1},{"version":"93268ed85b0177943983c9e62986795dcb4db5226732883e43c6008a24078d7f","impliedFormat":1},{"version":"843fa59ad0b6b285865b336b2cbc71cdc471e0076a43d773d580cb8ba2d7030d","impliedFormat":1},{"version":"aa2d452401748a5b296bf6c362b9788418b0ab09ee35f87a89ba6b3daa929872","impliedFormat":1},{"version":"a4ef3c3f6f0aadacac6b21320d0d5d77236360e755183802e307afd38f1cbcc9","impliedFormat":1},{"version":"853b1daed2861381ddda861a0450ce031c280d04caec035cc7433872643871c6","impliedFormat":1},{"version":"1058ed9becf0c63ba0a5f56caaafbfd0bf79edf2159c2f2f2fe39a423ae548ae","impliedFormat":1},{"version":"8b6eab9a4a523909ee1c698a10d332c544aa1fb363f482fe60f79c4d59ca2662","impliedFormat":1},{"version":"f2b2c244b10a8e87192b8730ed5b413623bf9ea59f2bf7322545da5ae6eae54b","impliedFormat":1},{"version":"92bbeada67d476b858679032b2c7b260b65dbccc42a27d0084953767d1a8cf46","impliedFormat":1},{"version":"545afad55926e207ac8bdd9b44bb68f0bbffc5314e1f3889d4a9ad020ea10445","impliedFormat":1},{"version":"4c8ef63125ed4d1eef8154ec9da0b6b7ca9effdf4fa5a53ab74a9d73c9754ff5","impliedFormat":1},{"version":"e76a7e0b4f2f08e2bef00eacc036515b176020ab6b0313380dd7a5bd557a17f0","impliedFormat":1},{"version":"fabd983e4148e2dce2a817c8c5cdbbc9cf7540445c2126a88f4bf9c3e29562b2","impliedFormat":1},{"version":"a80c5c5bab0eb6cc1b3276ac276e5b618ead5de62ec8b0e419ea5259af0a9355","impliedFormat":1},{"version":"d8cf5ded7dd2d5ce6c4e77f4e72e3e1d74bb953940a93d3291fb79158e1afc6e","impliedFormat":1},{"version":"bdb10c13a7ababaae91932d0957ef01cd8a789979cd0b606a2106d198848b16c","impliedFormat":1},{"version":"0fd3f9fed4dd35b1b07c18b4c3f612b7542c91835ad8a26e0e83d905709543dc","impliedFormat":1},{"version":"441b5f5ac4619df9dbf436ecdb9f0bbaacf8696e6fdb2f81c6f5b1db76f5a1c0","impliedFormat":1},{"version":"5d2284728400ee7b4fd1acd69e48d649d4056916cc70950a0000e5d70a32a750","impliedFormat":1},{"version":"27ef186120f9e7ee90686aa7ad5163eb5c7f4cdeb19bb87850c4a5fe4b8e05e8","impliedFormat":1},{"version":"4f1f9e056e0c9d23031367b4c7e7eedffb3e1ed58e64befc90749ca4dd9363ee","impliedFormat":1},{"version":"2b0ccf76bcf10f61612135f951a74327ea0a2d5a80f397b767e0e0b08cdac265","impliedFormat":1},{"version":"4e42e643f05a7fa69581a1a697a1cf967d9b2657dd9dd66e59d90500ec053ba0","impliedFormat":1},{"version":"0ea8485dc0bb7d2a258a93b16305e17fb5be9f877a9df88de7023a9821c537ab","impliedFormat":1},{"version":"5c221ba5333b775cef94d4a30076cc30730cceba649e9d30c5a7224a698c8825","impliedFormat":1},{"version":"cb61ba4d5b5e39ecafe74ad7d88dc8e67defcffe15fb9216addee0fa06d5df38","impliedFormat":1},{"version":"d83e8f0c10477fb4a7729a51aaad853cee81e0e332581dd2244da09e5526b5ff","impliedFormat":1},{"version":"c8933a5b693306696e78315dca1fa57f6f5493fed44cd90aa2d4a4d354dd6516","impliedFormat":1},{"version":"af8e2bf3df20cd2e6b8d744dd83499e174609d0c88864af3f30cd43671e719f5","impliedFormat":1},{"version":"4186fd8b51535399c7ad1edc08f9c4ebb2a9e8e327b131cc1f950c5dfbb0c358","impliedFormat":1},{"version":"b92965f503f55830702062f9e0832fabfbded49ff28728686a6fd84aa32f454d","impliedFormat":1},{"version":"172dbc7933ff46ba3b2efe8b5c7828fd4f0d45c08755df8200213b6055d57f2e","impliedFormat":1},{"version":"89e2ec7ed42725f89fa537c38f20144782bec6c5710e467a46a647647c8255cf","impliedFormat":1},{"version":"5165882999957fa041e423a4fb64627dcb310bf50183af70a6ee8e10a584b0c3","impliedFormat":1},{"version":"390997d64e1e5721fa807aa9e05c97086f58627170d9a7ed84b127126a3e5202","impliedFormat":1},{"version":"00cf8ed9b47860a5f8cc0a65d7a41f85a7026f68162057728abc9249943a8629","impliedFormat":1},{"version":"fc8b086c99f6d721eae8125a96833e0ba1762d00b80aad1d55c7a8b59d007466","impliedFormat":1},{"version":"ff72c74ccdc5570c4a75a93e605a5586596444d96048d52c72f322da183c556d","impliedFormat":1},{"version":"b8755448066177191edcd0b7e19e7fe44d69ed6dc97b16a420b7aa9070e2b850","impliedFormat":1},{"version":"822a0c843f492ad2dc815080f24d4ddac4817a9df0de8cd35830e88fbbafbbe4","impliedFormat":1},{"version":"467865324b9f66a1b8f68d9350c5aa0e749eec499e4863fe017b16ea8bcaccdf","impliedFormat":1},{"version":"863bd77d5546877e19594759a901cc7b75da8d27336d4351e54413ec12032d09","impliedFormat":1},{"version":"a17a62c94da321c0bf2315c35033e313daf1298a75aa43a01a4daf6937980c01","impliedFormat":1},{"version":"851271a09d3c2db3eab80d64beb468d775a9818df06a826ba58925c900231ccb","impliedFormat":1},{"version":"da2c95cd1f0f9cc19f3dd599b4c8fb0930eccb78a5c73f683e7ea98262d2f55e","impliedFormat":1},{"version":"e40d3ca85fb1362763067506784635aa28863640cf7cf9be9e8c1c521c0fbbd5","impliedFormat":1},{"version":"77a2f84e19aca9d03efdf0c484aba8daad3fd23c70b72e63aca78fadf71b448d","impliedFormat":1},{"version":"00c5b6248c69e66729e5c4acb239db849b1497d7eb111fed3eba979432461ebf","impliedFormat":1},{"version":"8e13abf75e9394f3a4b1d0b3f99468e15f4c7e2115153d2a1ca3c0de035bad1c","impliedFormat":1},{"version":"07097dab1c068118806fecb8544aba3cca30965d0864b1998af1bee326a9990c","impliedFormat":1},{"version":"c490ca6eb9149c28e4f2def6acb1bc058d160edb40fd249cf2a70c206a8cfecc","impliedFormat":1},{"version":"7c9aab9a76abba65aa6389e41707d57ea0288dac9a8b6359465dcb462d2cfaa1","impliedFormat":1},{"version":"97fbe30fd1b61b26f807ae1c78b681b0999af71cd9604c08a1d45e44690ca0c2","impliedFormat":1},{"version":"ef91bf45a3d149db0b9e4e612ed1400c35f6a3d2a09669d1441add612d5f16b8","impliedFormat":1},{"version":"dacebdc0353168f259724bccfd273b892e883baf36cf3dee21cf4178f3ef9ea0","impliedFormat":1},{"version":"5416fb031a72377c3c17faa2041428a5f19f9d46a70b645dda6e3293fd0ca8ce","impliedFormat":1},{"version":"95611472fd03e0992070caa3a5387133e76a079719994d237947f6bcf67f9bca","impliedFormat":1},{"version":"6141d19bfa7698f362e84460856ace80a1eac3eab1956b188427988f4cd8e750","impliedFormat":1},{"version":"1acded787e1fc09fd56c004d3ba5b719916c06b61976338a92a2f04ec05cba5c","impliedFormat":1},{"version":"8fb0d41cd90f47b9148e4a474fb03484d9af1735871321a2f57f456e40a7e319","impliedFormat":1},{"version":"a25cd4cf54bcdd109dd46274e2369fc1cad6d74350b5642441d2b9eef515c3bf","impliedFormat":1},{"version":"af4b9f16e50a0ae803745150e4c091e86ab95f3dac649286af28505258f7a189","impliedFormat":1},{"version":"3d209a6c3c53366b3bcb72dcf04a7ceda57362cae6ac47dbb783321934a0c5ad","impliedFormat":1},{"version":"4766770027d93a5ad1d4cc880cce405b4c6f67c64303ab34b347d6428eb783f2","impliedFormat":1},{"version":"43d2bec085f0fab54d7b9dfa3f5c5ce65e30da6a19d82ed37d1d41867682f86e","impliedFormat":1},{"version":"e5efb9781a0ef18d60cbb8afa261489efd260d87642c095cacba0b09b2684fcf","impliedFormat":1},{"version":"775ca7538a2f9bc674ebe5f3cb8aa8fa346ef4c1faec4c5b13b4784a744854dc","impliedFormat":1},{"version":"c0037c7c6fb8031f7047a1ccdb381762862b48429e9ab07bac8fc35fc5b5dd14","impliedFormat":1},{"version":"af4db63c6e4d55df1ad7f3dabdde31bc30555debf1cd6b79ea65a36c52bf199c","impliedFormat":1},{"version":"d291ffc234a58061b8192f74422f2e51fb87f6d10e82c30a555bccf9641b3e38","impliedFormat":1},{"version":"6d683695e9765b29165bb0823f88755211d48949f0b95a9a4236802afddf41e1","impliedFormat":1},{"version":"8fcd568ba937d867544cd8e726f35a515690ad041387fdebc93d820c8720e08c","impliedFormat":1},{"version":"81a0ff507ece65e130c1dd870ba79b8337c1fd345db7b154a2749282c994d2d5","impliedFormat":1},{"version":"64e2ffc72047548fa3c04095abb9dab48e2eaac169161fd2ed3564dea0c67e57","impliedFormat":1},{"version":"b525d2fc6b694512a877219ebba25d5fa244f99253a5bbe6c6421f8d71b1c806","impliedFormat":1},{"version":"d695f0d65f5fba0e275cf7801399575c272b86e7bf8e70133f8fc03517305b1d","impliedFormat":1},{"version":"0836f15e5e7dcad64fd50d49a39267da34371d1c2b803b38dffcfabcd2ff604e","impliedFormat":1},{"version":"56eff313f885482d44e4aa7cefdd55f7d0d92a91c1ddf9cd73c533abc36f4dff","impliedFormat":1},{"version":"022ff6b725f6ab95b1c4d229893b3047002a9c1fab6798c8fe63797ec1e63dc5","impliedFormat":1},{"version":"5e64d04301aa6ae6bf0f3435d07804889342873ab2875a16c827db9e6543002d","impliedFormat":1},{"version":"0b8c3effe0c65129d493be140da1a83eb61a1e83481d441dd2bc359a926b453e","impliedFormat":1},{"version":"0816c977ef73d99cbb134427a83f91ca6f7fe00eb7544118320d613a85da6879","impliedFormat":1},{"version":"068db2994f5926e888462b0852ada2c24f2cb50028f034f475407957ca51c6cd","impliedFormat":1},{"version":"59106b469557319ad26f40f054861be3fd2cf09911c3b66df280b9340a1d9caf","impliedFormat":1},{"version":"69e8e2dc21b0636f671485867555439facd68ee9e234fc9190c3b42e7f1a74e9","impliedFormat":1},{"version":"5fb0c0cae187f6554769cd4ff36575ddbc43078a4fdf9b17a5c0c25dfa9a9f2b","impliedFormat":1},{"version":"918d99a7aa4b7f5edf2cdcb33c163837a892f43b9e22c10634d61d0a28fc09a2","impliedFormat":1},{"version":"097b0d1e237bfcc97411fcae19a484a717fd4055a48e98ade5cc28b26afd21f6","impliedFormat":1},{"version":"5fb0eef64cb75951f7ae2dc6a704aa0567a25a39a616a5dd10ba7cfbfcf73b78","impliedFormat":1},{"version":"0a649cbc59a47f224d0494a6d5167a803ed049f995ade8423c7cb62bb6a38b64","impliedFormat":1},{"version":"68e25d1a79523b18fae630ca57100ce2dff6c5023376a2f57e9d0d07e1b9b8ef","impliedFormat":1},{"version":"1a505f408bc7d484553b7701f712dc52e1174648baff7d6c9c1f38b5cb83b772","impliedFormat":1},{"version":"b19badf31df455f10cf44fda9f6a0e0b42d6e970ac122b66c5da5d683fa270d4","impliedFormat":1},{"version":"71b6fe5c85eb877c3e3ed2f142b95a69f97905c34f11fc6d9052a4317e7f6bae","impliedFormat":1},{"version":"bd55536c0f989f59af6ca66cbc8121485f978f4e07c3df1688623c5f898058c6","impliedFormat":1},{"version":"dcb868c613ccd06b1a3ff56ee235e5987820c0c8bbd77fedc9af4dcfdd4c54bf","impliedFormat":1},{"version":"f3d1b3cd130e3cd67fe8e06256deb5d678243c6976ea498c81a48e542efb7529","impliedFormat":1},{"version":"772b881836efbdceb7ae8d3ae038f14ec83444397d8429b866312dcd78714dde","impliedFormat":1},{"version":"314d516eb3bf1eda07e898935edcbd1e74739493c8ad444e82181f8a020eef2c","impliedFormat":1},{"version":"8cfced8e57c64563f91e90a76a6df2d8f934c90a425327a9ed5393bc88c27d97","impliedFormat":1},{"version":"67bd754a8775c81794c9fc84b1a1e9fca44a402fa7d93fcdad4ba2d37737d929","impliedFormat":1},{"version":"5128e32c57068eb09d5189eb68681ca7d0e5e4b0cdedecbef9c67689f0970876","impliedFormat":1},{"version":"7fcdedd29146e5a2a6c86eda652f8485a1eeda1b8646825bbf729023f6ea6013","impliedFormat":1},{"version":"86b9b361ce8ea1d9f04e15bbe49e5ac72e5f97d8cfa8592930d32f267729a201","impliedFormat":1},{"version":"671f5e3a931c2737f8dfa43b34c4a320eca27fc6584ecef890ddd7374cee5cb7","impliedFormat":1},{"version":"ff213315eebd3ff05e01b383f704d79d8139aad5cb0d6a13c082f2e29625adbc","impliedFormat":1},{"version":"83ed351a10ef17b7811d3c06fc2775e36b6911278326d55da8d1eef8ff2f29df","impliedFormat":1},{"version":"2f5f146f1d6c04cf89ae0e9b4cf2b064b2ce4319ba6a5bf18ab8fb29db1cfd1a","impliedFormat":1},{"version":"7fc2b96a8465725bf774bd490c383edd5ee3dfe0d38c13551d082cae2de4041e","impliedFormat":1},{"version":"9eaeb6696e4218cb5bded9ee27c3e95589ad4af1fd4b97ccdca43eadd62c94d5","impliedFormat":1},{"version":"fd580a99cb9bb84288da00eea67dce300bdef06d4da2a727c0fc466d2922dca2","impliedFormat":1},{"version":"b82809d4468b6ba4d72437adaab7ca273547c59974e954c48f655a4b1bdca429","impliedFormat":1},{"version":"c6455d4ed4f7337bcb885c61372c7d9b03991995ed73e29023bad502d1336f0a","impliedFormat":1},{"version":"b5e6f0491b5a2002eb9b1146165cf915ee58e0fddf7f2adb5f2aa4bc44b4fb83","impliedFormat":1},{"version":"f534aef095a62fb82f57768fc52995d3e58d95e0a1671b0256a4704802aee818","impliedFormat":1},{"version":"cdc6f1d471882782cdac7442dbdad65aede5f749c09799a84918bd916eb6d6db","impliedFormat":1},{"version":"2475197472c609662f09660e3964a86aa355cea0e671653656800690bb508b7c","impliedFormat":1},{"version":"b4067760d0447747d82b6848b640168d656d0b916c3add2ec94c3c4dea92fc9f","impliedFormat":1},{"version":"c6c591a17f9c0c2821baf15f775f5c7d6dd4a0786365ee9c182d7a97e38ad96a","impliedFormat":1},{"version":"ede44ddf9d274a859e9f1f34333d5f0e8cf2167c3265f81d5280d37b872b4552","impliedFormat":1},{"version":"6317aba53c9152998bb1f8bd593f55730084d05c00c774ff72a3aa4d687a6dbb","impliedFormat":1},{"version":"26f1bd15980b19d925be98afde3918a6a181435b87e9b7c70d15726ecbfff0e5","impliedFormat":1},{"version":"57af4faf6847adff5048f82929b9a7d44619d482f571534539ae96a59bb29d3a","impliedFormat":1},{"version":"874770f851ac64a93aaddfb86a2f901f158711911fee14a98a67fe32533ee48b","impliedFormat":1},{"version":"3d933e519ad9cc8cf811124f50d0bc14223cdea9f17adf155f11d190ceb2a6c8","impliedFormat":1},{"version":"d5dfce61a7bf994d2cb711af824efa4de9afa5854d34e6725b9c69d925b6b2dc","impliedFormat":1},{"version":"f77d1e10417bf43f8fa5d18916935f342d4d443e371206ede7239faaf9abbbb8","impliedFormat":1},{"version":"c94e0b8815b72ba924c6b8aa666b25903d949a7ab0d38ed84e4bf65da3d06a3b","impliedFormat":1},{"version":"15db84e660fdcd8468f23973ab83c31d7fd28bdddb30b0aed16cfa051aafe900","impliedFormat":1},{"version":"7c01cbfe181c0e10044831b899de6c2eec4fba32de1f1cca12742d2333c1345b","impliedFormat":1},{"version":"62cb1636513ef26d3ea83fb5d2369cf8569d04aa30d8fd7f5327d0e10841635d","impliedFormat":1},{"version":"8282a076b07dc3dc6b2265377627ab3860cb6a1bcbae85a5a4006dec4c9f0066","impliedFormat":1},{"version":"b273c241dd08c6276fd35be413c64508ae50f847fa052bf7781799b51da8e9e9","impliedFormat":1},{"version":"3bc0bbef6d7fb63002fe80167db350b9677cfce5872c0cc7ecec42ba8248ded6","impliedFormat":1},{"version":"4880c6a85442934b81f3b1a92cb6b43df36f8c1b56b6822eb8cbc8c10c438462","impliedFormat":1},{"version":"1bfdd8c1710a3d1654746ca17f512f4a162968a28e1be1a3a1fdd2a8e5bf385f","impliedFormat":1},{"version":"5405aedafdf272dde53b89036199aaed20d81ddc5ec4bea0cb1ab40232fff3fe","impliedFormat":1},{"version":"db2ee45168db78cc83a4368546e0959318374d7256cbd5fa5692a430d5830a59","impliedFormat":1},{"version":"49993b0eaa14d6db6c334ef0e8b1440c06fee2a21ffd4dea64178880bd3d45a2","impliedFormat":1},{"version":"fb9d9dc0a51cb4014d0e5d5f230ec06ffc4eb6caae6eecfe82ea672b7f3c6967","impliedFormat":1},{"version":"84f44079a0793547d3a629feb8f37d8ef6d07cb5bb5fdeefd887f89e9be871f6","impliedFormat":1},{"version":"295c5ec088a1bfc286e8dbdc9807958588979988cd7a74ad32be774a6f6ea512","impliedFormat":1},{"version":"f15129c62ed04410ac0a3326ae6fa5ef7229bbb1b0cbfa252b5c558505a38253","impliedFormat":1},{"version":"4bf500d9a554d43cb9133d60f1b3f58ca98b0f794486d1377f3effc551b40faf","impliedFormat":1},{"version":"536f6a9208c89eb8f0a5eeda629175b0fa62ccd22e387af7f35297fa2af6897d","impliedFormat":1},{"version":"8c95fe5a655ea1c78f0335f8da58e70d98e72fe915987c3b61c6df49d6e276d1","impliedFormat":1},{"version":"4bd434d3055d1b4588f9d7522d44c43611341de7227db9718a700703c608e822","impliedFormat":1},{"version":"935507b695f420fddff2d41ddc12ff3935931a3f26d6aa65afbb276bfdf51cb4","impliedFormat":1},{"version":"e851c14c9dbe365592f5084c76d4b801e2f80302f82cebbe7c2b86095b3ae08a","impliedFormat":1},{"version":"b5c90d931d285d9d1c4cb92d71f2719e28caaa9ca062072d0bb3b69300b436c2","impliedFormat":1},{"version":"40b3e953e9ea51a86a1e5b60a2355eeb780f2f8ce895ece252910d3e0a033a16","impliedFormat":1},{"version":"0264b432aace8398f174e819a0fc4dc196d5aed49ae65aae071fc2ec8e6dc029","impliedFormat":1},{"version":"3b29bb23855a1924264c3a30b5c73b00c52a57c2ffb5f91c48c9572e71048f19","impliedFormat":1},{"version":"8b9b2e76db07d8926bcc432c9bdfb38af390568951b39fe122d8251b954f9ed2","impliedFormat":1},{"version":"96e85c6fa102741a25418ab2c8f740c994e27ea86fd6518a17ec01a84b64dd5c","impliedFormat":1},{"version":"9525b28a4fa959c8d8c7d6815f842f78c67b40def9160afdced5c9daf14cd4a8","impliedFormat":1},{"version":"0e59a6944a52f52138315b6658fb1d217fa017b7abec12006c491d51e07fb56d","impliedFormat":1},{"version":"cfa8acfeb9d68702aa6249b7295ca73ea598e441f014cd4184b6e2a3ea9a275c","impliedFormat":1},{"version":"21b0c616f61cd6699135a34a500f7df30022abf9358ba612f10668ea3c988e00","impliedFormat":1},{"version":"9ad1d0b171f7bb9f484ad156e97f0d8e760a5fee13e342831669c7b2d1137a30","impliedFormat":1},{"version":"7ccadd4ba126bb2c0564bfb85ddd7d084aa5f2880cc2d0149fbe183fd5ceb6d1","impliedFormat":1},{"version":"ebbde5a8a356a1547ac6ecdfba7547036a5ada116011cb96634c32df1cf69084","impliedFormat":1},{"version":"e703eded767e3a944ac1f7c58c201a0821da1d68c88d6ba94bb985a347c53e42","impliedFormat":1},{"version":"99953f3f1f9deae755b97ed3f43ce2bee2ae1324c21c1e5fa9285c0fe7b5077f","impliedFormat":1},{"version":"2afd452bfa6ebaacbead1ca5d8ab6eda3064d1ea7df60f2f8a2e8e69b40259e9","impliedFormat":1},{"version":"dae0f3382477d65621b86a085bdb0caabf49e6980e9f50ee1506b7466c4d678d","impliedFormat":1},{"version":"e5793b3f4cbd73c841790264db591d3abe9bd09128302a2901fedd2353ab24d5","impliedFormat":1},{"version":"41ed74193a13f64a53705a83e243235920fd58d4b115b4a9f5d122362cda7662","impliedFormat":1},{"version":"478e31b207faa7110b04f6a406240f26b06243eb2d2cff3234c3fc8dd075bf6c","impliedFormat":1},{"version":"ea917cdbfb87d11cd2f8b03e357b22b1114d0ba39ce4ce52b1a4f0dc10c6c20a","impliedFormat":1},{"version":"3ef0c5634d9aabee346f9ba056c1c5d977f2e811f6d13c082614c9062cd4b624","impliedFormat":1},{"version":"1ddb49c7f8fc4b9e4da2d5ddca91b4e2763fe7d17aa79940bd60406f3e2739bd","impliedFormat":1},{"version":"d5b01eab562dc40986a5ceb908519dc7f02a7ded2bcb74318317a75714dbc54c","impliedFormat":1},{"version":"b19ef44e991aa150a19a9f84be1fd1c4d86496241300fd904216762246700623","impliedFormat":1},{"version":"87df6cf2565a88dae3ec50e403e9ef6b434ad3e34d922fe11924299018b38e58","impliedFormat":1},{"version":"9d999d30b52fb0b916f7a64c468f6d5c7a994e0c1ef74d363562e9bda3cb8b99","impliedFormat":1},{"version":"9b1b05f88ded21046391276ff60d2d987bf160d77b40399e07b7bdbfe2e38b31","impliedFormat":1},{"version":"628177f7eb0314f0189e4d90f663233606b3936ce391c7f98da46105ae402c65","impliedFormat":1},{"version":"3c80bf6873eb3b95cd590aab8eb1612f0f7cef6a30b3f49535844f7cecd99351","impliedFormat":1},{"version":"da367ede4ebd5ff4cb1cf9e6bc8eb35848b23c57c22c53360e53dc772c7be8f9","impliedFormat":1},{"version":"4337acbd8896efb7e7d8d6e0eca78607fc7c1a9ad2bb228240f13f97b3492f1f","impliedFormat":1},{"version":"505c7800f8195961302dee715870b7212bdfb667e5e47de76447151dd35a40f1","impliedFormat":1},{"version":"cf5a3eed6cd493d198b0c1eacf70486d8bd527fc411d57660caf2c93b5ea0fb6","impliedFormat":1},{"version":"900e344adae3c65076c9ba4ee1a77c6db19fb0c7e54d7ce23c28ff8d272cba26","impliedFormat":1},{"version":"bcc5186a38d1eecf60b2c4d1e3eb9abd8ab91cb492f384a9d2ed7bcda2abd0d5","impliedFormat":1},{"version":"0ec1b41954fea9def7d9d87e0f3beea2ba3ec5b7beb769f308cfe32ad2968669","impliedFormat":1},{"version":"51189c085256f11da13b22792f1d7c928f8a8e9d9b6c7b38e956e72a51ef8219","impliedFormat":1},{"version":"504f509e23f2ab3a8018533925c034a340fbce4af9e77a1f71a8ddffbe0c19fa","impliedFormat":1},{"version":"635c049483e13e1dc8bee72dde300c40d350046cff59b202d41a12ec8c733d27","impliedFormat":1},{"version":"7fd8d5f70ea745e1a0338de7aaacd9bd6ff086ce6de75dcf91749c77d1e23831","impliedFormat":1},{"version":"78d2a7795bfd2be490937e8b01968a0acca8a6bdf5933570bc013806049d4175","impliedFormat":1},{"version":"db49833b6e9aa54b535076f40615349a7465005367a787b50ba7b92421e26442","impliedFormat":1},{"version":"6a936fc917de40c44ca81331ee7d7a71dc30ae1895871e7be7b6ed85d96cc41f","impliedFormat":1},{"version":"bdd2a764cf87c4ab1efd7084597d1ca4ba17f6b6496553095ecca5a14b5d4278","impliedFormat":1},{"version":"ddef8e6676fd572ee3de174ad28df05c7b3803542d7318482b8f98779ff25612","impliedFormat":1},{"version":"34eae3bc7f5bfb515d2ec163ccd4b63fdb73ad7f66564707686d84f42a8b7c35","impliedFormat":1},{"version":"d240d106cf9bc3c0efdb323d807b944ce16ac5d837ecef5b75f1e66d606b2a72","impliedFormat":1},{"version":"639d5a26be297431e0bcc9f71f969fd7d84319fc03b5e1c672ea10fb0094c616","impliedFormat":1},{"version":"770c3e6367c2802c027c0b1f86928f288e11ad77ac2f454d7f682460eab30a0c","impliedFormat":1},{"version":"c9dd2760e0419a059cf733c38ef5d44eeca3fc647f9c201d88656e5040f5a3a7","impliedFormat":1},{"version":"16766b8f3d1bba66ac8167e6407be6c490d4462e802f67c140b1174869db5b67","impliedFormat":1},{"version":"f9267391788ac81ca54dfae32c5d86e99a19abaee9b172b2f8d98a3c2b578a2f","impliedFormat":1},{"version":"92441638c0fa88072ef9f7b296a30e806bac70219ce2736ef33c8941259d9b70","impliedFormat":1},{"version":"8774efbaf39f9ea3a0ff5b1c662c224babee5abb3d754796278e30eb2e51ae3c","impliedFormat":1},{"version":"e634b47a7d3f9468572a7c9af1fe2f52687ee1afb23ba5568205a7a4c55662ef","impliedFormat":1},{"version":"1cbef47ee169c717a1ef7ea91b15582c61ac721fd5f5671de95c3df9f026db9a","impliedFormat":1},{"version":"0db0ee49f803c9b901dfe06be9c8fb6a1c05f98664ca34c68e0da575eae76f2b","impliedFormat":1},{"version":"4b745fcadf040899979b6b26e24aca6d2fa2bbe52a919d67f717bfe0339354a3","impliedFormat":1},{"version":"bc57f3550b3fd3b7d31b9a278d0b491dd45d170e37c4046a3105fdea9ebe5f89","impliedFormat":1},{"version":"b5f7093d62a228669dd56edd0bcb86a0cf0b46db4816a3967b4632503c21b93c","impliedFormat":1},{"version":"4d70bbb1f35f345b2c2e1b5c9b8174d5397bba76ffef12656bca16ce9a1830d3","impliedFormat":1},{"version":"a004fc80aa8f78dfb1d47b0e098fe646e759311c276b6b27404f5e356528f22d","impliedFormat":1},{"version":"c8933d9afe6c5ee7ecbeec5aa01f6b37d3c2be2f7dd203ee75ee4850164007cb","impliedFormat":1},{"version":"b1129b38f1eea70951ece3ccd1cc3e1d094379b64d3958ba8ce55b0ec0083434","impliedFormat":1},{"version":"b2bb10f992cfd1cf831eb005311a80f7f28bc14cfac5883f17e75f758d1354e1","impliedFormat":1},{"version":"58b621b924324874a67e92d7626809fd4b72fc079ce909f6da7097654026af00","impliedFormat":1},{"version":"149288ae23bb3b31ffe5cfb7eea669fc6872e41901d60be932af2581601fc70f","impliedFormat":1},{"version":"01a0fd262c8fdc6c91078255c4fe2f8602fd4fe4c753b2eae88537585b21dddf","impliedFormat":1},{"version":"deb69e6754a61784daadc35b318544b0aa69048ebfb142073c62b7f46bb1d5d0","impliedFormat":1},{"version":"60eef77c9b5cec20516907628f849845975a8137773ddb0bcb53fc2ea7d28870","impliedFormat":1},{"version":"67bcdcbd8cece34ae28180c636908af1b118fa9603d0d4b7dea877156d4de519","impliedFormat":1},{"version":"5a1c2cee26d1f8d9bb15b334f5b2df7de27a3944bff9ccf71d3b69c588612bda","impliedFormat":1},{"version":"a04d60b205af1f28461f3d2f5a8222ec2d8af54d436bc53a0460756e07e4207d","impliedFormat":1},{"version":"14c85d4debb2e0c8939f81b85cb9ab4543f70c8fe53be5fb5caf1192677c8ca4","impliedFormat":1},{"version":"c507cdc9757c048620ff08a85b9cf6278598eb1738d729fdbfa1e387a35e639a","impliedFormat":1},{"version":"4a4807c3096f49a463476742e3b5d23ccf0e087e43c017891c332ae5b8ad667d","impliedFormat":1},{"version":"c611af558c5d19fa477f1b03ceac7b0ae28fe5ad4f8bc61e8ad64c46f97e86e2","impliedFormat":1},{"version":"0cec41f583efa1f1033a4d546d926ee949756f19040bb65807c5a3ab6f3b8449","impliedFormat":1},{"version":"73b1eda15491d4f3052d6fac202190e76d6453fce832034bd29901cb198448b9","impliedFormat":1},{"version":"08c66989383183f3d7c43346617c8f466bef28f1e3eb4da829316d548cdbdf80","impliedFormat":1},{"version":"1f283476bbeaa589fe644fe6ba9da223baf118ecd4756863deae7362b246aff3","impliedFormat":1},{"version":"0a8f91ace4d1803eb2a50079c9e233fb262b0027d19aa250eb7ecbf6319e52d6","impliedFormat":1},{"version":"65bab52912be03b374ab591d73ee40aff3a465ac20bc0f2024b4c80ac5ce8397","impliedFormat":1},{"version":"6a647bf0620a4a7777527c688c62636a503e8b4d5e680037503066dd2af6d0dd","impliedFormat":1},{"version":"f1466e4d708815280c849956a506e132b7dc243907b9c8e07d52862e32dfcd91","impliedFormat":1},{"version":"cb4b99f8e47f57df841c95fcb1afc28488a2b5442e3524f6261e611b86105331","impliedFormat":1},{"version":"7c5fc61fc40a9f3aa3a09fd867536ff94a93b16f4ae99f1fb748fae6e13ae8bc","impliedFormat":1},{"version":"473d9ca5b242db0471d418336f410922eadd290679914f37ef21ee26dbeee2b4","impliedFormat":1},{"version":"2ffeb6ad0b074d1cfa3dc9671dad062b08129d1e8a8988b727dd2ce9fd4298d8","impliedFormat":1},{"version":"fa1d4332a68d84300895af592811f65f5f1d725ed0664f17d5c215a63408b6b4","impliedFormat":1},{"version":"7a09768c36d8b7d8e44b6085031712559362b28a54f133b803bed19408676cdf","impliedFormat":1},{"version":"f0b807278b2619fbe0acb9833bd285acabbf31da3592da949f4668a2e4bcbcf0","impliedFormat":1},{"version":"bc6419ca69c35169941d9d0f7a15c483a82ac601c3448257f29a1123bc2399e1","impliedFormat":1},{"version":"45f530610645ca6e25621ce8e7b3cf6c28cd5988871bc68b3772488bd8e45c25","impliedFormat":1},{"version":"2d3e715ca71765b491ae8bd76257e8ccfe97201c605dadc4e6532bb62e4f6eee","impliedFormat":1},{"version":"c519419c11e61347181ba3b77e8d560d8cc7614b6231cacefe206b41474792d4","impliedFormat":1},{"version":"24823640771cf82865c3b1cb48a8a88119b69e56aef594171cc0570f35f60b8a","impliedFormat":1},{"version":"30398045bda704d03d23e78a37095aa56e69ab2dd8bb7304b15df9e183b9800a","impliedFormat":1},{"version":"9a816fe54ea736ecf02b6865c10157724cdb5ba3f57ead02d9216b2dd4bd0d5f","impliedFormat":1},{"version":"a67582f2933f5b6faebba3484c99e78b529aa016369b768021726e400c93ddb8","impliedFormat":1},{"version":"96cd7367cc076d36d9f10cbe34b91e94467caf9b64a7a0fe1c4f6c8287e0a1b5","impliedFormat":1},{"version":"17c7be2c601e4b7e6292932997e491ff874418bef9ee6137e69ea6ef497e0e5d","impliedFormat":1},{"version":"eb7ed3b69718cf40c1ab8ce9a0e917819e0ef0b7480ba2890cddbb94a1386b10","impliedFormat":1},{"version":"7a7cec0720ee6d20e08fa9def697b149a94db1763bbec6e1ab5da8d7726ebddc","impliedFormat":1},{"version":"c024677c477a9dd20e7aba894c2f3e6ef81c4076af932a7fc00c210543cd53bc","impliedFormat":1},{"version":"7f31b6e6d0c03a34e462fdaaf2f7ab6daf85bed51fcaa61ee794aaa1c9b890ac","impliedFormat":1},{"version":"ffd5c614f7c66161efc5defd5f9dac16ae6877d13685f9ae224d5d081d841170","signature":"48e5a85c472f9c5980ed27788b84b5d58e9c0c97994fc379a2dd24d471a4cc7f"},"295c285c22bc6dd4e847f4a00825777096adde329fb4e7901e77fc5792872f3d","53fb9b3a127f1f5851727985e87e0a78cd05ce331fd219d04f61597a1fe61ecc","a3ae331b28da7fed70f45e76ac849a9a96590bfe887d0b2a5e3b290640b84f62","02dada8132db5766dc8ad2c99bba2cd1ab0b49e5de715c5d85f2b24efe2255d0","22172a7dd2af03e315c9397e405bb131ce102e20df29459a4f7102c2ecbf1936",{"version":"2824ca2624f0f709e610086eb07ea25170d888e266e287b758959d61891bda8a","signature":"662f513cb4a3de629172d7166dac34be49951591efa1bb1cd0c65e9474b99744"},"40bdb8e2a49bdddeb2855c05b62af26bafa2c2bbefad7054bbdb60c42beb39ae",{"version":"882b28abe64dae4932c83ebb71e4155da340929fe08a2055f3e573ef17f70fc3","impliedFormat":1},{"version":"4a3e425808751200a7709671667ad3d7e7cbfd0a06d469cab42adf06c2601f4a","impliedFormat":1},{"version":"401da46338f5b4f97c2a5f8a0faaace045c51aabd751d2dc704159f64feafe89","impliedFormat":1},{"version":"4e6da006f3a74377f1801ef8cbd771f82ead12d4326d4429661524aca2e21493","impliedFormat":1},{"version":"00282f6bd9be6b0232abcc49955f0cbe53d3cb7521d4687738c42e1ef829ae0a","signature":"df9e7bfe8f0a5b6860bb56b95b0de116750bbecd3c34efe4ea9f037bdb7f19f3"},"c2610e84e8e0b02701bb5bd55c3dc9da8e7ded2310aa911edababb91305e978f",{"version":"5ddadf70682e6d99d742a547f01d8e5bd31fc943888d091d772960faf58a93c7","signature":"a6d5d209a8ae18ed5397ce09dda87882c35ef91e64dbe6158e5232fbcee1c54c"},{"version":"f7a17ed602e068ddd7e43bb45ca9fb4aa8e507a8c97668e57b8608ba001b904a","signature":"f2ffcc0424acf94a1fc97f1598da823de80320c699e56961963be2935112d53a"},"4029088c8622ea8ef31b73ee2cb81ad90cb9014544c2f7e2c185609303831099","9b039812fa3eff2b4487b94715f877f5e3c13bc859aa357bd8bf148d57bc073d",{"version":"afe4d483f781d3d3c43f4bf88101236f856c4a0c8fa4f7d3ddb30b66ba5a0c85","signature":"a54ab828518a9f266b2bc298626dc2c522aafda07918dfec64d163f3fd750545"},"0eb7c579cf9e5634148d1322df3032cde9e0fa0d49cb9f8e77f9acb417e21607","d6ad3e3013abe85c680623db0bb8eedcab3da6864aa4a186915ce1ea2e003723","6e8ecf14ccc7032c3024d52862d796acb51d1aef5d5499e30350496d8ed97836","e8dcc1d02c46e68db2537c75f31de0d6893045e663278b92ec4f300e6ff0b5d9","55f9abb9cc177f10ded2daefd5d8ef00a56549dbe315d70707bd114dc6472198","6019f5fdd540c6b10925458425eaacdc57a602df5da2e5af8d322bdea68511c8","94a1851a21857fd7df68313dde72484afcbfa76a2277abb42fc8951f7acab932","28cdb028c1451b92b128be3abcb6414e4302c3143cc73144d3e7f4b4e932333c","a5db1437b4f7c24065819bd5d3eac25f2b88950ea184bb35d868cfc03d18cd7c","60d7b2eeda9ac3b810b446a552079af4a75633ac8039fbfc790eb1ba272a2b4b","e00629cf91446ccb7171dc19735bd0073a5cc19de766fbf1f23697f4568cd422","805f2ed4a67c52219dcfe754ea9f11f8299da92691dd464d292e018209142d38","f1d141f91d348e2433d335ad516bb0269124f0cd1ad686db2f2d19544900e2a0","43c7fdd9a2363dc964a6644339ea16f4f598ce5621bc68a5d168b3dbdb571132","748f71f7b70f100c70bc89ef2a1d7d0e6b95068b107a0b2732fe5c0905a53699","ba868acc53d316487b79805e640a2cb0bae1cdd573ae94c50c5823c1106a55ff",{"version":"3212ee6a39e886268c15a41021be022b681b8b958484d486dc1747b8eaa62f3c","signature":"a4eb2f286ab03f9cf7e81fe4cbbe541e73cf631e5e4fad44a293e41f03f13626"},"41dc30237d348b018455451803cf7362c3e3f3354076c383eb72e82f63f886d9","bb6bb9bd0c67610df969cdc390415f7f4c2c427980725488440b4e754e6e1d0d","325fcba7ecb747f598d12939e0b4730c9500d83f9107d2cc581460d5e48fd34d",{"version":"e9ec2c29038e75027ac42162c8fa1492c5c0afe430f9fda30349742407c32d5e","signature":"052c50ab25ce776b74abc154b10eff6f5f5b940c35f283fd7d52d9f7758ac56b"},"ec601651dd09100c2b07dfa762e63fabef054b562a1727da6ec4c7de798c7679","521a1cdcc287c36769cdf131d408f7455ea081b425c758f0d551c0f101120c80","9a21158de87685b940d32c40647d21ea6ce4225244fc69dad75a4d20f7df25b0",{"version":"fcffff3fdf119dce8f676a86e69d3c05217c8545b00c1395f6d6238756b13423","signature":"d303560f025fea5aabba06f1a3cabbec22c43e45a0bf445df0312d235dcf3eff"},"bf520bf187e4f515feaa449892b92f8a7ec52fa60b5b634fd1ea0f3a987561e8","8aa589446704a5b4afcfef3fcc743f6b190f12ccd06b2be4e3e7332a7f0c8a41",{"version":"1700a5a495ed9a991e23bc1fdab52d871ed3e3ddd37f9f669cfd3bcdc83d9ff1","signature":"1c8003d99e92c28cbb775189415fd58975dd0cac4dda2ef067506e281b36dc0a"},"539d171dd81cd9c2c5143f06f708101f05cb967bbf3ebd8bc89d6362b8addcdb",{"version":"e4892d139d7db560828e0a27449d9450b64eb0ef5b5eb4a8c57a909474d8f981","signature":"6022f518509a833a152478da1797b149fcdcd2736ec3eec9fe30a222ff45775c"},{"version":"e5b32253216721d8162aa54c343bb280aece827d3ef66796f0a92a25c85c665d","signature":"d093162354fda64bd11b932d1e65ebf756c7529754e13df3f2d6cb85c8a59c45"},"3cdd575aba8e4aad238f5c4becd78ef51c58c9e2872522f349a1e809b0125f77","35e09853d5055fa35a8834289447638bd39894b9c0d1faad1be44f4f55ecec19","6d9c54b517651034ed9d2f30c9d81a70b5cf21a556e7d6090c885fe2cd2ffbc5","5f84a2f65fb30674cdd43f2ec4ece6dab8ebf3412bb8b0c532e2517c3f9bca9d",{"version":"8853f7ad1a6366ef8460def59df7aa22e88d5535ed1ee28ca13ccb051acde8f4","signature":"c213fac2d8c40d184a446b8919701a9896e187f65958e0c60123c7b460532f96"},{"version":"5e037b8e19967d6d8bc6a9c78101c3c36f3b4cb2e2ef4b5cd37f77a8d5d90077","signature":"bb70bcf7aa9ea87f39fd1682dfa3c460c1814fe39e0961a8fb2b9c960dac2486"},{"version":"bd19ed8c7c8eb2c21aa29b5bf4dbd494ffc827f7e4b68b1febb9be5c47babc11","signature":"b709a0bff539a7d37409637f5e5e91b51ec9a783b3e5c763fc63d90ad232ff03"},{"version":"2259bd821bb61f05d568c5039cc3173d0852fac8f01db2e942efb2b57b3491e8","signature":"1d9ffc608b30a14b43cba6531a34e4729728bc0f4ac4160fe15e895cf35f0215"},{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ecec8f82ddf42db544c8320eddf7f09a9a788723f7473e82e903401a3d14d488","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1}],"root":[[350,354],[392,395],[398,405],[408,410],[414,418],[744,751],[756,801]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":1},"referencedMap":[[350,1],[419,2],[420,2],[421,2],[422,2],[424,2],[423,2],[425,2],[431,2],[426,2],[428,2],[427,2],[429,2],[430,2],[432,2],[433,2],[436,2],[434,2],[435,2],[437,2],[438,2],[439,2],[440,2],[442,2],[441,2],[443,2],[444,2],[447,2],[445,2],[446,2],[448,2],[449,2],[450,2],[451,2],[474,2],[475,2],[476,2],[477,2],[452,2],[453,2],[454,2],[455,2],[456,2],[457,2],[458,2],[459,2],[460,2],[461,2],[462,2],[463,2],[469,2],[464,2],[466,2],[465,2],[467,2],[468,2],[470,2],[471,2],[472,2],[473,2],[478,2],[479,2],[480,2],[481,2],[482,2],[483,2],[484,2],[485,2],[486,2],[487,2],[488,2],[489,2],[490,2],[491,2],[492,2],[493,2],[494,2],[497,2],[495,2],[496,2],[498,2],[500,2],[499,2],[504,2],[502,2],[503,2],[501,2],[505,2],[506,2],[507,2],[508,2],[509,2],[510,2],[511,2],[512,2],[513,2],[514,2],[515,2],[516,2],[518,2],[517,2],[519,2],[521,2],[520,2],[522,2],[524,2],[523,2],[525,2],[526,2],[527,2],[528,2],[529,2],[530,2],[531,2],[532,2],[533,2],[534,2],[535,2],[536,2],[537,2],[538,2],[539,2],[540,2],[542,2],[541,2],[543,2],[544,2],[545,2],[546,2],[547,2],[549,2],[548,2],[550,2],[551,2],[552,2],[553,2],[554,2],[555,2],[556,2],[558,2],[557,2],[559,2],[560,2],[561,2],[562,2],[563,2],[564,2],[565,2],[566,2],[567,2],[568,2],[569,2],[570,2],[571,2],[572,2],[573,2],[574,2],[575,2],[576,2],[577,2],[578,2],[579,2],[580,2],[585,2],[581,2],[582,2],[583,2],[584,2],[586,2],[587,2],[588,2],[590,2],[589,2],[591,2],[592,2],[593,2],[594,2],[596,2],[595,2],[597,2],[598,2],[599,2],[600,2],[601,2],[602,2],[603,2],[607,2],[604,2],[605,2],[606,2],[608,2],[609,2],[610,2],[612,2],[611,2],[613,2],[614,2],[615,2],[616,2],[617,2],[618,2],[619,2],[620,2],[621,2],[622,2],[623,2],[624,2],[626,2],[625,2],[627,2],[628,2],[630,2],[629,2],[743,3],[631,2],[632,2],[633,2],[634,2],[635,2],[636,2],[638,2],[637,2],[639,2],[640,2],[641,2],[642,2],[645,2],[643,2],[644,2],[647,2],[646,2],[648,2],[649,2],[650,2],[652,2],[651,2],[653,2],[654,2],[655,2],[656,2],[657,2],[658,2],[659,2],[660,2],[661,2],[662,2],[664,2],[663,2],[665,2],[666,2],[667,2],[669,2],[668,2],[670,2],[671,2],[673,2],[672,2],[674,2],[676,2],[675,2],[677,2],[678,2],[679,2],[680,2],[681,2],[682,2],[683,2],[684,2],[685,2],[686,2],[687,2],[688,2],[689,2],[690,2],[691,2],[692,2],[693,2],[695,2],[694,2],[696,2],[697,2],[698,2],[699,2],[700,2],[702,2],[701,2],[703,2],[704,2],[705,2],[706,2],[707,2],[708,2],[709,2],[710,2],[711,2],[712,2],[713,2],[714,2],[715,2],[716,2],[717,2],[718,2],[719,2],[720,2],[721,2],[722,2],[723,2],[724,2],[725,2],[726,2],[729,2],[727,2],[728,2],[730,2],[731,2],[733,2],[732,2],[734,2],[735,2],[736,2],[737,2],[738,2],[740,2],[739,2],[741,2],[742,2],[307,4],[803,5],[804,4],[103,6],[104,6],[105,7],[64,8],[106,9],[107,10],[108,11],[59,4],[62,12],[60,4],[61,4],[109,13],[110,14],[111,15],[112,16],[113,17],[114,18],[115,18],[117,4],[116,19],[118,20],[119,21],[120,22],[102,23],[63,4],[121,24],[122,25],[123,26],[155,27],[124,28],[125,29],[126,30],[127,31],[128,32],[129,33],[130,34],[131,35],[132,36],[133,37],[134,37],[135,38],[136,4],[137,39],[139,40],[138,41],[140,42],[141,43],[142,44],[143,45],[144,46],[145,47],[146,48],[147,49],[148,50],[149,51],[150,52],[151,53],[152,54],[153,55],[154,56],[51,4],[160,57],[161,58],[159,2],[157,59],[158,60],[49,4],[52,61],[802,62],[406,4],[397,4],[380,63],[383,64],[386,64],[387,64],[385,65],[384,65],[388,66],[391,67],[390,68],[381,69],[389,70],[382,64],[379,71],[377,4],[375,72],[378,73],[376,74],[374,75],[373,76],[371,77],[372,77],[370,4],[50,4],[360,78],[355,4],[357,79],[356,80],[407,62],[367,78],[366,78],[368,81],[365,82],[363,78],[364,78],[361,83],[362,78],[753,84],[752,4],[754,85],[369,86],[359,87],[358,4],[58,88],[310,89],[315,90],[317,91],[179,92],[184,93],[283,94],[254,95],[262,96],[281,97],[180,98],[228,4],[229,99],[282,100],[205,101],[181,102],[209,101],[199,101],[166,101],[246,103],[171,4],[243,104],[241,105],[188,4],[244,106],[334,107],[252,2],[333,4],[332,108],[245,2],[234,109],[242,110],[257,111],[258,112],[249,4],[189,113],[247,4],[248,2],[327,114],[330,115],[216,116],[215,117],[214,118],[337,2],[213,119],[193,4],[340,4],[412,120],[411,4],[343,4],[342,2],[344,121],[162,4],[277,4],[164,122],[298,4],[299,4],[301,4],[304,123],[300,4],[302,124],[303,124],[183,4],[309,119],[318,125],[322,126],[175,127],[236,128],[235,4],[253,129],[250,4],[251,4],[256,130],[232,131],[174,132],[203,133],[274,134],[167,135],[173,136],[163,137],[285,138],[296,139],[284,4],[295,140],[204,4],[191,141],[271,142],[270,4],[273,143],[272,143],[225,144],[210,144],[265,145],[211,145],[169,146],[168,4],[269,147],[268,148],[267,149],[266,150],[170,151],[240,152],[255,153],[239,154],[261,155],[263,156],[260,154],[206,151],[156,4],[275,157],[230,158],[294,159],[187,160],[289,161],[182,4],[290,162],[292,163],[293,164],[288,4],[287,135],[207,165],[276,166],[297,167],[176,4],[178,4],[190,168],[264,169],[172,170],[177,4],[186,171],[185,172],[192,173],[233,174],[231,108],[194,175],[196,176],[341,4],[195,177],[197,178],[312,4],[313,4],[311,4],[314,4],[339,4],[198,179],[238,2],[57,4],[259,180],[217,4],[227,181],[320,2],[326,182],[224,2],[324,2],[223,183],[306,184],[222,182],[165,4],[328,185],[220,2],[221,2],[212,4],[226,4],[219,186],[218,187],[208,188],[202,189],[291,4],[201,190],[200,4],[316,4],[237,2],[308,191],[48,4],[56,192],[53,2],[54,4],[55,4],[286,193],[280,194],[278,4],[279,195],[319,196],[321,197],[323,198],[413,199],[325,200],[349,201],[329,201],[348,202],[331,203],[335,204],[336,205],[338,206],[345,207],[347,4],[346,208],[305,209],[755,210],[46,4],[47,4],[8,4],[9,4],[11,4],[10,4],[2,4],[12,4],[13,4],[14,4],[15,4],[16,4],[17,4],[18,4],[19,4],[3,4],[20,4],[21,4],[4,4],[22,4],[26,4],[23,4],[24,4],[25,4],[27,4],[28,4],[29,4],[5,4],[30,4],[31,4],[32,4],[33,4],[6,4],[37,4],[34,4],[35,4],[36,4],[38,4],[7,4],[39,4],[44,4],[45,4],[40,4],[41,4],[42,4],[43,4],[1,4],[80,211],[90,212],[79,211],[100,213],[71,214],[70,215],[99,208],[93,216],[98,217],[73,218],[87,219],[72,220],[96,221],[68,222],[67,208],[97,223],[69,224],[74,225],[75,4],[78,225],[65,4],[101,226],[91,227],[82,228],[83,229],[85,230],[81,231],[84,232],[94,208],[76,233],[77,234],[86,235],[66,236],[89,227],[88,225],[92,4],[95,237],[759,238],[764,239],[763,240],[760,241],[774,242],[772,243],[776,244],[777,245],[768,246],[780,247],[781,248],[778,249],[415,250],[787,251],[788,252],[417,253],[401,254],[402,255],[403,256],[404,257],[789,258],[792,259],[796,260],[798,261],[795,262],[800,263],[801,263],[799,263],[793,264],[779,2],[770,265],[765,266],[771,267],[773,265],[766,268],[775,269],[769,270],[747,271],[745,272],[748,273],[746,253],[786,274],[784,274],[785,274],[757,275],[751,276],[758,275],[762,277],[783,278],[794,2],[782,279],[767,280],[750,275],[761,281],[791,282],[797,283],[418,284],[790,285],[744,286],[756,287],[749,2],[416,4],[414,288],[405,2],[399,289],[408,290],[396,4],[400,291],[394,292],[395,293],[393,294],[392,292],[351,4],[353,4],[352,4],[354,4],[409,4],[410,2],[398,4]],"affectedFilesPendingEmit":[759,764,763,760,774,772,776,777,768,780,781,778,415,787,788,417,401,402,403,404,789,792,796,798,795,800,801,799,793,779,770,765,771,773,766,775,769,747,745,748,746,786,784,785,757,751,758,762,783,794,782,767,750,761,791,797,418,790,744,756,749,416,414,405,399,408,400,394,395,393,392,351,353,352,354,409,410,398],"version":"5.8.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/lib/revalidate.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/client/components/request-async-storage.external.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","./node_modules/next/dist/client/components/app-router.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/action-async-storage.external.d.ts","./node_modules/next/dist/client/components/static-generation-bailout.d.ts","./node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.d.ts","./node_modules/next/dist/client/components/searchparams-bailout-proxy.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/client/components/not-found-boundary.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/future/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./src/lib/scraper/types.ts","./src/lib/scraper/utils/ratelimit.ts","./src/lib/scraper/utils/cache.ts","./src/lib/scraper/utils/urlparser.ts","./node_modules/domelementtype/lib/esm/index.d.ts","./node_modules/domhandler/lib/esm/node.d.ts","./node_modules/domhandler/lib/esm/index.d.ts","./node_modules/htmlparser2/lib/esm/tokenizer.d.ts","./node_modules/htmlparser2/lib/esm/parser.d.ts","./node_modules/dom-serializer/lib/esm/index.d.ts","./node_modules/domutils/lib/esm/stringify.d.ts","./node_modules/domutils/lib/esm/traversal.d.ts","./node_modules/domutils/lib/esm/manipulation.d.ts","./node_modules/domutils/lib/esm/querying.d.ts","./node_modules/domutils/lib/esm/legacy.d.ts","./node_modules/domutils/lib/esm/helpers.d.ts","./node_modules/domutils/lib/esm/feeds.d.ts","./node_modules/domutils/lib/esm/index.d.ts","./node_modules/htmlparser2/lib/esm/index.d.ts","./node_modules/css-what/lib/es/types.d.ts","./node_modules/css-what/lib/es/parse.d.ts","./node_modules/css-what/lib/es/stringify.d.ts","./node_modules/css-what/lib/es/index.d.ts","./node_modules/css-select/lib/esm/types.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/filters.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/pseudos.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/aliases.d.ts","./node_modules/css-select/lib/esm/pseudo-selectors/index.d.ts","./node_modules/css-select/lib/esm/index.d.ts","./node_modules/cheerio-select/lib/esm/index.d.ts","./node_modules/cheerio/lib/esm/options.d.ts","./node_modules/cheerio/lib/esm/types.d.ts","./node_modules/cheerio/lib/esm/api/attributes.d.ts","./node_modules/cheerio/lib/esm/api/traversing.d.ts","./node_modules/cheerio/lib/esm/api/manipulation.d.ts","./node_modules/cheerio/lib/esm/api/css.d.ts","./node_modules/cheerio/lib/esm/api/forms.d.ts","./node_modules/cheerio/lib/esm/cheerio.d.ts","./node_modules/cheerio/lib/esm/static.d.ts","./node_modules/cheerio/lib/esm/load.d.ts","./node_modules/cheerio/lib/esm/index.d.ts","./src/lib/scraper/strategies/textextractor.ts","./src/lib/scraper/strategies/linkextractor.ts","./src/lib/scraper/strategies/contentcleaner.ts","./src/lib/scraper/strategies/index.ts","./src/lib/scraper/config/sites.json","./node_modules/axios/index.d.ts","./src/types/api.ts","./src/lib/api.ts","./src/lib/scraper/scraper.ts","./src/app/scrape/author/route.ts","./src/app/scrape/bulk/progress/route.ts","./src/app/scrape/bulk/route.ts","./src/app/scrape/story/route.ts","./src/hooks/uselibrarylayout.ts","./src/hooks/uselibraryswitch.ts","./node_modules/@types/trusted-types/lib/index.d.ts","./node_modules/dompurify/dist/purify.es.d.mts","./src/lib/sanitization.ts","./src/lib/settings.ts","./src/lib/theme.ts","./node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/next/font/google/index.d.ts","./src/contexts/authcontext.tsx","./src/app/layout.tsx","./src/components/ui/loadingspinner.tsx","./src/app/page.tsx","./src/components/ui/button.tsx","./node_modules/@heroicons/react/24/outline/academiccapicon.d.ts","./node_modules/@heroicons/react/24/outline/adjustmentshorizontalicon.d.ts","./node_modules/@heroicons/react/24/outline/adjustmentsverticalicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxxmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/archiveboxicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdowncircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownonsquarestackicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownonsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdowntrayicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftendonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowleftstartonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlonglefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowlongupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowpathroundedsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowpathicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightendonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrightstartonrectangleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmalldownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmalllefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmallrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsmallupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtoprightonsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtrendingdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowtrendingupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturndownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturndownrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnleftdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnleftupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnrightdownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnrightupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnuplefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowturnuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowupcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuplefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuponsquarestackicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuponsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuptrayicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturndownicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnrighticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowuturnupicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowspointinginicon.d.ts","./node_modules/@heroicons/react/24/outline/arrowspointingouticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsrightlefticon.d.ts","./node_modules/@heroicons/react/24/outline/arrowsupdownicon.d.ts","./node_modules/@heroicons/react/24/outline/atsymbolicon.d.ts","./node_modules/@heroicons/react/24/outline/backspaceicon.d.ts","./node_modules/@heroicons/react/24/outline/backwardicon.d.ts","./node_modules/@heroicons/react/24/outline/banknotesicon.d.ts","./node_modules/@heroicons/react/24/outline/bars2icon.d.ts","./node_modules/@heroicons/react/24/outline/bars3bottomlefticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3bottomrighticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3centerlefticon.d.ts","./node_modules/@heroicons/react/24/outline/bars3icon.d.ts","./node_modules/@heroicons/react/24/outline/bars4icon.d.ts","./node_modules/@heroicons/react/24/outline/barsarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/barsarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/battery0icon.d.ts","./node_modules/@heroicons/react/24/outline/battery100icon.d.ts","./node_modules/@heroicons/react/24/outline/battery50icon.d.ts","./node_modules/@heroicons/react/24/outline/beakericon.d.ts","./node_modules/@heroicons/react/24/outline/bellalerticon.d.ts","./node_modules/@heroicons/react/24/outline/bellslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bellsnoozeicon.d.ts","./node_modules/@heroicons/react/24/outline/bellicon.d.ts","./node_modules/@heroicons/react/24/outline/boldicon.d.ts","./node_modules/@heroicons/react/24/outline/boltslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bolticon.d.ts","./node_modules/@heroicons/react/24/outline/bookopenicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarkslashicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarksquareicon.d.ts","./node_modules/@heroicons/react/24/outline/bookmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/briefcaseicon.d.ts","./node_modules/@heroicons/react/24/outline/buganticon.d.ts","./node_modules/@heroicons/react/24/outline/buildinglibraryicon.d.ts","./node_modules/@heroicons/react/24/outline/buildingoffice2icon.d.ts","./node_modules/@heroicons/react/24/outline/buildingofficeicon.d.ts","./node_modules/@heroicons/react/24/outline/buildingstorefronticon.d.ts","./node_modules/@heroicons/react/24/outline/cakeicon.d.ts","./node_modules/@heroicons/react/24/outline/calculatoricon.d.ts","./node_modules/@heroicons/react/24/outline/calendardaterangeicon.d.ts","./node_modules/@heroicons/react/24/outline/calendardaysicon.d.ts","./node_modules/@heroicons/react/24/outline/calendaricon.d.ts","./node_modules/@heroicons/react/24/outline/cameraicon.d.ts","./node_modules/@heroicons/react/24/outline/chartbarsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/chartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/chartpieicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblebottomcentertexticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblebottomcentericon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleleftellipsisicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleleftrighticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubblelefticon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleovalleftellipsisicon.d.ts","./node_modules/@heroicons/react/24/outline/chatbubbleovallefticon.d.ts","./node_modules/@heroicons/react/24/outline/checkbadgeicon.d.ts","./node_modules/@heroicons/react/24/outline/checkcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/checkicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoubledownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoublelefticon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoublerighticon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondoubleupicon.d.ts","./node_modules/@heroicons/react/24/outline/chevrondownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevronlefticon.d.ts","./node_modules/@heroicons/react/24/outline/chevronrighticon.d.ts","./node_modules/@heroicons/react/24/outline/chevronupdownicon.d.ts","./node_modules/@heroicons/react/24/outline/chevronupicon.d.ts","./node_modules/@heroicons/react/24/outline/circlestackicon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumentcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumentlisticon.d.ts","./node_modules/@heroicons/react/24/outline/clipboarddocumenticon.d.ts","./node_modules/@heroicons/react/24/outline/clipboardicon.d.ts","./node_modules/@heroicons/react/24/outline/clockicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/cloudicon.d.ts","./node_modules/@heroicons/react/24/outline/codebracketsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/codebracketicon.d.ts","./node_modules/@heroicons/react/24/outline/cog6toothicon.d.ts","./node_modules/@heroicons/react/24/outline/cog8toothicon.d.ts","./node_modules/@heroicons/react/24/outline/cogicon.d.ts","./node_modules/@heroicons/react/24/outline/commandlineicon.d.ts","./node_modules/@heroicons/react/24/outline/computerdesktopicon.d.ts","./node_modules/@heroicons/react/24/outline/cpuchipicon.d.ts","./node_modules/@heroicons/react/24/outline/creditcardicon.d.ts","./node_modules/@heroicons/react/24/outline/cubetransparenticon.d.ts","./node_modules/@heroicons/react/24/outline/cubeicon.d.ts","./node_modules/@heroicons/react/24/outline/currencybangladeshiicon.d.ts","./node_modules/@heroicons/react/24/outline/currencydollaricon.d.ts","./node_modules/@heroicons/react/24/outline/currencyeuroicon.d.ts","./node_modules/@heroicons/react/24/outline/currencypoundicon.d.ts","./node_modules/@heroicons/react/24/outline/currencyrupeeicon.d.ts","./node_modules/@heroicons/react/24/outline/currencyyenicon.d.ts","./node_modules/@heroicons/react/24/outline/cursorarrowraysicon.d.ts","./node_modules/@heroicons/react/24/outline/cursorarrowrippleicon.d.ts","./node_modules/@heroicons/react/24/outline/devicephonemobileicon.d.ts","./node_modules/@heroicons/react/24/outline/devicetableticon.d.ts","./node_modules/@heroicons/react/24/outline/divideicon.d.ts","./node_modules/@heroicons/react/24/outline/documentarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/documentarrowupicon.d.ts","./node_modules/@heroicons/react/24/outline/documentchartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/documentcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencybangladeshiicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencydollaricon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyeuroicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencypoundicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyrupeeicon.d.ts","./node_modules/@heroicons/react/24/outline/documentcurrencyyenicon.d.ts","./node_modules/@heroicons/react/24/outline/documentduplicateicon.d.ts","./node_modules/@heroicons/react/24/outline/documentmagnifyingglassicon.d.ts","./node_modules/@heroicons/react/24/outline/documentminusicon.d.ts","./node_modules/@heroicons/react/24/outline/documentplusicon.d.ts","./node_modules/@heroicons/react/24/outline/documenttexticon.d.ts","./node_modules/@heroicons/react/24/outline/documenticon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsishorizontalcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsishorizontalicon.d.ts","./node_modules/@heroicons/react/24/outline/ellipsisverticalicon.d.ts","./node_modules/@heroicons/react/24/outline/envelopeopenicon.d.ts","./node_modules/@heroicons/react/24/outline/envelopeicon.d.ts","./node_modules/@heroicons/react/24/outline/equalsicon.d.ts","./node_modules/@heroicons/react/24/outline/exclamationcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/exclamationtriangleicon.d.ts","./node_modules/@heroicons/react/24/outline/eyedroppericon.d.ts","./node_modules/@heroicons/react/24/outline/eyeslashicon.d.ts","./node_modules/@heroicons/react/24/outline/eyeicon.d.ts","./node_modules/@heroicons/react/24/outline/facefrownicon.d.ts","./node_modules/@heroicons/react/24/outline/facesmileicon.d.ts","./node_modules/@heroicons/react/24/outline/filmicon.d.ts","./node_modules/@heroicons/react/24/outline/fingerprinticon.d.ts","./node_modules/@heroicons/react/24/outline/fireicon.d.ts","./node_modules/@heroicons/react/24/outline/flagicon.d.ts","./node_modules/@heroicons/react/24/outline/folderarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/folderminusicon.d.ts","./node_modules/@heroicons/react/24/outline/folderopenicon.d.ts","./node_modules/@heroicons/react/24/outline/folderplusicon.d.ts","./node_modules/@heroicons/react/24/outline/foldericon.d.ts","./node_modules/@heroicons/react/24/outline/forwardicon.d.ts","./node_modules/@heroicons/react/24/outline/funnelicon.d.ts","./node_modules/@heroicons/react/24/outline/gificon.d.ts","./node_modules/@heroicons/react/24/outline/gifttopicon.d.ts","./node_modules/@heroicons/react/24/outline/gifticon.d.ts","./node_modules/@heroicons/react/24/outline/globealticon.d.ts","./node_modules/@heroicons/react/24/outline/globeamericasicon.d.ts","./node_modules/@heroicons/react/24/outline/globeasiaaustraliaicon.d.ts","./node_modules/@heroicons/react/24/outline/globeeuropeafricaicon.d.ts","./node_modules/@heroicons/react/24/outline/h1icon.d.ts","./node_modules/@heroicons/react/24/outline/h2icon.d.ts","./node_modules/@heroicons/react/24/outline/h3icon.d.ts","./node_modules/@heroicons/react/24/outline/handraisedicon.d.ts","./node_modules/@heroicons/react/24/outline/handthumbdownicon.d.ts","./node_modules/@heroicons/react/24/outline/handthumbupicon.d.ts","./node_modules/@heroicons/react/24/outline/hashtagicon.d.ts","./node_modules/@heroicons/react/24/outline/hearticon.d.ts","./node_modules/@heroicons/react/24/outline/homemodernicon.d.ts","./node_modules/@heroicons/react/24/outline/homeicon.d.ts","./node_modules/@heroicons/react/24/outline/identificationicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxarrowdownicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxstackicon.d.ts","./node_modules/@heroicons/react/24/outline/inboxicon.d.ts","./node_modules/@heroicons/react/24/outline/informationcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/italicicon.d.ts","./node_modules/@heroicons/react/24/outline/keyicon.d.ts","./node_modules/@heroicons/react/24/outline/languageicon.d.ts","./node_modules/@heroicons/react/24/outline/lifebuoyicon.d.ts","./node_modules/@heroicons/react/24/outline/lightbulbicon.d.ts","./node_modules/@heroicons/react/24/outline/linkslashicon.d.ts","./node_modules/@heroicons/react/24/outline/linkicon.d.ts","./node_modules/@heroicons/react/24/outline/listbulleticon.d.ts","./node_modules/@heroicons/react/24/outline/lockclosedicon.d.ts","./node_modules/@heroicons/react/24/outline/lockopenicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglasscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassminusicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassplusicon.d.ts","./node_modules/@heroicons/react/24/outline/magnifyingglassicon.d.ts","./node_modules/@heroicons/react/24/outline/mappinicon.d.ts","./node_modules/@heroicons/react/24/outline/mapicon.d.ts","./node_modules/@heroicons/react/24/outline/megaphoneicon.d.ts","./node_modules/@heroicons/react/24/outline/microphoneicon.d.ts","./node_modules/@heroicons/react/24/outline/minuscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/minussmallicon.d.ts","./node_modules/@heroicons/react/24/outline/minusicon.d.ts","./node_modules/@heroicons/react/24/outline/moonicon.d.ts","./node_modules/@heroicons/react/24/outline/musicalnoteicon.d.ts","./node_modules/@heroicons/react/24/outline/newspapericon.d.ts","./node_modules/@heroicons/react/24/outline/nosymbolicon.d.ts","./node_modules/@heroicons/react/24/outline/numberedlisticon.d.ts","./node_modules/@heroicons/react/24/outline/paintbrushicon.d.ts","./node_modules/@heroicons/react/24/outline/paperairplaneicon.d.ts","./node_modules/@heroicons/react/24/outline/paperclipicon.d.ts","./node_modules/@heroicons/react/24/outline/pausecircleicon.d.ts","./node_modules/@heroicons/react/24/outline/pauseicon.d.ts","./node_modules/@heroicons/react/24/outline/pencilsquareicon.d.ts","./node_modules/@heroicons/react/24/outline/pencilicon.d.ts","./node_modules/@heroicons/react/24/outline/percentbadgeicon.d.ts","./node_modules/@heroicons/react/24/outline/phonearrowdownlefticon.d.ts","./node_modules/@heroicons/react/24/outline/phonearrowuprighticon.d.ts","./node_modules/@heroicons/react/24/outline/phonexmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/phoneicon.d.ts","./node_modules/@heroicons/react/24/outline/photoicon.d.ts","./node_modules/@heroicons/react/24/outline/playcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/playpauseicon.d.ts","./node_modules/@heroicons/react/24/outline/playicon.d.ts","./node_modules/@heroicons/react/24/outline/pluscircleicon.d.ts","./node_modules/@heroicons/react/24/outline/plussmallicon.d.ts","./node_modules/@heroicons/react/24/outline/plusicon.d.ts","./node_modules/@heroicons/react/24/outline/powericon.d.ts","./node_modules/@heroicons/react/24/outline/presentationchartbaricon.d.ts","./node_modules/@heroicons/react/24/outline/presentationchartlineicon.d.ts","./node_modules/@heroicons/react/24/outline/printericon.d.ts","./node_modules/@heroicons/react/24/outline/puzzlepieceicon.d.ts","./node_modules/@heroicons/react/24/outline/qrcodeicon.d.ts","./node_modules/@heroicons/react/24/outline/questionmarkcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/queuelisticon.d.ts","./node_modules/@heroicons/react/24/outline/radioicon.d.ts","./node_modules/@heroicons/react/24/outline/receiptpercenticon.d.ts","./node_modules/@heroicons/react/24/outline/receiptrefundicon.d.ts","./node_modules/@heroicons/react/24/outline/rectanglegroupicon.d.ts","./node_modules/@heroicons/react/24/outline/rectanglestackicon.d.ts","./node_modules/@heroicons/react/24/outline/rocketlaunchicon.d.ts","./node_modules/@heroicons/react/24/outline/rssicon.d.ts","./node_modules/@heroicons/react/24/outline/scaleicon.d.ts","./node_modules/@heroicons/react/24/outline/scissorsicon.d.ts","./node_modules/@heroicons/react/24/outline/serverstackicon.d.ts","./node_modules/@heroicons/react/24/outline/servericon.d.ts","./node_modules/@heroicons/react/24/outline/shareicon.d.ts","./node_modules/@heroicons/react/24/outline/shieldcheckicon.d.ts","./node_modules/@heroicons/react/24/outline/shieldexclamationicon.d.ts","./node_modules/@heroicons/react/24/outline/shoppingbagicon.d.ts","./node_modules/@heroicons/react/24/outline/shoppingcarticon.d.ts","./node_modules/@heroicons/react/24/outline/signalslashicon.d.ts","./node_modules/@heroicons/react/24/outline/signalicon.d.ts","./node_modules/@heroicons/react/24/outline/slashicon.d.ts","./node_modules/@heroicons/react/24/outline/sparklesicon.d.ts","./node_modules/@heroicons/react/24/outline/speakerwaveicon.d.ts","./node_modules/@heroicons/react/24/outline/speakerxmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/square2stackicon.d.ts","./node_modules/@heroicons/react/24/outline/square3stack3dicon.d.ts","./node_modules/@heroicons/react/24/outline/squares2x2icon.d.ts","./node_modules/@heroicons/react/24/outline/squaresplusicon.d.ts","./node_modules/@heroicons/react/24/outline/staricon.d.ts","./node_modules/@heroicons/react/24/outline/stopcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/stopicon.d.ts","./node_modules/@heroicons/react/24/outline/strikethroughicon.d.ts","./node_modules/@heroicons/react/24/outline/sunicon.d.ts","./node_modules/@heroicons/react/24/outline/swatchicon.d.ts","./node_modules/@heroicons/react/24/outline/tablecellsicon.d.ts","./node_modules/@heroicons/react/24/outline/tagicon.d.ts","./node_modules/@heroicons/react/24/outline/ticketicon.d.ts","./node_modules/@heroicons/react/24/outline/trashicon.d.ts","./node_modules/@heroicons/react/24/outline/trophyicon.d.ts","./node_modules/@heroicons/react/24/outline/truckicon.d.ts","./node_modules/@heroicons/react/24/outline/tvicon.d.ts","./node_modules/@heroicons/react/24/outline/underlineicon.d.ts","./node_modules/@heroicons/react/24/outline/usercircleicon.d.ts","./node_modules/@heroicons/react/24/outline/usergroupicon.d.ts","./node_modules/@heroicons/react/24/outline/userminusicon.d.ts","./node_modules/@heroicons/react/24/outline/userplusicon.d.ts","./node_modules/@heroicons/react/24/outline/usericon.d.ts","./node_modules/@heroicons/react/24/outline/usersicon.d.ts","./node_modules/@heroicons/react/24/outline/variableicon.d.ts","./node_modules/@heroicons/react/24/outline/videocameraslashicon.d.ts","./node_modules/@heroicons/react/24/outline/videocameraicon.d.ts","./node_modules/@heroicons/react/24/outline/viewcolumnsicon.d.ts","./node_modules/@heroicons/react/24/outline/viewfindercircleicon.d.ts","./node_modules/@heroicons/react/24/outline/walleticon.d.ts","./node_modules/@heroicons/react/24/outline/wifiicon.d.ts","./node_modules/@heroicons/react/24/outline/windowicon.d.ts","./node_modules/@heroicons/react/24/outline/wrenchscrewdrivericon.d.ts","./node_modules/@heroicons/react/24/outline/wrenchicon.d.ts","./node_modules/@heroicons/react/24/outline/xcircleicon.d.ts","./node_modules/@heroicons/react/24/outline/xmarkicon.d.ts","./node_modules/@heroicons/react/24/outline/index.d.ts","./src/components/ui/dropdown.tsx","./src/components/layout/header.tsx","./src/components/layout/protectedroute.tsx","./src/components/layout/applayout.tsx","./src/components/layout/importlayout.tsx","./src/components/ui/input.tsx","./src/components/stories/taginput.tsx","./src/components/stories/richtexteditor.tsx","./node_modules/file-selector/dist/file.d.ts","./node_modules/file-selector/dist/file-selector.d.ts","./node_modules/file-selector/dist/index.d.ts","./node_modules/react-dropzone/typings/react-dropzone.d.ts","./src/components/ui/imageupload.tsx","./src/components/stories/authorselector.tsx","./src/components/stories/seriesselector.tsx","./src/app/add-story/page.tsx","./src/app/authors/page.tsx","./src/components/tags/tagdisplay.tsx","./src/components/stories/storycard.tsx","./src/app/authors/[id]/page.tsx","./src/app/authors/[id]/edit/page.tsx","./src/components/collections/collectioncard.tsx","./src/components/collections/collectiongrid.tsx","./src/components/stories/tagfilter.tsx","./src/app/collections/page.tsx","./src/components/collections/storyreorderlist.tsx","./src/components/collections/addtocollectionmodal.tsx","./src/components/collections/collectiondetailview.tsx","./src/app/collections/[id]/page.tsx","./src/components/collections/collectionform.tsx","./src/app/collections/[id]/edit/page.tsx","./src/components/collections/collectionreadingview.tsx","./src/app/collections/[id]/read/[storyid]/page.tsx","./src/app/collections/new/page.tsx","./src/app/import/page.tsx","./src/components/bulkimportprogress.tsx","./src/app/import/bulk/page.tsx","./src/app/import/epub/page.tsx","./src/components/stories/storyselectiontoolbar.tsx","./src/components/stories/storymultiselect.tsx","./src/components/library/sidebarlayout.tsx","./src/components/library/toolbarlayout.tsx","./src/components/library/minimallayout.tsx","./src/app/library/page.tsx","./src/app/login/page.tsx","./src/components/ui/libraryswitchloader.tsx","./src/components/library/librarysettings.tsx","./src/app/settings/page.tsx","./src/components/ui/colorpicker.tsx","./src/components/tags/tageditmodal.tsx","./src/app/settings/tag-maintenance/page.tsx","./src/app/stories/page.tsx","./src/components/stories/storyrating.tsx","./src/app/stories/[id]/page.tsx","./src/app/stories/[id]/detail/page.tsx","./src/components/tags/tagsuggestions.tsx","./src/app/stories/[id]/edit/page.tsx","./src/app/stories/import/page.tsx","./src/app/stories/import/bulk/page.tsx","./src/app/stories/import/epub/page.tsx","./node_modules/@types/trusted-types/index.d.ts","./node_modules/@types/dompurify/index.d.ts","./node_modules/@types/json5/index.d.ts"],"fileIdsList":[[64,106,348,349],[52,64,106],[64,106,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743],[64,106],[64,106,805],[64,103,106],[64,105,106],[106],[64,106,111,140],[64,106,107,112,118,119,126,137,148],[64,106,107,108,118,126],[59,60,61,64,106],[64,106,109,149],[64,106,110,111,119,127],[64,106,111,137,145],[64,106,112,114,118,126],[64,105,106,113],[64,106,114,115],[64,106,116,118],[64,105,106,118],[64,106,118,119,120,137,148],[64,106,118,119,120,133,137,140],[64,101,106],[64,106,114,118,121,126,137,148],[64,106,118,119,121,122,126,137,145,148],[64,106,121,123,137,145,148],[62,63,64,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[64,106,118,124],[64,106,125,148,153],[64,106,114,118,126,137],[64,106,127],[64,106,128],[64,105,106,129],[64,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[64,106,131],[64,106,132],[64,106,118,133,134],[64,106,133,135,149,151],[64,106,118,137,138,140],[64,106,139,140],[64,106,137,138],[64,106,140],[64,106,141],[64,103,106,137,142],[64,106,118,143,144],[64,106,143,144],[64,106,111,126,137,145],[64,106,146],[64,106,126,147],[64,106,121,132,148],[64,106,111,149],[64,106,137,150],[64,106,125,151],[64,106,152],[64,106,118,120,129,137,140,148,151,153],[64,106,137,154],[52,64,106,159,160,161],[52,64,106,159,160],[52,56,64,106,158,305,344],[52,56,64,106,157,305,344],[49,50,51,64,106],[64,106,407],[64,106,357,379],[64,106,357,388],[64,106,357,382,388],[64,106,155,357,381,382,383,384,385,386,387],[64,106,155,357,381,382,388,389,390],[64,106,155,357,381,382,388,389],[64,106,155,357,369,380],[64,106,357,381,382,391],[64,106,373,374,378],[64,106,374],[64,106,373,374,375,376,377],[64,106,373,374],[64,106,373],[64,106,370,371,372],[64,106,370],[64,106,357],[64,106,356],[64,106,355],[64,106,357,361,362,363,364,365,366,367],[64,106,355,357],[64,106,357,360],[64,106,753],[64,106,753,754],[64,106,355,357,358,359,368],[64,106,358],[57,64,106],[64,106,309],[64,106,311,312,313,314],[64,106,316],[64,106,164,173,180,305],[64,106,164,171,175,182],[64,106,173,282],[64,106,230,240,253,347],[64,106,261],[64,106,164,173,179,217,227,280,347],[64,106,179,347],[64,106,173,227,228,347],[64,106,173,179,217,347],[64,106,347],[64,106,179,180,347],[64,105,106,155],[52,64,106,241,242,258],[52,64,106,158],[52,64,106,241,256],[64,106,237,259,332,333],[64,106,194],[64,105,106,155,194,231,232,233],[52,64,106,256,259],[64,106,256,258],[52,64,106,256,257,259],[64,105,106,155,174,187,188],[52,64,106,165,326],[52,64,106,148,155],[52,64,106,179,215],[52,64,106,179],[64,106,213,218],[52,64,106,214,308],[64,106,412],[52,56,64,106,121,155,157,158,305,342,343],[64,106,163],[64,106,298,299,300,301,302,303],[64,106,300],[52,64,106,306,308],[52,64,106,308],[64,106,121,155,174,308],[64,106,121,155,172,189,190,205,234,235,255,256],[64,106,188,189,234,243,244,245,246,247,248,249,250,251,252,347],[52,64,106,132,155,173,187,205,207,209,255,305,347],[64,106,121,155,174,175,194,195,231],[64,106,121,155,173,175],[64,106,121,137,155,172,174,175],[64,106,121,132,148,155,163,165,172,173,174,175,179,182,184,186,187,190,191,199,201,204,205,207,208,209,256,264,266,269,271,272,273,305],[64,106,121,137,155],[64,106,164,165,166,172,305,308,347],[64,106,173],[64,106,121,137,148,155,169,281,283,284,347],[64,106,132,148,155,169,172,174,187,198,199,201,202,203,207,269,274,276,294,295],[64,106,173,177,187],[64,106,172,173],[64,106,191,270],[64,106,270],[64,106,168,169],[64,106,168,210],[64,106,168],[64,106,170,191,268],[64,106,267],[64,106,169,170],[64,106,170,265],[64,106,169],[64,106,255],[64,106,121,155,172,190,206,225,230,236,239,254,256],[64,106,219,220,221,222,223,224,237,238,259,306],[64,106,263],[64,106,121,155,172,190,206,211,260,262,264,305,308],[64,106,121,148,155,165,172,173,186],[64,106,229],[64,106,121,155,287,293],[64,106,184,186,308],[64,106,288,294,297],[64,106,121,177,287,289],[64,106,164,173,184,208,291],[64,106,121,155,173,179,208,277,285,286,290,291,292],[64,106,156,205,206,305,308],[64,106,121,132,148,155,170,172,174,177,181,182,184,186,187,190,198,199,201,202,203,204,207,266,274,275,308],[64,106,121,155,172,173,177,276,296],[64,106,121,155,182,189],[52,64,106,121,132,155,163,165,172,175,190,204,205,207,209,263,305,308],[64,106,121,132,148,155,167,170,171,174],[64,106,185],[64,106,121,155,182,190],[64,106,121,155,173,191],[64,106,121,155],[64,106,193],[64,106,195],[64,106,173,192,194,198],[64,106,173,192,194],[64,106,121,155,167,173,174,195,196,197],[52,64,106,256,257,258],[64,106,226],[52,64,106,165],[52,64,106,201],[52,64,106,156,204,209,305,308],[64,106,165,326,327],[52,64,106,218],[52,64,106,132,148,155,163,212,214,216,217,308],[64,106,174,179,201],[64,106,132,155],[64,106,200],[52,64,106,119,121,132,155,163,218,227,305,306,307],[48,52,53,54,55,64,106,157,158,305,344],[64,106,111],[64,106,278,279],[64,106,278],[64,106,318],[64,106,320],[64,106,322],[64,106,413],[64,106,324],[64,106,328],[56,58,64,106,305,310,315,317,319,321,323,325,329,331,335,336,338,345,346,347],[64,106,330],[64,106,334],[64,106,214],[64,106,337],[64,105,106,195,196,197,198,339,340,341,344],[64,106,155],[52,56,64,106,121,123,132,155,157,158,159,161,163,175,297,304,308,344],[52,64,106,755],[64,73,77,106,148],[64,73,106,137,148],[64,68,106],[64,70,73,106,145,148],[64,106,126,145],[64,68,106,155],[64,70,73,106,126,148],[64,65,66,69,72,106,118,137,148],[64,73,80,106],[64,65,71,106],[64,73,94,95,106],[64,69,73,106,140,148,155],[64,94,106,155],[64,67,68,106,155],[64,73,106],[64,67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,106],[64,73,88,106],[64,73,80,81,106],[64,71,73,81,82,106],[64,72,106],[64,65,68,73,106],[64,73,77,81,82,106],[64,77,106],[64,71,73,76,106,148],[64,65,70,73,80,106],[64,106,137],[64,68,73,94,106,153,155],[52,64,106,335,399,415,419,749,750,751,752,757,758,759],[52,64,106,329,335,398,399,417,419,748,750,757],[52,64,106,329,331,335,398,399,417,419,748,763],[52,64,106,329,331,398,399,417,419,748,750],[52,64,106,335,398,399,417,748,774],[52,64,106,335,398,399,417,748,772],[52,64,106,335,398,399,417,748,776],[52,64,106,335,398,399,748,774],[52,64,106,398,399,417,419,748,750,767,768],[52,64,106,331,335,419,749,750,780],[52,64,106,335,419,744,749,750],[52,64,106,335,419,749,750],[64,106,348,414,415],[52,64,106,335,398,399,405,417,419,748,750,768,784,785,786,787],[52,64,106,329,335,411,415,419,750],[52,64,106,335,415,417],[64,106,345,400],[64,106,345],[64,106,345,400,402],[64,106,345,351,400],[52,64,106,399,405,411,419,748,791],[52,64,106,398,399,417,419,748,750,762,794],[52,64,106,329,331,335,398,399,410,417,419,748,762],[52,64,106,335,398,399,417,419,748,750,751,752,757,758,759,800],[52,64,106,331,335,398,399,409,417,419,762,797],[52,64,106,335],[52,64,106,335,417],[52,64,106,398,399,417,419,750],[64,106,331,398,399],[52,64,106,331,335,398,399,417,419,770,771],[64,106,398,766],[52,64,106,331,398,399,419,762],[52,64,106,331,398,399,419],[64,106,746,747],[52,64,106,329,331,335,411,415,419,745],[52,64,106,331,335,748],[52,64,106,335,406,419,750,790],[52,64,106,398,419,750,762],[52,64,106,398,399],[52,64,106,409,419,750],[52,64,106,329,331,398,399,419,762],[52,64,106,398,763,783],[52,64,106,398,399,417,419],[64,106,398],[52,64,106,398],[52,64,106,398,399,419,750,793],[52,64,106,399,417,419],[52,64,106,331,417],[52,64,106,419],[52,64,106,331,744],[52,64,106,329,756],[52,64,106,417],[52,64,106,335,399,409],[64,106,397,398],[64,106,399,408],[64,106,351,352,353,354,391,395,396,399],[64,106,351,391],[64,106,392,393,394],[64,106,351]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"472f5aab7edc498a0a761096e8e254c5bc3323d07a1e7f5f8b8ec0d6395b60a0","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"49a5a44f2e68241a1d2bd9ec894535797998841c09729e506a7cbfcaa40f2180","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"1ca84b44ad1d8e4576f24904d8b95dd23b94ea67e1575f89614ac90062fc67f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d586db0a09a9495ebb5dece28f54df9684bfbd6e1f568426ca153126dac4a40","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"567b7f607f400873151d7bc63a049514b53c3c00f5f56e9e95695d93b66a138e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"84c1930e33d1bb12ad01bcbe11d656f9646bd21b2fb2afd96e8e10615a021aef","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4b87f767c7bc841511113c876a6b8bf1fd0cb0b718c888ad84478b372ec486b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"2bf469abae4cc9c0f340d4e05d9d26e37f936f9c8ca8f007a6534f109dcc77e4","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c21aaa8257d7950a5b75a251d9075b6a371208fc948c9c8402f6690ef3b5b55","impliedFormat":1},{"version":"b5895e6353a5d708f55d8685c38a235c3a6d8138e374dee8ceb8ffde5aa8002a","impliedFormat":1},{"version":"54c4f21f578864961efc94e8f42bc893a53509e886370ec7dd602e0151b9266c","impliedFormat":1},{"version":"de735eca2c51dd8b860254e9fdb6d9ec19fe402dfe597c23090841ce3937cfc5","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"5155da3047ef977944d791a2188ff6e6c225f6975cc1910ab7bb6838ab84cede","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"e16d218a30f6a6810b57f7e968124eaa08c7bb366133ea34bbf01e7cd6b8c0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb8692dea24c27821f77e397272d9ed2eda0b95e4a75beb0fdda31081d15a8ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"5b6844ad931dcc1d3aca53268f4bd671428421464b1286746027aede398094f2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"0dbcebe2126d03936c70545e96a6e41007cf065be38a1ce4d32a39fcedefead4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"461e54289e6287e8494a0178ba18182acce51a02bca8dea219149bf2cf96f105","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"e31e51c55800014d926e3f74208af49cb7352803619855c89296074d1ecbb524","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"dfb96ba5177b68003deec9e773c47257da5c4c8a74053d8956389d832df72002","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d3070580cf72b4bb80959b7f16ede9a3f39e6f4ef2ac87cfa4561844fdc69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"613deebaec53731ff6b74fe1a89f094b708033db6396b601df3e6d5ab0ec0a47","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"e56eb632f0281c9f8210eb8c86cc4839a427a4ffffcfd2a5e40b956050b3e042","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1},{"version":"8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","impliedFormat":1},{"version":"3609e455ffcba8176c8ce0aa57f8258fe10cf03987e27f1fab68f702b4426521","impliedFormat":1},{"version":"d1bd4e51810d159899aad1660ccb859da54e27e08b8c9862b40cd36c1d9ff00f","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","impliedFormat":1},{"version":"cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","impliedFormat":1},{"version":"3b8f725c3d5ffb64bf876c87409686875102c6f7450b268d8f5188b6920f7c25","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","impliedFormat":1},{"version":"fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","impliedFormat":1},{"version":"37f7b8e560025858aae5195ca74a3e95ecd55591e2babc0acd57bc1dab4ea8ea","impliedFormat":1},{"version":"e2d5483c9a79900ba9d6012135f18b662b3ca1d33fde4f5e39b71f74e47d6331","impliedFormat":1},{"version":"22b9fab85e85b95f6378b5a2bd43c9d2e15106d760e0e58111c416fe224cc76f","impliedFormat":1},{"version":"fc46f093d1b754a8e3e34a071a1dd402f42003927676757a9a10c6f1d195a35b","impliedFormat":1},{"version":"b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"49e567e0aa388ab416eeb7a7de9bce5045a7b628bad18d1f6fa9d3eacee7bc3f","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"87eaecac33864ecec8972b1773c5d897f0f589deb7ac8fe0dcdf4b721b06e28d","impliedFormat":1},{"version":"47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","impliedFormat":1},{"version":"4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","impliedFormat":1},{"version":"fa1ea09d3e073252eccff2f6630a4ce5633cc2ff963ba672dd8fd6783108ea83","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"309816cd6e597f4d4b080bc5e36215c6b78196f744d578adf61589bee5fd7eea","impliedFormat":1},{"version":"bdb44eca306ff5b62bcf2b4e70e96a40987e018029d95565e2f234aad80830cf","impliedFormat":1},{"version":"edaa0bbf2891b17f904a67aef7f9d53371c993fe3ff6dec708c2aff6083b01af","impliedFormat":1},{"version":"89aece12f9cd6d736ae7c350800f257a2363f6322ae8f998da73153fb405d8af","impliedFormat":1},{"version":"d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","impliedFormat":1},{"version":"aa9a92be255ec97f669ea89678fafcbd35d165f65b68ff22685263f6eaeb3c9c","impliedFormat":1},{"version":"fa8b514302736759e491d3df074a61f54ed1a6a69b4aadee05dbcdda53f881c3","impliedFormat":1},{"version":"e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","impliedFormat":1},{"version":"ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","impliedFormat":1},{"version":"c9d71f340f1a4576cd2a572f73a54dc7212161fa172dfe3dea64ac627c8fcb50","impliedFormat":1},{"version":"3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","impliedFormat":1},{"version":"6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","impliedFormat":1},{"version":"4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","impliedFormat":1},{"version":"ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","impliedFormat":1},{"version":"b9750fe7235da7d8bf75cb171bf067b7350380c74271d3f80f49aea7466b55b5","impliedFormat":1},{"version":"ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","impliedFormat":1},{"version":"973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","impliedFormat":1},{"version":"ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"f79e0681538ef94c273a46bb1a073b4fe9fdc93ef7f40cc2c3abd683b85f51fc","impliedFormat":1},{"version":"70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","impliedFormat":1},{"version":"17ace83a5bea3f1da7e0aef7aab0f52bca22619e243537a83a89352a611b837d","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"6cf2d240d4e449ccfee82aff7ce0fd1890c1b6d4f144ec003aa51f7f70f68935","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3","impliedFormat":1},{"version":"9deab571c42ed535c17054f35da5b735d93dc454d83c9a5330ecc7a4fb184e9e","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d","impliedFormat":1},{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","impliedFormat":1},{"version":"8945919709e0c6069c32ca26a675a0de90fd2ad70d5bc3ba281c628729a0c39d","impliedFormat":1},{"version":"ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","impliedFormat":1},{"version":"763ee3998716d599321e34b7f7e93a8e57bef751206325226ebf088bf75ea460","impliedFormat":1},{"version":"e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","impliedFormat":1},{"version":"3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","impliedFormat":1},{"version":"437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","impliedFormat":1},{"version":"48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","impliedFormat":1},{"version":"606e6f841ba9667de5d83ca458449f0ed8c511ba635f753eaa731e532dea98c7","impliedFormat":1},{"version":"7c0d4fc71fe32cedb758c7e3c08715235a51e5a22d184306a59dae10a9c7ffaa","impliedFormat":1},{"version":"ce8a0b21e80cf5f10adc9336b46ffc666696d1373a763b170baf69a722f85d67","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"baeffe1b7d836196d497eb755699718deb729a2033078a018f037a14ecaeb9a7","impliedFormat":1},{"version":"39da0a8478aede3a55308089e231c5966b2196e7201494280b1e19f8ec8e24d4","impliedFormat":1},{"version":"90be1a7f573bad71331ff10deeadce25b09034d3d27011c2155bcb9cb9800b7f","impliedFormat":1},{"version":"bc7221c9a8dc71587ff784120f7707985627282dad0a99439e893a1588651ef0","impliedFormat":1},{"version":"438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","impliedFormat":1},{"version":"ad444a874f011d3a797f1a41579dbfcc6b246623f49c20009f60e211dbd5315e","impliedFormat":1},{"version":"1124613ba0669e7ea5fb785ede1c3f254ed1968335468b048b8fc35c172393de","impliedFormat":1},{"version":"5fa139523e35fd907f3dd6c2e38ef2066687b27ed88e2680783e05662355ac04","impliedFormat":1},{"version":"9c250db4bab4f78fad08be7f4e43e962cc143e0f78763831653549ceb477344a","impliedFormat":1},{"version":"9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"db7c948e2e69559324be7628cb63296ec8986d60f26173f9e324aeb8a2fe23d8","impliedFormat":1},{"version":"9c2353ef1fb353a1c8f30af2cf104f0bc64ebc2fcdb98c2834d451bd654664ab","impliedFormat":1},{"version":"63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","impliedFormat":1},{"version":"3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","impliedFormat":1},{"version":"7fda4c0e3f50513286029633c458ee82cee563cd6af20b92e43b4425c969c146","impliedFormat":1},{"version":"cda4052f66b1e6cb7cf1fdfd96335d1627aa24a3b8b82ba4a9f873ec3a7bcde8","impliedFormat":1},{"version":"703733dde084b7e856f5940f9c3c12007ca62858accb9482c2b65e030877702d","impliedFormat":1},{"version":"413cb597cc5933562ec064bfb1c3a9164ef5d2f09e5f6b7bd19f483d5352449e","impliedFormat":1},{"version":"fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","impliedFormat":1},{"version":"ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","impliedFormat":1},{"version":"6cc79183c88040697e1552ba81c5245b0c701b965623774587c4b9d1e7497278","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","impliedFormat":1},{"version":"82c27d4cf380b0e6cd62628f069b850298d20051f0b7b0a1904fdb38c53fa7a6","impliedFormat":1},{"version":"c97b9278c8ce212c1bdf4fae9c77d58c15565d4ebf663d761a9deb924b6ca8b3","impliedFormat":1},{"version":"8bb6e7ce91ec84336203e87010b1198514548c2e44789752c1741eaac02f2431","impliedFormat":1},{"version":"b33ac7d8d7d1bfc8cc06c75d1ee186d21577ab2026f482e29babe32b10b26512","impliedFormat":1},{"version":"24f8f342c14c911eedfee43074c6a0d0a5ebb5ec984353bffaeadddb3f6a6b1c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"03d4a10c21ac451b682246f3261b769247baf774c4878551c02256ae98299b1c","impliedFormat":1},{"version":"2d9b710fee8c3d7eabee626af8fd6ec2cf6f71e6b7429b307b8f67d70b1707c5","impliedFormat":1},{"version":"652a4bbefba6aa309bfc3063f59ed1a2e739c1d802273b0e6e0aa7082659f3b3","impliedFormat":1},{"version":"d7ca19bfb1ba4c3ef59d43bd7cd3719d8c5ffb60a9b6f402dee4e229f4d921aa","impliedFormat":1},{"version":"0c0a85a19b60f2ec18a32ff051bb1423860977a16b645dbf159baa7202bc633b","impliedFormat":1},{"version":"fc5bdc1d13667041055811568043956c75150923d8b9a32b989ac7588418ce47","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"d3b290cc3c08cbde2b463df2616b948fb32733dafe3ac29b9e6ded26baee5489","impliedFormat":1},{"version":"94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","impliedFormat":1},{"version":"5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","impliedFormat":1},{"version":"f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","impliedFormat":1},{"version":"9558d365d0e72b6d9bd8c1742fe1185f983965c6d2eff88a117a59b9f51d3c5f","impliedFormat":1},{"version":"6cc2961fbe8d32e34fd4c7f1b7045353016fff50df98bc31af7c7d1b4b6eb552","impliedFormat":1},{"version":"01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","impliedFormat":1},{"version":"a2e1f7010ae5f746b937621840cb87dee9eeb69188d32880bd9752029084212c","impliedFormat":1},{"version":"dd30eb34b5c4597a568de0efb8b34e328c224648c258759ac541beb16256ffb6","impliedFormat":1},{"version":"6129bd7098131a0e346352901bc8d461a76d0568686bb0e1f8499df91fde8a1f","impliedFormat":1},{"version":"7cd7923a36835c1194a92b808068a524c4e7c0ff7bdc8712865800e6963d75da","impliedFormat":1},{"version":"82200d39d66c91f502f74c85db8c7a8d56cfc361c20d7da6d7b68a4eeaaefbf4","impliedFormat":1},{"version":"741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","impliedFormat":1},{"version":"a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","impliedFormat":1},{"version":"131b1475d2045f20fb9f43b7aa6b7cb51f25250b5e4c6a1d4aa3cf4dd1a68793","impliedFormat":1},{"version":"3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","impliedFormat":1},{"version":"32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","impliedFormat":1},{"version":"0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","impliedFormat":1},{"version":"e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","impliedFormat":1},{"version":"76264a4df0b7c78b7b12dfaedc05d9f1016f27be1f3d0836417686ff6757f659","impliedFormat":1},{"version":"c0fabd699e6e0b6bfc1728c048e52737b73fb6609eeeae0f7f4775ff14ff2df6","affectsGlobalScope":true,"impliedFormat":1},{"version":"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","impliedFormat":1},{"version":"19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","impliedFormat":1},{"version":"4dd4f6e28afc1ee30ce76ffc659d19e14dff29cb19b7747610ada3535b7409af","impliedFormat":1},{"version":"1640728521f6ab040fc4a85edd2557193839d0cd0e41c02004fc8d415363d4e2","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","impliedFormat":1},{"version":"5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","impliedFormat":1},{"version":"9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","impliedFormat":1},{"version":"e81bf06c0600517d8f04cc5de398c28738bfdf04c91fb42ad835bfe6b0d63a23","impliedFormat":1},{"version":"363996fe13c513a7793aa28ffb05b5d0230db2b3d21b7bfaf21f79e4cde54b4e","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"7f6c48cacd08c1b1e29737b8221b7661e6b855767f8778f9a181fa2f74c09d21","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"f72ee46ae3f73e6c5ff0da682177251d80500dd423bfd50286124cd0ca11e160","impliedFormat":1},{"version":"898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","impliedFormat":1},{"version":"d707fb7ca32930495019a4c85500385f6850c785ee0987a1b6bcad6ade95235e","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"5d26aae738fa3efc87c24f6e5ec07c54694e6bcf431cc38d3da7576d6bb35bd6","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"e0aa1079d58134e55ad2f73508ad1be565a975f2247245d76c64c1ca9e5e5b26","impliedFormat":1},{"version":"cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","impliedFormat":1},{"version":"68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"94fd3ce628bd94a2caf431e8d85901dbe3a64ab52c0bd1dbe498f63ca18789f7","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0","impliedFormat":99},{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true,"impliedFormat":1},{"version":"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","impliedFormat":1},{"version":"521fc35a732f1a19f5d52024c2c22e257aa63258554968f7806a823be2f82b03","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf",{"version":"5fe5261888f807e5313cba55b93a4778b1d30c1cdafd5ee5968f58db09264438","signature":"1e8d749e23750475a16578786160132ddfacbdb19a58dae84c217f55b7bd0781"},{"version":"75572a14d49d5857e480f2a397c3df9624eaa05ba25e5c75ad0a364ead3f3e52","signature":"e6add220edf9e992868695f8d297ba60d29bfcb10ef148c779a6869186feb0a3"},{"version":"cdd8855391d2cefcfbd7d8cf0cf21fc5fa96f73dedf37ef5083c1504d1f6dfda","signature":"009c713bef2c53ab9257fb5e0a3c6c4447426898364849d4be633de0fad8888d"},{"version":"110902392738bd83f6a49bd474805210a5d5befaccfcba05c146da212c9c7e59","signature":"e4cec98f1ba49c4a6be95a07070daadcf64898a0409396762b8a6006bea02bee"},{"version":"2556e7e8bb7e6f0bb3fe25f3da990d1812cb91f8c9b389354b6a0c8a6d687590","impliedFormat":99},{"version":"ad1c91ca536e0962dcbfcdff40073e3dd18da839e0baad3fe990cf0d10c93065","impliedFormat":99},{"version":"19cf605ba2a4e8fba017edebdddbbc45aea897ddc58b4aae4c55f382b570ff53","impliedFormat":99},{"version":"f1cb3052f76b6d3a0bbe97e87a7e8ffa15661ac8ff496079daef778a60acf9ce","impliedFormat":99},{"version":"18852bc9e6c3dfe183573ab1e15f983d8172213969e7c1f51fa5f277ed41dab6","impliedFormat":99},{"version":"7618d2cb769e2093acd4623d645b683ab9fea78c262b3aa354aba9f5afdcaaee","impliedFormat":99},{"version":"029f1ce606891c3f57f4c0c60b8a46c8ced53e719d27a7c9693817f2fe37690b","impliedFormat":99},{"version":"83596c963e276a9c5911412fba37ae7c1fe280f2d77329928828eed5a3bfa9a6","impliedFormat":99},{"version":"81acfd3a01767770e559bc57d32684756989475be6ea32e2fe6255472c3ea116","impliedFormat":99},{"version":"88d0c3eae81868b4749ba5b88f9b6d564ee748321ce19a2f4269a4e9dd46020a","impliedFormat":99},{"version":"8266b39a828bfb2695cabfa403e7c1226d7d94599f21bea9f760e35f4ca7a576","impliedFormat":99},{"version":"c1c1e740195c882a776cf084acbaf963907785ee39e723c6375fec9a59bf2387","impliedFormat":99},{"version":"137f96b78e477e08876f6372072c3b6f1767672bf182013f84f8ae53d987ff86","impliedFormat":99},{"version":"29896c61d09880ff39f8a86873bf72ce4deb910158d3a496122781e29904c615","impliedFormat":99},{"version":"dc1d7cc525fd825a3172b066489eaa2048e8e40ce2a56a6f1372ad05236bc049","impliedFormat":99},{"version":"ed9ce8e6dd5b2d00ab95efc44e4ad9d0eba77362e01619cb21dedfdedbad51b8","impliedFormat":1},{"version":"5520611f997f2b8e62a6e191da45b07813ac2e758304690606604a64ac0ca976","impliedFormat":1},{"version":"00b469cba48c9d772a4555216d21ba41cdb5a732af797ccb57267344f4fc6c3d","impliedFormat":1},{"version":"2766bf77766c85c25ec31586823fefb48344e64556faad7e75a3363e517814f6","impliedFormat":1},{"version":"b7d1eaffd8003e8dc0ec275e58bd24c7b9a4dbae2a2d0d83cf248c88237262ce","impliedFormat":99},{"version":"7a8b08c0521c3a9e1db3c8b14f37e59d838fdc32389f1193b96630b435a8e64e","impliedFormat":99},{"version":"2e54848617fae9eb73654d9cf4295d99dab4b9c759934e5b82e2e57e6aaaef20","impliedFormat":99},{"version":"ae056b7c3f727d492166d4c1169d5905ddd194128a014b5d2d621248ed94b49c","impliedFormat":99},{"version":"edc5d99a04130f066f6e8d31c7c3f9ba4749496356470279408833b4faee3554","impliedFormat":99},{"version":"2f502ac2473a2bbf0d6217f9660e9d5bf40165a2f91067596323898c53dab87c","impliedFormat":99},{"version":"21f27a0c8bc8d9a4e2cf6d9c60140f8b071d0e1ffddb4b7dcf6bbf74d0e8d470","impliedFormat":99},{"version":"deb3f73972ef3525308c943cfe417840e64ccfc3a3e3cebaaed4ad51c241e6b4","impliedFormat":99},{"version":"09f1b5d09fd74c119863dd4fea0c13cac164a5b35d9efa4f0ee6c407310fc1e6","impliedFormat":99},{"version":"49ef40d7a022a3c9060581d2d1783e9a0b6eb398330cf950cf4713214892c5a5","impliedFormat":99},{"version":"5256f5cf585954c773ee01a0272df9e13e0fec1d32ae196619c9a14dd4dcfdc3","impliedFormat":99},{"version":"9cbca8447baaa98288175320c3eaa02135d5370881ee2ca2a1c91cf549b34d81","impliedFormat":99},{"version":"1d6ad75caac5c783a41789d1f9ece0da982b4af600d2ae6a7f2dd025d12aa212","impliedFormat":99},{"version":"7cb7ca9e74d896aa6f51557df37c249605ce93cf855c075a91fabaac331d4a80","impliedFormat":99},{"version":"4274ed938e85b119581cd6c65c7242555567eb55906af839a931f0acf6023982","impliedFormat":99},{"version":"8151f274499e464ac8459cbbaae63e2537d112ca41761f5067a05fb0e98e9291","impliedFormat":99},{"version":"825103c182891d61d14191b0bf64b0666663d4fd1b1468a30c203208297f253a","impliedFormat":99},{"version":"5889044020ca262dfc82a80357d75d715a0b9aa6dc3673f58220aefa36818f87","impliedFormat":99},{"version":"b2fadfb2042b920f9334bf1795d1cfc2afddacc4a4aa4cacbdbf45165966b740","signature":"ba147a0c772b9c0a676215fbcdce099ab6aae9bb0844c61d53373abe2fe4e694"},{"version":"867498b01d8cc8b1f0d51a6ad1f365bd3c65e714b8aa78abfb219658d2595d68","signature":"f4e3f014a94776db30786b918fcd5b3053d070cbd786dd1549cf3e2f578686e3"},"4a14e39855699bd4c5b4057d3f0ccf0b2b05cadff1b6942a4afcfb676635bf1d","bca619a199547e560027f57284812eb1e37475b591a11bdb4425120c030d7a70",{"version":"a6b1af90be57c2134cd57d413e87692c79b58b1db1a56bff18dbea10e57bef0f","signature":"bd10d75fb1b63460389cb095fc4c731b88e5d6bebd38feec0488f0b50fad97e6"},{"version":"1d7ee0c4eb734d59b6d962bc9151f6330895067cd3058ce6a3cd95347ef5c6e8","impliedFormat":99},{"version":"d2d2156516c6cf0fe7f4b20ec8d4771f0f9577d17272e4e9db8026270ad0f534","signature":"d09572b5874b806a61eea45697f2f3de8c5467f7682108789416152013c61970"},"3c945c2cc29086b9460b2dbe6ab3f377f21863b73b425a4366a91b6fe86eb6ea","ff083724d6c285a438384bc6dbb9d18bf75ea2d1ed07e78430066feb0e0fc094","8cb888e04a0093d373958adee1782753ac05cfd9ba2e13d7dfa93f13c0b47e25",{"version":"8198b38947844903ac9436fa1460a4c2badf1bdcbb1f718e2e48e60aac0c266c","signature":"d4a05ab77a048299fe0688addd13111a1b51a0cc2612db67c77500d16a2aa527"},"db16bd7e1e3e16a15b118213afdcd25936845dcf81e0c1b4e573a44e6f1207c2","1dc9da51d09b2b70542a3ea3767af7b97d73380b7ff6869b1ee45bc818de1ece",{"version":"4d1e354d388bd9a61afbb2fc5ef2cc42bdcd38e315214b5829e7288f597b79d0","signature":"a78ca39c2cd068be881b384ced2bf87d6b45dbedb997733e8fef5b16139d0c32"},{"version":"84cd746323c0ffb3c4b0531dc06a92abebffeb2d1a8cf4275f51963d5dc89f6e","signature":"69d0e35ed27783f66f1d4a8c459ffc4c44ca58c3b4f93acf9c452a6f278842ca"},{"version":"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e","impliedFormat":1},{"version":"42979633ab57d6cc7837b15be8c44c2087a264d5f2ca976afed684bee0925468","impliedFormat":99},"dc46151f659545eae8fc6f85db3a0a3efa005238b75055a44d4949bfa4ff730c",{"version":"b58b573f4e231c54bd58d92276f1ab5ea522d57a91e5872851d605f75f36d00b","signature":"9233c6a47fb6a1b96a6ad7adde996db020aa4cdb0dd702cb3408b5794d440631"},"0fce8a9bd25cb14b8c3e3577883596593a377c3ec2cc775040b625f442b35e38",{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"1b61d562dbf8295515b0f1016ea7b719e46847621988f7420785e5c8668ca790","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},"f2611056758a00c757050a56348333c8cb7a72adee9ca6a24eb6231169e04203","8bf5182f42ea17acad008ff41e3c0943185e67966fb08da0d96851dbd992aa6e","ee46c526e4a0119c3e8e4edc5f2281d4180b8f1ba0cc01c840f7aff9592b299e","8eda331cd98719945603ff749b1fc960c5e75c7b14850c2c6387405e0f6ea3ce","f08c967d1e8618060baaa840dd0e1c8a31cdc682416af116d32fda7d78b76ace",{"version":"c8e857b6224783e90301f09988fb3c237fe24f4ebf04778d0cbe8147a26fffe7","impliedFormat":1},{"version":"df33f22efcbdd885a1ea377b014e0c1dfbe2e42d184d85b26ea38db8ee7834c4","impliedFormat":1},{"version":"f400febd2140549f95c47b2b9a45841c495dfeb51cc1639950fa307cd06a7213","impliedFormat":1},{"version":"7048016c91c6203433420b9e16db56eec9c3f5d5a1301398e9907ac1fed63b58","impliedFormat":1},{"version":"a4234645829a455706bf2d7b85642ee3c96bfe1cfddc9918e25bac9ce2062465","impliedFormat":1},{"version":"9ff2d17592dec933b2b9e423fab8b8bc20feed486f16d35c75edd77c061de6e3","impliedFormat":1},{"version":"fe9fc5b80b53a1982fe8fc0f14a002941b471213717536987d0cf4093a0c90a0","impliedFormat":1},{"version":"4921f21de15ba1e7d1d5c83cf17466d30d4371bc9acf0c2c98015ebc646702ef","impliedFormat":1},{"version":"f728f13a2965aacfb75807a27837509c2ab20a4bb7b0c9242e9b5ca2e5576d22","impliedFormat":1},{"version":"c340ac804b0c549d62956f78a877dda3b150e79954be0673e1fc55f4a415f118","impliedFormat":1},{"version":"2bfe95f5f0ea1a7928d7495c4f3df92cdc7b24872f50b4584e90350255181839","impliedFormat":1},{"version":"9dfe677f6d3a486eebe1101b4cf6d4ec1c4f9ee24cc5b5391f27b1a519c926f7","impliedFormat":1},{"version":"2766c9a60df883b515c418a938f3c8fd932241c89aba12aedf418e02a73017ce","impliedFormat":1},{"version":"394967bc5f7707312a95cd7da0e5b30b736b7ab2f25817a8fea2d73b9398d102","impliedFormat":1},{"version":"014a4afcc1674f40c7d77ca215e68bb3b0a254c2c925bcaa9932b6fb8f1ccd4e","impliedFormat":1},{"version":"f816538db9388ac17bd354cf38d52da6c01d9a83f0589b3ff579af80cff0c8c6","impliedFormat":1},{"version":"d2e0c04dce50f51b98ee32fd461dfa6e416a4b703c3d6d7e7fb7e68eca57a8de","impliedFormat":1},{"version":"a8995e0a2eae0cdcd287dca4cf468ea640a270967ed32678d6fbf89e9f56d76d","impliedFormat":1},{"version":"b151ad192b8e11b5ca8234d589abd2ae9c3fc229cdbe2651e9599f104fe5aa6b","impliedFormat":1},{"version":"c37f352ab276b3cd4117f29e4cc70ed8ac911f3d63758ca45202a1a052fa9d00","impliedFormat":1},{"version":"c97ffd10ec4e8d2ae3da391ca8a7ff71b745594588acc5d5bdef9c6da3e221bc","impliedFormat":1},{"version":"74c373c562b48a0bde3ee68ac563403883b81cabe15c5ada4642a559cbd5d04e","impliedFormat":1},{"version":"d42fe36f52e0ae09274753ed0fdedb32c42c2ad6ad247c81e6bd9982d1762004","impliedFormat":1},{"version":"87f162804c7a5615d3ea9bdb2c828cd1d1f8378d5e2a9c3be1bd45c12f1fc1a5","impliedFormat":1},{"version":"ccb92f285e2f3a3462262945fa59506aebe6ec569e9fec223d45d41c7c6cd447","impliedFormat":1},{"version":"04e45000cf1381e6a84196aa01ca811ab192ca0a09debacc9e75dcfc6777bae1","impliedFormat":1},{"version":"566007f48fa4cc7d29e4cb5cce9c315ccd52b72300d2d45ab0c639889e42d455","impliedFormat":1},{"version":"4c2f8fb8a8f4afce6e05b9c554c012eb50147084933d78f7d218108740afd803","impliedFormat":1},{"version":"6f72b3ebad0276cfcc7291fd2aefd1fbbd229487ec1acbbad03e798e8760e02e","impliedFormat":1},{"version":"096681898d7131c1183f164ccfec478d99a9efa3744a1b6617116bc6713ed7be","impliedFormat":1},{"version":"2c9626288e967ebb03ec2bc27ea504f6f829b1686f65b86fd5074d53e0160d70","impliedFormat":1},{"version":"4de35fb3800a92324c59c1d2ed28a4dc1284d507d27ef2eed680c2f9ebb32cd2","impliedFormat":1},{"version":"4c3cccf01f76ca4292746b6dfebd6df4382eb7a05315724116feacecf952f106","impliedFormat":1},{"version":"492d1d21f79a8fa084e9dfd8fab89247301a49f1a0c12765b99c30a0ad8629ff","impliedFormat":1},{"version":"69872cabf40dd4399939184cd7c5e47da62a9df811d3f56d193a437817a85b21","impliedFormat":1},{"version":"19d00382e69115eeb1214d9b865030b61ec14f1bd5e91fb6e2b75acf5a6bef80","impliedFormat":1},{"version":"3c3045d2661ef44458559f6bd48ebb47ccdfcbc513d859dc60c5e18e0544ac87","impliedFormat":1},{"version":"e1de43a7fb0dda59dd9ed398fa306abdcb99da16b54edd3c7dc5e1a45d7e91df","impliedFormat":1},{"version":"8301449ecbf03d5f893c298863fb66d97f1becb31f157276bdba7c708174a5be","impliedFormat":1},{"version":"a556bdee2de2416a026022aeb260b5d684da34e322b5a95c7503143e51787b4f","impliedFormat":1},{"version":"e8bc04f55c1b3da172412955b2785de54f2e1f2c9cb8949c0748ff143525310e","impliedFormat":1},{"version":"683ad3639d8a96cfc782d672c44797d13c735ca9792d6c57e2fa5ada89e18e0c","impliedFormat":1},{"version":"25b171a82c55909032e85448d89f8409e045a24a2b0458080bf304845b29b6ba","impliedFormat":1},{"version":"ce25751e5374e1f13100276ecf2e2e8aac4d4c7229f762b3dc206639640954b8","impliedFormat":1},{"version":"2f0a5a8ef5c6f5866d3caf04151422d05e64765ee250a7e9defc62908cfe73af","impliedFormat":1},{"version":"79726fbe0854724f5bc3f16d4e40c0b320bbaa7a6296d1d782d70909f3b3a2eb","impliedFormat":1},{"version":"6d391889910947acbe7d110271463ef74e7f65ae372d355756b1a6b0a987168d","impliedFormat":1},{"version":"b3dadc705ad865a3acd5b40561ac0dcbce38fa28872ecb903eb586bd64cfa8b6","impliedFormat":1},{"version":"8181adc6c7145eb6b2596249f3a2e1ff2fa7ebc604e73fe583f98c4b40916d6a","impliedFormat":1},{"version":"dc84bb520982504eb30b09b870b32be8eccff2cd9beb963efd6a78971ae104b6","impliedFormat":1},{"version":"bafdca74b47f54e116a9f2d589d39f1c677c777198b96a677a2d2f628b43c8f5","impliedFormat":1},{"version":"9ccc168fc7cb696b5f60f216c72881db1f6c2d8e39eadd6c68130711f8eddd19","impliedFormat":1},{"version":"6187a2dae6a9d910f272bfae324625437343f43a6ff48a28a5c5dd5e9cfc2d5f","impliedFormat":1},{"version":"f063f87a44b1e92948bd5ef6db5b8cadef75218126e75ff02df83196e2b43c4b","impliedFormat":1},{"version":"333df4996910e46b00aa9b7c8be938f6c5c99bfbf3a306596e56af9fff485acb","impliedFormat":1},{"version":"deaf2e9bfb510a40e9413d5e940f96bf5a98a144b4e09a0e512efe12bfe10e9b","impliedFormat":1},{"version":"de2395fb1d7aa90b75e52395ca02441e3a5ec66aa4283fb9ced22e05c8591159","impliedFormat":1},{"version":"64be79c9e846ee074b3a6fb3becdbb7ac2b0386e1e1c680e43984ec8e2c2bbb9","impliedFormat":1},{"version":"9c09e723f7747efc123e19f0ced5f3e144bbc3f40a6e1644a8c23437c4e3527f","impliedFormat":1},{"version":"36fc129c8e3ad288656ea0e9ba0112728c7ec9507c75c6a3bce6d66f821a31d5","impliedFormat":1},{"version":"3771470dde36546305e0431b0f107e2175d94e11f09b116611156f134364127e","impliedFormat":1},{"version":"18c6715ca6b4304a314ff9adb864bd9266fc73813efd33d2992a7c6a8c6e7f73","impliedFormat":1},{"version":"90cde8ac2173d2008c51996e52db2113e7a277718689f59cd3507f934ced2ac2","impliedFormat":1},{"version":"69d01aac664fe15d1f3135885cd9652cca6d7d3591787124ae88c6264140f4b1","impliedFormat":1},{"version":"55ab3dd3c8452b12f9097653247c83d49530b7ea5fe2cb9ef887434e366aee8c","impliedFormat":1},{"version":"abd2ce77050bfd6da9017f3e4d7661e11f5dc1c5323b780587829c49fcac0d26","impliedFormat":1},{"version":"d9dfcbbd2f1229ce6216cb36c23d106487a66f44d72e68fd9b6cb21186b360cd","impliedFormat":1},{"version":"244abd05ca8a96a813bf46ddb76c46675427dd3a13434d06d55e477021a876ef","impliedFormat":1},{"version":"5298f6656d93b1e49cf9c7828306b8aefc0aa39ac56c0a1226f1d4fba50a2019","impliedFormat":1},{"version":"93268ed85b0177943983c9e62986795dcb4db5226732883e43c6008a24078d7f","impliedFormat":1},{"version":"843fa59ad0b6b285865b336b2cbc71cdc471e0076a43d773d580cb8ba2d7030d","impliedFormat":1},{"version":"aa2d452401748a5b296bf6c362b9788418b0ab09ee35f87a89ba6b3daa929872","impliedFormat":1},{"version":"a4ef3c3f6f0aadacac6b21320d0d5d77236360e755183802e307afd38f1cbcc9","impliedFormat":1},{"version":"853b1daed2861381ddda861a0450ce031c280d04caec035cc7433872643871c6","impliedFormat":1},{"version":"1058ed9becf0c63ba0a5f56caaafbfd0bf79edf2159c2f2f2fe39a423ae548ae","impliedFormat":1},{"version":"8b6eab9a4a523909ee1c698a10d332c544aa1fb363f482fe60f79c4d59ca2662","impliedFormat":1},{"version":"f2b2c244b10a8e87192b8730ed5b413623bf9ea59f2bf7322545da5ae6eae54b","impliedFormat":1},{"version":"92bbeada67d476b858679032b2c7b260b65dbccc42a27d0084953767d1a8cf46","impliedFormat":1},{"version":"545afad55926e207ac8bdd9b44bb68f0bbffc5314e1f3889d4a9ad020ea10445","impliedFormat":1},{"version":"4c8ef63125ed4d1eef8154ec9da0b6b7ca9effdf4fa5a53ab74a9d73c9754ff5","impliedFormat":1},{"version":"e76a7e0b4f2f08e2bef00eacc036515b176020ab6b0313380dd7a5bd557a17f0","impliedFormat":1},{"version":"fabd983e4148e2dce2a817c8c5cdbbc9cf7540445c2126a88f4bf9c3e29562b2","impliedFormat":1},{"version":"a80c5c5bab0eb6cc1b3276ac276e5b618ead5de62ec8b0e419ea5259af0a9355","impliedFormat":1},{"version":"d8cf5ded7dd2d5ce6c4e77f4e72e3e1d74bb953940a93d3291fb79158e1afc6e","impliedFormat":1},{"version":"bdb10c13a7ababaae91932d0957ef01cd8a789979cd0b606a2106d198848b16c","impliedFormat":1},{"version":"0fd3f9fed4dd35b1b07c18b4c3f612b7542c91835ad8a26e0e83d905709543dc","impliedFormat":1},{"version":"441b5f5ac4619df9dbf436ecdb9f0bbaacf8696e6fdb2f81c6f5b1db76f5a1c0","impliedFormat":1},{"version":"5d2284728400ee7b4fd1acd69e48d649d4056916cc70950a0000e5d70a32a750","impliedFormat":1},{"version":"27ef186120f9e7ee90686aa7ad5163eb5c7f4cdeb19bb87850c4a5fe4b8e05e8","impliedFormat":1},{"version":"4f1f9e056e0c9d23031367b4c7e7eedffb3e1ed58e64befc90749ca4dd9363ee","impliedFormat":1},{"version":"2b0ccf76bcf10f61612135f951a74327ea0a2d5a80f397b767e0e0b08cdac265","impliedFormat":1},{"version":"4e42e643f05a7fa69581a1a697a1cf967d9b2657dd9dd66e59d90500ec053ba0","impliedFormat":1},{"version":"0ea8485dc0bb7d2a258a93b16305e17fb5be9f877a9df88de7023a9821c537ab","impliedFormat":1},{"version":"5c221ba5333b775cef94d4a30076cc30730cceba649e9d30c5a7224a698c8825","impliedFormat":1},{"version":"cb61ba4d5b5e39ecafe74ad7d88dc8e67defcffe15fb9216addee0fa06d5df38","impliedFormat":1},{"version":"d83e8f0c10477fb4a7729a51aaad853cee81e0e332581dd2244da09e5526b5ff","impliedFormat":1},{"version":"c8933a5b693306696e78315dca1fa57f6f5493fed44cd90aa2d4a4d354dd6516","impliedFormat":1},{"version":"af8e2bf3df20cd2e6b8d744dd83499e174609d0c88864af3f30cd43671e719f5","impliedFormat":1},{"version":"4186fd8b51535399c7ad1edc08f9c4ebb2a9e8e327b131cc1f950c5dfbb0c358","impliedFormat":1},{"version":"b92965f503f55830702062f9e0832fabfbded49ff28728686a6fd84aa32f454d","impliedFormat":1},{"version":"172dbc7933ff46ba3b2efe8b5c7828fd4f0d45c08755df8200213b6055d57f2e","impliedFormat":1},{"version":"89e2ec7ed42725f89fa537c38f20144782bec6c5710e467a46a647647c8255cf","impliedFormat":1},{"version":"5165882999957fa041e423a4fb64627dcb310bf50183af70a6ee8e10a584b0c3","impliedFormat":1},{"version":"390997d64e1e5721fa807aa9e05c97086f58627170d9a7ed84b127126a3e5202","impliedFormat":1},{"version":"00cf8ed9b47860a5f8cc0a65d7a41f85a7026f68162057728abc9249943a8629","impliedFormat":1},{"version":"fc8b086c99f6d721eae8125a96833e0ba1762d00b80aad1d55c7a8b59d007466","impliedFormat":1},{"version":"ff72c74ccdc5570c4a75a93e605a5586596444d96048d52c72f322da183c556d","impliedFormat":1},{"version":"b8755448066177191edcd0b7e19e7fe44d69ed6dc97b16a420b7aa9070e2b850","impliedFormat":1},{"version":"822a0c843f492ad2dc815080f24d4ddac4817a9df0de8cd35830e88fbbafbbe4","impliedFormat":1},{"version":"467865324b9f66a1b8f68d9350c5aa0e749eec499e4863fe017b16ea8bcaccdf","impliedFormat":1},{"version":"863bd77d5546877e19594759a901cc7b75da8d27336d4351e54413ec12032d09","impliedFormat":1},{"version":"a17a62c94da321c0bf2315c35033e313daf1298a75aa43a01a4daf6937980c01","impliedFormat":1},{"version":"851271a09d3c2db3eab80d64beb468d775a9818df06a826ba58925c900231ccb","impliedFormat":1},{"version":"da2c95cd1f0f9cc19f3dd599b4c8fb0930eccb78a5c73f683e7ea98262d2f55e","impliedFormat":1},{"version":"e40d3ca85fb1362763067506784635aa28863640cf7cf9be9e8c1c521c0fbbd5","impliedFormat":1},{"version":"77a2f84e19aca9d03efdf0c484aba8daad3fd23c70b72e63aca78fadf71b448d","impliedFormat":1},{"version":"00c5b6248c69e66729e5c4acb239db849b1497d7eb111fed3eba979432461ebf","impliedFormat":1},{"version":"8e13abf75e9394f3a4b1d0b3f99468e15f4c7e2115153d2a1ca3c0de035bad1c","impliedFormat":1},{"version":"07097dab1c068118806fecb8544aba3cca30965d0864b1998af1bee326a9990c","impliedFormat":1},{"version":"c490ca6eb9149c28e4f2def6acb1bc058d160edb40fd249cf2a70c206a8cfecc","impliedFormat":1},{"version":"7c9aab9a76abba65aa6389e41707d57ea0288dac9a8b6359465dcb462d2cfaa1","impliedFormat":1},{"version":"97fbe30fd1b61b26f807ae1c78b681b0999af71cd9604c08a1d45e44690ca0c2","impliedFormat":1},{"version":"ef91bf45a3d149db0b9e4e612ed1400c35f6a3d2a09669d1441add612d5f16b8","impliedFormat":1},{"version":"dacebdc0353168f259724bccfd273b892e883baf36cf3dee21cf4178f3ef9ea0","impliedFormat":1},{"version":"5416fb031a72377c3c17faa2041428a5f19f9d46a70b645dda6e3293fd0ca8ce","impliedFormat":1},{"version":"95611472fd03e0992070caa3a5387133e76a079719994d237947f6bcf67f9bca","impliedFormat":1},{"version":"6141d19bfa7698f362e84460856ace80a1eac3eab1956b188427988f4cd8e750","impliedFormat":1},{"version":"1acded787e1fc09fd56c004d3ba5b719916c06b61976338a92a2f04ec05cba5c","impliedFormat":1},{"version":"8fb0d41cd90f47b9148e4a474fb03484d9af1735871321a2f57f456e40a7e319","impliedFormat":1},{"version":"a25cd4cf54bcdd109dd46274e2369fc1cad6d74350b5642441d2b9eef515c3bf","impliedFormat":1},{"version":"af4b9f16e50a0ae803745150e4c091e86ab95f3dac649286af28505258f7a189","impliedFormat":1},{"version":"3d209a6c3c53366b3bcb72dcf04a7ceda57362cae6ac47dbb783321934a0c5ad","impliedFormat":1},{"version":"4766770027d93a5ad1d4cc880cce405b4c6f67c64303ab34b347d6428eb783f2","impliedFormat":1},{"version":"43d2bec085f0fab54d7b9dfa3f5c5ce65e30da6a19d82ed37d1d41867682f86e","impliedFormat":1},{"version":"e5efb9781a0ef18d60cbb8afa261489efd260d87642c095cacba0b09b2684fcf","impliedFormat":1},{"version":"775ca7538a2f9bc674ebe5f3cb8aa8fa346ef4c1faec4c5b13b4784a744854dc","impliedFormat":1},{"version":"c0037c7c6fb8031f7047a1ccdb381762862b48429e9ab07bac8fc35fc5b5dd14","impliedFormat":1},{"version":"af4db63c6e4d55df1ad7f3dabdde31bc30555debf1cd6b79ea65a36c52bf199c","impliedFormat":1},{"version":"d291ffc234a58061b8192f74422f2e51fb87f6d10e82c30a555bccf9641b3e38","impliedFormat":1},{"version":"6d683695e9765b29165bb0823f88755211d48949f0b95a9a4236802afddf41e1","impliedFormat":1},{"version":"8fcd568ba937d867544cd8e726f35a515690ad041387fdebc93d820c8720e08c","impliedFormat":1},{"version":"81a0ff507ece65e130c1dd870ba79b8337c1fd345db7b154a2749282c994d2d5","impliedFormat":1},{"version":"64e2ffc72047548fa3c04095abb9dab48e2eaac169161fd2ed3564dea0c67e57","impliedFormat":1},{"version":"b525d2fc6b694512a877219ebba25d5fa244f99253a5bbe6c6421f8d71b1c806","impliedFormat":1},{"version":"d695f0d65f5fba0e275cf7801399575c272b86e7bf8e70133f8fc03517305b1d","impliedFormat":1},{"version":"0836f15e5e7dcad64fd50d49a39267da34371d1c2b803b38dffcfabcd2ff604e","impliedFormat":1},{"version":"56eff313f885482d44e4aa7cefdd55f7d0d92a91c1ddf9cd73c533abc36f4dff","impliedFormat":1},{"version":"022ff6b725f6ab95b1c4d229893b3047002a9c1fab6798c8fe63797ec1e63dc5","impliedFormat":1},{"version":"5e64d04301aa6ae6bf0f3435d07804889342873ab2875a16c827db9e6543002d","impliedFormat":1},{"version":"0b8c3effe0c65129d493be140da1a83eb61a1e83481d441dd2bc359a926b453e","impliedFormat":1},{"version":"0816c977ef73d99cbb134427a83f91ca6f7fe00eb7544118320d613a85da6879","impliedFormat":1},{"version":"068db2994f5926e888462b0852ada2c24f2cb50028f034f475407957ca51c6cd","impliedFormat":1},{"version":"59106b469557319ad26f40f054861be3fd2cf09911c3b66df280b9340a1d9caf","impliedFormat":1},{"version":"69e8e2dc21b0636f671485867555439facd68ee9e234fc9190c3b42e7f1a74e9","impliedFormat":1},{"version":"5fb0c0cae187f6554769cd4ff36575ddbc43078a4fdf9b17a5c0c25dfa9a9f2b","impliedFormat":1},{"version":"918d99a7aa4b7f5edf2cdcb33c163837a892f43b9e22c10634d61d0a28fc09a2","impliedFormat":1},{"version":"097b0d1e237bfcc97411fcae19a484a717fd4055a48e98ade5cc28b26afd21f6","impliedFormat":1},{"version":"5fb0eef64cb75951f7ae2dc6a704aa0567a25a39a616a5dd10ba7cfbfcf73b78","impliedFormat":1},{"version":"0a649cbc59a47f224d0494a6d5167a803ed049f995ade8423c7cb62bb6a38b64","impliedFormat":1},{"version":"68e25d1a79523b18fae630ca57100ce2dff6c5023376a2f57e9d0d07e1b9b8ef","impliedFormat":1},{"version":"1a505f408bc7d484553b7701f712dc52e1174648baff7d6c9c1f38b5cb83b772","impliedFormat":1},{"version":"b19badf31df455f10cf44fda9f6a0e0b42d6e970ac122b66c5da5d683fa270d4","impliedFormat":1},{"version":"71b6fe5c85eb877c3e3ed2f142b95a69f97905c34f11fc6d9052a4317e7f6bae","impliedFormat":1},{"version":"bd55536c0f989f59af6ca66cbc8121485f978f4e07c3df1688623c5f898058c6","impliedFormat":1},{"version":"dcb868c613ccd06b1a3ff56ee235e5987820c0c8bbd77fedc9af4dcfdd4c54bf","impliedFormat":1},{"version":"f3d1b3cd130e3cd67fe8e06256deb5d678243c6976ea498c81a48e542efb7529","impliedFormat":1},{"version":"772b881836efbdceb7ae8d3ae038f14ec83444397d8429b866312dcd78714dde","impliedFormat":1},{"version":"314d516eb3bf1eda07e898935edcbd1e74739493c8ad444e82181f8a020eef2c","impliedFormat":1},{"version":"8cfced8e57c64563f91e90a76a6df2d8f934c90a425327a9ed5393bc88c27d97","impliedFormat":1},{"version":"67bd754a8775c81794c9fc84b1a1e9fca44a402fa7d93fcdad4ba2d37737d929","impliedFormat":1},{"version":"5128e32c57068eb09d5189eb68681ca7d0e5e4b0cdedecbef9c67689f0970876","impliedFormat":1},{"version":"7fcdedd29146e5a2a6c86eda652f8485a1eeda1b8646825bbf729023f6ea6013","impliedFormat":1},{"version":"86b9b361ce8ea1d9f04e15bbe49e5ac72e5f97d8cfa8592930d32f267729a201","impliedFormat":1},{"version":"671f5e3a931c2737f8dfa43b34c4a320eca27fc6584ecef890ddd7374cee5cb7","impliedFormat":1},{"version":"ff213315eebd3ff05e01b383f704d79d8139aad5cb0d6a13c082f2e29625adbc","impliedFormat":1},{"version":"83ed351a10ef17b7811d3c06fc2775e36b6911278326d55da8d1eef8ff2f29df","impliedFormat":1},{"version":"2f5f146f1d6c04cf89ae0e9b4cf2b064b2ce4319ba6a5bf18ab8fb29db1cfd1a","impliedFormat":1},{"version":"7fc2b96a8465725bf774bd490c383edd5ee3dfe0d38c13551d082cae2de4041e","impliedFormat":1},{"version":"9eaeb6696e4218cb5bded9ee27c3e95589ad4af1fd4b97ccdca43eadd62c94d5","impliedFormat":1},{"version":"fd580a99cb9bb84288da00eea67dce300bdef06d4da2a727c0fc466d2922dca2","impliedFormat":1},{"version":"b82809d4468b6ba4d72437adaab7ca273547c59974e954c48f655a4b1bdca429","impliedFormat":1},{"version":"c6455d4ed4f7337bcb885c61372c7d9b03991995ed73e29023bad502d1336f0a","impliedFormat":1},{"version":"b5e6f0491b5a2002eb9b1146165cf915ee58e0fddf7f2adb5f2aa4bc44b4fb83","impliedFormat":1},{"version":"f534aef095a62fb82f57768fc52995d3e58d95e0a1671b0256a4704802aee818","impliedFormat":1},{"version":"cdc6f1d471882782cdac7442dbdad65aede5f749c09799a84918bd916eb6d6db","impliedFormat":1},{"version":"2475197472c609662f09660e3964a86aa355cea0e671653656800690bb508b7c","impliedFormat":1},{"version":"b4067760d0447747d82b6848b640168d656d0b916c3add2ec94c3c4dea92fc9f","impliedFormat":1},{"version":"c6c591a17f9c0c2821baf15f775f5c7d6dd4a0786365ee9c182d7a97e38ad96a","impliedFormat":1},{"version":"ede44ddf9d274a859e9f1f34333d5f0e8cf2167c3265f81d5280d37b872b4552","impliedFormat":1},{"version":"6317aba53c9152998bb1f8bd593f55730084d05c00c774ff72a3aa4d687a6dbb","impliedFormat":1},{"version":"26f1bd15980b19d925be98afde3918a6a181435b87e9b7c70d15726ecbfff0e5","impliedFormat":1},{"version":"57af4faf6847adff5048f82929b9a7d44619d482f571534539ae96a59bb29d3a","impliedFormat":1},{"version":"874770f851ac64a93aaddfb86a2f901f158711911fee14a98a67fe32533ee48b","impliedFormat":1},{"version":"3d933e519ad9cc8cf811124f50d0bc14223cdea9f17adf155f11d190ceb2a6c8","impliedFormat":1},{"version":"d5dfce61a7bf994d2cb711af824efa4de9afa5854d34e6725b9c69d925b6b2dc","impliedFormat":1},{"version":"f77d1e10417bf43f8fa5d18916935f342d4d443e371206ede7239faaf9abbbb8","impliedFormat":1},{"version":"c94e0b8815b72ba924c6b8aa666b25903d949a7ab0d38ed84e4bf65da3d06a3b","impliedFormat":1},{"version":"15db84e660fdcd8468f23973ab83c31d7fd28bdddb30b0aed16cfa051aafe900","impliedFormat":1},{"version":"7c01cbfe181c0e10044831b899de6c2eec4fba32de1f1cca12742d2333c1345b","impliedFormat":1},{"version":"62cb1636513ef26d3ea83fb5d2369cf8569d04aa30d8fd7f5327d0e10841635d","impliedFormat":1},{"version":"8282a076b07dc3dc6b2265377627ab3860cb6a1bcbae85a5a4006dec4c9f0066","impliedFormat":1},{"version":"b273c241dd08c6276fd35be413c64508ae50f847fa052bf7781799b51da8e9e9","impliedFormat":1},{"version":"3bc0bbef6d7fb63002fe80167db350b9677cfce5872c0cc7ecec42ba8248ded6","impliedFormat":1},{"version":"4880c6a85442934b81f3b1a92cb6b43df36f8c1b56b6822eb8cbc8c10c438462","impliedFormat":1},{"version":"1bfdd8c1710a3d1654746ca17f512f4a162968a28e1be1a3a1fdd2a8e5bf385f","impliedFormat":1},{"version":"5405aedafdf272dde53b89036199aaed20d81ddc5ec4bea0cb1ab40232fff3fe","impliedFormat":1},{"version":"db2ee45168db78cc83a4368546e0959318374d7256cbd5fa5692a430d5830a59","impliedFormat":1},{"version":"49993b0eaa14d6db6c334ef0e8b1440c06fee2a21ffd4dea64178880bd3d45a2","impliedFormat":1},{"version":"fb9d9dc0a51cb4014d0e5d5f230ec06ffc4eb6caae6eecfe82ea672b7f3c6967","impliedFormat":1},{"version":"84f44079a0793547d3a629feb8f37d8ef6d07cb5bb5fdeefd887f89e9be871f6","impliedFormat":1},{"version":"295c5ec088a1bfc286e8dbdc9807958588979988cd7a74ad32be774a6f6ea512","impliedFormat":1},{"version":"f15129c62ed04410ac0a3326ae6fa5ef7229bbb1b0cbfa252b5c558505a38253","impliedFormat":1},{"version":"4bf500d9a554d43cb9133d60f1b3f58ca98b0f794486d1377f3effc551b40faf","impliedFormat":1},{"version":"536f6a9208c89eb8f0a5eeda629175b0fa62ccd22e387af7f35297fa2af6897d","impliedFormat":1},{"version":"8c95fe5a655ea1c78f0335f8da58e70d98e72fe915987c3b61c6df49d6e276d1","impliedFormat":1},{"version":"4bd434d3055d1b4588f9d7522d44c43611341de7227db9718a700703c608e822","impliedFormat":1},{"version":"935507b695f420fddff2d41ddc12ff3935931a3f26d6aa65afbb276bfdf51cb4","impliedFormat":1},{"version":"e851c14c9dbe365592f5084c76d4b801e2f80302f82cebbe7c2b86095b3ae08a","impliedFormat":1},{"version":"b5c90d931d285d9d1c4cb92d71f2719e28caaa9ca062072d0bb3b69300b436c2","impliedFormat":1},{"version":"40b3e953e9ea51a86a1e5b60a2355eeb780f2f8ce895ece252910d3e0a033a16","impliedFormat":1},{"version":"0264b432aace8398f174e819a0fc4dc196d5aed49ae65aae071fc2ec8e6dc029","impliedFormat":1},{"version":"3b29bb23855a1924264c3a30b5c73b00c52a57c2ffb5f91c48c9572e71048f19","impliedFormat":1},{"version":"8b9b2e76db07d8926bcc432c9bdfb38af390568951b39fe122d8251b954f9ed2","impliedFormat":1},{"version":"96e85c6fa102741a25418ab2c8f740c994e27ea86fd6518a17ec01a84b64dd5c","impliedFormat":1},{"version":"9525b28a4fa959c8d8c7d6815f842f78c67b40def9160afdced5c9daf14cd4a8","impliedFormat":1},{"version":"0e59a6944a52f52138315b6658fb1d217fa017b7abec12006c491d51e07fb56d","impliedFormat":1},{"version":"cfa8acfeb9d68702aa6249b7295ca73ea598e441f014cd4184b6e2a3ea9a275c","impliedFormat":1},{"version":"21b0c616f61cd6699135a34a500f7df30022abf9358ba612f10668ea3c988e00","impliedFormat":1},{"version":"9ad1d0b171f7bb9f484ad156e97f0d8e760a5fee13e342831669c7b2d1137a30","impliedFormat":1},{"version":"7ccadd4ba126bb2c0564bfb85ddd7d084aa5f2880cc2d0149fbe183fd5ceb6d1","impliedFormat":1},{"version":"ebbde5a8a356a1547ac6ecdfba7547036a5ada116011cb96634c32df1cf69084","impliedFormat":1},{"version":"e703eded767e3a944ac1f7c58c201a0821da1d68c88d6ba94bb985a347c53e42","impliedFormat":1},{"version":"99953f3f1f9deae755b97ed3f43ce2bee2ae1324c21c1e5fa9285c0fe7b5077f","impliedFormat":1},{"version":"2afd452bfa6ebaacbead1ca5d8ab6eda3064d1ea7df60f2f8a2e8e69b40259e9","impliedFormat":1},{"version":"dae0f3382477d65621b86a085bdb0caabf49e6980e9f50ee1506b7466c4d678d","impliedFormat":1},{"version":"e5793b3f4cbd73c841790264db591d3abe9bd09128302a2901fedd2353ab24d5","impliedFormat":1},{"version":"41ed74193a13f64a53705a83e243235920fd58d4b115b4a9f5d122362cda7662","impliedFormat":1},{"version":"478e31b207faa7110b04f6a406240f26b06243eb2d2cff3234c3fc8dd075bf6c","impliedFormat":1},{"version":"ea917cdbfb87d11cd2f8b03e357b22b1114d0ba39ce4ce52b1a4f0dc10c6c20a","impliedFormat":1},{"version":"3ef0c5634d9aabee346f9ba056c1c5d977f2e811f6d13c082614c9062cd4b624","impliedFormat":1},{"version":"1ddb49c7f8fc4b9e4da2d5ddca91b4e2763fe7d17aa79940bd60406f3e2739bd","impliedFormat":1},{"version":"d5b01eab562dc40986a5ceb908519dc7f02a7ded2bcb74318317a75714dbc54c","impliedFormat":1},{"version":"b19ef44e991aa150a19a9f84be1fd1c4d86496241300fd904216762246700623","impliedFormat":1},{"version":"87df6cf2565a88dae3ec50e403e9ef6b434ad3e34d922fe11924299018b38e58","impliedFormat":1},{"version":"9d999d30b52fb0b916f7a64c468f6d5c7a994e0c1ef74d363562e9bda3cb8b99","impliedFormat":1},{"version":"9b1b05f88ded21046391276ff60d2d987bf160d77b40399e07b7bdbfe2e38b31","impliedFormat":1},{"version":"628177f7eb0314f0189e4d90f663233606b3936ce391c7f98da46105ae402c65","impliedFormat":1},{"version":"3c80bf6873eb3b95cd590aab8eb1612f0f7cef6a30b3f49535844f7cecd99351","impliedFormat":1},{"version":"da367ede4ebd5ff4cb1cf9e6bc8eb35848b23c57c22c53360e53dc772c7be8f9","impliedFormat":1},{"version":"4337acbd8896efb7e7d8d6e0eca78607fc7c1a9ad2bb228240f13f97b3492f1f","impliedFormat":1},{"version":"505c7800f8195961302dee715870b7212bdfb667e5e47de76447151dd35a40f1","impliedFormat":1},{"version":"cf5a3eed6cd493d198b0c1eacf70486d8bd527fc411d57660caf2c93b5ea0fb6","impliedFormat":1},{"version":"900e344adae3c65076c9ba4ee1a77c6db19fb0c7e54d7ce23c28ff8d272cba26","impliedFormat":1},{"version":"bcc5186a38d1eecf60b2c4d1e3eb9abd8ab91cb492f384a9d2ed7bcda2abd0d5","impliedFormat":1},{"version":"0ec1b41954fea9def7d9d87e0f3beea2ba3ec5b7beb769f308cfe32ad2968669","impliedFormat":1},{"version":"51189c085256f11da13b22792f1d7c928f8a8e9d9b6c7b38e956e72a51ef8219","impliedFormat":1},{"version":"504f509e23f2ab3a8018533925c034a340fbce4af9e77a1f71a8ddffbe0c19fa","impliedFormat":1},{"version":"635c049483e13e1dc8bee72dde300c40d350046cff59b202d41a12ec8c733d27","impliedFormat":1},{"version":"7fd8d5f70ea745e1a0338de7aaacd9bd6ff086ce6de75dcf91749c77d1e23831","impliedFormat":1},{"version":"78d2a7795bfd2be490937e8b01968a0acca8a6bdf5933570bc013806049d4175","impliedFormat":1},{"version":"db49833b6e9aa54b535076f40615349a7465005367a787b50ba7b92421e26442","impliedFormat":1},{"version":"6a936fc917de40c44ca81331ee7d7a71dc30ae1895871e7be7b6ed85d96cc41f","impliedFormat":1},{"version":"bdd2a764cf87c4ab1efd7084597d1ca4ba17f6b6496553095ecca5a14b5d4278","impliedFormat":1},{"version":"ddef8e6676fd572ee3de174ad28df05c7b3803542d7318482b8f98779ff25612","impliedFormat":1},{"version":"34eae3bc7f5bfb515d2ec163ccd4b63fdb73ad7f66564707686d84f42a8b7c35","impliedFormat":1},{"version":"d240d106cf9bc3c0efdb323d807b944ce16ac5d837ecef5b75f1e66d606b2a72","impliedFormat":1},{"version":"639d5a26be297431e0bcc9f71f969fd7d84319fc03b5e1c672ea10fb0094c616","impliedFormat":1},{"version":"770c3e6367c2802c027c0b1f86928f288e11ad77ac2f454d7f682460eab30a0c","impliedFormat":1},{"version":"c9dd2760e0419a059cf733c38ef5d44eeca3fc647f9c201d88656e5040f5a3a7","impliedFormat":1},{"version":"16766b8f3d1bba66ac8167e6407be6c490d4462e802f67c140b1174869db5b67","impliedFormat":1},{"version":"f9267391788ac81ca54dfae32c5d86e99a19abaee9b172b2f8d98a3c2b578a2f","impliedFormat":1},{"version":"92441638c0fa88072ef9f7b296a30e806bac70219ce2736ef33c8941259d9b70","impliedFormat":1},{"version":"8774efbaf39f9ea3a0ff5b1c662c224babee5abb3d754796278e30eb2e51ae3c","impliedFormat":1},{"version":"e634b47a7d3f9468572a7c9af1fe2f52687ee1afb23ba5568205a7a4c55662ef","impliedFormat":1},{"version":"1cbef47ee169c717a1ef7ea91b15582c61ac721fd5f5671de95c3df9f026db9a","impliedFormat":1},{"version":"0db0ee49f803c9b901dfe06be9c8fb6a1c05f98664ca34c68e0da575eae76f2b","impliedFormat":1},{"version":"4b745fcadf040899979b6b26e24aca6d2fa2bbe52a919d67f717bfe0339354a3","impliedFormat":1},{"version":"bc57f3550b3fd3b7d31b9a278d0b491dd45d170e37c4046a3105fdea9ebe5f89","impliedFormat":1},{"version":"b5f7093d62a228669dd56edd0bcb86a0cf0b46db4816a3967b4632503c21b93c","impliedFormat":1},{"version":"4d70bbb1f35f345b2c2e1b5c9b8174d5397bba76ffef12656bca16ce9a1830d3","impliedFormat":1},{"version":"a004fc80aa8f78dfb1d47b0e098fe646e759311c276b6b27404f5e356528f22d","impliedFormat":1},{"version":"c8933d9afe6c5ee7ecbeec5aa01f6b37d3c2be2f7dd203ee75ee4850164007cb","impliedFormat":1},{"version":"b1129b38f1eea70951ece3ccd1cc3e1d094379b64d3958ba8ce55b0ec0083434","impliedFormat":1},{"version":"b2bb10f992cfd1cf831eb005311a80f7f28bc14cfac5883f17e75f758d1354e1","impliedFormat":1},{"version":"58b621b924324874a67e92d7626809fd4b72fc079ce909f6da7097654026af00","impliedFormat":1},{"version":"149288ae23bb3b31ffe5cfb7eea669fc6872e41901d60be932af2581601fc70f","impliedFormat":1},{"version":"01a0fd262c8fdc6c91078255c4fe2f8602fd4fe4c753b2eae88537585b21dddf","impliedFormat":1},{"version":"deb69e6754a61784daadc35b318544b0aa69048ebfb142073c62b7f46bb1d5d0","impliedFormat":1},{"version":"60eef77c9b5cec20516907628f849845975a8137773ddb0bcb53fc2ea7d28870","impliedFormat":1},{"version":"67bcdcbd8cece34ae28180c636908af1b118fa9603d0d4b7dea877156d4de519","impliedFormat":1},{"version":"5a1c2cee26d1f8d9bb15b334f5b2df7de27a3944bff9ccf71d3b69c588612bda","impliedFormat":1},{"version":"a04d60b205af1f28461f3d2f5a8222ec2d8af54d436bc53a0460756e07e4207d","impliedFormat":1},{"version":"14c85d4debb2e0c8939f81b85cb9ab4543f70c8fe53be5fb5caf1192677c8ca4","impliedFormat":1},{"version":"c507cdc9757c048620ff08a85b9cf6278598eb1738d729fdbfa1e387a35e639a","impliedFormat":1},{"version":"4a4807c3096f49a463476742e3b5d23ccf0e087e43c017891c332ae5b8ad667d","impliedFormat":1},{"version":"c611af558c5d19fa477f1b03ceac7b0ae28fe5ad4f8bc61e8ad64c46f97e86e2","impliedFormat":1},{"version":"0cec41f583efa1f1033a4d546d926ee949756f19040bb65807c5a3ab6f3b8449","impliedFormat":1},{"version":"73b1eda15491d4f3052d6fac202190e76d6453fce832034bd29901cb198448b9","impliedFormat":1},{"version":"08c66989383183f3d7c43346617c8f466bef28f1e3eb4da829316d548cdbdf80","impliedFormat":1},{"version":"1f283476bbeaa589fe644fe6ba9da223baf118ecd4756863deae7362b246aff3","impliedFormat":1},{"version":"0a8f91ace4d1803eb2a50079c9e233fb262b0027d19aa250eb7ecbf6319e52d6","impliedFormat":1},{"version":"65bab52912be03b374ab591d73ee40aff3a465ac20bc0f2024b4c80ac5ce8397","impliedFormat":1},{"version":"6a647bf0620a4a7777527c688c62636a503e8b4d5e680037503066dd2af6d0dd","impliedFormat":1},{"version":"f1466e4d708815280c849956a506e132b7dc243907b9c8e07d52862e32dfcd91","impliedFormat":1},{"version":"cb4b99f8e47f57df841c95fcb1afc28488a2b5442e3524f6261e611b86105331","impliedFormat":1},{"version":"7c5fc61fc40a9f3aa3a09fd867536ff94a93b16f4ae99f1fb748fae6e13ae8bc","impliedFormat":1},{"version":"473d9ca5b242db0471d418336f410922eadd290679914f37ef21ee26dbeee2b4","impliedFormat":1},{"version":"2ffeb6ad0b074d1cfa3dc9671dad062b08129d1e8a8988b727dd2ce9fd4298d8","impliedFormat":1},{"version":"fa1d4332a68d84300895af592811f65f5f1d725ed0664f17d5c215a63408b6b4","impliedFormat":1},{"version":"7a09768c36d8b7d8e44b6085031712559362b28a54f133b803bed19408676cdf","impliedFormat":1},{"version":"f0b807278b2619fbe0acb9833bd285acabbf31da3592da949f4668a2e4bcbcf0","impliedFormat":1},{"version":"bc6419ca69c35169941d9d0f7a15c483a82ac601c3448257f29a1123bc2399e1","impliedFormat":1},{"version":"45f530610645ca6e25621ce8e7b3cf6c28cd5988871bc68b3772488bd8e45c25","impliedFormat":1},{"version":"2d3e715ca71765b491ae8bd76257e8ccfe97201c605dadc4e6532bb62e4f6eee","impliedFormat":1},{"version":"c519419c11e61347181ba3b77e8d560d8cc7614b6231cacefe206b41474792d4","impliedFormat":1},{"version":"24823640771cf82865c3b1cb48a8a88119b69e56aef594171cc0570f35f60b8a","impliedFormat":1},{"version":"30398045bda704d03d23e78a37095aa56e69ab2dd8bb7304b15df9e183b9800a","impliedFormat":1},{"version":"9a816fe54ea736ecf02b6865c10157724cdb5ba3f57ead02d9216b2dd4bd0d5f","impliedFormat":1},{"version":"a67582f2933f5b6faebba3484c99e78b529aa016369b768021726e400c93ddb8","impliedFormat":1},{"version":"96cd7367cc076d36d9f10cbe34b91e94467caf9b64a7a0fe1c4f6c8287e0a1b5","impliedFormat":1},{"version":"17c7be2c601e4b7e6292932997e491ff874418bef9ee6137e69ea6ef497e0e5d","impliedFormat":1},{"version":"eb7ed3b69718cf40c1ab8ce9a0e917819e0ef0b7480ba2890cddbb94a1386b10","impliedFormat":1},{"version":"7a7cec0720ee6d20e08fa9def697b149a94db1763bbec6e1ab5da8d7726ebddc","impliedFormat":1},{"version":"c024677c477a9dd20e7aba894c2f3e6ef81c4076af932a7fc00c210543cd53bc","impliedFormat":1},{"version":"7f31b6e6d0c03a34e462fdaaf2f7ab6daf85bed51fcaa61ee794aaa1c9b890ac","impliedFormat":1},{"version":"ffd5c614f7c66161efc5defd5f9dac16ae6877d13685f9ae224d5d081d841170","signature":"48e5a85c472f9c5980ed27788b84b5d58e9c0c97994fc379a2dd24d471a4cc7f"},"295c285c22bc6dd4e847f4a00825777096adde329fb4e7901e77fc5792872f3d","53fb9b3a127f1f5851727985e87e0a78cd05ce331fd219d04f61597a1fe61ecc","a3ae331b28da7fed70f45e76ac849a9a96590bfe887d0b2a5e3b290640b84f62","02dada8132db5766dc8ad2c99bba2cd1ab0b49e5de715c5d85f2b24efe2255d0","22172a7dd2af03e315c9397e405bb131ce102e20df29459a4f7102c2ecbf1936",{"version":"2824ca2624f0f709e610086eb07ea25170d888e266e287b758959d61891bda8a","signature":"662f513cb4a3de629172d7166dac34be49951591efa1bb1cd0c65e9474b99744"},"40bdb8e2a49bdddeb2855c05b62af26bafa2c2bbefad7054bbdb60c42beb39ae",{"version":"882b28abe64dae4932c83ebb71e4155da340929fe08a2055f3e573ef17f70fc3","impliedFormat":1},{"version":"4a3e425808751200a7709671667ad3d7e7cbfd0a06d469cab42adf06c2601f4a","impliedFormat":1},{"version":"401da46338f5b4f97c2a5f8a0faaace045c51aabd751d2dc704159f64feafe89","impliedFormat":1},{"version":"4e6da006f3a74377f1801ef8cbd771f82ead12d4326d4429661524aca2e21493","impliedFormat":1},{"version":"00282f6bd9be6b0232abcc49955f0cbe53d3cb7521d4687738c42e1ef829ae0a","signature":"df9e7bfe8f0a5b6860bb56b95b0de116750bbecd3c34efe4ea9f037bdb7f19f3"},"c2610e84e8e0b02701bb5bd55c3dc9da8e7ded2310aa911edababb91305e978f",{"version":"5ddadf70682e6d99d742a547f01d8e5bd31fc943888d091d772960faf58a93c7","signature":"a6d5d209a8ae18ed5397ce09dda87882c35ef91e64dbe6158e5232fbcee1c54c"},{"version":"f7a17ed602e068ddd7e43bb45ca9fb4aa8e507a8c97668e57b8608ba001b904a","signature":"f2ffcc0424acf94a1fc97f1598da823de80320c699e56961963be2935112d53a"},"4029088c8622ea8ef31b73ee2cb81ad90cb9014544c2f7e2c185609303831099","9b039812fa3eff2b4487b94715f877f5e3c13bc859aa357bd8bf148d57bc073d",{"version":"afe4d483f781d3d3c43f4bf88101236f856c4a0c8fa4f7d3ddb30b66ba5a0c85","signature":"a54ab828518a9f266b2bc298626dc2c522aafda07918dfec64d163f3fd750545"},"0eb7c579cf9e5634148d1322df3032cde9e0fa0d49cb9f8e77f9acb417e21607","d6ad3e3013abe85c680623db0bb8eedcab3da6864aa4a186915ce1ea2e003723","6e8ecf14ccc7032c3024d52862d796acb51d1aef5d5499e30350496d8ed97836","e8dcc1d02c46e68db2537c75f31de0d6893045e663278b92ec4f300e6ff0b5d9","55f9abb9cc177f10ded2daefd5d8ef00a56549dbe315d70707bd114dc6472198","6019f5fdd540c6b10925458425eaacdc57a602df5da2e5af8d322bdea68511c8","94a1851a21857fd7df68313dde72484afcbfa76a2277abb42fc8951f7acab932","28cdb028c1451b92b128be3abcb6414e4302c3143cc73144d3e7f4b4e932333c","a5db1437b4f7c24065819bd5d3eac25f2b88950ea184bb35d868cfc03d18cd7c","60d7b2eeda9ac3b810b446a552079af4a75633ac8039fbfc790eb1ba272a2b4b","e00629cf91446ccb7171dc19735bd0073a5cc19de766fbf1f23697f4568cd422","805f2ed4a67c52219dcfe754ea9f11f8299da92691dd464d292e018209142d38","f1d141f91d348e2433d335ad516bb0269124f0cd1ad686db2f2d19544900e2a0","43c7fdd9a2363dc964a6644339ea16f4f598ce5621bc68a5d168b3dbdb571132","748f71f7b70f100c70bc89ef2a1d7d0e6b95068b107a0b2732fe5c0905a53699","ba868acc53d316487b79805e640a2cb0bae1cdd573ae94c50c5823c1106a55ff",{"version":"3212ee6a39e886268c15a41021be022b681b8b958484d486dc1747b8eaa62f3c","signature":"a4eb2f286ab03f9cf7e81fe4cbbe541e73cf631e5e4fad44a293e41f03f13626"},"41dc30237d348b018455451803cf7362c3e3f3354076c383eb72e82f63f886d9","bb6bb9bd0c67610df969cdc390415f7f4c2c427980725488440b4e754e6e1d0d","325fcba7ecb747f598d12939e0b4730c9500d83f9107d2cc581460d5e48fd34d",{"version":"e9ec2c29038e75027ac42162c8fa1492c5c0afe430f9fda30349742407c32d5e","signature":"052c50ab25ce776b74abc154b10eff6f5f5b940c35f283fd7d52d9f7758ac56b"},"ec601651dd09100c2b07dfa762e63fabef054b562a1727da6ec4c7de798c7679","521a1cdcc287c36769cdf131d408f7455ea081b425c758f0d551c0f101120c80","9a21158de87685b940d32c40647d21ea6ce4225244fc69dad75a4d20f7df25b0",{"version":"fcffff3fdf119dce8f676a86e69d3c05217c8545b00c1395f6d6238756b13423","signature":"d303560f025fea5aabba06f1a3cabbec22c43e45a0bf445df0312d235dcf3eff"},"bf520bf187e4f515feaa449892b92f8a7ec52fa60b5b634fd1ea0f3a987561e8",{"version":"82c9c53b06946b7a2b0d9aa3c67a7307336aee30fadcaa074dee8ca1f9621497","signature":"33ab2748404fc1199d1c84db8b454970c68461cce4b15d52962201dc6fd524f2"},{"version":"d9fb0d6918b2f8d385a821a9f6cb03ca8bdd7773914af4e3329e22405d2c3e20","signature":"5dd9546ddc32d212279437e4f91f11c84c1e1e89c287606b62474e2afafddf94"},{"version":"9f01ff889f75f18465e8844b6b1dcd723ecacd79744856f6f73168dbbfe455a7","signature":"3a8523bfa20e149df671c3166d3c2e0c8e5b9f015b121a6855deedf209096b5e"},{"version":"1700a5a495ed9a991e23bc1fdab52d871ed3e3ddd37f9f669cfd3bcdc83d9ff1","signature":"1c8003d99e92c28cbb775189415fd58975dd0cac4dda2ef067506e281b36dc0a"},"539d171dd81cd9c2c5143f06f708101f05cb967bbf3ebd8bc89d6362b8addcdb",{"version":"e4892d139d7db560828e0a27449d9450b64eb0ef5b5eb4a8c57a909474d8f981","signature":"6022f518509a833a152478da1797b149fcdcd2736ec3eec9fe30a222ff45775c"},{"version":"e5b32253216721d8162aa54c343bb280aece827d3ef66796f0a92a25c85c665d","signature":"d093162354fda64bd11b932d1e65ebf756c7529754e13df3f2d6cb85c8a59c45"},"3cdd575aba8e4aad238f5c4becd78ef51c58c9e2872522f349a1e809b0125f77","35e09853d5055fa35a8834289447638bd39894b9c0d1faad1be44f4f55ecec19","6d9c54b517651034ed9d2f30c9d81a70b5cf21a556e7d6090c885fe2cd2ffbc5","5f84a2f65fb30674cdd43f2ec4ece6dab8ebf3412bb8b0c532e2517c3f9bca9d",{"version":"8853f7ad1a6366ef8460def59df7aa22e88d5535ed1ee28ca13ccb051acde8f4","signature":"c213fac2d8c40d184a446b8919701a9896e187f65958e0c60123c7b460532f96"},{"version":"5e037b8e19967d6d8bc6a9c78101c3c36f3b4cb2e2ef4b5cd37f77a8d5d90077","signature":"bb70bcf7aa9ea87f39fd1682dfa3c460c1814fe39e0961a8fb2b9c960dac2486"},{"version":"bd19ed8c7c8eb2c21aa29b5bf4dbd494ffc827f7e4b68b1febb9be5c47babc11","signature":"b709a0bff539a7d37409637f5e5e91b51ec9a783b3e5c763fc63d90ad232ff03"},{"version":"2259bd821bb61f05d568c5039cc3173d0852fac8f01db2e942efb2b57b3491e8","signature":"1d9ffc608b30a14b43cba6531a34e4729728bc0f4ac4160fe15e895cf35f0215"},{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ecec8f82ddf42db544c8320eddf7f09a9a788723f7473e82e903401a3d14d488","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1}],"root":[[350,354],[392,395],[398,406],[409,411],[415,419],[745,752],[757,804]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":1},"referencedMap":[[350,1],[420,2],[421,2],[422,2],[423,2],[425,2],[424,2],[426,2],[432,2],[427,2],[429,2],[428,2],[430,2],[431,2],[433,2],[434,2],[437,2],[435,2],[436,2],[438,2],[439,2],[440,2],[441,2],[443,2],[442,2],[444,2],[445,2],[448,2],[446,2],[447,2],[449,2],[450,2],[451,2],[452,2],[475,2],[476,2],[477,2],[478,2],[453,2],[454,2],[455,2],[456,2],[457,2],[458,2],[459,2],[460,2],[461,2],[462,2],[463,2],[464,2],[470,2],[465,2],[467,2],[466,2],[468,2],[469,2],[471,2],[472,2],[473,2],[474,2],[479,2],[480,2],[481,2],[482,2],[483,2],[484,2],[485,2],[486,2],[487,2],[488,2],[489,2],[490,2],[491,2],[492,2],[493,2],[494,2],[495,2],[498,2],[496,2],[497,2],[499,2],[501,2],[500,2],[505,2],[503,2],[504,2],[502,2],[506,2],[507,2],[508,2],[509,2],[510,2],[511,2],[512,2],[513,2],[514,2],[515,2],[516,2],[517,2],[519,2],[518,2],[520,2],[522,2],[521,2],[523,2],[525,2],[524,2],[526,2],[527,2],[528,2],[529,2],[530,2],[531,2],[532,2],[533,2],[534,2],[535,2],[536,2],[537,2],[538,2],[539,2],[540,2],[541,2],[543,2],[542,2],[544,2],[545,2],[546,2],[547,2],[548,2],[550,2],[549,2],[551,2],[552,2],[553,2],[554,2],[555,2],[556,2],[557,2],[559,2],[558,2],[560,2],[561,2],[562,2],[563,2],[564,2],[565,2],[566,2],[567,2],[568,2],[569,2],[570,2],[571,2],[572,2],[573,2],[574,2],[575,2],[576,2],[577,2],[578,2],[579,2],[580,2],[581,2],[586,2],[582,2],[583,2],[584,2],[585,2],[587,2],[588,2],[589,2],[591,2],[590,2],[592,2],[593,2],[594,2],[595,2],[597,2],[596,2],[598,2],[599,2],[600,2],[601,2],[602,2],[603,2],[604,2],[608,2],[605,2],[606,2],[607,2],[609,2],[610,2],[611,2],[613,2],[612,2],[614,2],[615,2],[616,2],[617,2],[618,2],[619,2],[620,2],[621,2],[622,2],[623,2],[624,2],[625,2],[627,2],[626,2],[628,2],[629,2],[631,2],[630,2],[744,3],[632,2],[633,2],[634,2],[635,2],[636,2],[637,2],[639,2],[638,2],[640,2],[641,2],[642,2],[643,2],[646,2],[644,2],[645,2],[648,2],[647,2],[649,2],[650,2],[651,2],[653,2],[652,2],[654,2],[655,2],[656,2],[657,2],[658,2],[659,2],[660,2],[661,2],[662,2],[663,2],[665,2],[664,2],[666,2],[667,2],[668,2],[670,2],[669,2],[671,2],[672,2],[674,2],[673,2],[675,2],[677,2],[676,2],[678,2],[679,2],[680,2],[681,2],[682,2],[683,2],[684,2],[685,2],[686,2],[687,2],[688,2],[689,2],[690,2],[691,2],[692,2],[693,2],[694,2],[696,2],[695,2],[697,2],[698,2],[699,2],[700,2],[701,2],[703,2],[702,2],[704,2],[705,2],[706,2],[707,2],[708,2],[709,2],[710,2],[711,2],[712,2],[713,2],[714,2],[715,2],[716,2],[717,2],[718,2],[719,2],[720,2],[721,2],[722,2],[723,2],[724,2],[725,2],[726,2],[727,2],[730,2],[728,2],[729,2],[731,2],[732,2],[734,2],[733,2],[735,2],[736,2],[737,2],[738,2],[739,2],[741,2],[740,2],[742,2],[743,2],[307,4],[806,5],[807,4],[103,6],[104,6],[105,7],[64,8],[106,9],[107,10],[108,11],[59,4],[62,12],[60,4],[61,4],[109,13],[110,14],[111,15],[112,16],[113,17],[114,18],[115,18],[117,4],[116,19],[118,20],[119,21],[120,22],[102,23],[63,4],[121,24],[122,25],[123,26],[155,27],[124,28],[125,29],[126,30],[127,31],[128,32],[129,33],[130,34],[131,35],[132,36],[133,37],[134,37],[135,38],[136,4],[137,39],[139,40],[138,41],[140,42],[141,43],[142,44],[143,45],[144,46],[145,47],[146,48],[147,49],[148,50],[149,51],[150,52],[151,53],[152,54],[153,55],[154,56],[51,4],[160,57],[161,58],[159,2],[157,59],[158,60],[49,4],[52,61],[805,62],[407,4],[397,4],[380,63],[383,64],[386,64],[387,64],[385,65],[384,65],[388,66],[391,67],[390,68],[381,69],[389,70],[382,64],[379,71],[377,4],[375,72],[378,73],[376,74],[374,75],[373,76],[371,77],[372,77],[370,4],[50,4],[360,78],[355,4],[357,79],[356,80],[408,62],[367,78],[366,78],[368,81],[365,82],[363,78],[364,78],[361,83],[362,78],[754,84],[753,4],[755,85],[369,86],[359,87],[358,4],[58,88],[310,89],[315,90],[317,91],[179,92],[184,93],[283,94],[254,95],[262,96],[281,97],[180,98],[228,4],[229,99],[282,100],[205,101],[181,102],[209,101],[199,101],[166,101],[246,103],[171,4],[243,104],[241,105],[188,4],[244,106],[334,107],[252,2],[333,4],[332,108],[245,2],[234,109],[242,110],[257,111],[258,112],[249,4],[189,113],[247,4],[248,2],[327,114],[330,115],[216,116],[215,117],[214,118],[337,2],[213,119],[193,4],[340,4],[413,120],[412,4],[343,4],[342,2],[344,121],[162,4],[277,4],[164,122],[298,4],[299,4],[301,4],[304,123],[300,4],[302,124],[303,124],[183,4],[309,119],[318,125],[322,126],[175,127],[236,128],[235,4],[253,129],[250,4],[251,4],[256,130],[232,131],[174,132],[203,133],[274,134],[167,135],[173,136],[163,137],[285,138],[296,139],[284,4],[295,140],[204,4],[191,141],[271,142],[270,4],[273,143],[272,143],[225,144],[210,144],[265,145],[211,145],[169,146],[168,4],[269,147],[268,148],[267,149],[266,150],[170,151],[240,152],[255,153],[239,154],[261,155],[263,156],[260,154],[206,151],[156,4],[275,157],[230,158],[294,159],[187,160],[289,161],[182,4],[290,162],[292,163],[293,164],[288,4],[287,135],[207,165],[276,166],[297,167],[176,4],[178,4],[190,168],[264,169],[172,170],[177,4],[186,171],[185,172],[192,173],[233,174],[231,108],[194,175],[196,176],[341,4],[195,177],[197,178],[312,4],[313,4],[311,4],[314,4],[339,4],[198,179],[238,2],[57,4],[259,180],[217,4],[227,181],[320,2],[326,182],[224,2],[324,2],[223,183],[306,184],[222,182],[165,4],[328,185],[220,2],[221,2],[212,4],[226,4],[219,186],[218,187],[208,188],[202,189],[291,4],[201,190],[200,4],[316,4],[237,2],[308,191],[48,4],[56,192],[53,2],[54,4],[55,4],[286,193],[280,194],[278,4],[279,195],[319,196],[321,197],[323,198],[414,199],[325,200],[349,201],[329,201],[348,202],[331,203],[335,204],[336,205],[338,206],[345,207],[347,4],[346,208],[305,209],[756,210],[46,4],[47,4],[8,4],[9,4],[11,4],[10,4],[2,4],[12,4],[13,4],[14,4],[15,4],[16,4],[17,4],[18,4],[19,4],[3,4],[20,4],[21,4],[4,4],[22,4],[26,4],[23,4],[24,4],[25,4],[27,4],[28,4],[29,4],[5,4],[30,4],[31,4],[32,4],[33,4],[6,4],[37,4],[34,4],[35,4],[36,4],[38,4],[7,4],[39,4],[44,4],[45,4],[40,4],[41,4],[42,4],[43,4],[1,4],[80,211],[90,212],[79,211],[100,213],[71,214],[70,215],[99,208],[93,216],[98,217],[73,218],[87,219],[72,220],[96,221],[68,222],[67,208],[97,223],[69,224],[74,225],[75,4],[78,225],[65,4],[101,226],[91,227],[82,228],[83,229],[85,230],[81,231],[84,232],[94,208],[76,233],[77,234],[86,235],[66,236],[89,227],[88,225],[92,4],[95,237],[760,238],[765,239],[764,240],[761,241],[775,242],[773,243],[777,244],[778,245],[769,246],[781,247],[782,248],[779,249],[416,250],[788,251],[789,252],[418,253],[401,254],[402,255],[403,256],[404,257],[792,258],[795,259],[799,260],[801,261],[798,262],[803,263],[804,263],[802,263],[796,264],[780,2],[771,265],[766,266],[772,267],[774,265],[767,268],[776,269],[770,270],[748,271],[746,272],[749,273],[747,253],[791,274],[787,275],[785,275],[786,275],[758,276],[752,277],[759,276],[763,278],[784,279],[797,2],[783,280],[768,281],[751,276],[762,282],[794,283],[800,284],[419,285],[793,286],[745,287],[757,288],[750,2],[790,289],[417,4],[415,290],[405,2],[406,2],[399,291],[409,292],[396,4],[400,293],[394,294],[395,295],[393,296],[392,294],[351,4],[353,4],[352,4],[354,4],[410,4],[411,2],[398,4]],"affectedFilesPendingEmit":[760,765,764,761,775,773,777,778,769,781,782,779,416,788,789,418,401,402,403,404,792,795,799,801,798,803,804,802,796,780,771,766,772,774,767,776,770,748,746,749,747,791,787,785,786,758,752,759,763,784,797,783,768,751,762,794,800,419,793,745,757,750,790,417,415,405,406,399,409,400,394,395,393,392,351,353,352,354,410,411,398],"version":"5.8.3"} \ No newline at end of file