{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/KingroonNavBar.vue?1e18","webpack:///../app_ent/static/img/partners/app-screenshot-2.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?1451","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/i18n/i18n.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/fluidd_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/gaps-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/raisedRipples-2.jpg","webpack:///../app_ent/static/img/partners/app-screenshot-3.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?c817","webpack:///../app_ent/static/img/partners/app-screenshot-4.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?ce8b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?6f24","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/generic-app.png","webpack:///./src/views/TimelapseUploadPage.vue?3753","webpack:///./src/views/CelestriusConfigurePage.vue?0a0c","webpack:///../app_ent/static/img/partners/printer-management.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?d28b","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?ee77","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?e9b1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?58e6","webpack:///../app_ent/static/img/partners/bigtree-tech-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/UserPreferencesPage.vue?7f90","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?d3ff","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?4d4e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterSettingsPage.vue?d363","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterControlPage.vue?3cf2","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?359f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/RenameModal.vue?ac10","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?0eef","webpack:///./src/views/partners/BttRedeemPage.vue?1ca1","webpack:///../app_ent/static/img/partners/ai-failure-detection.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/printer-wizard/commandLinePrompt.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CascadedDropdown.vue?adf3","webpack:///../app_ent/static/img/partners/app-screenshot-5.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ReorderModal.vue?e43e","webpack:///../app_ent/static/img/partners/get-on-google-play.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?b3be","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/bubbling-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/polymer.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?ef23","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?5e91","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/SharePrinter.vue?9826","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?0a91","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/pref.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?7ff0","webpack:///../app_ent/static/img/partners/mobile-web-app.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FailureDetectionGauge.vue?85f6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/printer.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?cbaf","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/raspberry_pi.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?ed7d","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?1b3e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/printer-wizard/lcdScreenLarge.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/PrinterCard.vue?dfcd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/mainsail_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?b2fa","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?cc4a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?14f1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octoapp.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/HelpWidget.vue","webpack:///../../obico-server/frontend/src/components/HelpWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/HelpWidget.vue?c486","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/HelpWidget.vue?0047","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/printer-wizard/klipperScreenMenu.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/StatusTemp.vue?ce5a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/HelpWidget.vue?2628","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?da8a","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?3393","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/vue-swal.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/filters.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/sentry.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/LoadingPlaceholder.vue","webpack:///../../obico-server/frontend/src/components/LoadingPlaceholder.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/LoadingPlaceholder.vue?6efc","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/LoadingPlaceholder.vue?32e3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SyndicateAwareSVG.vue","webpack:///../../obico-server/frontend/src/components/SyndicateAwareSVG.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SyndicateAwareSVG.vue?70b9","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SyndicateAwareSVG.vue?489f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/config/syndicateText.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/mount.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/formatters.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/gcode-metadata.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/printer-transient-state.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/normalizers.js","webpack:///../../obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?4d7a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/NewOctoPrintTunnelPage.vue?b05e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/OctoPrintTunnelPage.vue","webpack:///../../obico-server/frontend/src/views/OctoPrintTunnelPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?7264","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/OctoPrintTunnelPage.vue?d37a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintShotFeedbackApp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue","webpack:///../../obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?4421","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?d190","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/PageLayout.vue","webpack:///../../obico-server/frontend/src/components/PageLayout.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/PageLayout.vue?48ba","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/PageLayout.vue?2d09","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/VideoBox.vue","webpack:///../../obico-server/frontend/src/components/VideoBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/VideoBox.vue?e64c","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/VideoBox.vue?f5fb","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DetectiveWorking.vue","webpack:///../../obico-server/frontend/src/components/DetectiveWorking.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DetectiveWorking.vue?af03","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DetectiveWorking.vue?0c81","webpack:///../../obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?b1a4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?d41d","webpack:///../../obico-server/frontend/src/views/PrintShotFeedbackApp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?06d4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?95e5","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintHistoryPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CascadedDropdown.vue","webpack:///../../obico-server/frontend/src/components/CascadedDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CascadedDropdown.vue?c7f6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CascadedDropdown.vue?7dfe","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SortingDropdown.vue","webpack:///../../obico-server/frontend/src/components/SortingDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SortingDropdown.vue?b2d4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SortingDropdown.vue?2d8b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FilteringDropdown.vue","webpack:///../../obico-server/frontend/src/components/FilteringDropdown.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FilteringDropdown.vue?b3a2","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FilteringDropdown.vue?8dce","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ActiveFilterNotice.vue","webpack:///../../obico-server/frontend/src/components/ActiveFilterNotice.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ActiveFilterNotice.vue?830d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ActiveFilterNotice.vue?8c78","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintHistoryItem.vue","webpack:///../../obico-server/frontend/src/components/prints/PrintHistoryItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?de1e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintHistoryItem.vue?5f23","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DatePickerModal.vue","webpack:///../../obico-server/frontend/src/components/DatePickerModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DatePickerModal.vue?84c3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DatePickerModal.vue?2160","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/time-period-filtering.js","webpack:///../../obico-server/frontend/src/views/PrintHistoryPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintHistoryPage.vue?662f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintHistoryPage.vue?9354","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/StatsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/MutedAlert.vue","webpack:///../../obico-server/frontend/src/components/MutedAlert.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/MutedAlert.vue?5efd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/MutedAlert.vue?a1a6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/charts/donut-chart.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/charts/bar-chart.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/printStats.js","webpack:///../../obico-server/frontend/src/views/StatsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/StatsPage.vue?1051","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/StatsPage.vue?1dce","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FailureDetectionGauge.vue","webpack:///../../obico-server/frontend/src/components/FailureDetectionGauge.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FailureDetectionGauge.vue?216f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FailureDetectionGauge.vue?015d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/printer-comm.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/printer-local-comm.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/sendToPrint.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/GCodeDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CollapsableDetails.vue","webpack:///../../obico-server/frontend/src/components/CollapsableDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CollapsableDetails.vue?efff","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CollapsableDetails.vue?0752","webpack:///../../obico-server/frontend/src/components/GCodeDetails.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/GCodeDetails.vue?a14e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/GCodeDetails.vue?4cc7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue","webpack:///../../obico-server/frontend/src/components/prints/FirstLayerReportModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?8e2d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?ee4d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/services/gradeCalculator.js","webpack:///../../obico-server/frontend/src/views/PrintPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintPage.vue?c3c4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintPage.vue?7cc3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterListPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/PrinterCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/janus.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/webrtc.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/StreamingBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/viewing-throttle.js","webpack:///../../obico-server/frontend/src/components/StreamingBox.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/StreamingBox.vue?8671","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/StreamingBox.vue?6911","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/DurationBlock.vue","webpack:///../../obico-server/frontend/src/components/printers/DurationBlock.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/DurationBlock.vue?c0e8","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/DurationBlock.vue?92dc","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/StatusTemp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TemperatureItem.vue","webpack:///../../obico-server/frontend/src/components/printers/TemperatureItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TemperatureItem.vue?9143","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TemperatureItem.vue?4e37","webpack:///../../obico-server/frontend/src/components/printers/StatusTemp.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/StatusTemp.vue?5527","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/StatusTemp.vue?4635","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempTargetEditor.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SliderInput.vue","webpack:///../../obico-server/frontend/src/components/SliderInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SliderInput.vue?597d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SliderInput.vue?ae70","webpack:///../../obico-server/frontend/src/components/printers/TempTargetEditor.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempTargetEditor.vue?26de","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempTargetEditor.vue?7f41","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/SharePrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/SharePrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/SharePrinter.vue?078d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/SharePrinter.vue?d816","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue","webpack:///../../obico-server/frontend/src/components/printer-control/WidgetTemplate.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?46c0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/WidgetTemplate.vue?3edd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFoldersPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SearchInput.vue","webpack:///../../obico-server/frontend/src/components/SearchInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SearchInput.vue?5934","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SearchInput.vue?56e8","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/NewFolderModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/NewFolderModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?bf0c","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?a5ef","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/RenameModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/RenameModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/RenameModal.vue?84cd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/RenameModal.vue?bc6d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/MoveModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/FileStructureItem.vue","webpack:///../../obico-server/frontend/src/components/g-codes/FileStructureItem.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?5f07","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?9d02","webpack:///../../obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?82a0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/GCodeFileStructure.vue?3631","webpack:///../../obico-server/frontend/src/components/g-codes/MoveModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/MoveModal.vue?0a84","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/MoveModal.vue?2f6f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue","webpack:///../../obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?1fd1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/DeleteConfirmationModal.vue?55bf","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/dropzone-upload-error.js","webpack:///../../obico-server/frontend/src/views/GCodeFoldersPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFoldersPage.vue?e757","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFoldersPage.vue?9840","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFilePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue","webpack:///../../obico-server/frontend/src/components/g-codes/AvailablePrinters.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?4552","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?9ba6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue","webpack:///../../obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?a185","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?cd2e","webpack:///../../obico-server/frontend/src/components/g-codes/JusprinFeedback.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?f292","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?751f","webpack:///../../obico-server/frontend/src/views/GCodeFilePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFilePage.vue?cb99","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFilePage.vue?8b12","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/ConnectPrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/ConnectPrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/ConnectPrinter.vue?c084","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/ConnectPrinter.vue?3869","webpack:///../../obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?662e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?aee1","webpack:///../../obico-server/frontend/src/components/printers/PrinterCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/PrinterCard.vue?5381","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/PrinterCard.vue?80bf","webpack:///../../obico-server/frontend/src/views/PrinterListPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterListPage.vue?6fa5","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterListPage.vue?866c","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/SharedPrinterPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NavBar.vue","webpack:///../../obico-server/frontend/src/components/NavBar.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NavBar.vue?a5ca","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NavBar.vue?fb1e","webpack:///../../obico-server/frontend/src/views/SharedPrinterPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/SharedPrinterPage.vue?baad","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/SharedPrinterPage.vue?d16b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterSettingsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberInput.vue","webpack:///../../obico-server/frontend/src/components/NumberInput.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberInput.vue?e062","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberInput.vue?5298","webpack:///../../obico-server/frontend/src/views/PrinterSettingsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterSettingsPage.vue?df6d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterSettingsPage.vue?5e2f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue","webpack:///./src/config/event-handler.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?fde0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/DiscoveredPrinter.vue?af67","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?1007","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?8ca1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue","webpack:///../../obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?75f9","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/PrinterProgress.vue?935f","webpack:///../../obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?c34b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/PrinterLinkingPage.vue?6dea","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?fc63","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/TargetPlatformSelectionPage.vue?4b7d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?a1c2","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?68b7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue","webpack:///../../obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue?edd6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/AddPrinterSuccessPage.vue?47f1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterControlPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?2c60","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?f22e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?a851","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?814b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempPresets.vue","webpack:///../../obico-server/frontend/src/components/printers/TempPresets.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempPresets.vue?9d99","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TempPresets.vue?1d8f","webpack:///../../obico-server/frontend/src/components/printer-control/TemperatureWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?9436","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?7909","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?b0f2","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?2120","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ReorderModal.vue","webpack:///../../obico-server/frontend/src/components/ReorderModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ReorderModal.vue?5aa6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ReorderModal.vue?2efe","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TerminalWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/PrinterTerminal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/TerminalFeedView.vue","webpack:///../../obico-server/frontend/src/components/terminal/TerminalFeedView.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?dc26","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/TerminalFeedView.vue?4429","webpack:///../../obico-server/frontend/src/components/terminal/PrinterTerminal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?c9e5","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/terminal/PrinterTerminal.vue?1ad7","webpack:///../../obico-server/frontend/src/components/printer-control/TerminalWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?4335","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TerminalWidget.vue?c7c6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?4c71","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?c8db","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue","webpack:///../../obico-server/frontend/src/components/printer-control/PowerControlWidget.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?3398","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PowerControlWidget.vue?4868","webpack:///../../obico-server/frontend/src/views/PrinterControlPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterControlPage.vue?d225","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterControlPage.vue?4a31","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/UserPreferencesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/config/user-preferences/sections.js","webpack:///./src/config/user-preferences/sections.js","webpack:///../../obico-server/frontend/src/views/UserPreferencesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/UserPreferencesPage.vue?87ec","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/UserPreferencesPage.vue?06f3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterEventsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue","webpack:///../../obico-server/frontend/src/components/printer-events/PrinterEventCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?dc03","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-events/PrinterEventCard.vue?e3aa","webpack:///../../obico-server/frontend/src/views/PrinterEventsPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterEventsPage.vue?aed1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterEventsPage.vue?4b56","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterTerminalPage.vue","webpack:///../../obico-server/frontend/src/views/PrinterTerminalPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterTerminalPage.vue?ae98","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterTerminalPage.vue?c7dd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue","webpack:///../../obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?74db","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?9511","webpack:///../../obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?ad86","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/FirstLayerInspectionImagePage.vue?54d9","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?13f7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/QuickButtonComponent.vue?5190","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/lib/api.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/lib/agentAction.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/mixins/quickButtonsMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/mixins/messagesMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/mixins/slicingParamFixerMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?90b3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?749d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?3a40","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ChatPanelHeader.vue?d34c","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/mixins/userNotificationMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?8ad4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?ca65","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?3541","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?5331","webpack:///../../obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?e323","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?f1aa","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?71e7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?e59c","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/lib/api.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/lib/agentAction.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/mixins/quickButtonsMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/mixins/messagesMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/mixins/slicingParamFixerMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?fb7b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?b0f7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?7f16","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?66da","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/mixins/userNotificationMixin.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?a73f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?a477","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?181f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?89d7","webpack:///../../obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?e29a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/EmbeddedChatPage.vue?199a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/pages.js","webpack:///./src/views/PricingPage.vue","webpack:///./src/components/pricing/QuestionsSection.vue","webpack:///src/components/pricing/QuestionsSection.vue","webpack:///./src/components/pricing/QuestionsSection.vue?598d","webpack:///./src/components/pricing/QuestionsSection.vue?c985","webpack:///src/views/PricingPage.vue","webpack:///./src/views/PricingPage.vue?b0b0","webpack:///./src/views/PricingPage.vue?aa3b","webpack:///./src/views/ArchivedPrintersPage.vue","webpack:///src/views/ArchivedPrintersPage.vue","webpack:///./src/views/ArchivedPrintersPage.vue?ab1e","webpack:///./src/views/ArchivedPrintersPage.vue?da12","webpack:///./src/views/DetectiveHourCouponCodesPage.vue","webpack:///src/views/DetectiveHourCouponCodesPage.vue","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?3775","webpack:///./src/views/DetectiveHourCouponCodesPage.vue?2a44","webpack:///./src/views/PublicTimelapsesPage.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintCard.vue","webpack:///../../obico-server/frontend/src/components/prints/PrintCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintCard.vue?3b02","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintCard.vue?7a41","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue","webpack:///../../obico-server/frontend/src/components/prints/FullScreenPrintCard.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?e640","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?9e17","webpack:///src/views/PublicTimelapsesPage.vue","webpack:///./src/views/PublicTimelapsesPage.vue?4c7b","webpack:///./src/views/PublicTimelapsesPage.vue?22ea","webpack:///./src/views/TimelapseUploadPage.vue","webpack:///src/views/TimelapseUploadPage.vue","webpack:///./src/views/TimelapseUploadPage.vue?9bd0","webpack:///./src/views/TimelapseUploadPage.vue?7e64","webpack:///./src/views/WelcomePage.vue","webpack:///src/views/WelcomePage.vue","webpack:///./src/views/WelcomePage.vue?5732","webpack:///./src/views/WelcomePage.vue?99a8","webpack:///./src/views/CelestriusConfigurePage.vue","webpack:///src/views/CelestriusConfigurePage.vue","webpack:///./src/views/CelestriusConfigurePage.vue?09cf","webpack:///./src/views/CelestriusConfigurePage.vue?fa2d","webpack:///./src/views/partners/MintionRedeemPage.vue","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/BttUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?8f86","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?730c","webpack:///src/views/partners/MintionRedeemPage.vue","webpack:///./src/views/partners/MintionRedeemPage.vue?a32d","webpack:///./src/views/partners/MintionRedeemPage.vue?d8d4","webpack:///./src/views/partners/BttRedeemPage.vue","webpack:///src/views/partners/BttRedeemPage.vue","webpack:///./src/views/partners/BttRedeemPage.vue?787e","webpack:///./src/views/partners/BttRedeemPage.vue?653f","webpack:///./src/views/partners/SovolRedeemPage.vue","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/SovolUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?1e7c","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?773e","webpack:///src/views/partners/SovolRedeemPage.vue","webpack:///./src/views/partners/SovolRedeemPage.vue?412d","webpack:///./src/views/partners/SovolRedeemPage.vue?4cc6","webpack:///./src/views/partners/ThreeDORedeemPage.vue","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue","webpack:///src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?25fd","webpack:///./src/views/partners/components/ThreeDOUserNotAuthenticatedModal.vue?fe1d","webpack:///src/views/partners/ThreeDORedeemPage.vue","webpack:///./src/views/partners/ThreeDORedeemPage.vue?aa63","webpack:///./src/views/partners/ThreeDORedeemPage.vue?36c5","webpack:///./src/views/partners/KingroonPricingPage.vue","webpack:///./src/components/pricing/QuestionsKingroonSection.vue","webpack:///src/components/pricing/QuestionsKingroonSection.vue","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?0261","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?664d","webpack:///./src/components/KingroonNavBar.vue","webpack:///src/components/KingroonNavBar.vue","webpack:///./src/components/KingroonNavBar.vue?bfef","webpack:///./src/components/KingroonNavBar.vue?804a","webpack:///src/views/partners/KingroonPricingPage.vue","webpack:///./src/views/partners/KingroonPricingPage.vue?af80","webpack:///./src/views/partners/KingroonPricingPage.vue?6461","webpack:///./src/views/jusprin/JusPrinPricingPage.vue","webpack:///./src/views/jusprin/lib/jusprin_chargebee.js","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue","webpack:///src/views/jusprin/components/DowngradeConfirmation.vue","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue?c491","webpack:///./src/views/jusprin/components/DowngradeConfirmation.vue?31ff","webpack:///src/views/jusprin/JusPrinPricingPage.vue","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?f581","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?a0e5","webpack:///./src/pages.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/store/sliceSettingsStore.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/store/index.js","webpack:///./src/main.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterTerminalPage.vue?c468","webpack:///./src/views/ArchivedPrintersPage.vue?409a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octopod.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SearchInput.vue?558e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/PrintShotCard.vue?e309","webpack:///./src/lib/consts.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octoprint-plugin-guide/plugin_verification_code.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/klipper_logo.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/StreamingBox.vue?f522","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/detached-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/bumpsAndRoughSurface-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DatePickerModal.vue?dee4","webpack:///../app_ent/static/img/partners/app-screenshot-7.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberSpinner.vue?9a15","webpack:///./src/components/pricing/QuestionsKingroonSection.vue?e5b0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/QuickButtonComponent.vue?023a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/StatsPage.vue?26ed","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintShotFeedbackApp.vue?9a26","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/TemperatureItem.vue?bbca","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octoprint-plugin-guide/install_plugin.png","webpack:///../app_ent/static/img/partners/download-on-app-store.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/TemperatureWidget.vue?6043","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberInput.vue?bdfd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NavBar.vue?1230","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/DetectiveWorking.vue?8a16","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SavingAnimation.vue?435a","webpack:///./src/lib/pricing.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octoprint_logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterListPage.vue?a874","webpack:///./src/views/partners/ThreeDORedeemPage.vue?36d5","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/UpgradeModal.vue?9919","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/octoprint-plugin-guide/moonraker_verification_code.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/detached-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ChatPanelHeader.vue?ab71","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/GradientFadableContainer.vue?ee01","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/FileStructureItem.vue?75d0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/ContactSupportForm.vue?c4b2","webpack:///./src/components/pricing/QuestionsSection.vue?3158","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinChatHistory.vue?cb64","webpack:///../app_ent/static/img/partners/app-screenshot-1.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/printer-wizard/ObicoInstallationGuidePage.vue?5dad","webpack:///../app_ent/static/img/partners/webcam-streaming.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?35aa","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/gaps-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/NewFolderModal.vue?f6ea","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/js/utils.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrinterControlWidget.vue?f101","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/PageLayout.vue?4e0a","webpack:///./src/lib/chargebee.js","webpack:///./src/components/pricing/ConfigureSubscription.vue?fd0f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/detective-working.gif","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintPage.vue?6ad7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/FirstLayerShotCard.vue?6f2d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/FilteringDropdown.vue?dff6","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/vacation.gif","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/EmbeddedChatPage.vue?5180","webpack:///./src/components/pricing/ConfigureSubscription.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberSpinner.vue","webpack:///../../obico-server/frontend/src/components/NumberSpinner.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberSpinner.vue?b305","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/NumberSpinner.vue?6180","webpack:///src/components/pricing/ConfigureSubscription.vue","webpack:///./src/components/pricing/ConfigureSubscription.vue?487a","webpack:///./src/components/pricing/ConfigureSubscription.vue?a7d1","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/JusprinFeedback.vue?2c03","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/PrintCard.vue?d2f0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SliderInput.vue?7393","webpack:///./src/views/WelcomePage.vue?af24","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?203a","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/bubbling-2.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/GradientFadableContainer.vue?e74e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/PageLayout.vue?9b09","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/ActiveFilterNotice.vue?d593","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.2/components/UpgradeModal.vue?8180","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/AvailablePrinters.vue?5217","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/page-context.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/axios-csrf.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/g-codes/MoveModal.vue?7521","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/print-shot-feedback/FocusedFeedbackConsent.vue?c762","webpack:///./src/views/partners/components/SovolUserNotAuthenticatedModal.vue?0a11","webpack:///../app_ent/static/img/partners/full-remote-access.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/GCodeDetails.vue?0353","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrintHistoryPage.vue?e6da","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FirstLayerReportModal.vue?841e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/HelpWidget.vue?1c71","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/config/server-urls.js","webpack:///./src/config/server-urls.js","webpack:///./src/views/partners/components/BttUserNotAuthenticatedModal.vue?992e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/printoid.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFilePage.vue?fe33","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/print-padded.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/notifications/plugins lazy ^\\.\\/.*$ namespace object","webpack:///./src/views/partners/KingroonPricingPage.vue?7e19","webpack:///./src/views/partners/MintionRedeemPage.vue?c50e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/prints/FullScreenPrintCard.vue?1e7d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/utils.js","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?61d3","webpack:///./src/views/partners/SovolRedeemPage.vue?1ff0","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SavingAnimation.vue","webpack:///../../obico-server/frontend/src/components/SavingAnimation.vue","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SavingAnimation.vue?9984","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/SavingAnimation.vue?45b5","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/LoadingPlaceholder.vue?8463","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/bumpsAndRoughSurface-1.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/notifications/plugins.js","webpack:///../app_ent/static/img/partners/compatible-with-favorite-software.png","webpack:///../app_ent/static/img/partners/mintion-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/jusprin/v1.0/components/ContactSupportForm.vue?178d","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/CollapsableDetails.vue?e329","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/webpage-multiple.svg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/DisplayStatusWidget.vue?c9e7","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/img/mobileraker.webp","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/styles/main.sass?e484","webpack:///./src/views/PublicTimelapsesPage.vue?554f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/js/syndicate.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/static/js/color-scheme.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/lib/color-scheme-controller.js","webpack:///../app_ent/static/img/partners/sovol-obico-logo.png","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/VideoBox.vue?c2bc","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/first-layer-review/example-images/raisedRipples-3.jpg","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintJobControlWidget.vue?c345","webpack:///./src/views/jusprin/JusPrinPricingPage.vue?5bd4","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/config/user-preferences/pref-routes.js","webpack:///./src/config/user-preferences/pref-routes.js","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/FailureDetectionWidget.vue?8bfd","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/GCodeFoldersPage.vue?ed8e","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/SharedPrinterPage.vue?6c02","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/views/PrinterListPage.vue?85f3","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printers/wizard/AutoLinkPopup.vue?631f","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/MutedAlert.vue?a8f3","webpack:///./src/views/partners/components/BttRedeemCompletedModal.vue?cf4b","webpack:////Users/kenneth/Projects/tsd-enterprise/obico-server/frontend/src/components/printer-control/PrintProgressWidget.vue?c4fa","webpack:///../app_ent/static/img/partners/app-screenshot-6.webp","webpack:///./src/views/partners/components/ThreeDORedeemCompletedModal.vue?1718","webpack:///../app_ent/static/img/partners/3do-obico-logo.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","getCurrentLanguage","savedLanguage","getLocalPref","lang","language","replace","currentLanguage","resources","translation","baseEn","entBaseEn","baseZhCN","entBaseZhCN","baseZhTW","entBaseZhTW","baseCa","entBaseCa","baseCs","entBaseCs","baseDe","entBaseDe","baseEs","entBaseEs","baseFr","entBaseFr","baseHu","entBaseHu","baseIt","entBaseIt","baseJa","entBaseJa","baseKo","entBaseKo","baseNl","entBaseNl","basePl","entBasePl","basePtBR","entBasePtBR","baseRu","entBaseRu","baseSv","entBaseSv","baseTr","entBaseTr","baseUk","entBaseUk","i18n","init","lng","fallbackLng","interpolation","escapeValue","debug","nsSeparator","prefId","defaultValue","printerId","storageKey","savedVal","isLocalStorageSupported","localStorage","getItem","val","JSON","parse","setLocalPref","setItem","render","_vm","this","_c","_self","_setupProxy","staticClass","attrs","_v","_s","$t","$syndicateText","brandName","staticRenderFns","directives","rawName","show","expression","class","highlighted","highlight","on","$event","positionWidget","_t","ref","xDirection","yDirection","showCloseButton","_e","id","scopedSlots","_u","fn","proxy","getDocUrl","require","ClickOutside","props","String","required","Boolean","default","textBefore","methods","$nextTick","_this$$refs$widget","_this$$refs$widget2","widgetWidth","$refs","widget","offsetWidth","widgetHeight","offsetHeight","minHorizontalSpace","minVerticalSpace","helpIconPosition","widgetWrapper","getBoundingClientRect","distanceFromRightEdge","innerWidth","left","width","distanceFromBottomEdge","innerHeight","top","height","component","openModalWithComponent","C","modalOptions","wrapper","Vue","h","$mount","swal","customClass","container","html","onBeforeOpen","el","querySelector","replaceWith","$el","onDestroy","$destroy","remove","openModalWithElement","element","install","options","use","VueSwal","Confirm","mixin","title","showCancelButton","confirmButtonText","cancelButtonText","Toast","toast","position","showConfirmButton","timer","Reject","icon","Prompt","DismissableToast","swalOpt","dismissKey","opt","log","$swal","filter","Math","floor","COMPONENT_NAME_REGEXP","ROOT_COMPONENT_NAME","ANONYMOUS_COMPONENT_NAME","splitPathRe","splitPath","filename","parts","exec","basename","path","ext","f","substr","getComponentName","vm","$root","$options","_componentTag","__file","unifiedFile","_","toUpperCase","build","to","from","prefix","depth","maxDepth","maxKeys","setup","defaultErrorHandler","config","errorHandler","info","Sentry","metadata","obj","_original","componentName","stringify","propsData","_oO","lifecycleHook","getCurrentHub","withScope","scope","setContext","captureException","util","warn","toString","_b","$attrs","syndicateAwareHref","computed","$syndicate","syndicateTextConstant","base","docRoot","appRoot","yumi","mintion","kingroon","jusprin","jusprinv2","syndicate","store","routes","components","initTheme","setupSentry","VueRouter","BootstrapVue","Sticky","VueMoment","VuePluralize","OnoffToggle","LoadScript","I18NextVue","i18next","errorDialog","errorObj","userMessage","fire","$i18next","getAppUrl","router","beforeEach","next","changeLanguage","LoadingPlaceholder","SyndicateAwareSVG","library","add","faStar","faFileCode","faCalendarDays","faChartPie","faMoneyCheckDollar","faCircleQuestion","faBell","faCog","faDiscord","faRotateRight","faCirclePause","faCirclePlay","faCircleXmark","faPowerOff","faGear","faLayerGroup","faChevronDown","faRulerVertical","faCheck","FontAwesomeIcon","getElementById","app","moment","updateLocale","week","dow","user","printersToShow","isEnt","trialDaysLeft","platformDisplayName","wizardUrl","authorized","appDisplayName","is_pro","printerToAuthorize","$$selectedVal","Array","selected","map","_value","multiple","domProps","_l","printer","staticStyle","performingAuthRequest","authorize","logoutUrl","appLogo","platformLogo","loginUrl","signupUrl","humanizedDuration","durationInSeconds","seconds","round","getDurationComponents","days","hoursRounded","hours","minutes","duration","asDays","humanizedFilamentUsage","millimeters","meters","twoDecimal","timeFromNow","timeFormat","date","Date","newDate","setSeconds","getSeconds","format","gcodeMetadata","faIcon","formatter","formatters","svgIcon","v","TRANSIENT_STATES","fromStates","Starting","Pausing","Resuming","Cancelling","setPrinterTransientState","transientStateName","currentTime","timeOutInSeconds","isAgentVersionGte","getTime","getPrinterCalculatedState","underlinedState","_TRANSIENT_STATES$per","clearPrinterTransientState","persistedTransientState","calculatedState","includes","showTimeoutError","removeItem","localTransientState","newPrinterState","_window$Sentry","captureMessage","location","reload","toMomentOrNull","datetimeStr","PrintStatus","Printing","isActive","Paused","Finished","Cancelled","normalizedPrint","print","started_at","uploaded_at","finished_at","cancelled_at","ended_at","diff","asSeconds","has_alerts","alerted_at","printShotFeedbackEligible","printshotfeedback_set","status","paused_at","normalizedPrinter","g_code_file","normalizedGcode","gcode","created_at","updated_at","deleted","filesize","num_bytes","print_set","sort","a","b","last_print","failedPrints","successPrints","totalPrints","metadata_json","analysis","_gcode$analysis$dimen","filament_total","object_height","dimensions","estimated_time","estimatedPrintTime","filament","tools","keys","forEach","getBigThumbnailUrl","thumbnail1_url","thumbnail2_url","thumbnail3_url","getSmallThumbnailUrl","normalizedGcodeFolder","folder","numItems","g_code_file_count","g_code_folder_count","newData","oldData","printerMixin","createdAt","progressCompletion","isOffline","isPaused","isDisconnected","flags","operational","ready","paused","inTransientState","endsWith","_this$status","_this$status$state","state","text","calculatedStateColor","calcState","colorMapping","secondary","success","neutral","warning","danger","color","states","entries","setTransientState","stateText","inUserInteractionRequired","hasError","toLowerCase","isAgentMoonraker","agentDisplayName","minOctoPrintAgentVersion","minMoonrakerAgentVersion","semverGte","alertUnacknowledged","isAfter","isPrintable","archived_at","printabilityText","normalizedPrinterEvent","printerEvent","printers","encodeURIComponent","pathname","search","appName","URLSearchParams","platform","_this$user","_this$user$subscripti","subscription","plan_id","expired_at","octopodLogo","printoidLogo","polymerLogo","octoappLogo","mobilerakerLogo","genericAppLogo","isKlipper","klipperLogo","octoprintLogo","created","IS_ENT","settings","fetchPrinters","axios","urls","response","post","tunnels","app_name","target_printer_id","tunnelEndpoint","tunnel_endpoint","redirectUrl","catch","isPro","usageFetched","showDetails","daysUntilReset","usageClass","usageMTD","humanizedUsageCap","overage","percentage","iframeUrl","bytesMTD","usageCap","endOfMonth","endOf","split","pop","mounted","skipWarning","input","inputPlaceholder","isConfirmed","matchMedia","classList","self","fetchUsage","firstFetch","tunnelUsage","resp","total","monthly_cap","setInterval","access_consented_at","onNextShot","page","pageClass","shots","shot","onShotChanged","onPrev","onNext","consentBtnPressed","image_url","updateShot","model","answer","callback","$$v","_m","$emit","BFormGroup","BFormRadioGroup","put","printShotFeedback","print_id","instance","credited_dhs","collapsed","inMobileWebView","isPopup","active","hasUnseenPrinterEvents","unseenPrinterEventsDisplay","$slots","topBarLeft","topBarRight","hideHeader","allowSignUp","urlParams","num","ACCOUNT_ALLOW_SIGN_UP","staticAlert","style","paddingBottom","estimatedFeedbackTime","consentChecked","isArray","_i","$$a","$$el","$$c","checked","$$i","concat","fromNow","video_url","poster_url","playerOptions","onTimeUpdate","downloadBtn","fullscreenBtn","exitFullscreenBtn","videoPlayer","videoUrl","posterUrl","fluid","autoplay","defaultFullScreenToggle","muted","preload","playbackRates","fill","sources","controlBar","fullscreenToggle","poster","VideoBox","DetectiveWorking","humanize","FocusedFeedbackConsent","Loading","PrintShotCard","VueSlickCarousel","PageLayout","currentShot","fetchData","printId","sortBy","updatePrint","patch","findIndex","$set","carousel","shotIndex","prev","answered_at","allPrintsSelected","selectedPrintIds","size","onDeleteBtnClick","sortingLocalStoragePrefix","sortingOptions","sortingValue","onSortingUpdated","filterLocalStoragePrefix","filterOptions","filterValues","filterUpdateMixin","onFilterUpdated","expandable","resetFilters","prints","loading","stats","total_print_count","total_succeeded_print_count","total_cancelled_print_count","totalPrintTimeFormatted","totalFilamentUsedFormatted","index","has","onSelectedChanged","fetchMoreData","noMoreData","onDatesPicked","menuExpanded","menuOptions","option","onClick","stopPropagation","preventDefault","customMenuOptionClass","resetMenuExpanded","menuOption","sorting","nativeOn","updateSorting","visibility","sortingDirections","direction","SortingDirections","localStoragePrefix","restoreSortingValue","sortingKey","directionKey","find","values","updateFiltering","filterOptionKey","filterValueKey","includesAll","subtitle","Function","filterOption","filterValue","currentFilterValue","newFilterValue","_filterOption$values$","restoreFilterValues","allOption","getFilterParams","customFilterParamsBuilder","params","buildQueryParam","customParams","queryParam","shouldShowFilterWarning","activeFilters","selectable","isSelected","fileName","backgroundImage","Number","watch","newValue","handleOk","resetModal","focusInput","handleSubmit","arguments","dateFrom","dateTo","errorMessage","isOpen","initDateFrom","initDateTo","$bvModal","select","close","hide","bvModalEvent","DateParamFormat","queryBuilder","customDateFrom","customDateTo","from_date","getDateFrom","to_date","getDateTo","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","today","firstDayOfWeek","setDate","getDate","getDay","firstDayOfMonth","getFullYear","getMonth","firstDayOfYear","date_joined","lastDayOfWeek","lastDayOfMonth","lastDayOfYear","getRecommendedGrouping","fromDate","toDate","PAGE_SIZE","SortingLocalStoragePrefix","SortingOptions","FilterLocalStoragePrefix","FilterOptions","timePeriod","printStatus","feedbackNeeded","MugenScroll","CascadedDropdown","DatePickerModal","SortingDropdown","FilteringDropdown","ActiveFilterNotice","PrintHistoryItem","HelpWidget","Set","total_print_time","_this$stats","total_filament_used","defaultStatsParams","group_by","set","updateCustomPeriodFilterSubtitle","with_archived","validPrinterIds","refetchData","start","limit","fetchStats","selectedPrintIdsClone","delete","userAction","printsBulkDelete","print_ids","filterOptionValue","getCurrentDateFrom","getCurrentDateTo","datePickerModal","newTitle","dateFormat","currentDateFrom","currentDateTo","dateFromFormatted","dateToFormatted","filteringDropdown1","$forceUpdate","filteringDropdown2","groupingOptions","grouping","updateChartGrouping","activeGrouping","groupingAdjusted","groupingNotice","longest_print_time","average_print_time","DonutChart","x","y","totalValue","totalValueFormat","innerRadius","min","outerRadius","labelRadius","names","colors","stroke","strokeWidth","strokeLinejoin","padAngle","emptyState","N","d3","V","I","isNaN","formatValue","O","T","arcs","arc","arcLabel","svg","attr","append","selectAll","join","centroid","lines","endAngle","startAngle","formatTotalValue","assign","node","scales","BarChart","marginTop","marginRight","marginBottom","marginLeft","xDomain","xRange","xLabelShow","xLabelRotation","yType","yDomain","yRange","yTicks","xPadding","yFormat","yTickFormat","yLabel","X","Y","xScale","padding","yScale","xAxis","tickSizeOuter","yAxis","ticks","tickFormat","g","clone","bar","bandwidth","each","xAxisLabelsFormat","wrapperWidth","barsCount","lastDayInDataset","barWidth","horizontalLabelRequiredWidth","rotatedLabelRequiredWidth","frequency","rotation","ceil","firstLine","secondLine","endOfWeek","isBefore","month","label","uniqueDateKey","shouldShow","async","fetchPrintStats","groupings","requestedGrouping","effectiveGrouping","_error$response","_error$response$data","_error$response2","_error$response3","_error$response3$data","suggestedGrouping","suggested_group_by","indexOf","GroupingLocalStorageKey","MutedAlert","effectiveGroupingTitle","_this$groupingOptions","getActiveGrouping","isEmptyState","finishedPrintsPercentage","_this$stats2","_this$stats3","finished","cancelledPrintsPercentage","_this$stats4","_this$stats5","addEventListener","drawCharts","unmounted","removeEventListener","getFilterParamsFromQuery","excludeParams","with_deleted","totalPrintsDonutChart","replaceChildren","printCountMaxValue","max","print_count_groups","drawBarChart","printCountGroupsChart","titleValue","printTimeMaxValue","print_time_groups","printTimeMaxvalueHours","printTimeGroupsChart","filamentUsedMaxValue","filament_used_groups","filamentUsedMaxvalueMeters","filamentUsedGroupsChart","chartWidth","xLabelsFormat","isLoading","currentIndex","prevPrint","switchToPrint","PrevPrintButtonTitle","absoluteDateFormat","nextPrint","NextPrintButtonTitle","filament_used","canOpenFile","url","onRepeatPrintClicked","isSending","firstLayerInspection","gradeResult","gradeAccent","gradeTitle","firstLayerPrintTime","onOpenDetailedReport","fullscreenUrl","tagged_video_url","aiTimeLapsePosterImageUrl","fullscreen","enterFullscreen","exitFullscreen","download","downloadFile","video_archived_at","canShowDetectiveView","prediction_json_url","normalizedP","thumbedUp","onThumbUpClick","inflightAlertOverwrite","thumbedDown","onThumbDownClick","need_print_shot_feedback","titleColor","titleText","computedOptions","RadialGauge","isWatching","inactiveColor","highlight1","currentThemeValue","Themes","Light","highlight2","highlight3","needle","valueDec","valueInt","units","box","minValue","maxValue","majorTicks","minorTicks","highlights","colorPlate","colorTitle","colorStrokeTicks","colorNeedleEnd","colorNeedle","colorNeedleShadowUp","valueBox","animationRule","animationDuration","animatedValue","ticksAngle","borders","level","PrinterCommManager","constructor","printerCommMap","Map","setPrinterComm","printerComm","getPrinterComm","getOrCreatePrinterComm","PrinterComm","closeConnection","closeServerWebSocket","webrtcConnections","webrtc","closeAllConnections","token","printerCommManager","wsUri","callbacks","ws","passthruQueue","ifvisible","closeWebSocket","connect","onPassThruReceived","msg","refId","ret","onTerminalFeedReceived","terminal_feed","printer_event","event_class","event_title","sanitizeEventText","event_text","isDismissed","dismiss","onOpenCallback","readyState","WebSocket","OPEN","protocol","host","onmessage","passthru","onPrinterUpdateReceived","onopen","ensureWebsocketClosed","heartbeat","setWebRTCConnection","webcamName","parseJsonData","jsonData","onStatusReceived","callbacksFuncs","onData","maybeBin","toArrayBuffer","arrayBuffer","pako","ungzip","Uint8Array","setCallbacks","passThruToPrinter","canSend","random","dataChannelWebrtc","sendData","send","onclose","ev","freeze","listPrinterLocalGCodesOctoPrint","searchKeyword","listRecoursively","fileObj","fileList","item","children","kwargs","recursive","func","folders","files","local","ObicoUpload","items","display","listPrinterLocalGCodesMoonraker","pathPrefix","extended","dirsInServerFormat","dirname","startsWith","modified","filesInServerFormat","printPrinterLocalGCodeOctoPrint","args","printAfterSelect","printPrinterLocalGCodeMoonraker","verb","repeatPrinterLocalGCode","getMoonrakerWebcams","webcams","requestSnapshot","pic","confirmPrint","escape","imageUrl","reverseButtons","printCloudGCode","safe_filename","sendToPrint","isCloud","Swal","onCommandSent","onPrinterStatusChanged","printerWebSocket","printGCode","checkPrinterStatus","REDIRECT_TIMER","showRedirectModal","onClose","timerInterval","onOpen","htmlContainer","getHtmlContainer","timerElement","textContent","getTimerLeft","toFixed","clearInterval","fileDetailsToShow","compact","compactView","showThumbnail","bigThumbnailUrl","file","showOpenButton","openButtonVariant","openButtonText","numberOfVisibleLines","shouldShowDataNotice","expanded","rotated","CollapsableDetails","showPrintStats","unshift","showIconThumbnail","fileUploadedTime","grade","gradeRemarks","isGradeA","gradeSuggestion","suggestion","images","showCarouselAnimation","first_layer_info","carouselItems","dots","infinite","speed","slidesToShow","slidesToScroll","adaptiveHeight","initialSlide","activeTab","carouselKey","activeThumbnail","thumbnailStyle","zIndex","_this$firstLayerInspe","firstLayerInfo","handler","prepareFirstLayerInfo","immediate","calculateGrade","score","FailureDetectionGauge","GCodeDetails","image","isFirstLayerReportModalOpen","predictions","currentPosition","currentPrint","printerStateCheckInterval","resident_printer","currentPrintId","_this$currentPrint","indexParam","parseInt","getNormalizedP","alert_overwrite","_this$printer","printerState","fetchSiblingPrints","clearPreviousData","printResponse","prepareFirstLayerReport","firstlayerinspection_set","finally","firstLayerInspectionData","newUrl","history","replaceState","prevExists","alertOverwrite","_this$print$g_code_fi","FirstLayerReportModal","dhBadgeNum","mobileMenuOptions","visiblePrinters","onPrinterUpdated","shouldShowArchiveWarning","archivedPrinterNum","_f","handleNeverShowAgain","hasCurrentPrintFilename","current_print","statusClass","statusText","onSharePrinter","octoPrintTunnelUrl","settingsUrl","isProAccount","webcam","onNotAFailureClicked","overlay","not_watching_reason","normalized_p","sendPrinterAction","pressed","section_toggles","onSettingsToggleClicked","time","onTimeToggleClicked","statusTemp","onStatusTempToggleClicked","watchForFailures","onWatchForFailuresToggled","pauseOnFailure","onPauseOnFailureToggled","timeRemaining","timeTotal","progressPct","tempProps","onTempEditClicked","Janus","sessions","isExtensionEnabled","navigator","mediaDevices","getDisplayMedia","userAgent","match","chromever","maxver","extension","isInstalled","defaultExtension","extensionId","getScreen","pending","cache","postMessage","origin","sourceId","gatewayCallbacks","noop","wsopened","destroyed","initDone","isWebrtcSupported","server","websockets","wsHandlers","wsKeepaliveTimeoutId","servers","serversIndex","iceServers","iceTransportPolicy","bundlePolicy","ipv6Support","ipv6","withCredentials","maxev","max_poll_events","apisecret","destroyOnUnload","keepAlivePeriod","longPollTimeout","getMaxBitrates","simulcastMaxBitrates","maxBitrates","high","medium","low","connected","sessionId","pluginHandles","that","retries","transactions","eventHandler","longpoll","httpAPICall","handleEvent","textStatus","errorThrown","json","skipTimeout","session_id","sender","pluginHandle","candidate","webrtcStuff","pc","remoteSdp","completed","addIceCandidate","endOfCandidates","candidates","webrtcState","hangup","detached","ondetached","detach","mediaState","slowLink","reason","transaction","reportSuccess","plugindata","jsep","vdebug","keepAlive","randomString","createSession","eventName","newWebSocket","body","getInfo","destroySession","unload","notifyDestroyed","cleanupHandles","handleId","destroyHandle","noRequest","sendBeacon","unbindWebSocket","onUnbindMessage","onUnbindError","createHandle","consentDialog","iceState","onlocalstream","onremotestream","ondata","ondataopen","oncleanup","plugin","opaqueId","handleToken","session","started","myStream","streamExternal","remoteStream","mySdp","mediaConstraints","dataChannel","dtmfSender","trickle","iceDone","volume","bitrate","bsnow","bsbefore","tsnow","tsbefore","getId","getPlugin","getVolume","getRemoteVolume","getLocalVolume","isAudioMuted","isMuted","muteAudio","mute","unmuteAudio","isVideoMuted","muteVideo","unmuteVideo","getBitrate","sendMessage","dtmf","sendDtmf","createOffer","prepareWebrtc","createAnswer","handleRemoteJsep","prepareWebrtcPeer","ontrackmuted","ontrackunmuted","sendRequest","cleanupWebrtc","sdp","e2ee","rid_order","sendTrickleCandidate","createDataChannel","dclabel","dcprotocol","incoming","pendingData","onDataChannelMessage","onDataChannelStateChange","dcState","onDataChannelError","dcoptions","ordered","dataChanDefaultLabel","senders","getSenders","audioSender","track","kind","ontonechange","tone","tones","gap","insertDTMF","streamsDone","media","stream","stopAllTracks","getAudioTracks","getVideoTracks","addTracks","update","replaceAudio","replaceVideo","isAudioSendEnabled","addAudio","addTrack","unifiedPlan","audioTransceiver","transceivers","getTransceivers","receiver","replaceTrack","isVideoSendEnabled","addVideo","videoTransceiver","pc_config","webRTCAdapter","browserDetails","browser","version","pc_constraints","optional","rtcConstraints","RTCRtpSender","createEncodedStreams","createEncodedAudioStreams","createEncodedVideoStreams","senderTransforms","receiverTransforms","RTCPeerConnection","getStats","oniceconnectionstatechange","iceConnectionState","onicecandidate","sendSDP","sdpMid","sdpMLineIndex","ontrack","streams","onended","receiverStreams","createAudioEncodedStreams","readableStream","writableStream","pipeThrough","pipeTo","readable","writable","trackMutedTimeoutId","removeTrack","onmute","onunmute","simulcast2","getTracks","tr","addTransceiver","sendEncodings","rid","maxBitrate","scaleResolutionDownBy","senderStreams","isDataEnabled","ondatachannel","channel","oldsdp","pattern","newsdp","setRemoteDescription","offer","webrtcError","audio","video","isTrickleEnabled","keepAudio","removeAudio","audioSend","keepVideo","removeVideo","videoSend","addData","at","stop","ra","asnd","vt","rv","vsnd","isGetUserMediaAvailable","constraints","mandatory","audioSupport","videoSupport","simulcast","screenshareFrameRate","frameRate","screenshareHeight","screenshareWidth","captureDesktopAudio","getUserMedia","audioStream","callbackUserMedia","getScreenMedia","gsmCallback","useAudio","googLeakyBucket","maxWidth","screen","maxHeight","minFrameRate","maxFrameRate","chromeMediaSource","googTemporalLayeredScreencast","chromeMediaSourceId","mozMediaSource","mediaSource","lastTime","polly","enumerateDevices","devices","audioExist","some","device","videoExist","isScreenSendEnabled","needAudioDevice","isAudioSendRequired","needVideoDevice","isVideoSendRequired","haveAudioDevice","haveVideoDevice","gumConstraints","customizeSdp","audioRecv","isAudioRecvEnabled","setDirection","videoRecv","isVideoRecvEnabled","iceRestart","sendVideo","parameters","getParameters","encodings","setParameters","mungeSdpForSimulcasting","setLocalDescription","offerToReceiveAudio","offerToReceiveVideo","OfferToReceiveAudio","OfferToReceiveVideo","localDescription","sdpSent","remote","res","remoteSource","audioLevel","enabled","inStats","mediaType","bytesReceived","googCodecName","fps","framesPerSecond","timestamp","timePassed","bitRate","hangupRequest","ssrc","ssrc_fid","cname","msid","mslabel","insertAt","mline","sim","fid","failIfNoAudio","failIfNoVideo","getServer","isConnected","reconnect","getSessionId","destroy","attach","useDefaultDependencies","deps","fetch","socketCls","proto","arr","adapter","fetchOptions","method","headers","credentials","fetching","timerId","race","ok","parsed","useOldDependencies","jq","jQuery","payload","contentType","xhrFields","ajax","extend","dataType","xhr","tracks","mst","trace","usedDependencies","dependencies","listDevices","attachMediaStream","srcObject","URL","createObjectURL","reattachMediaStream","iOS","oldOBF","safariVp8","getCapabilities","codecs","codec","mimeType","testpc","RTCRtpTransceiver","tempPc","len","charSet","randomPoz","substring","printerWebRTCUrl","printerSharedWebRTCUrl","authToken","_syndicate","turnServer","turn_server","credential","username","WebRTCConnection","streamMode","streamIdToTest","h264Webrtc","mjpegWebrtc","H264WebRTCConnection","MJpegWebRTCConnection","initialized","h264WebRTCConn","mjpegWebRTCConn","openForShareToken","shareToken","openForPrinter","disconnect","janus","stopStream","startStream","streamIdsToTest","baseConnection","BaseWebRTCConnection","infoSuccessCallback","streamId","streaming","mjpegStreamExisting","onStreamAvailable","onRawData","rawData","onMJpegData","_baseConnection$strea","channelOpen","offer_video","videoStreamExisting","_baseConnection$strea2","clearBitrateInterval","bitrateInterval","onBitrateUpdated","DataChannelOnlyWebRTCConnection","dataStreamExisting","connectJanusWebSocket","onMessage","onRemoteStream","onTrackMuted","onTrackUnmuted","uplink","lost","onSlowLink","onDefaultStreamCleanup","_self$streaming","_self$streaming2","_self$streaming3","_self$streaming4","_self$streaming5","_self$streaming6","slowLinkLoss","slowLinkClicked","fixSlowLinkTextWidth","slowLinkShowing","slowLinkHiding","showing","hiding","trackMuted","showMutedStatusDescription","isVideoAvailable","isBasicStreamingReadyToPlay","isBasicStreamingFrozen","onPlayBtnClicked","remainingSecondsUntilNextCycle","videoLoading","taggedSrc","showMJpeg","showVideo","isBasicStreamingInProgress","currentBitrate","clickable","onInfoClicked","remainingSecondsCurrentVideoCycle","webcamStyle","mjpgSrc","onLoadStart","onCanPlay","onRotateRightClicked","ViewingThrottle","countDownCallback","localStorageItemId","remainingSeconds","countDownTimer","startOrResumeVideoCycle","countDown","resumeVideoCycle","updateRemainingSeconds","remainingViewableSeconds","tsNextVideoCycle","parseFloat","now","MJpegStreamDecoder","onFrame","contentLength","NaN","imageBuffer","bytesRead","originalJpgLength","TextDecoder","decode","jpg","jpgLength","lengthHeaders","halfHeight","_this$webcam","stickyStreamingSrc","isVideoVisible","localStorageRotationKey","stream_id","customRotationDeg","videoRotationDeg","_this$webcam2","webcamVideoHeight","ratio169","_this$webcam3","is_primary_camera","basicStreamingInWebrtc","_this$webcam$flipH","_this$webcam4","_this$webcam$flipV","_this$webcam5","_this$videoRotationDe","_this$webcam6","_this$webcam7","output","transform","generateTransform","flipH","flipV","aspectRatio","streamRatio","scale","mjpegStreamDecoder","videoLimit","initWebRTC","onWebRTCRemoteStream","onMJpegChunk","webrtcConn","videoTracks","getComputedStyle","slowLinkText","loss","flip_horizontal","flip_vertical","transforms","trimStart","valid","printing","showHours","showMinutes","showSeconds","temperatures","isPluginVersionSufficient","onEditClicked","editable","tempKey","tempItem","heaterIcon","temperatureDisplayName","actual","TemperatureItem","onPresetChanged","preset","allPresets","pre","maxTemp","onSliderChanged","composing","step","SliderInput","presets","curTarget","curPreset","sharedResource","onSharingToggled","sharedLink","copyToClipboard","copyStatus","copyMessage","share","share_token","fetchSharedResources","sharedResources","printer_id","postSharedResources","deleteSharedResources","focus","execCommand","insideCard","onPauseToggled","onCancelClicked","openObicoFiles","openPrinterFiles","connecting","onConnectClicked","modalId","resetGcodesModal","selectedGcodeId","fileId","printerFiles","on-close","goBack","scrollToTop","parentFolder","savedPath","openFile","allSelected","toggleSelectAll","selectedItemsCount","moveSelectedItems","deleteSelectedItems","updateSearch","createFolder","switchToCloudStorage","click","switchToPrinterStorage","selectedPrinterId","isPrinterBrowsable","printerBrowsabilityText","onMenuOptionClicked","cascadedDropdown","dropzoneOptions","gcodeUploadSuccess","gcodeUploadError","addParentFolderParam","maxFilesize","maxTotalFilesize","searchStateIsActive","searchInProgress","targetPrinter","nothingFound","scrollContainerId","noMoreFolders","noMoreFiles","localFilesLoading","openFolder","renameItem","moveItem","deleteItem","onPrintClicked","fetchFilesAndFolders","onSelectFiles","onSelectFolders","activeItem","verifyItemRename","onItemRenamed","activeItems","onItemMoved","onItemDeleted","verifyNewFolder","onFolderCreated","newFolderName","preConfirm","parentFolderId","newFolder","gcodeFolders","parent_folder","newItemName","itemType","fullName","fileExt","nameWithoutExt","newNameWithExt","gcodeFile","gcodeFolder","isSameDir","patchLoading","disabledItems","isMoveModal","isFolder","selectedFolders","selectedFiles","isFolderEmpty","disabled","isDisabled","cancelled","FileStructureItem","selectedItemsCopy","unselectAll","GCodeFileStructure","itemParentFolderId","currentFoldersPage","currentFilesPage","resetFiles","reset","_response","_response2","page_size","folderKey","results","gcodeFolderBulkMove","folder_ids","gcodeFileBulkMove","file_ids","msgBoxConfirm","centered","okTitle","okVariant","autoFocusButton","MAX_USER_MESSAGE_LENGTH","MAX_SENTRY_MESSAGE_LENGTH","isObject","truncate","maxLength","normalizeWhitespace","trim","looksLikeHtml","test","decodeHtmlEntities","textarea","innerHTML","stripHtml","extractHtmlTitle","_value$match","getHeader","getResponseHeader","_error","getResponseText","responseText","getStatus","parseJson","safeString","flattenApiErrors","directValue","flatMap","detail","sanitizeUserMessage","userMessageFromApiBody","errors","defaultUploadErrorMessage","fallbackMessageForStatus","defaultMessage","normalizeDropzoneUploadError","jsonBody","htmlResponse","isHtmlResponse","responseTitle","responseSnippet","dropzoneMessage","fileSize","getDropzoneUploadErrorMessage","SEARCH_API_CALL_DELAY","SearchInput","vueDropzone","vue2Dropzone","RenameModal","MoveModal","DeleteConfirmationModal","NewFolderModal","routeParams","csrf","searchQuery","searchTimeoutId","selectedPrinterComm","itemsCount","selectedPrinter","acceptedFiles","gcodeFiles","getCsrfFromDocument","getRouteParam","$watch","$route","toParams","previousParams","gCodeFileStructure","moveModal","selectedFolderIds","selectedFileIds","gcodeFolderBulkDelete","gcodeFileBulkDelete","$router","browsabilityMinPluginVersion","listPrinterLocalGCodes","decodeURIComponent","sortLocalItems","printLastUploadedFile","fetchLocalFiles","_response3","_response4","q","_response5","formData","printAfterUpload","gcodesDropzone","getAcceptedFiles","getRejectedFiles","removeAllFiles","renameModal","newName","targetArr","deleteConfirmationModal","newFolderModal","menuOptionKey","newFolderId","compareValues","av","bv","localeCompare","sensitivity","cmp","an","bn","canDownloadGcode","downloadGcode","renameFile","deleteFile","dropdownMenuOptions","gcodeNotFound","isDeleted","targetPrinterId","onRefresh","printersLoading","selectPrinter","printerComms","_this$selectedPrinter","chat","showChatHistory","userFeedback","submitFeedback","showTextFeedback","textFeedback","submitFeedbackText","messages","role","content","changedParams","VueMarkdown","_message$slicing_prof","_message$slicing_prof2","_message$slicing_prof3","_message$slicing_prof4","_message$slicing_prof5","slicing_profiles","filament_overrides","print_process_overrides","gCodeFileId","fetchChat","thumbsUp","_this$chat","user_feedback","thumbsDown","_this$chat2","jusprinChats","_this$chat3","g_code_file_id","feedback","user_feedback_text","_this$chat4","JusPrinChatHistory","availablePrinters","JusprinFeedback","_this$gcode","_this$gcode2","_this$gcode3","fetchPrinter","gcodeId","fetchGcode","decodedPath","dir_path","getPrinterLocalGCode","_result$files","hash","safeFilename","agent_signature","gcodeFileOnServer","cloudCopy","_file","_file2","fetchLocalFile","go","fileUrl","blob","link","revokeObjectURL","selectedPort","connectionOptions","ports","port","selectedBaudrate","baudrates","baudrate","PAUSE_PRINT","RESUME_PRINT","CANCEL_PRINT","WidgetTemplate","GCodeFoldersPage","GCodeFilePage","connectBtnClicked","openFiles","scrollTo","ConnectPrinter","MUTE_CURRENT_PRINT","ACK_ALERT_NOT_FAILED","Show","Hide","LocalPrefNames","Settings","Time","StatusTemp","StreamingBox","DurationBlock","PrintJobControlWidget","toDuration","secondsLeft","secs","secondsPrinted","watching_enabled","action_on_failure","actionsProps","_data$settings","updatedPrinter","_data$settings2","stream_mode","auth_token","printerStatus","octoprint_data","resumePrint","updatePrinter","tempProfiles","TempTargetEditor","targetTemp","succeeded","printerAction","shouldVideoBeFull","hasImage","shouldBeThumb","asHours","SharePrinter","PrinterCard","is_dh_unlimited","dh_balance","reverse","hiddenPrinterCount","insertPrinter","shouldShowArchiveWarningFunc","shouldNeverShow","_vm$printer","_vm$printer$pic","_vm$printer2","_vm$printer2$pic","_vm$printer3","_vm$printer3$pic","img_url","theme","themes","Dark","showMainMenu","viewName","first_name","email","hideDropdowns","accountDropdown","NavBar","videoAvailable","isWebrtcOpened","printerSharedWebSocket","_this$printer$setting","_this$printer2","_this$printer2$settin","webcamsDeepCopy","errorMessages","saving","action_on_failure_NONE","_q","updateSetting","action_on_failure_PAUSE","tools_off_on_pause","bed_off_on_pause","retract_on_pause","retractFilamentByEnabled","retractOnPause","lift_z_on_pause","liftExtruderByEnabled","liftExtruderBy","detective_sensitivity","sensitivityTooltipFormatter","detectiveSensitivity","timelapseOnFinishEnabled","timelapseOnCancelEnabled","min_timelapse_secs_on_finish","minTimelapseMinutesOnFinish","min_timelapse_secs_on_cancel","minTimelapseMinutesOnCancel","printerWizardUrl","archivePrinter","deletePrinter","disable","inputValue","opacity","unit","SavingAnimation","NumberInput","VueSlider","delayedSubmit","delay","timeoutId","printerWizard","printerName","oldValue","changeRetractOnPause","changeLiftExtruderBy","patchPrinter","propName","propValue","inputElem","getSettingsItemInput","setSavingStatus","non_field_errors","errorAlert","settingsItem","delayInfo","chosenDeviceId","discoveryEnabled","canStartLinking","discoveredPrinters","discoveredPrinter","device_id","autoLinkPrinter","discoveryCount","targetOctoPrint","useLegacyVerificationCode","verificationCode","copied","timeToExpire","zoomIn","targetKlipper","showVerificationCodeHelpModal","oneTimePasscode","oneTimePasscodeStatus","oneTimePasscodeChanged","back","onPrinterLinked","posthog","capture","agent","rpi_model","machine_type","host_or_ip","hostname","octopi_version","os","linking","cancel","switchToManualLinking","secretObtained","gotWindowMessage","beforeDestroy","gotSecret","obicoDiscoveryPopup","open","destUrl","closeDiscoveryPopup","pluginName","switchToManual","device_secret","done","DiscoveredPrinter","PrinterProgress","verifiedPrinter","apiCallIntervalId","printerIdToLink","query","expiryMoment","_this$verificationCod","_this$discoveredPrint","targetPlatform","getVerificationCode","discoverPrinter","oneTimePasscodes","one_time_passcode","verification_code","verificationCodeUrl","baseUrl","verified_at","callVerificationCodeApi","toggle","callPrinterDiscoveryApi","printerDiscovery","AutoLinkPopup","secret","allowOutsideClick","devicesWithObicoPreInstalled","targetPlatformClicked","brand","printerItem","targetKlipperPreInstall","targetKlipperGeneric","goForward","printer_name","updatePrinterName","redirectToTunnelCreation","editPrinterUrl","widgets","isWidgetVisible","lastPrint","onSendPrinterAction","onUpdateSettings","onReorderClicked","selectedWebcam","chooseWebcam","isWebcamSelected","deg","handleRotateRightClicked","isPrinting","printProgressPercentage","layerProgress","finishingAt","DATE_TIME_FORMAT","timeElapsed","mmProgress","isPrintStarting","onRepeatClicked","startedAt","extraVisible","_this$print","_this$printer$status","_this$printer$status2","_this$printer$status3","_this$printer$status4","_this$printer$status5","progressInMillimeters","progressMillimeters","currentZ","totalMillimeters","file_metadata","printingArea","maxZ","_this$printer$status6","_this$printer$status7","_this$printer$status8","_this$printer$status9","progressInLayers","progressLayers","currentLayerHeight","totalLayers","obico","totalLayerCount","_this$printer$status$","_this$printer$status10","_this$printer$status11","progress","printTime","_this$printer$status$2","_this$printer2$status","_this$printer2$status2","printTimeLeft","updatePrintProgress","deep","toggleZHeightProgressType","preferZHeightProgressInLayers","_this$printer$status12","_this$printer$status13","_this$printer$status14","_this$printer$status15","_this$printer$status16","elapsed","printProgressMillimeters","printMillimetersTotal","enableFailureDetection","onFailureDetectionToggled","notWatchingExplanation","settingName","settingValue","onTemperaturePresetsClicked","currentPreset","agentName","handleSetTemp","TempPresets","_result$value","applyTempPreset","profile","presetObj","presetName","bed","extruder","chamber","toolName","temp","activeMenu","hideTunePrinter","xyzJogDistance","xyzControl","axis","directions","down","up","xy","home","z","homeAll","disableSteppers","showExtrudeControl","extrudeJogDistance","handleFilament","filamentDirections","retract","extrude","showToolsSelector","activeTool","activeToolTemperature","activeToolDisplayName","activeToolActualTemperature","activeToolTargetTemperature","zOffsetJogDistance","controlZOffset","currentZOffset","currentFeedRate","customFeedRateFactor","setPrintSpeed","currentFlowRate","customFlowRateFactor","setFlowRate","currentFanSpeed","customFanSpeed","setFanSpeed","AXIS","xyz","DIRECTIONS","FILAMENT_DIRECTIONS","extruders","_this$activeToolTempe","prevValue","toolKeys","getCurrentZOffset","onEscape","keyCode","$once","moonrakerPayload","offset","gcode_move","homing_origin","cleanOffset","octoPayload","currentToolTemp","toolNum","changeAmount","commandScript","octoVal","moonrakerVal","force","sendCommandToPrinter","command","onError","onSuccess","dragging","currentItems","getTitle","toggleItemEnabled","draggable","extraInfo","newVal","oldVal","saveNewOrder","sortingConfig","fullScreenHeight","showFullScreenOpt","feedIsOn","canToggleFeed","toggleTerminalPower","clearFeed","updateFilterPrefs","hideTempMessages","hideSDMessages","hideGCodeMessages","hideOKMessages","terminalFeedArray","_k","feed","normalTimeStamp","TerminalFeedView","oldTerminalFeed","onNextTerminalFeed","terminalSetup","hideTempPref","hideSDPref","hideOKPref","hideGCodePref","newTerminalFeed","_this$oldTerminalFeed","_this$oldTerminalFeed2","sameMsg","same_ts","_ts","newMsg","tempRegex","SDRegex","gCodeRegex","newString","str","PrinterTerminal","display_status","onDisplayClear","availablePowerDevices","togglePower","batchPowerControl","powerDevices","getPowerDevices","action","WIDGETS","PrintProgressWidget","FailureDetectionWidget","TemperatureWidget","PrinterControlWidget","PowerControlWidget","TerminalWidget","DisplayStatusWidget","lastPrintFetchCounter","widgetsConfig","preferredWebcam","customRotationData","configItem","w","_this$printer$setting2","webcam_rotation","_newValue$current_pri","_oldValue$current_pri","restoreWidgets","fetchLastPrint","pollForCorrect","_this$printer3","_this$printer3$settin","_this$printer4","_this$printer4$settin","data_channel_id","dataChannelOnlyWebrtc","_this$printer5","_this$printer5$settin","agent_connected","webcamExists","customRotationIndex","custom","customRotation","WIDGET","terminalWidget","defaultProps","filter_by_printer_ids","retry","newDelay","isOctoPrintCommand","ReorderModal","useMobileLayout","onlyNotifications","sections","isHidden","isSubcategory","route","logout","currentSection","isNotificationChannel","availableNotificationPlugins","currentRouteComponent","createNotificationChannel","patchNotificationChannel","deleteNotificationChannel","clearErrorMessages","addErrorMessage","updateRoute","notification_enabled","defaultSections","GeneralPreferences","importComponent","ThemePreferences","ProfilePreferences","AuthorizedApps","GeneralNotifications","PushNotifications","notificationSections","notificationPlugins","reduce","displayName","channelName","entSections","subscriptionSection","Subscription","detectiveHoursSection","DetectiveHours","deleteAccountSection","DeleteAccount","publicSections","configuredNotificationChannels","last_name","combinedInputs","visibleSections","section","clientIsThemeable","fetchNotificationPlugins","fetchNotificationChannels","fetchUser","checkMobileLayout","onresize","paddingTop","newTabIndex","vw","documentElement","clientWidth","plugins","pluginInfo","env_vars","needHidden","envItem","is_required","is_set","notificationChannels","channels","channelInfo","opts","getNotificationSettingKey","innnerError","propNames","propValues","prop","updateNotificationChannel","patchUser","checkForCombinedValues","inputs","emptyValues","ReactNativeWebView","firstName","lastName","eventClassFiltering","eventClass","toggleEventFiltering","cssClassFromEventClass","eventTypeFiltering","eventType","printerEvents","tintBorderClass","info_url","onTextClick","tintClass","eventTitle","eventText","LOCAL_PREF_NAMES","localPrefKey","localPref","PrinterEventCard","filter_by_classes","filter_by_types","original","onImageUpdated","labels","raisedRipples","openExample","bubbling","bumpsAndRoughSurface","gaps","other","noIssues","notANozzleCam","isFirst","labelsSelected","isLast","totalShots","labelsToString","parseLabelsString","updateLabels","labelsString","labelArray","desc","imageUrls","raised","raised1","raised2","bubbling1","bubbling2","bumps","bumps1","bumps2","detached1","detached2","gaps1","gaps2","FirstLayerShotCard","inspectionId","urlParts","_vm$slicingProgress","_vm$slicingProgress2","oauthAccessToken","creditsInfo","callAgentAction","showContactSupportForm","showDiscordSupportMessage","openUpgradeModal","showUpgradeModal","closeUpgradeModal","handleChatScroll","has_upgrade_link","per_override_explanations","explanation","parameter","slicingSettingsInMessage","use_print_process_preset","applySettingsInMessage","suggested_printing_method","jusprinNotification","discord_support","qr_code_url","handleQRCodeError","thinking","showContactSupport","handleContactSupportFormDismissed","slicingProgress","fadeOut","overrun","quickButtons","showScrollButton","scrollToBottom","userInput","readyForUserQuery","handleEnterKey","onUserInput","handleClick","Authorization","setAgentActionRetVal","retVal","agentActionCallMap","_window$wx","wx","stubAgentActionResponse","getAgentActionResponse","checkResponse","quickButtonsStack","cannedActions","addPrinters","popQuickButtons","callLongRunningAgentActionThenRefreshPresets","addFilaments","changePrinter","showPresetOptions","changeFilament","moreOptions","showMoreOptions","sliceWithCurrentSettings","doSliceWithCurrentSettings","endTroubleshooting","current_workflow","onUserQueryQuickButton","stayInTroubleshooting","startOver","exportGCode","switchToPreview","autoOrient","autoOrientAllObjects","undoAutoOrient","removeQuickButtons","undoAutoArrange","enableSupport","paramOverridesToApplyConfigPayload","enable_support","setQuickButtons","undoEnableSupport","tellMeWhatNotificationMeans","lastErrorMessage","originalErrorMessage","newMessage","acknowledgeError","commonPrintingPrompts","showCommonPrintingPrompts","testRender","renderPlateForAnalysis","analyseModel","getAnalysisResult","plateAnalysisLooksGoodToMe","queryWithSuggestedPrintingMethod","plateAnalysisIsNotGood","removePlateAnalysis","editPlateAnalysis","shouldShowSliceWithCurrentSettingsQuickButton","lastMessage","shouldShowStartOverQuickButton","shouldShowPlateAnalysisQuickButton","haveDonePlateAnalysis","hasModelObjects","pushQuickButtons","actions","actionMessages","topActions","clearQuickButtons","initUserQueryHintButtons","initQueryHints","hint","presetType","refreshSelectedPresets","populateQuickButtons","charAt","additionalActions","newActions","newAction","existing","populateQuickButtonsOnError","cannedMessages","greeting","needToAddPrinters","needToAddFilaments","noModelObjects","noSupportForMultiplePlatesOrFilaments","currentPresetSelections","filamentName","currentModelObjects","modelObjectCount","newModelObjects","modelName","generalError","fixFilamentParamOverrides","param_overrides","plateTemps","existingTemp","tempValue","plateTempsInitialLayer","existingTempInitialLayer","isUnfaded","toggleFade","hasFade","checkIfNeedsFade","updated","scrollHeight","clientHeight","chatPanelPopUpOnErrors","creditStatusClass","creditTooltipText","ai_credit_free_monthly_quota","remainingCredits","handleSupportButtonClick","curChatPanelViewMode","changeChatPanelViewMode","changeChatPanelVisibility","shouldPopupChatPanel","preferredChatPanelViewModeValue","curChatPanelVisible","popupChatPanelTimeout","notificationBadgeCount","green_badge","orange_badge","red_badge","chatPanelPopUpOnErrorsValue","preferredChatPanelViewMode","newViewMode","ai_credit_used_current_month","remaining","ratio","devMode","savePreferredViewMode","view_mode","newVisible","visible","_event$data","focusEventType","processedNotifications","processNotificationPushedEvent","notificationKey","chatHeader","popupChatPanelIfNecessary","supportMessage","isSubmitting","sendSupportRequest","cancelSupportRequest","lastUserMessage","lastUserMsg","api","jusprinContactSupport","closeModal","isUnlimitedPlan","userInfo","userDisplayName","progressPercentage","credits","resetDate","nextMonthResetDate","has_active_subscription","_this$credits","nextMonth","toLocaleDateString","day","fetchAICreditsData","jusprinMe","ai_credits","QuickButtonComponent","GradientFadableContainer","ChatPanelHeader","ContactSupportForm","UpgradeModal","mixins","QuickButtonsMixin","MessagesMixin","SlicingParamFixerMixin","userNotificationMixin","currentChatId","modelObjects","supportedActions","autoOrientInProgress","isDevMode","readyToSlice","_message$agent_action","agent_actions","adjustTextareaHeight","fetchUserData","initMessagesAndQuickButtons","apiCall","processAgentEvent","processModelObjectsChangedEvent","processAutoOrientEvent","processNativeErrorOccurredEvent","processChatPanelFocusEvent","processSlicingProgressEvent","editedPreset","editedPresets","overridesFromEditedPreset","dirty_options","overrides","selectedPreset","_presets","is_selected","sendUserQuery","chatTextarea","currentProject","plates","userQueryPreconditionsMet","preset_type","_this$editedPreset","_this$selectedPreset","_this$editedPreset2","getCurrentChatId","withCreditCheck","jusprinChatMessages","filament_presets","print_process_presets","printProcessPresets","chat_id","processChatResponse","_window$Sentry2","_newChatResponse$data","chatsApiUrl","newChatResponse","responseData","_this$selectedPreset2","_this$selectedPreset3","_this$selectedPreset4","_message$agent_action2","machine_name","filament_name","print_process_name","populateDatabaseWithChat","processAgentActions","chatsApiVerb","_message$agent_action3","autoArrangeAllObjects","showOptionsAsQuickButtons","filamentOverrides","_window$Sentry3","hasModels","plate","_plate$model_objects","model_objects","_this$selectedPreset5","_this$selectedPreset6","doSlice","agentActionName","autoArrangeInProgress","_message$slicing_prof6","_message$slicing_prof7","_message$slicing_prof8","_message$slicing_prof9","refreshModelObjects","project","distinctModelObjectsInProject","_this$selectedPreset7","_this$selectedPreset8","fixBrokenMarkdown","formattedText","chatMessageContainer","scrollTop","onChatContentChanged","_presets$printerPrese","_presets$printerPrese2","_presets$filamentPres","_presets$filamentPres2","printerPresets","every","is_default","filamentPresets","modelObjectsWithOverhang","_obj$features$overhan","_obj$features","features","overhang","unique","exists","_event$data2","_window$Sentry4","_event$data3","_event$data4","_event$data5","jusprinPlateAnalysisProcess","cameraPositionByDegrees","xyPlaneAngle","zPlaneAngle","distanceFromTarget","xyPlaneAngleRadians","PI","zPlaneAngleRadians","sin","cos","bounding_box","views","camera_position","renderResult","plate_index","base64","analysisResponse","callPlateAnalysis","processAnalysisResponse","ensurePlateAnalysisMessageExists","plateAnalysisMessage","atBottom","chatMessages","newHeight","chatInput","closest","inputTotalHeight","shiftKey","metaKey","ctrlKey","altKey","supportMsgIndex","_message$agent_action4","user_options_to_choose_from","newQuickButtons","getHeaders","getConfig","isFirstTime","showPricingPlan","slicingProgressCompletionTimeout","_window$Sentry5","UserPreferencesPage","TargetPlatformSelectionPage","ObicoInstallationGuidePage","PrinterLinkingPage","AddPrinterSuccessPage","prefRoutes","NewOctoPrintTunnelPage","OctoPrintTunnelPage","PrintShotFeedbackApp","PrinterListPage","SharedPrinterPage","PrinterSettingsPage","PrinterControlPage","PrintPage","PrintHistoryPage","StatsPage","PrinterEventsPage","PrinterTerminalPage","FirstLayerInspectionImagePage","EmbeddedChatV10Page","EmbeddedChatV12Page","loaded","couponCode","hasSubscription","btn","isAnnual","billingCycle","BillingCycle","Annual","Monthly","isAuthenticated","priceTable","basePlanPrice","totalPlanPrice","basePrinterPrice","calc","placement","modifiers","upgrade","PrepaidDHPacks","price","selectedPrepaidPack","purchasePrepaidPack","DHPacks","dhPackKey","getDHPackLabel","getDHPackSubLabel","upgradeWithDHPack","calcWithDHPack","mailto","SupportEmail","QuestionsSection","primaryEmailVerified","chargeBeeSite","initialNumPrinters","annualAsDefault","initialCBSubscription","numPrinters","isCalcOpen","calcPriceTable","chargeBeeInstance","chargeBee","activeSubscription","cb_subscription","googleOptimizeScript","year","calcDHPackPrice","CalcPeriod","Year","Month","hour","ConfigureSubscription","calculateOnly","initialDHPackKey","initialBillingCycle","checkoutPrepaidDHPack","dhpack_level","overSubscribed","archivedPrinters","unarchivePrinter","over_subscribed","lastRedeemedCode","description","formatDate","redeemed_at","couponCodes","detectiveHourCouponCodes","dateString","_this$$i18n","locale","$i18n","minute","pageTimelapses","timelapse","openFullScreen","fullScreenPrintTitle","fullScreenClosed","fullScreenPrint","fullScreenPrintVideoUrl","isPublic","creator_name","hasSelectedChangedListener","selectedCardView","deleteVideo","posterSrc","showVideoArchivedDescription","hasFullscreenListener","cardView","humanizedPrintedOrUploadedTime","longFormat","wasTimelapseUploaded","endStatus","focusedFeedbackLink","ALERT_THRESHOLD","$listeners","selectedChanged","fetchPredictions","ts","initialPosition","PrintCard","FullScreenPrintCard","perLoad","loadsNumber","timelapses","end","publicTimelapses","adaptTimelapseToPrint","p_json_url","onUploadSuccess","onUploadError","openTimelapse","issue_severity","statusIcon","selectedTimelapse","onModalHidden","warningTriggered","original_video_url","uploadedTimelapses","paramName","pollInterval","fetchTimelapses","computeIssueFromPredictions","MINOR_THRESHOLD","MAJOR_THRESHOLD","firstIssueFrame","issueSeverity","pred","frame","predictions_json_url","predResponse","dropzone","removeFile","alert","first_issue_frame","showSuccess","agent_name","firstLayerOptedIn","updateFirstLayerOptedIn","updateFirstLayerZhop","firstLayerScanZhop","updateFirstLayerCooldownTemp","firstLayerCooldownTemp","updateFirstLayerRetract","firstLayerScanRetract","updateFirstLayerScanRetractSpeed","firstLayerScanRetractSpeed","showFetchingWebcamLoader","testSnapshotString","urlPlaceHolder","nozzlecam_url","first_layer_scan_opted_in","first_layer_scan_zhop","first_layer_scan_retract","first_layer_scan_retract_speed","first_layer_scan_cooldown_temp","webcamUrls","more","isValidCouponCode","redeemPeriod","redeemClicked","isPlanAdded","cbSubscription","free3mCouponCodePrefix","free6mCouponCodePrefix","redirectUrlWhenNotAuthenticated","isRedirectedAfterLoginOrSignup","$loadScript","handlePlanAdded","openBttUserNotAuthenticatedModal","BttUserNotAuthenticatedModal","redeemMintion3mUnlimited","coupon_code","BttRedeemCompletedModal","openAlreadyHaveProPlanModal","plan","annual","coupon","choosePlanClicked","free3mCouponCode","discount25pctCouponCode","discount25pctCodeOnly","hasFreePlan","handlePlanNotAdded","redeemBtt3mUnlimited","couponPrefix","couponCodeParam","validateSovolCode","openUserNotAuthenticatedModal","SovolUserNotAuthenticatedModal","open3doUserNotAuthenticatedModal","ThreeDOUserNotAuthenticatedModal","redeemThreeDO3mUnlimited","ThreeDORedeemCompletedModal","QuestionsKingroonSection","canGoBackToChat","hasActiveSubscription","downgradeToFree","freeButtonText","hasActiveObicoProSubscription","originalPriceDollars","originalPriceCents","discountedPriceDollars","discountedPriceCents","obicoProDiscountPercentage","upgradeToProPlan","upgradeButtonText","showSuccessPopup","circleCircumference","circleOffset","countdownSeconds","cancelRedirect","redirectToChat","closeSuccessPopup","site","Chargebee","checkout","chargebeeInstance","openCheckout","hostedPage","Accept","portal","setPortalSession","cbPortal","createChargebeePortal","confirm","currentSubscription","obicoSubscription","showBackToChatHeader","countdownInterval","jusprinChargebee","handleCanGoBackToChatParam","fetchCurrentSubscription","fetchObicoSubscription","checkForCheckoutSuccess","is_active","isCurrentPlanAnnual","is_annual","isCurrentPlanMonthly","is_monthly","_this$obicoSubscripti","discountedPrice","originalPrice","discountMultiplier","hasBillingCycleChanged","getCsrfToken","cookies","cookie","checkoutOptions","DowngradeConfirmation","startCountdown","searchParams","canGoBack","sessionStorage","beforeUnmount","PricingPage","KingroonPricingPage","ArchivedPrintersPage","DetectiveHourCouponCodesPage","PublicTimelapsesPage","TimelapseUploadPage","WelcomePage","CelestriusConfigurePage","MintionRedeemPage","BttRedeemPage","SovolRedeemPage","ThreeDoRedeemPage","JusPrinPricingPage","RotationbottomSheetOpen","ScalebottomSheetOpen","TranslatebottomSheetOpen","PrintProfilebottomSheetOpen","MachineSelectionOpen","PatternSelectionOpen","GeneralTypeSelectionOpen","PatternSelectionType","GeneralTypeSelectionType","FilamentSelectionOpen","PrintProcessSelectionOpen","isInitialLoad","profilePreset","profileOverwrites","filamentProfilePreset","filamentProfileOverwrites","selectedMachine","selectedFilament","selectedPrintProcess","suggestedPrintProcess","meshes","selectedMeshIndex","jusprintCurrentChatId","mutations","ADD_MODEL","mesh","SET_SELECTED_MESH_INDEX","UPDATE_MESH_ROTATION","meshIndex","UPDATE_MESH_TRANSLATE","translate","UPDATE_MESH_DEFAULT_TRANSLATE","defaultTranslate","UPDATE_MESH_DIMENSIONS","currentDimensions","SET_ROTATION_BOTTOM_SHEET_OPEN","SET_SCALE_BOTTOM_SHEET_OPEN","SET_TRANSLATE_BOTTOM_SHEET_OPEN","SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN","SET_MACHINE_SELECTION_OPEN","SET_PATTERN_SELECTION_OPEN","SET_PATTERN_SELECTION_TYPE","SET_GENERAL_TYPE_SELECTION_OPEN","SET_GENERAL_TYPE_SELECTION_TYPE","SET_FILAMENT_SELECTION_OPEN","SET_PRINT_PROCESS_SELECTION_OPEN","SET_SELECTED_MACHINE","SET_SELECTED_FILAMENT","SET_SELECTED_PRINT_PROCESS","SET_SUGGESTED_PRINT_PROCESS","SET_PROFILE_PRESET","fuzzy_skin","internal_solid_infill_pattern","brim_type","CLEAR_PROFILE_OVERWRITE_VALUE","UPDATE_PROFILE_OVERWRITE_VALUE","SET_PROFILE_OVERWRITE","SET_FILAMENT_PROFILE_PRESET","SET_FILAMENT_PROFILE_OVERWRITE_VALUE","CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE","SET_FILAMENT_PROFILE_OVERWRITE","SET_INITIAL_LOAD","SET_JUSPRINT_CURRENT_CHAT_ID","addMesh","commit","setSelectedMeshIndex","updateMeshRotation","updateMeshTranslate","updateCurrentDimensions","openMeshRotationBottomSheet","closeMeshRotationBottomSheet","openMeshScaleBottomSheet","closeMeshScaleBottomSheet","openTranslateBottomSheet","closeTranslateBottomSheet","openPrintProfileBottomSheet","closePrintProfileBottomSheet","updateProfileValue","openMachineSelection","closeMachineSelectionAndClearInitialLoad","openPatternSelection","closePatternSelection","setPatternSelectionType","openGeneralTypeSelection","closeGeneralTypeSelection","setGeneralTypeSelectionType","changeMachineAndRelatedPresets","dispatch","machine","default_filament","default_print_process","changePrintProcessAndLoadPreset","slicer_profile_url","encodedUrl","encodeURI","changeFilamentAndLoadPreset","openFilamentSelection","closeFilamentSelection","openPrintProcess","closePrintProcess","setInitialLoadDone","getters","selectedMeshRotation","_state$meshes$state$s","selectedMeshTranslate","_state$meshes$state$s2","selectedMeshDefaultTranslate","_state$meshes$state$s3","selectedMeshCenter","_state$meshes$state$s4","center","selectedMeshDimensions","_state$meshes$state$s5","_state$meshes$state$s6","originalDimensions","FilamentSelectionOpenn","getProfileValue","getFilamentProfileValue","namespaced","Vuex","Store","sliceSettingsStore","mountVue","entRoutes","entComponents","Hour","PlanMonthlyPrice","LoyaltyMonthlyPrice","monthlyPriceFor","isLoyalty","DHPackBillingCycleMul","AdditionalPrinterPrice","CalcPeriodMonths","roundCurrency","EPSILON","toCalcPeriod","0","2","5","10","20","RecommendedDHPackKey","calcPlanPrice","calcPeriod","calcPrinterPrice","numAdditionalPrinters","billingCycleMonths","additionalPrintersPrice","dhPackPrice","totalAdditionalPrintersPrice","totalDHPackPrice","totalPrice","urlObj","fetchPortalSession","portalSession","access_url","changeSubscription","recommended","recommendedDHPackKey","getDHPackChoiceLabel","priceDisplay","priceSubDisplay","dhPackName","groupClass","buttonsClass","buttonsWidth","decrease","whileMouseDown","clearTimer","classes","textAlign","onInput","increase","mouseDownSpeed","onNewValue","NumberSpinner","currentPlanId","isLoyaltyPlan","showPrimaryEmailUnverifiedWarning","pageContext","mobilePlatform","defaults","common","shotId","pubPrinter","tunnel","paramsObj","entry","resourceId","testNotificationChannel","printerControl","chatId","publicUrls","getMessages","dismissMessage","deleteAccount","userExt","switchLegacySubscriptionToLoyalty","subscriptions","cancelSubscription","webpackAsyncContext","req","ids","EVENT_TEXT_TAGS","DOMPurify","sanitize","ALLOWED_TAGS","ALLOWED_ATTR","notificationChannel","startCase","toLower","Blob","reader","FileReader","srcElement","readAsArrayBuffer","_document$getElements","getElementsByName","aElement","formatWithoutDaylightSavingShift","formattingStr","utcOffset","_tzm","savingClass","savingDoneClass","savingFailedClass","smallHeightClass","errorMsg","savingTimeout","savingDoneTimeout","nowSaving","prevSaving","clearSavingTimeout","twilio","pushbullet","discord","telegram","pushover","slack","webhook","apprise","System","biqu","defaultTheme","shadows","singleThemeSyndicates","matches","mergeColorOverrides","defaultColors","syndicateColors","merged","themeValue","finalColors","syndicates","setProperty","meta","shadow","observable","setTheme","newTheme","defaultRoutes","notificationRoutes","publicRoutes"],"mappings":"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","file":"js/root.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"root\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"root\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-07cc365e\":1,\"chunk-19479659\":1,\"chunk-24e37396\":1,\"chunk-312ac63a\":1,\"chunk-38e6bf7c\":1,\"chunk-4c1203f5\":1,\"chunk-5f4cc896\":1,\"chunk-683e0066\":1,\"chunk-691bc59e\":1,\"chunk-716240ff\":1,\"chunk-7c899771\":1,\"chunk-c8beb52c\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/frontend/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=style&index=0&id=3e53836d&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-2.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=style&index=0&id=b30f9c60&prod&lang=sass&scoped=true&\"","import i18n from 'i18next';\n\nimport baseEn from './locales/en.json';\nimport baseZhCN from './locales/zh-CN.json';\nimport baseZhTW from './locales/zh-TW.json';\nimport baseCa from './locales/ca.json';\nimport baseCs from './locales/cs.json';\nimport baseDe from './locales/de.json';\nimport baseEs from './locales/es.json';\nimport baseFr from './locales/fr.json';\nimport baseHu from './locales/hu.json';\nimport baseIt from './locales/it.json';\nimport baseJa from './locales/ja.json';\nimport baseKo from './locales/ko.json';\nimport baseNl from './locales/nl.json';\nimport basePl from './locales/pl.json';\nimport basePtBR from './locales/pt-BR.json';\nimport baseRu from './locales/ru.json';\nimport baseSv from './locales/sv.json';\nimport baseTr from './locales/tr.json';\nimport baseUk from './locales/uk.json';\n\nimport entBaseEn from './locales/ent_en.json';\nimport entBaseZhCN from './locales/ent_zh-CN.json';\nimport entBaseZhTW from './locales/ent_zh-TW.json';\nimport entBaseCa from './locales/ent_ca.json';\nimport entBaseCs from './locales/ent_cs.json';\nimport entBaseDe from './locales/ent_de.json';\nimport entBaseEs from './locales/ent_es.json';\nimport entBaseFr from './locales/ent_fr.json';\nimport entBaseHu from './locales/ent_hu.json';\nimport entBaseIt from './locales/ent_it.json';\nimport entBaseJa from './locales/ent_ja.json';\nimport entBaseKo from './locales/ent_ko.json';\nimport entBaseNl from './locales/ent_nl.json';\nimport entBasePl from './locales/ent_pl.json';\nimport entBasePtBR from './locales/ent_pt-BR.json';\nimport entBaseRu from './locales/ent_ru.json';\nimport entBaseSv from './locales/ent_sv.json';\nimport entBaseTr from './locales/ent_tr.json';\nimport entBaseUk from './locales/ent_uk.json';\n\nimport {language} from '@src/lib/page-context'\nimport { getLocalPref } from '@src/lib/pref'\n\nconst getCurrentLanguage = () => {\n  // Check for saved language preference first\n  const savedLanguage = getLocalPref('user-language', null)\n  if (savedLanguage) {\n    return savedLanguage\n  }\n\n  // Fall back to backend page context\n  const lang = language().replace(/_/g, '-');\n  if (lang === 'zh') return 'zh-CN';\n  if (lang === 'zh_Hans' || lang === 'zh-Hans') return 'zh-CN';\n  if (lang === 'zh_Hant' || lang === 'zh-Hant') return 'zh-TW';\n  return lang;\n};\n\nconst currentLanguage = getCurrentLanguage()\n\nconst resources = {\n  'en': {\n    translation: {\n      ...baseEn,\n      ...entBaseEn\n    }\n  },\n  'zh-CN': {\n    translation: {\n      ...baseZhCN,\n      ...entBaseZhCN\n    }\n  },\n  'zh-TW': {\n    translation: {\n      ...baseZhTW,\n      ...entBaseZhTW\n    }\n  },\n  'ca': {\n    translation: {\n      ...baseCa,\n      ...entBaseCa\n    }\n  },\n  'cs': {\n    translation: {\n      ...baseCs,\n      ...entBaseCs\n    }\n  },\n  'de': {\n    translation: {\n      ...baseDe,\n      ...entBaseDe\n    }\n  },\n  'es': {\n    translation: {\n      ...baseEs,\n      ...entBaseEs\n    }\n  },\n  'fr': {\n    translation: {\n      ...baseFr,\n      ...entBaseFr\n    }\n  },\n  'hu': {\n    translation: {\n      ...baseHu,\n      ...entBaseHu\n    }\n  },\n  'it': {\n    translation: {\n      ...baseIt,\n      ...entBaseIt\n    }\n  },\n  'ja': {\n    translation: {\n      ...baseJa,\n      ...entBaseJa\n    }\n  },\n  'ko': {\n    translation: {\n      ...baseKo,\n      ...entBaseKo\n    }\n  },\n  'nl': {\n    translation: {\n      ...baseNl,\n      ...entBaseNl\n    }\n  },\n  'pl': {\n    translation: {\n      ...basePl,\n      ...entBasePl\n    }\n  },\n  'pt-BR': {\n    translation: {\n      ...basePtBR,\n      ...entBasePtBR\n    }\n  },\n  'ru': {\n    translation: {\n      ...baseRu,\n      ...entBaseRu\n    }\n  },\n  'sv': {\n    translation: {\n      ...baseSv,\n      ...entBaseSv\n    }\n  },\n  'tr': {\n    translation: {\n      ...baseTr,\n      ...entBaseTr\n    }\n  },\n  'uk': {\n    translation: {\n      ...baseUk,\n      ...entBaseUk\n    }\n  }\n};\n\ni18n\n  .init({\n    resources,\n    lng: currentLanguage,\n    fallbackLng: ['en'],\n    interpolation: {\n      escapeValue: false,\n    },\n    debug: true,\n    nsSeparator:false\n  });\n\nexport default i18n;\n","module.exports = __webpack_public_path__ + \"img/fluidd_logo.png\";","module.exports = __webpack_public_path__ + \"img/gaps-2.jpg\";","module.exports = __webpack_public_path__ + \"img/raisedRipples-2.jpg\";","module.exports = __webpack_public_path__ + \"img/app-screenshot-3.webp\";","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=style&index=0&id=9def43e8&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-4.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=style&index=0&id=60f4cf2a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=style&index=0&id=a071ad6e&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/generic-app.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=style&index=0&id=3178e435&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=style&index=0&id=e62ff952&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printer-management.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=style&index=0&id=6b4f0900&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=style&index=0&id=3931bb0f&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=style&index=0&id=00f2b5bc&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=style&index=0&id=07968630&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bigtree-tech-obico-logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=style&index=0&id=6717962a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=style&index=0&id=78933ce3&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=style&index=0&id=7e0a0f74&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=style&index=0&id=7705cf7b&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=style&index=0&id=b5382844&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=style&index=0&id=7f13343f&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=style&index=0&id=1c69e3a5&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=style&index=0&id=7ae7d3b0&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=style&index=0&id=7c122ccc&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/ai-failure-detection.png\";","module.exports = __webpack_public_path__ + \"img/commandLinePrompt.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=style&index=0&id=e01269fe&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-5.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=style&index=0&id=74b26ea3&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/get-on-google-play.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=style&index=0&id=3cbabed8&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bubbling-1.jpg\";","module.exports = __webpack_public_path__ + \"img/polymer.webp\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=style&index=0&id=f3289a68&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=style&index=0&id=81513708&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=style&index=0&id=29e8b0b6&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=217c34d2&prod&lang=sass&scoped=true&\"","import { isLocalStorageSupported } from '@static/js/utils'\n\nexport const getLocalPref = (prefId, defaultValue, printerId = null) => {\n  const storageKey = printerId === null ? prefId : `${prefId}_${printerId}`;\n  var savedVal = isLocalStorageSupported() ? localStorage.getItem(storageKey) : null\n  var val = savedVal || defaultValue\n  // Hack to deal with data type such as boolean and number\n  try {\n    return JSON.parse(val)\n  } catch (e) {\n    return val\n  }\n}\n\nexport const setLocalPref = (prefId, value, printerId = null) => {\n  if (isLocalStorageSupported()) {\n    const storageKey = printerId === null ? prefId : `${prefId}_${printerId}`;\n    localStorage.setItem(storageKey, value);\n  }\n}","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=style&index=0&id=7924844c&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mobile-web-app.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=style&index=0&id=1f5952c0&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printer.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=style&index=1&id=60f4cf2a&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/raspberry_pi.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=style&index=0&id=04d63edc&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Your three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan Is Now Active')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Go To Printer Control Page'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=style&index=0&id=7c771c69&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/lcdScreenLarge.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=style&index=0&id=44dc68ea&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mainsail_logo.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=style&index=1&id=7e0a0f74&prod&lang=sass&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=style&index=0&id=b4e920a0&prod&scoped=true&lang=scss&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=style&index=0&id=1c764133&prod&lang=sass&\"","module.exports = __webpack_public_path__ + \"img/octoapp.webp\";","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(() => (_vm.show = false)),expression:\"() => (show = false)\"}],staticClass:\"help-wrapper\",class:{ highlighted: _vm.highlight }},[_c('div',{staticClass:\"text\",on:{\"click\":function($event){_vm.positionWidget()\n      _vm.show = !_vm.show}}},[_vm._t(\"default\")],2),_c('div',{ref:\"widgetWrapper\",staticClass:\"widget-wrapper\"},[_c('div',{staticClass:\"question-mark\",on:{\"click\":function($event){_vm.positionWidget()\n        _vm.show = !_vm.show}}},[_c('svg',[_c('use',{attrs:{\"href\":\"#svg-question-icon\"}})])]),_c('transition',{attrs:{\"name\":\"pop-up\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show),expression:\"show\"}],ref:\"widget\",staticClass:\"widget\",class:[_vm.xDirection, _vm.yDirection]},[(_vm.showCloseButton)?_c('div',{staticClass:\"close-button\",on:{\"click\":function($event){_vm.show = false}}},[_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":\"#svg-cross-icon\"}})])]):_vm._e(),_c('div',{staticClass:\"content\"},[(_vm.id === 'basic-streaming-on-kingroon-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Basic Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"1 FPS (frame-per-second), 100 hours of streaming per month\")))])])]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Learn more about {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])]},proxy:true}],null,false,1592606660)})],1)]:_vm._e(),(_vm.id === 'detective-hours-free-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Basic AI Detection checks for failures every 30 seconds.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"AI usage is reset on the 1st of each month. Hours do not roll over month to month.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-free-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\"))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'premium-streaming-on-kingroon-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Premium Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 5 FPS with any webcam\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS with Kingroon H.264 Camera.\")))])])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'detective-hours-pro-plan-on-kingroon-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Advanced AI checks for failures more frequently - Catch failures up to 2X faster than Basic AI.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month-to-month\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-pro-plan-on-kingroon-pricing-page')?[_c('div',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere. Unlimited.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'basic-streaming-on-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Basic Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 5 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Throttled for 30 seconds every minute\")))])])]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Learn more about {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])]},proxy:true}],null,false,3864550040)})],1)]:_vm._e(),(_vm.id === 'first-gen-ai-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Our original AI failure detection model.\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Upgrade to AI Premium for the Next-gen AI model with 63% fewer missed failures and 56% fewer false alerts.\")))])]:_vm._e(),(_vm.id === 'next-gen-ai-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Our latest AI failure detection model.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"63% fewer missed failures than the First-gen AI model.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"56% fewer false alerts than the First-gen AI model.\")))])])]:_vm._e(),(_vm.id === 'detective-hours-free-plan-on-pricing-page')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Yup! Even Free account gets 10 AI Detection Hours for FREE each month.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month to month.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"earn free AI Detection Hours by helping her improve\")))]),_vm._v(\". \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can also\"))+\" \"),_c('a',{staticClass:\"link\",attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t(\"purchase additional AI hours\")))]),_vm._v(\". \")])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-detective-hour-work/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'detective-hours-pro-plan-on-pricing-page')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Pro plan includes 50 AI Detection Hours each month.\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unused AI Detection Hours roll over month to month.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours expire when subscription ends.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"earn more AI Detection Hours by helping her improve\")))]),_vm._v(\". \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"You can also\"))+\" \"),_c('a',{staticClass:\"link\",attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t(\"purchase additional AI hours\")))]),_vm._v(\". \")])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-detective-hour-work/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"how the AI Detection Hour works \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'premium-streaming-on-pricing-page')?[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Premium Streaming\"))+\": \"),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Up to 25 FPS (frame-per-second)\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Un-throttled\")))])])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"the differences between the Premium Streaming and the Basic Streaming\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-free-plan-on-pricing-page')?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your OctoPrint/Klipper from anywhere.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\"))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"OctoPrint/Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'tunneling-pro-plan-on-pricing-page')?[_c('div',[_vm._v(_vm._s(_vm.$t(\"Securely tunnel to your OctoPrint/Klipper from anywhere. Unlimited.\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Learn more about\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"OctoPrint/Klipper tunnel \"))),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === '3rd-party-app-integration-free-on-pricing-page')?[_c('div',[_c('div',[_vm._v(_vm._s(_vm.$t(\"The monthly cap is shared between 3rd-party app and OctoPrint tunnel\"))+\":\")]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"The combined usage can't exceed 300MB per month.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Data usage is reset on the 1st day of each month.\")))])]),_c('p',[_vm._v(_vm._s(_vm.$t(\"Supported 3rd-party mobile apps\"))+\":\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octoapp.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/printoid.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octopod.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/polymer.webp')}})])]:_vm._e(),(_vm.id === '3rd-party-app-integration-pro-on-pricing-page')?[_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"Supported 3rd-party mobile apps\"))+\":\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octoapp.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/printoid.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/octopod.webp')}}),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":require('@static/img/polymer.webp')}})])]:_vm._e(),(_vm.id === 'filament-change-on-notification-preferences')?[_c('i',[_c('ul',[_vm._v(\" \"+_vm._s(_vm.$t(\"Required versions\"))+\": \"),_c('li',[_vm._v(_vm._s(_vm.$t(\"OctoPrint 1.7.0 or higher\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"The {brandName} plugin 1.8.11 or higher\",{brandName: _vm.$syndicateText.brandName })))])])]),_c('h3',[_vm._v(_vm._s(_vm.$t(\"Filament Runout Notifications\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Host_action_commands must be enabled in your firmware to make it possible for your filament runout sensor to communicate with OctoPrint and the {brandName} app. If you enable action commands in your firmware, then the filament runout sensor can work properly and the {brandName} app can notify you when the filament runs out. Unfortunately, without host_action_commands enabled, OctoPrint is unable to communicate with the printer to know that a filament runout was detected.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_vm._v(_vm._s(_vm.$t(\"To enable support, you need to do the following\"))+\":\")]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Marlin: Uncomment #define HOST_ACTION_COMMANDS in Configuration_adv.h and recompile. See here for more information on host_action_commands.\"))+\" \")])]),_c('h3',[_vm._v(_vm._s(_vm.$t(\"Color Change Notifications\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Notifications on color change will work with any printer that has M600 enabled in its firmware. You do not need host_action_commands enabled to get notified when a color change is needed.\"))+\" \")])]:_vm._e(),(_vm.id === 'filament-used-may-be-incorrect')?[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Is filament usage inaccurate?\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('G-code files uploaded to your {brandName} account before upgrading to {brandName} for OctoPrint version 2.3.0 or {brandName} for Klipper version 1.2.0 do not include filament usage data.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('strong',[_vm._v(_vm._s(_vm.$t(\"To ensure accurate filament usage and other statistics\"))+\":\")])]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t('Upload G-code files and start prints directly through {brandName} instead of OctoPrint/Klipper.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Use a slicer that supports filament usage parameters, such as Cura, Prusa Slicer, SuperSlicer, IdeaMaker, or Simplify3D.\"))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Print statistics for G-code files deleted before 12/20/2022 are not included. For files deleted after 12/20/2022, statistics are preserved.\"))+\" \")])])]:_vm._e(),(_vm.id === 'thumbnail-setup-guide')?[_c('p',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/enable-gcode-thumbnails/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn how to configure G-Code preview generation in your slicer\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]:_vm._e(),(_vm.id === 'fan-speed-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Adjust the speed of the cooling fan by setting a percentage value between 0 and 100. The default value is usually 100, which means the fan will run at full speed. Lowering the fan speed can reduce noise and save energy, but may also affect print quality if the printer gets too hot.\"))+\" \")])]:_vm._e(),(_vm.id === 'print-speed-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Adjust the speed of your 3D printer by changing the speed of all movement commands by a specified factor. The default value is 100%, meaning that the printer will move at its standard speed. Lowering the print speed factor will slow down your print, while increasing it will speed it up. Value of 200% will double the speed.\"))+\" \")])]:_vm._e(),(_vm.id === 'flow-rate-widget-help')?[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Flow rate is the speed at which the printer extrudes plastic. If the flow rate is too high, the printer may extrude too much plastic and create blobs or stringing, while too low flow rate may result in weak and brittle prints. Adjusting the flow rate can help achieve the optimal balance between speed and quality. The default value is 100%.\"))+\" \")])]:_vm._e(),(_vm.id === 'coupon-entered-automatically')?[_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t('No cost for three months. Plan renews after expiration. Cancel anytime.')))])])]:_vm._e()],2)])])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    v-click-outside=\"() => (show = false)\"\n    class=\"help-wrapper\"\n    :class=\"{ highlighted: highlight }\"\n  >\n    <!-- Slot for text -->\n    <div\n      class=\"text\"\n      @click=\"\n        positionWidget()\n        show = !show\n      \"\n    >\n      <slot></slot>\n    </div>\n\n    <div ref=\"widgetWrapper\" class=\"widget-wrapper\">\n      <!-- Help icon -->\n      <div\n        class=\"question-mark\"\n        @click=\"\n          positionWidget()\n          show = !show\n        \"\n      >\n        <svg>\n          <use href=\"#svg-question-icon\" />\n        </svg>\n      </div>\n\n      <!-- Help widget -->\n      <transition name=\"pop-up\">\n        <div v-show=\"show\" ref=\"widget\" class=\"widget\" :class=\"[xDirection, yDirection]\">\n          <div v-if=\"showCloseButton\" class=\"close-button\" @click=\"show = false\">\n            <svg width=\"16\" height=\"16\">\n              <use href=\"#svg-cross-icon\" />\n            </svg>\n          </div>\n\n          <!-- Help content -->\n          <div class=\"content\">\n            <!-- KINGROON PRICING PAGE HELP CONTENT START -->\n            <!-- basic-streaming-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'basic-streaming-on-kingroon-pricing-page'\">\n              <div>\n                {{$t(\"Basic Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"1 FPS (frame-per-second), 100 hours of streaming per month\") }}</li>\n                </ul>\n              </div>\n              <div>\n                <i18next :translation=\"$t('Learn more about {localizedDom}')\">\n                  <template #localizedDom>\n                    <a href=\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\" target=\"_blank\">{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}} <i class=\"fas fa-external-link-alt\"></i></a>\n                  </template>\n                </i18next>\n\n              </div>\n            </template>\n\n            <!-- detective-hours-free-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'detective-hours-free-plan-on-kingroon-pricing-page'\">\n                <p>{{ $t(\"Basic AI Detection checks for failures every 30 seconds.\") }}</p>\n                <p>{{ $t(\"AI usage is reset on the 1st of each month. Hours do not roll over month to month.\") }}</p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-free-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'tunneling-free-plan-on-kingroon-pricing-page'\">\n              <p>{{ $t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere.\") }}</p>\n              <p>\n                {{$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\")}}\n              </p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a href=\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\" target=\"_blank\"\n                  >{{ $t(\"Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- premium-streaming-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'premium-streaming-on-kingroon-pricing-page'\">\n              <div>\n                {{$t(\"Premium Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 25 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Up to 5 FPS with any webcam\") }}</li>\n                  <li>{{ $t(\"Up to 25 FPS with Kingroon H.264 Camera.\") }}</li>\n                </ul>\n              </div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://docs.kingroon.com/docs/user-guides/webcam-streaming-for-human-eyes/\"\n                  target=\"_blank\"\n                  >{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- detective-hours-pro-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'detective-hours-pro-plan-on-kingroon-pricing-page'\">\n              <p>{{ $t(\"Advanced AI checks for failures more frequently - Catch failures up to 2X faster than Basic AI.\") }}</p>\n              <p>{{ $t(\"Unused AI Detection Hours roll over month-to-month\") }}</p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  href=\"https://www.docs.kingroon.com/docs/user-guides/how-does-detective-hour-work/\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-pro-plan-on-kingroon-pricing-page -->\n            <template v-if=\"id === 'tunneling-pro-plan-on-kingroon-pricing-page'\">\n              <div>{{ $t(\"Securely tunnel to your Mainsail or fluidd Klipper interface from anywhere. Unlimited.\") }}</div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a href=\"https://docs.kingroon.com/docs/user-guides/octoprint-tunneling/\" target=\"_blank\"\n                  >{{ $t(\"Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- KINGROON PRICING PAGE HELP CONTENT END -->\n\n            <!-- basic-streaming-on-pricing-page -->\n            <template v-if=\"id === 'basic-streaming-on-pricing-page'\">\n              <div>\n                {{$t(\"Basic Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 5 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Throttled for 30 seconds every minute\") }}</li>\n                </ul>\n              </div>\n              <div>\n                <i18next :translation=\"$t('Learn more about {localizedDom}')\">\n                  <template #localizedDom>\n                    <a :href=\"getDocUrl('/user-guides/webcam-streaming-for-human-eyes/')\" target=\"_blank\">{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}} <i class=\"fas fa-external-link-alt\"></i></a>\n                  </template>\n                </i18next>\n\n              </div>\n            </template>\n\n            <!-- first-gen-ai-on-pricing-page -->\n            <template v-if=\"id === 'first-gen-ai-on-pricing-page'\">\n              <p>{{ $t(\"Our original AI failure detection model.\") }}</p>\n              <p>{{ $t(\"Upgrade to AI Premium for the Next-gen AI model with 63% fewer missed failures and 56% fewer false alerts.\") }}</p>\n            </template>\n\n            <!-- next-gen-ai-on-pricing-page -->\n            <template v-if=\"id === 'next-gen-ai-on-pricing-page'\">\n              <p>{{ $t(\"Our latest AI failure detection model.\") }}</p>\n              <ul>\n                <li>{{ $t(\"63% fewer missed failures than the First-gen AI model.\") }}</li>\n                <li>{{ $t(\"56% fewer false alerts than the First-gen AI model.\") }}</li>\n              </ul>\n            </template>\n\n            <!-- detective-hours-free-plan-on-pricing-page -->\n            <template v-if=\"id === 'detective-hours-free-plan-on-pricing-page'\">\n              <h3>{{ $t(\"Yup! Even Free account gets 10 AI Detection Hours for FREE each month.\") }}</h3>\n              <ul>\n                <li>{{ $t(\"Unused AI Detection Hours roll over month to month.\") }}</li>\n                <li>\n                  {{$t(\"You can\")}}\n                  <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                    >{{ $t(\"earn free AI Detection Hours by helping her improve\") }}</a\n                  >.\n                </li>\n                <li>\n                  {{$t(\"You can also\")}} <a class=\"link\" href=\"#need-more\">{{ $t(\"purchase additional AI hours\") }}</a>.\n                </li>\n              </ul>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/how-does-detective-hour-work/')\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- detective-hours-pro-plan-on-pricing-page -->\n            <template v-if=\"id === 'detective-hours-pro-plan-on-pricing-page'\">\n              <h3>{{ $t(\"Pro plan includes 50 AI Detection Hours each month.\") }}</h3>\n              <ul>\n                <li>{{ $t(\"Unused AI Detection Hours roll over month to month.\") }}</li>\n                <li>{{ $t(\"AI Detection Hours expire when subscription ends.\") }}</li>\n                <li>\n                  {{$t(\"You can\")}}\n                  <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                    >{{ $t(\"earn more AI Detection Hours by helping her improve\") }}</a\n                  >.\n                </li>\n                <li>\n                  {{$t(\"You can also\")}} <a class=\"link\" href=\"#need-more\">{{ $t(\"purchase additional AI hours\") }}</a>.\n                </li>\n              </ul>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/how-does-detective-hour-work/')\"\n                  target=\"_blank\"\n                  >{{ $t(\"how the AI Detection Hour works \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- premium-streaming-on-pricing-page -->\n            <template v-if=\"id === 'premium-streaming-on-pricing-page'\">\n              <div>\n                {{$t(\"Premium Streaming\")}}:\n                <ul>\n                  <li>{{ $t(\"Up to 25 FPS (frame-per-second)\") }}</li>\n                  <li>{{ $t(\"Un-throttled\") }}</li>\n                </ul>\n              </div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a\n                  :href=\"getDocUrl('/user-guides/webcam-streaming-for-human-eyes/')\"\n                  target=\"_blank\"\n                  >{{$t(\"the differences between the Premium Streaming and the Basic Streaming\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-free-plan-on-pricing-page -->\n            <template v-if=\"id === 'tunneling-free-plan-on-pricing-page'\">\n              <p>{{ $t(\"Securely tunnel to your OctoPrint/Klipper from anywhere.\") }}</p>\n              <p>\n                {{$t(\"Free plan is subject to 300MB/month data cap. Data usage is reset on the 1st day of each month.\")}}\n              </p>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\"\n                  >{{ $t(\"OctoPrint/Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- tunneling-pro-plan-on-pricing-page -->\n            <template v-if=\"id === 'tunneling-pro-plan-on-pricing-page'\">\n              <div>{{ $t(\"Securely tunnel to your OctoPrint/Klipper from anywhere. Unlimited.\") }}</div>\n              <p>\n                {{$t(\"Learn more about\")}}\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\"\n                  >{{ $t(\"OctoPrint/Klipper tunnel \") }}<i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <!-- 3rd-party-app-integration-free-on-pricing-page -->\n            <template v-if=\"id === '3rd-party-app-integration-free-on-pricing-page'\">\n              <div>\n                <div>{{ $t(\"The monthly cap is shared between 3rd-party app and OctoPrint tunnel\") }}:</div>\n                <ul>\n                  <li>{{ $t(\"The combined usage can't exceed 300MB per month.\") }}</li>\n                  <li>{{ $t(\"Data usage is reset on the 1st day of each month.\") }}</li>\n                </ul>\n                <p>{{ $t(\"Supported 3rd-party mobile apps\") }}:</p>\n                <img class=\"logo-icon\" :src=\"require('@static/img/octoapp.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/printoid.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/octopod.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/polymer.webp')\" />\n              </div>\n            </template>\n\n            <!-- 3rd-party-app-integration-pro-on-pricing-page -->\n            <template v-if=\"id === '3rd-party-app-integration-pro-on-pricing-page'\">\n              <div>\n                <p>{{ $t(\"Supported 3rd-party mobile apps\") }}:</p>\n                <img class=\"logo-icon\" :src=\"require('@static/img/octoapp.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/printoid.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/octopod.webp')\" />\n                <img class=\"logo-icon\" :src=\"require('@static/img/polymer.webp')\" />\n              </div>\n            </template>\n\n            <!-- filament-change-on-notification-preferences -->\n            <template v-if=\"id === 'filament-change-on-notification-preferences'\">\n              <i>\n                <ul>\n                  {{$t(\"Required versions\")}}:\n                  <li>{{ $t(\"OctoPrint 1.7.0 or higher\") }}</li>\n                  <li>{{$t(\"The {brandName} plugin 1.8.11 or higher\",{brandName: $syndicateText.brandName })}}</li>\n                </ul>\n              </i>\n              <h3>{{ $t(\"Filament Runout Notifications\") }}</h3>\n              <p>\n                {{ $t('Host_action_commands must be enabled in your firmware to make it possible for your filament runout sensor to communicate with OctoPrint and the {brandName} app. If you enable action commands in your firmware, then the filament runout sensor can work properly and the {brandName} app can notify you when the filament runs out. Unfortunately, without host_action_commands enabled, OctoPrint is unable to communicate with the printer to know that a filament runout was detected.',{brandName:$syndicateText.brandName}) }}\n              </p>\n\n              <p>{{ $t(\"To enable support, you need to do the following\") }}:</p>\n              <ul>\n                <li>\n                  {{$t(\"Marlin: Uncomment #define HOST_ACTION_COMMANDS in Configuration_adv.h and recompile. See here for more information on host_action_commands.\")}}\n                </li>\n              </ul>\n\n              <h3>{{ $t(\"Color Change Notifications\") }}</h3>\n              <p>\n                {{$t(\"Notifications on color change will work with any printer that has M600 enabled in its firmware. You do not need host_action_commands enabled to get notified when a color change is needed.\")}}\n              </p>\n            </template>\n\n            <!-- filament-used-may-be-incorrect -->\n            <template v-if=\"id === 'filament-used-may-be-incorrect'\">\n              <h3>{{ $t(\"Is filament usage inaccurate?\") }}</h3>\n              <p>\n                {{ $t('G-code files uploaded to your {brandName} account before upgrading to {brandName} for OctoPrint version 2.3.0 or {brandName} for Klipper version 1.2.0 do not include filament usage data.',{brandName:$syndicateText.brandName}) }}\n              </p>\n              <p><strong>{{ $t(\"To ensure accurate filament usage and other statistics\") }}:</strong></p>\n              <ul>\n                <li>\n                  {{ $t('Upload G-code files and start prints directly through {brandName} instead of OctoPrint/Klipper.',{brandName:$syndicateText.brandName}) }}\n\n                </li>\n                <li>\n                  {{$t(\"Use a slicer that supports filament usage parameters, such as Cura, Prusa Slicer, SuperSlicer, IdeaMaker, or Simplify3D.\")}}\n                </li>\n                <li>\n                  {{$t(\"Print statistics for G-code files deleted before 12/20/2022 are not included. For files deleted after 12/20/2022, statistics are preserved.\")}}\n                </li>\n              </ul>\n            </template>\n\n            <!-- thumbnail-setup-guide -->\n            <template v-if=\"id === 'thumbnail-setup-guide'\">\n              <p>\n                <a :href=\"getDocUrl('/user-guides/enable-gcode-thumbnails/')\" target=\"_blank\"\n                  >{{$t(\"Learn how to configure G-Code preview generation in your slicer\")}}\n                  <i class=\"fas fa-external-link-alt\"></i\n                ></a>\n              </p>\n            </template>\n\n            <template v-if=\"id === 'fan-speed-widget-help'\">\n              <p>\n                {{$t(\"Adjust the speed of the cooling fan by setting a percentage value between 0 and 100. The default value is usually 100, which means the fan will run at full speed. Lowering the fan speed can reduce noise and save energy, but may also affect print quality if the printer gets too hot.\")}}\n              </p>\n            </template>\n            <template v-if=\"id === 'print-speed-widget-help'\">\n              <p>\n                {{$t(\"Adjust the speed of your 3D printer by changing the speed of all movement commands by a specified factor. The default value is 100%, meaning that the printer will move at its standard speed. Lowering the print speed factor will slow down your print, while increasing it will speed it up. Value of 200% will double the speed.\")}}\n              </p>\n            </template>\n            <template v-if=\"id === 'flow-rate-widget-help'\">\n              <p>\n                {{$t(\"Flow rate is the speed at which the printer extrudes plastic. If the flow rate is too high, the printer may extrude too much plastic and create blobs or stringing, while too low flow rate may result in weak and brittle prints. Adjusting the flow rate can help achieve the optimal balance between speed and quality. The default value is 100%.\")}}\n              </p>\n            </template>\n\n            <!-- coupon-entered-automatically -->\n            <template v-if=\"id === 'coupon-entered-automatically'\">\n              <div>\n                <p>{{ $t('No cost for three months. Plan renews after expiration. Cancel anytime.') }}</p>\n              </div>\n            </template>\n          </div>\n        </div>\n      </transition>\n    </div>\n  </div>\n</template>\n\n<script>\n/**\n * Pop-up widget to show additional help notes\n * To work properly should wrap raw text\n *\n * @example\n * <div>\n *   <help-widget src=\"...\">Webcam streaming</help-widget>\n * </div>\n */\n\nimport ClickOutside from 'vue-click-outside'\n\nexport default {\n  name: 'HelpWidget',\n\n  directives: {\n    ClickOutside,\n  },\n\n  props: {\n    id: {\n      type: String,\n      required: true,\n    },\n    highlight: {\n      type: Boolean,\n      default: true,\n    },\n    showCloseButton: {\n      type: Boolean,\n      default: false,\n    },\n    textBefore: {\n      type: String,\n      default: '',\n    },\n  },\n\n  data() {\n    return {\n      show: false,\n      xDirection: 'left',\n      yDirection: 'top',\n    }\n  },\n\n  methods: {\n    // Find preferred direction for widget to pup-up\n    // Based on help icon position inside viewport\n    positionWidget() {\n      this.$nextTick(() => {\n        const widgetWidth = this.$refs.widget?.offsetWidth || 360\n        const widgetHeight = this.$refs.widget?.offsetHeight || 420\n\n        const minHorizontalSpace = widgetWidth + 10\n        const minVerticalSpace = widgetHeight + 10\n\n        const helpIconPosition = this.$refs.widgetWrapper.getBoundingClientRect()\n        const distanceFromRightEdge =\n          window.innerWidth - (helpIconPosition.left + helpIconPosition.width)\n        const distanceFromBottomEdge =\n          window.innerHeight - (helpIconPosition.top + helpIconPosition.height)\n\n        if (distanceFromRightEdge < minHorizontalSpace) {\n          this.xDirection = 'right'\n        } else {\n          this.xDirection = 'left'\n        }\n\n        if (distanceFromBottomEdge < minVerticalSpace) {\n          this.yDirection = 'bottom'\n        } else {\n          this.yDirection = 'top'\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.help-wrapper\n  display: inline\n  position: relative\n  &.highlighted\n    text-decoration: underline\n    text-decoration-color: var(--color-text-help)\n  .text\n    display: inline\n    &:hover\n      cursor: pointer\n\n.widget-wrapper\n  $widget-width: 360px\n  $x-breakpoint: #{$widget-width + 20px}\n  $x-breakpoint-2: #{$widget-width * 2 + 20px}\n  position: relative\n  left: .1rem\n  top: .1rem\n  width: 1rem\n  height: 1rem\n  display: inline-block\n\n  .question-mark\n    display: flex\n    color: var(--color-text-help)\n    transition: all .2s ease-out\n    height: 1rem\n    &:hover\n      cursor: pointer\n\n    svg\n      width: 1rem\n      height: 1rem\n\n  .widget\n    width: $widget-width\n    z-index: 10\n    position: absolute\n    box-shadow: 0 0 0 9999px rgb(0 0 0 / 0.5)\n    border-radius: 12px\n    background-color: var(--color-surface-primary)\n    display: flex\n    flex-direction: column\n    color: var(--color-text-primary)\n\n    .logo-icon\n      max-height: 50px\n      object-fit: contain\n      border-radius: 8px\n      margin: 0px 15px\n\n    @media (min-width: $x-breakpoint-2)\n      &.left\n        left: 100%\n      &.right\n        right: 100%\n      &.bottom\n        bottom: 100%\n      &.top\n        top: 100%\n\n    @media (max-width: $x-breakpoint-2)\n      left: 0rem\n      right: 0rem\n      top: 5rem\n      margin: auto\n      position: fixed\n\n    @media (max-width: $x-breakpoint)\n      left: 1rem\n      right: 1rem\n      width: auto\n\n    .close-button\n      $close-btn-height: 24px\n      position: absolute\n      left: #{$close-btn-height * -.5}\n      top: #{$close-btn-height * -.5}\n      color: var(--color-text-primary)\n      transition: all .2s ease-out\n      &:hover\n        cursor: pointer\n        opacity: .7\n\n      svg\n        width: $close-btn-height\n        height: $close-btn-height\n\n    .content\n      padding: 1rem .875rem\n      font-size: 14px\n      font-weight: normal\n\n      & > *\n        margin-bottom: 1em\n        display: block\n\n      h1, h2, h3\n        font-weight: bold\n\n      h1\n        font-size: 1.3em\n      h2\n        font-size: 1.2em\n      h3\n        font-size: 1.1em\n\n      ul\n        padding-left: 2em\n\n      .video-wrapper\n        position: relative\n        padding-bottom: 56.25%\n        height: 0\n\n        iframe\n          position: absolute\n          top: 0\n          left: 0\n          width: 100%\n          height: 100%\n</style>\n\n<style scoped>\n/*\n  Widget animation\n  Defined with native CSS due to SASS and Vue conflict\n*/\n\n.pop-up-enter-active {\n  transition: all 0.1s ease-out;\n}\n\n.pop-up-leave-active {\n  transition: all 0.1s ease-in;\n}\n\n.pop-up-enter,\n.pop-up-leave-to {\n  transform: translate(-2rem, -1rem) scale(0.8);\n  opacity: 0;\n}\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./HelpWidget.vue?vue&type=template&id=40661357&scoped=true&\"\nimport script from \"./HelpWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./HelpWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./HelpWidget.vue?vue&type=style&index=0&id=40661357&prod&lang=sass&scoped=true&\"\nimport style1 from \"./HelpWidget.vue?vue&type=style&index=1&id=40661357&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"40661357\",\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/klipperScreenMenu.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=style&index=0&id=395dc948&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=style&index=0&id=40661357&prod&lang=sass&scoped=true&\"","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttRedeemCompletedModal.vue?vue&type=template&id=058adf52&scoped=true&\"\nimport script from \"./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttRedeemCompletedModal.vue?vue&type=style&index=0&id=058adf52&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"058adf52\",\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueSwal from 'vue-sweetalert2'\n\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\n\nconst openModalWithComponent = (C, props, modalOptions) => {\n  let wrapper = document.createElement('div')\n  const c = new Vue({\n    render: (h) => h(C, { props: props }),\n  }).$mount(wrapper)\n\n  return Vue.swal({\n    ...modalOptions,\n    customClass: {\n      container: 'dark-backdrop',\n    },\n    html: '<div id=\"replace-here\">Placeholder</div>',\n    onBeforeOpen: (el) => {\n      el.querySelector('#replace-here').replaceWith(c.$el)\n    },\n    onDestroy: () => {\n      c.$destroy()\n      wrapper.remove()\n    },\n  })\n}\n\nconst openModalWithElement = (element, props, modalOptions) => {\n  return Vue.swal({\n    ...modalOptions,\n    customClass: {\n      container: 'dark-backdrop',\n    },\n    html: '<div id=\"replace-here\">Placeholder</div>',\n    onBeforeOpen: (el) => {\n      el.querySelector('#replace-here').replaceWith(element)\n    },\n  })\n}\n\nconst install = (Vue, options) => {\n  Vue.use(VueSwal, options)\n\n  const Confirm = Vue.swal.mixin({\n    title: 'Are you sure?',\n    showCancelButton: true,\n    confirmButtonText: 'Yes',\n    cancelButtonText: 'No',\n    customClass: {\n      container: 'dark-backdrop',\n    },\n  })\n\n  const Toast = Vue.swal.mixin({\n    toast: true,\n    position: 'top-end',\n    showConfirmButton: false,\n    timer: 5000,\n  })\n\n  const Reject = Vue.swal.mixin({\n    icon: 'error',\n    customClass: {\n      container: 'dark-backdrop error-alert',\n    },\n  })\n\n  const Prompt = Vue.swal.mixin({\n    customClass: {\n      container: 'dark-backdrop',\n    },\n  })\n\n  const DismissableToast = (swalOpt, dismissKey) => {\n    if (!getLocalPref(dismissKey, false)) {\n      const opt = {\n        ...swalOpt,\n        position: 'top-end',\n        confirmButtonText: \"Gotcha! Don't show this again.\",\n      }\n      return Vue.swal(opt).then(function (result) {\n        if (result.value) {\n          setLocalPref(dismissKey, true)\n          console.log(result)\n        }\n      })\n    }\n  }\n\n  Vue.prototype.$swal['openModalWithComponent'] = openModalWithComponent\n  Vue.prototype.$swal['openModalWithElement'] = openModalWithElement\n  Vue.prototype.$swal['Confirm'] = Confirm\n  Vue.prototype.$swal['Toast'] = Toast\n  Vue.prototype.$swal['DismissableToast'] = DismissableToast\n  Vue.prototype.$swal['Reject'] = Reject\n  Vue.prototype.$swal['Prompt'] = Prompt\n}\n\nexport default { install: install }\n","import Vue from 'vue'\n\nVue.filter('floor', (value) => Math.floor(value))\n","// extract from @sentry/vue package\n\nconst COMPONENT_NAME_REGEXP = /(?:^|[-_/])(\\w)/g\nconst ROOT_COMPONENT_NAME = 'root'\nconst ANONYMOUS_COMPONENT_NAME = 'anonymous component'\n\nconst splitPathRe = /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^/]+?|)(\\.[^./]*|))(?:[/]*)$/\nconst splitPath = (filename) => {\n  const parts = splitPathRe.exec(filename)\n  return parts ? parts.slice(1) : []\n}\n\nconst basename = (path, ext) => {\n  let f = splitPath(path)[2]\n  if (ext && f.substr(ext.length * -1) === ext) {\n    f = f.substr(0, f.length - ext.length)\n  }\n  return f\n}\n\nconst getComponentName = (vm) => {\n  if (!vm) {\n    return ANONYMOUS_COMPONENT_NAME\n  }\n\n  if (vm.$root === vm) {\n    return ROOT_COMPONENT_NAME\n  }\n\n  if (!vm.$options) {\n    return ANONYMOUS_COMPONENT_NAME\n  }\n\n  if (vm.$options.name) {\n    return vm.$options.name\n  }\n\n  if (vm.$options._componentTag) {\n    return vm.$options._componentTag\n  }\n\n  // injected by vue-loader\n  if (vm.$options.__file) {\n    const unifiedFile = vm.$options.__file.replace(/^[a-zA-Z]:/, '').replace(/\\\\/g, '/')\n    const filename = basename(unifiedFile, '.vue')\n    return filename.replace(COMPONENT_NAME_REGEXP, (_, c) =>\n      c ? c.toUpperCase() : '',\n    )\n  }\n\n  return ANONYMOUS_COMPONENT_NAME\n}\n\nconst build = (to, from, prefix, depth, maxDepth, maxKeys) => {\n  let c = 0\n  for (let key in from) {\n    c += 1\n    if (c > maxKeys) {\n      break\n    }\n    if (typeof from[key] == 'object') {\n      if (maxDepth > depth) {\n        build(to, from[key], prefix + '.' + key, depth + 1, maxDepth, maxKeys)\n      }\n    } else {\n      to[prefix + '.' + key] = from[key]\n    }\n  }\n}\n\nconst setup = (Vue) => {\n  const defaultErrorHandler = Vue.config.errorHandler\n\n  Vue.config.errorHandler = (error, vm, info) => {\n    if (window.Sentry) {\n      const metadata = {}\n\n      let obj = vm\n      if (vm._original) {\n        obj = vm._original\n      }\n\n      if (obj) {\n\n        try {\n          metadata.componentName = getComponentName(obj)\n          build(metadata, JSON.parse(JSON.stringify(obj.$options.propsData)), 'props', 0, 2, 10)\n        } catch (_oO) {\n          console.log('Unable to extract metadata from Vue component.')\n        }\n      }\n\n      if (info) {\n        metadata.lifecycleHook = info\n      }\n\n      // Capture exception in the next event loop, to make sure that all breadcrumbs are recorded in time.\n      setTimeout(() => {\n        window.Sentry.getCurrentHub().withScope(scope => {\n          scope.setContext('vue', metadata)\n          window.Sentry.getCurrentHub().captureException(error)\n        })\n      })\n    }\n\n    if (typeof defaultErrorHandler === 'function') {\n      defaultErrorHandler.call(Vue, error, vm, info)\n    }\n\n    if (Vue.util) {\n      Vue.util.warn(`Error in ${info}: \"${error.toString()}\"`, vm)\n    }\n    console.error(error)\n  }\n}\n\nexport default setup\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},[_c('b-spinner')],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"wrapper\">\n    <b-spinner />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'LoadingPlaceholder',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  margin: 5rem\n  text-align: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoadingPlaceholder.vue?vue&type=template&id=18d7f03c&scoped=true&\"\nimport script from \"./LoadingPlaceholder.vue?vue&type=script&lang=js&\"\nexport * from \"./LoadingPlaceholder.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoadingPlaceholder.vue?vue&type=style&index=0&id=18d7f03c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"18d7f03c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('svg',_vm._b({},'svg',_vm.$attrs,false),[_c('use',{attrs:{\"xlink:href\":_vm.syndicateAwareHref}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <svg v-bind=\"$attrs\">\n    <use :xlink:href=\"syndicateAwareHref\" />\n  </svg>\n</template>\n\n<script>\nexport default {\n  name: 'SyndicateAwareSVG',\n  props: ['href'],\n  computed: {\n    syndicateAwareHref() {\n      return this.$syndicate === 'base' ? this.href : `#${this.$syndicate}-${this.href.slice(1)}`;\n    },\n  },\n};\n</script> ","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SyndicateAwareSVG.vue?vue&type=template&id=2c76d918&\"\nimport script from \"./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"\nexport * from \"./SyndicateAwareSVG.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","export const syndicateTextConstant = {\n  base:{\n    brandName: 'Obico',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  yumi:{\n    brandName: 'Yumi',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  mintion:{\n    brandName: 'Mintion',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  kingroon:{\n    brandName: 'Kingroon',\n    docRoot: 'https://docs.kingroon.com/docs',\n    appRoot: 'https://app.kingroon.com',\n  },\n  jusprin:{\n    brandName: 'JusPrin',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://app.obico.io',\n  },\n  jusprinv2:{\n    brandName: 'JusPrin',\n    docRoot: 'https://www.obico.io/docs',\n    appRoot: 'https://jusprinv2.obico.io',\n  },\n};\n","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport VueSwal from '@src/lib/vue-swal'\nimport { BootstrapVue } from 'bootstrap-vue'\nimport '@mdi/font/css/materialdesignicons.css'\nimport Sticky from 'vue-sticky-directive'\nimport VueMoment from 'vue-moment'\nimport '@src/lib/filters'\nimport setupSentry from '@src/lib/sentry'\nimport { initTheme } from '@src/lib/color-scheme-controller'\nimport VuePluralize from 'vue-pluralize'\nimport OnoffToggle from 'vue-onoff-toggle'\nimport LoadScript from 'vue-plugin-load-script'\nimport LoadingPlaceholder from '@src/components/LoadingPlaceholder.vue'\nimport SyndicateAwareSVG from '@src/components/SyndicateAwareSVG.vue'\nimport moment from 'moment'\n\nimport { library } from '@fortawesome/fontawesome-svg-core'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport I18NextVue from \"i18next-vue\";\nimport {\n  faStar,\n  faFileCode,\n  faCalendarDays,\n  faChartPie,\n  faMoneyCheckDollar,\n  faCircleQuestion,\n  faBell,\n  faCog,\n  faCirclePause,\n  faCirclePlay,\n  faCircleXmark,\n  faPowerOff,\n  faGear,\n  faRotateRight,\n  faLayerGroup,\n  faChevronDown,\n  faRulerVertical,\n  faCheck\n} from '@fortawesome/free-solid-svg-icons'\nimport { faDiscord } from '@fortawesome/free-brands-svg-icons'\nimport { syndicate } from '@src/lib/page-context'\nimport { syndicateTextConstant } from '@src/config/syndicateText'\nimport { getLocalPref } from '@src/lib/pref'\nimport i18next from '@src/i18n/i18n.js'\n\nVue.prototype.$syndicate = syndicate().name\nVue.prototype.$syndicateText = syndicateTextConstant[syndicate().name||'base'] || syndicateTextConstant.base\n\nexport default (store, routes, components) => {\n  initTheme()\n  setupSentry(Vue)\n  Vue.use(VueRouter)\n  Vue.use(BootstrapVue)\n  Vue.use(VueSwal)\n  Vue.use(Sticky)\n  Vue.use(VueMoment)\n  Vue.use(VuePluralize)\n  Vue.use(OnoffToggle)\n  Vue.use(LoadScript)\n  Vue.use(I18NextVue, { i18next });\n  Vue.mixin({\n    methods: {\n      errorDialog: function (errorObj, userMessage) {\n        console.error('logError', errorObj)\n        if (userMessage) {\n          this.$swal.Reject.fire({\n            title: `${this.$i18next.t('Error')}`,\n            html: `<p style=\"line-height: 1.5; max-width: 400px; margin: 0 auto;\">\n              ${userMessage}.\n              ${this.$i18next.t(\"Get help from\")} <a href=\"https://obico.io/discord-obico-klipper\">${this.$i18next.t(\"the {brandName} for Klipper support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"or\")} <a href=\"https://obico.io/discord\">${this.$i18next.t('the {brandName} general support forum',{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"if this error persists.\")}\n            </p>`,\n            showConfirmButton: false,\n            showCancelButton: true,\n            cancelButtonText: 'Close',\n          })\n        }\n      },\n      getDocUrl(path) {\n        return this.$syndicateText.docRoot + path;\n      },\n      getAppUrl(path) {\n        if(path)\n          return this.$syndicateText.appRoot + path;\n        else\n        return this.$syndicateText.appRoot;\n      }\n    },\n  })\n\n  const router = new VueRouter({\n    mode: 'history',\n    routes,\n  })\n\n  // Apply saved language preference on navigation\n  router.beforeEach((to, from, next) => {\n    const savedLanguage = getLocalPref('user-language', null)\n\n    if (savedLanguage && savedLanguage !== i18next.language) {\n      i18next.changeLanguage(savedLanguage)\n    }\n\n    next()\n  })\n\n  Vue.component('LoadingPlaceholder', LoadingPlaceholder)\n  Vue.component('SyndicateAwareSVG', SyndicateAwareSVG)\n\n  library.add(\n    faStar,\n    faFileCode,\n    faCalendarDays,\n    faChartPie,\n    faMoneyCheckDollar,\n    faCircleQuestion,\n    faBell,\n    faCog,\n    faDiscord,\n    faRotateRight,\n    faCirclePause,\n    faCirclePlay,\n    faCircleXmark,\n    faPowerOff,\n    faGear,\n    faLayerGroup,\n    faChevronDown,\n    faRulerVertical,\n    faCheck\n  )\n  Vue.component('FontAwesomeIcon', FontAwesomeIcon)\n\n  if (document.getElementById('app')) {\n    window.app = new Vue({\n      store,\n      router,\n      components,\n    }).$mount('#app')\n  }\n\n  // FIXME: make start of the week dynamic when/if it will be done in the backend\n  moment.updateLocale('en', {\n    week: {\n      dow: 0, // Sunday is the first day of the week.\n    },\n  })\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[(_vm.user)?_c('b-col',{staticClass:\"mt-3\",attrs:{\"lg\":\"8\"}},[(_vm.printersToShow.length === 0)?_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"mx-auto\"},[_vm._v(_vm._s(_vm.$t(\"Welcome To\"))+\" \"+_vm._s(_vm.$syndicateText.brandName))])]),_c('b-row',[_c('b-col',[_c('hr')])],1),(_vm.isEnt && _vm.trialDaysLeft > 0)?_c('b-row',[_c('b-col',[(_vm.trialDaysLeft >= 29)?_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Your 30-Day {localizedDom} Free Trial Has Started!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(_vm._s(_vm.$t(\"Pro Plan\")))])]},proxy:true}],null,false,2641834975)})],1):_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(_vm._s(_vm.$t(\"Pro Plan\"))+\" \")])]},proxy:true},{key:\"trialDaysLeft\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.trialDaysLeft)+\" \")]},proxy:true}],null,false,1171636685)})],1),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to your {platformDisplayName}',{platformDisplayName: _vm.platformDisplayName})))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"Premium 25 FPS Webcam Streaming\")))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"250 AI Failure Detection Hours\")))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t(\"G-Code Remote Upload and Printing\")))])]),_c('div',{staticClass:\"lead py-4\"},[_vm._v(_vm._s(_vm.$t(\"{platformDisplayName} has not been linked to your {brandName} account.\",{platformDisplayName: _vm.platformDisplayName,brandName:_vm.$syndicateText.brandName})))]),_c('div',{staticClass:\"d-flex flex-column align-center justify-content-center\"},[_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.wizardUrl}},[_vm._v(_vm._s(_vm.$t(\"Link {platformDisplayName} Now\",{platformDisplayName: _vm.platformDisplayName})))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"It's as easy as 1-2-3.\"))+\" \")])])])])],1):_vm._e(),_c('div',{staticClass:\"footer-note small\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Not ready to start yet? {localizedDom} to pause your free trial.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"}},[_vm._v(_vm._s(_vm.$t(\"Email us\")))])]},proxy:true}],null,false,51292438)})],1)],1)],1):_c('div',[_c('div',{staticClass:\"text-center\"},[_c('svg',{attrs:{\"width\":\"100\",\"height\":\"30\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-full\"}})])]),(_vm.authorized)?_c('div',{staticClass:\"authorization-successful\"},[_c('h4',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Authorization Successful!\")))]),_c('p',[_vm._v(_vm._s(_vm.$t(\"You can close this page\")))])]):_c('div',[_c('div',[_c('div',{staticClass:\"lead text-center mt-3 mb-5\"},[_vm._v(_vm._s(_vm.$t(\"Tunnel Access Authorization\")))]),_c('h4',{staticClass:\"my-4\"},[_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(_vm.appDisplayName))]),_vm._v(\" \"+_vm._s(_vm.$t('is requesting to access you {platformDisplayName} Tunnel.',{platformDisplayName: _vm.platformDisplayName}))+\" \")]),_c('p',{staticClass:\"text-muted\"},[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.platformDisplayName)+\" \"+_vm._s(_vm.$t(\"Tunnel\")))]),_c('i18next',{attrs:{\"translation\":_vm.$t('is a secure way provided by {localizedDom} to remotely access your {platformDisplayName}. With the {platformDisplayName} Tunnel, you can use {appDisplayName} to access your {platformDisplayName} from anywhere.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://www.obico.io/\",\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$syndicateText.brandName))])]},proxy:true},{key:\"platformDisplayName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.platformDisplayName)+\" \")]},proxy:true},{key:\"appDisplayName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.appDisplayName)+\" \")]},proxy:true}],null,false,145365998)})],1),(!_vm.user.is_pro)?_c('b-alert',{staticClass:\"my-3\",attrs:{\"variant\":\"warning\",\"dismissible\":\"\",\"show\":\"\"}},[_c('div',[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t('Tunnel usage of a free account is {localizedDom} to enjoy unlimited tunnel usage.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"capped at 300MB per month\")))]),_vm._v(\". \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,2385482320)})],1)]):_vm._e(),(_vm.user.is_pro && _vm.trialDaysLeft > 0)?_c('b-alert',{staticClass:\"my-3\",attrs:{\"variant\":\"warning\",\"dismissible\":\"\",\"show\":\"\"}},[_c('div',[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t('After the Free trial expires, tunnel data usage will be {localizedDom} to continue enjoying unlimited tunnel usage.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"capped at 300MB per month\")))]),_vm._v(\". \"+_vm._s(_vm.$t(\"You can\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,2385482320)})],1)]):_vm._e(),_c('div',{staticClass:\"mt-5\"},[_c('p',{staticClass:\"lead\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Tunnel access by {localizedDom} (make sure you trust it)')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(_vm.appDisplayName))])]},proxy:true}],null,false,460061086)})],1),(_vm.printersToShow.length === 0)?_c('h5',[_vm._v(_vm._s(_vm.$t(\"You have 0 active printers\")))]):(_vm.printersToShow.length === 1)?_c('h5',{staticClass:\"font-weight-bold\"},[_vm._v(\" \"+_vm._s(_vm.printersToShow[0].name)+\" \")]):(_vm.printersToShow.length > 1)?_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printerToAuthorize),expression:\"printerToAuthorize\"}],staticClass:\"custom-select\",on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.printerToAuthorize=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":null}},[_vm._v(_vm._s(_vm.$t(\"Please select a printer\")))]),_vm._l((_vm.printersToShow),function(printer){return _c('option',{key:printer.id,domProps:{\"value\":printer.id}},[_vm._v(\" \"+_vm._s(printer.name)+\" \")])})],2):_vm._e(),(_vm.printersToShow.length)?_c('div',{staticClass:\"d-flex mt-4 mb-3\"},[_c('button',{staticClass:\"btn btn-primary\",staticStyle:{\"flex\":\"1\"},attrs:{\"disabled\":!_vm.printerToAuthorize || _vm.performingAuthRequest},on:{\"click\":_vm.authorize}},[(_vm.performingAuthRequest)?_c('b-spinner',{attrs:{\"small\":\"\",\"label\":\"Loading...\"}}):_c('span',[_vm._v(_vm._s(_vm.$t(\"Authorize\")))])],1),_c('a',{staticClass:\"btn btn-outline-secondary ml-2\",staticStyle:{\"flex\":\"1\"},attrs:{\"href\":\"/user_preferences/authorized_apps\"}},[_vm._v(_vm._s(_vm.$t(\"Manage Apps\")))])]):_vm._e()])],1),_c('div',{staticClass:\"mt-4\"},[_c('p',{staticClass:\"text-muted small mb-1\"},[_vm._v(_vm._s(_vm.$t(\"Security notes\"))+\":\")]),_c('ul',{staticClass:\"text-muted small pl-4\"},[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The app can only access the tunnel, not your {brandName} account info such as your email address.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The access remains valid until explicitly revoked. You can revoke the access by going to Preferences -> Authorized Apps.\"))+\" \")])])])])]),_c('div',{staticClass:\"text-center pt-3 w-100\"},[_c('a',{staticClass:\"btn btn-secondary\",attrs:{\"href\":_vm.logoutUrl}},[_vm._v(_vm._s(_vm.$t(\"Log Out\")))])])]):_c('b-col',{staticClass:\"mt-5\"},[_c('div',[_c('b-container',[_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":_vm.appLogo}}),_c('h3',[_vm._v(\"⇄\")]),_c('svg',{staticClass:\"logo-icon obico\"},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})]),_c('h3',[_vm._v(\"⇄\")]),_c('img',{staticClass:\"logo-icon\",attrs:{\"src\":_vm.platformLogo}})]),_c('div',{staticClass:\"my-4\"},[_c('div',{staticClass:\"mx-auto text-center\"},[_c('h4',[_vm._v(_vm._s(_vm.$t(\"Free {platformDisplayName} Tunnel\",{platformDisplayName: _vm.platformDisplayName})))]),_c('div',{staticClass:\"lead\"},[_vm._v(_vm._s(_vm.$t(\"Powered by {brandName}\",{brandName:_vm.$syndicateText.brandName})))])])]),_c('div',{staticClass:\"account-details\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"With the Free {platformDisplayName} Tunnel by {brandName}, you can now use {appDisplayName} to\",{platformDisplayName: _vm.platformDisplayName,brandName:_vm.$syndicateText.brandName,appDisplayName: _vm.appDisplayName}))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"securely control and monitor your printer from anywhere\")))])]),_c('ul',{staticClass:\"text-muted\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"Unlimited realtime webcam at 0.1FPS.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"300MB monthly tunnel data cap (excluding webcam streaming).\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"10 hours/mo AI failure detection.\")))])]),_c('div',[_vm._v(\" 🔥🔥🔥 \"),_c('i18next',{attrs:{\"translation\":_vm.$t('Upgrade to {brandName} Pro Account ({localizedDom}) to get premium features')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"from $4/mo\")))])]},proxy:true},{key:\"brandName\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")]},proxy:true}])})],1),_c('ul',[_c('li',[_vm._v(\"📷\"+_vm._s(_vm.$t(\"Unlimited realtime webcam streaming.\")))]),_c('li',[_vm._v(\"📶 \"+_vm._s(_vm.$t(\"Unlimited tunnel data usage.\")))]),_c('li',[_vm._v(\"🤖 \"+_vm._s(_vm.$t(\"50 hours/mo AI failure detection.\")))]),_c('li',[_c('a',{attrs:{\"href\":_vm.getAppUrl('/ent_pub/pricing/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"And much more...\")))])])])]),_c('div',[_c('div',{staticClass:\"my-5 w-100\"},[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"href\":_vm.loginUrl}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN \")))]),_c('div',{staticClass:\"text-center pt-3 w-100\"},[_c('div',{staticClass:\"font-weight-light text-muted\"},[_vm._v(_vm._s(_vm.$t(\"- OR -\")))]),_c('a',{staticClass:\"btn\",attrs:{\"href\":_vm.signupUrl}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))])])])])])],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import moment from 'moment'\n\nexport const humanizedDuration = (durationInSeconds) => {\n  const seconds = Math.round(durationInSeconds || 0)\n  const components = getDurationComponents(seconds)\n\n  if (components.days !== 0) {\n    const hoursRounded = components.hours + Math.round(components.minutes / 60)\n    if (hoursRounded === 24) {\n      return `${components.days + 1}d ${0}h`\n    } else {\n      return `${components.days}d ${hoursRounded}h`\n    }\n  } else if (components.hours !== 0) {\n    if (components.minutes === 60) {\n      const hoursRounded = components.hours + 1\n      if (hoursRounded === 24) {\n        return `${1}d ${0}h`\n      } else {\n        return `${components.hours + 1}h ${0}m`\n      }\n    } else {\n      return `${components.hours}h ${components.minutes}m`\n    }\n  } else {\n    return `${components.minutes}m`\n  }\n}\n\nexport const getDurationComponents = (durationInSeconds) => {\n  const duration = moment.duration(durationInSeconds || 0, 'seconds')\n  const days = Math.floor(duration.asDays())\n  const hours = duration.hours()\n  const minutes = duration.minutes() + Math.round(duration.seconds() / 60)\n  return {\n    days,\n    hours,\n    minutes,\n  }\n}\n\nexport const humanizedFilamentUsage = (millimeters) => {\n  const meters = (millimeters || 0) / 1000\n  const twoDecimal = Math.round(meters * 100) / 100\n  return `${twoDecimal}m`\n}\n\nexport const timeFromNow = (duration, timeFormat = 'MMM D, h:mm a') => {\n  if (!duration) {\n    return '-'\n  }\n  let date = new Date()\n  let newDate = new Date(date.setSeconds(date.getSeconds() + duration))\n  return moment(newDate).format(timeFormat)\n}\n","import * as formatters from '@src/lib/formatters'\nimport i18n from '@src/i18n/i18n.js'\n\nexport const gcodeMetadata = [\n  {\n    name: 'estimated_time',\n    faIcon: 'fas fa-clock',\n    title: `${i18n.t('Print duration estimate')}`,\n    formatter: formatters.humanizedDuration,\n  },\n  {\n    name: 'filament_total',\n    faIcon: 'fas fa-ruler-horizontal',\n    title: `${i18n.t('Filament usage estimate')}`,\n    formatter: formatters.humanizedFilamentUsage,\n  },\n  {\n    name: 'first_layer_bed_temp',\n    svgIcon: 'bed-temp',\n    title: `${i18n.t('First layer bed temperature')}`,\n    formatter: (v) => `${v}°C`,\n  },\n  {\n    name: 'first_layer_extr_temp',\n    svgIcon: 'extruder',\n    title: `${i18n.t('First layer extruder temperature')}`,\n    formatter: (v) => `${v}°C`,\n  },\n  {\n    name: 'first_layer_height',\n    faIcon: 'fas fa-layer-group',\n    title: `${i18n.t('First layer height')}`,\n    formatter: (v) => `${v}mm`,\n  },\n  {\n    name: 'layer_height',\n    faIcon: 'fas fa-layer-group',\n    title: `${i18n.t('Layer height')}`,\n    formatter: (v) => `${v}mm`,\n  },\n  {\n    name: 'object_height',\n    faIcon: 'fas fa-ruler-vertical',\n    title: `${i18n.t('Object height')}`,\n    formatter: (v) => `${Math.round(v)}mm`,\n  },\n  {\n    name: 'filament_type',\n    svgIcon: 'filament',\n    title: `${i18n.t('Filament type')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'filament_name',\n    svgIcon: 'filament',\n    title: `${i18n.t('Filament name')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'slicer',\n    svgIcon: 'slicer-program',\n    title: `${i18n.t('Slicer')}`,\n    formatter: (v) => v,\n  },\n  {\n    name: 'slicer_version',\n    svgIcon: 'slicer-version',\n    title: `${i18n.t('Slicer version')}`,\n    formatter: (v) => v,\n  },\n]\n","import Vue from 'vue'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport i18n from '@src/i18n/i18n.js'\n\nconst TRANSIENT_STATES = {\n  'G-Code Downloading': {\n    fromStates: ['Operational'],\n  },\n  Starting: {\n    fromStates: ['Operational'],\n  },\n  Pausing: {\n    fromStates: ['Printing'],\n  },\n  Resuming: {\n    fromStates: ['Paused'],\n  },\n  Cancelling: {\n    fromStates: ['Printing', 'Paused'],\n  },\n}\n\nexport const setPrinterTransientState = (printer, transientStateName) => {\n  const printerId = printer.id\n  if (!isLocalStorageSupported()) return\n  const prefix = `printer-${printerId}-state-transitioning`\n  localStorage.setItem(`${prefix}-name`, transientStateName)\n\n  const currentTime = new Date()\n  // Agents in older versions didn't have all transient states implemented. So we make it more forgiving even if it increases the chance for app to be stuck in a transient state.\n  const timeOutInSeconds = printer.isAgentVersionGte('2.3.7', '1.4.2') ? 15 : 5 * 60\n  const timeout = new Date(currentTime.getTime() + timeOutInSeconds * 1000)\n  localStorage.setItem(`${prefix}-timeout`, timeout)\n}\n\nexport const getPrinterCalculatedState = (printer, underlinedState) => {\n  const printerId = printer.id\n\n  if (!isLocalStorageSupported()) return underlinedState\n\n  if (!underlinedState) {\n    // Printer is offline or disconnected, clear transient state if any\n    clearPrinterTransientState(printerId)\n    return null\n  }\n\n  const prefix = `printer-${printerId}-state-transitioning`\n  const persistedTransientState = localStorage.getItem(`${prefix}-name`)\n  const timeout = localStorage.getItem(`${prefix}-timeout`)\n  const fromStates = TRANSIENT_STATES[persistedTransientState]?.fromStates\n\n  let calculatedState = underlinedState\n  if (persistedTransientState && timeout && fromStates) {\n    if (fromStates.includes(underlinedState)) {\n      if (new Date() > new Date(timeout)) {\n        clearPrinterTransientState(printerId)\n        showTimeoutError(printer, persistedTransientState, underlinedState)\n      } else {\n        // underlinedState is still the previous state. Transition not finished\n        calculatedState = persistedTransientState\n      }\n    } else {\n      clearPrinterTransientState(printerId)\n    }\n  }\n\n  return calculatedState\n}\n\nexport const clearPrinterTransientState = (printerId) => {\n  if (!isLocalStorageSupported()) return\n  localStorage.removeItem('printer-' + printerId + '-state-transitioning-name')\n  localStorage.removeItem('printer-' + printerId + '-state-transitioning-timeout')\n}\n\nexport const showTimeoutError = (printer, localTransientState, newPrinterState) => {\n  window.Sentry?.captureMessage(\n    `Transient state timeout: \"${localTransientState}\" -> \"${newPrinterState}\" (printer ID: ${printer.id})`\n  )\n\n  Vue.swal\n    .fire({\n      icon: 'error',\n      title: `${i18n.t('Printer not responding')}`,\n      html: `${i18n.t(\"The printer doesn't seem to be responding. Is it powered on and connected to the Internet? Please\")} <a href=\"mailto:support@obico.io\">${i18n.t(\"report the problem to us\")}</a> ${i18n.t(\"if this error repeats multiple times.\")}`,\n    })\n    .then(() => {\n      window.location.reload()\n    })\n}\n","import moment from 'moment'\nimport get from 'lodash/get'\nimport filesize from 'filesize'\nimport semverGte from 'semver/functions/gte'\nimport { humanizedDuration } from '@src/lib/formatters'\nimport { gcodeMetadata } from '@src/components/g-codes/gcode-metadata'\nimport {\n  setPrinterTransientState,\n  getPrinterCalculatedState,\n} from '@src/lib/printer-transient-state'\n\nexport const toMomentOrNull = (datetimeStr) => {\n  if (!datetimeStr) {\n    return null\n  }\n  return moment(datetimeStr)\n}\n\nexport const PrintStatus = {\n  Printing: { key: 'printing', title: 'Printing...', isActive: true },\n  Paused: { key: 'paused', title: 'Paused', isActive: true },\n  Finished: { key: 'finished', title: 'Finished', isActive: false },\n  Cancelled: { key: 'cancelled', title: 'Cancelled', isActive: false },\n}\n\n// ––––––––––––––––––––––\n\nexport const normalizedPrint = (print) => {\n  print.started_at = toMomentOrNull(print.started_at)\n  print.uploaded_at = toMomentOrNull(print.uploaded_at)\n  print.finished_at = toMomentOrNull(print.finished_at)\n  print.cancelled_at = toMomentOrNull(print.cancelled_at)\n  print.ended_at = toMomentOrNull(print.ended_at)\n  if (print.ended_at) {\n    const duration = moment.duration(print.ended_at.diff(print.started_at))\n    print.duration = humanizedDuration(duration.asSeconds())\n  }\n  print.has_alerts = Boolean(print.alerted_at)\n  print.printShotFeedbackEligible =\n    print.printshotfeedback_set && print.printshotfeedback_set.length > 0\n  print.status = print.ended_at\n    ? print.cancelled_at\n      ? PrintStatus.Cancelled\n      : PrintStatus.Finished\n    : print.paused_at\n    ? PrintStatus.Paused\n    : PrintStatus.Printing\n  if (print.printer) {\n    print.printer = normalizedPrinter(print.printer)\n  }\n  if (print.g_code_file) {\n    print.g_code_file = normalizedGcode(print.g_code_file)\n  }\n  return print\n}\n\nexport const normalizedGcode = (gcode) => {\n  if (!gcode) {\n    return\n  }\n\n  gcode.created_at = toMomentOrNull(gcode.created_at)\n  gcode.updated_at = toMomentOrNull(gcode.updated_at)\n  gcode.deleted = toMomentOrNull(gcode.deleted)\n  gcode.filesize = filesize(gcode.num_bytes)\n\n  if (gcode.print_set) {\n    gcode.print_set.map((p) => normalizedPrint(p))\n    gcode.print_set.sort((a, b) => {\n      if (!a.ended_at && !b.ended_at) {\n        // if both in progress, sort by started_at\n        if (a.started_at > b.started_at) {\n          return -1\n        } else if (a.started_at < b.started_at) {\n          return 1\n        } else {\n          return 0\n        }\n      } else if (!a.ended_at) {\n        return -1\n      } else if (!b.ended_at) {\n        return 1\n      } else {\n        if (a.ended_at > b.ended_at) {\n          return -1\n        } else if (a.ended_at < b.ended_at) {\n          return 1\n        } else {\n          return 0\n        }\n      }\n    })\n    gcode.last_print = gcode.print_set[0]\n\n    gcode.failedPrints = gcode.print_set.filter((p) => p.cancelled_at).length\n    gcode.successPrints = gcode.print_set.filter((p) => p.finished_at).length\n    gcode.totalPrints = gcode.print_set.length\n  }\n\n  // Normalize metadata\n  gcode.metadata = {}\n\n  if (gcode.metadata_json) {\n    // obico file with metadata\n    gcode.metadata = JSON.parse(gcode.metadata_json)\n  } else if (gcode.analysis) {\n    // octoprint file\n    gcode.metadata.object_height = gcode.analysis.dimensions?.height\n    gcode.metadata.estimated_time = gcode.analysis.estimatedPrintTime\n\n    let filament_total\n    if (gcode.analysis.filament) {\n      const tools = Object.keys(gcode.analysis.filament)\n      if (tools.length) {\n        filament_total = 0\n        tools.forEach((key) => {\n          filament_total += gcode.analysis.filament[key].length\n        })\n      }\n    }\n    gcode.metadata.filament_total = filament_total\n  } else {\n    // either obico file without metadata or klipper file\n    gcodeMetadata.forEach((v) => {\n      if (gcode[v.name]) {\n        gcode.metadata[v.name] = gcode[v.name]\n      }\n    })\n  }\n\n  // leave only non-null metadata\n  Object.keys(gcode.metadata).forEach((key) => {\n    if (gcode.metadata[key] === null || gcode.metadata[key] === undefined) {\n      delete gcode.metadata[key]\n    }\n  })\n\n  // Normalize thumbnail\n  gcode.getBigThumbnailUrl = () => {\n    return gcode.thumbnail1_url || gcode.thumbnail2_url || gcode.thumbnail3_url\n  }\n  gcode.getSmallThumbnailUrl = () => {\n    return gcode.thumbnail3_url || gcode.thumbnail2_url || gcode.thumbnail1_url\n  }\n\n  return gcode\n}\n\nexport const normalizedGcodeFolder = (folder) => {\n  folder.created_at = toMomentOrNull(folder.created_at)\n  folder.updated_at = toMomentOrNull(folder.updated_at)\n  folder.numItems = folder.g_code_file_count + folder.g_code_folder_count\n  return folder\n}\n\nexport const normalizedPrinter = (newData, oldData) => {\n  const printerMixin = {\n    createdAt: function () {\n      return toMomentOrNull(this.created_at)\n    },\n    progressCompletion: function () {\n      return get(this, 'status.progress.completion', 0)\n    },\n    isOffline: function () {\n      return get(this, 'status', null) === null\n    },\n    isPaused: function () {\n      return get(this, 'status.state.flags.paused', false)\n    },\n    isDisconnected: function () {\n      return get(this, 'status.state.flags.closedOrError', true)\n    },\n    isActive: function () {\n      const flags = get(this, 'status.state.flags')\n      // https://discord.com/channels/704958479194128507/705047010641838211/1013193281280159875\n      return (\n        Boolean(flags && flags.operational && (!flags.ready || flags.paused)) ||\n        this.inTransientState()\n      )\n    },\n    inTransientState: function () {\n      const calculatedState = this.calculatedState()\n      // Backward compatibility with OctoPrint-Obico 2.3.7 - 2.3.9\n      if (calculatedState === 'Downloading G-Code') {\n        return true\n      }\n\n      return calculatedState && calculatedState.endsWith('ing') && calculatedState !== 'Printing'\n    },\n    calculatedState: function () {\n      return getPrinterCalculatedState(this, this.status?.state?.text)\n    },\n    calculatedStateColor: function () {\n      const calcState = this.calculatedState()\n      const colorMapping = {\n        secondary: ['Offline', undefined, null],\n        success: ['Operational'],\n        neutral: ['Printing', 'G-Code Downloading', 'Downloading G-Code', 'Starting'],\n        warning: ['Paused', 'Pausing', 'Resuming'],\n        danger: ['Cancelling'],\n      }\n\n      for (const [color, states] of Object.entries(colorMapping)) {\n        if (states.includes(calcState)) {\n          return color\n        }\n      }\n      return 'neutral' // fallback\n    },\n    setTransientState: function (stateText) {\n      setPrinterTransientState(this, stateText)\n      if (this.status) this.status = { ...this.status } // clone status to trigger immidiate UI update\n    },\n    inUserInteractionRequired: function () {\n      return get(this, 'status.user_interaction_required', false)\n    },\n    hasError: function () {\n      return (\n        get(this, 'status.state.flags.error') ||\n        get(this, 'status.state.text', '').toLowerCase().includes('error')\n      )\n    },\n    isAgentMoonraker: function () {\n      return get(this, 'agent_name', '') === 'moonraker_obico'\n    },\n    agentDisplayName: function () {\n      return this.isAgentMoonraker() ? 'Klipper' : 'OctoPrint'\n    },\n    isAgentVersionGte: function (minOctoPrintAgentVersion, minMoonrakerAgentVersion) {\n      return (\n        (get(this, 'settings.agent_name', '') === 'octoprint_obico' &&\n          semverGte(get(this, 'settings.agent_version', '0.0.0'), minOctoPrintAgentVersion)) ||\n        (get(this, 'settings.agent_name', '') === 'moonraker_obico' &&\n          semverGte(get(this, 'settings.agent_version', '0.0.0'), minMoonrakerAgentVersion))\n      )\n    },\n    alertUnacknowledged: function () {\n      return (\n        get(this, 'current_print.alerted_at') &&\n        moment(get(this, 'current_print.alerted_at')).isAfter(\n          moment(get(this, 'current_print.alert_acknowledged_at') || 0)\n        )\n      )\n    },\n    // Printing availability\n    isPrintable: function () {\n      return !this.isOffline() && !this.isDisconnected() && !this.isActive() && !this.archived_at\n    },\n    printabilityText: function () {\n      return this.isPrintable() ? 'Ready' : 'Unavailable'\n    },\n  }\n  if (oldData) {\n    if (\n      get(oldData, 'status._ts', -1) > get(newData, 'status._ts', get(oldData, 'status._ts', 0))\n    ) {\n      delete newData.status\n    }\n    return {\n      ...oldData,\n      ...newData,\n      ...printerMixin,\n    }\n  } else {\n    return {\n      ...newData,\n      ...printerMixin,\n    }\n  }\n}\n\nexport const normalizedPrinterEvent = (printerEvent) => {\n  printerEvent.created_at = toMomentOrNull(printerEvent.created_at)\n  return printerEvent\n}\n","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col v-if=\"user\" lg=\"8\" class=\"mt-3\">\n        <div v-if=\"printersToShow.length === 0\" class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h1 class=\"mx-auto\">{{$t(\"Welcome To\")}} {{ $syndicateText.brandName }}</h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row v-if=\"isEnt && trialDaysLeft > 0\">\n              <b-col>\n                <h3 v-if=\"trialDaysLeft >= 29\" class=\"py-3\">\n                  <i18next :translation=\"$t('Your 30-Day {localizedDom} Free Trial Has Started!')\">\n                    <template #localizedDom>\n                      <a class=\"link\" target=\"_blank\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">{{$t(\"Pro Plan\")}}</a>\n                    </template>\n                  </i18next>\n                </h3>\n                <h3 v-else class=\"py-3\">\n                  <i18next :translation=\"$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')\">\n                    <template #localizedDom>\n                      <a class=\"link\" target=\"_blank\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">{{$t(\"Pro Plan\")}} </a>\n                    </template>\n                    <template #trialDaysLeft>\n                      {{trialDaysLeft}}\n                    </template>\n                  </i18next>\n\n                </h3>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\"\n                    >{{ $t('Unlimited Secure Tunnel to your {platformDisplayName}',{platformDisplayName}) }}</span\n                  >\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{$t(\"Premium 25 FPS Webcam Streaming\")}}</span>\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t(\"250 AI Failure Detection Hours\") }}</span>\n                </div>\n                <div class=\"pb-1\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t(\"G-Code Remote Upload and Printing\") }}</span>\n                </div>\n                <div class=\"lead py-4\">{{ $t(\"{platformDisplayName} has not been linked to your {brandName} account.\",{platformDisplayName,brandName:$syndicateText.brandName}) }}</div>\n                <div class=\"d-flex flex-column align-center justify-content-center\">\n                  <div>\n                    <a :href=\"wizardUrl\" class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                      >{{ $t(\"Link {platformDisplayName} Now\",{platformDisplayName}) }}</a\n                    >\n                  </div>\n                  <div>\n                    <div class=\"text-muted mx-auto text-center font-weight-light\">\n                      {{$t(\"It's as easy as 1-2-3.\")}}\n                    </div>\n                  </div>\n                </div>\n              </b-col>\n            </b-row>\n            <div class=\"footer-note small\">\n              <i18next :translation=\"$t('Not ready to start yet? {localizedDom} to pause your free trial.')\">\n                <template #localizedDom>\n                  <a href=\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\">{{$t(\"Email us\")}}</a>\n                </template>\n              </i18next>\n            </div>\n          </b-container>\n        </div>\n        <div v-else>\n          <div class=\"text-center\">\n            <svg width=\"100\" height=\"30\">\n              <use href=\"#svg-logo-full\" />\n            </svg>\n          </div>\n\n          <div v-if=\"authorized\" class=\"authorization-successful\">\n            <h4 class=\"title\">{{ $t(\"Authorization Successful!\") }}</h4>\n            <p>{{ $t(\"You can close this page\") }}</p>\n          </div>\n          <div v-else>\n            <div>\n              <div class=\"lead text-center mt-3 mb-5\">{{ $t(\"Tunnel Access Authorization\") }}</div>\n              <h4 class=\"my-4\">\n                <span class=\"font-weight-bold\">{{appDisplayName}}</span>\n\n                {{ $t('is requesting to access you {platformDisplayName} Tunnel.',{platformDisplayName}) }}\n              </h4>\n              <p class=\"text-muted\">\n                <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/')\" target=\"_blank\">{{platformDisplayName}} {{$t(\"Tunnel\")}}</a>\n                <i18next :translation=\"$t('is a secure way provided by {localizedDom} to remotely access your {platformDisplayName}. With the {platformDisplayName} Tunnel, you can use {appDisplayName} to access your {platformDisplayName} from anywhere.')\">\n                    <template #localizedDom>\n                      <a href=\"https://www.obico.io/\" target=\"_blank\">{{$syndicateText.brandName}}</a>\n                    </template>\n                    <template #platformDisplayName>\n                      {{platformDisplayName}}\n                    </template>\n                    <template #appDisplayName>\n                      {{appDisplayName}}\n                    </template>\n                  </i18next>\n              </p>\n\n              <b-alert v-if=\"!user.is_pro\" variant=\"warning\" dismissible class=\"my-3\" show>\n                <div>\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t('Tunnel usage of a free account is {localizedDom} to enjoy unlimited tunnel usage.')\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\">{{$t(\"capped at 300MB per month\")}}</a>. {{$t(\"You can\")}} <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:$syndicateText.brandName})}}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </b-alert>\n              <b-alert\n                v-if=\"user.is_pro && trialDaysLeft > 0\"\n                variant=\"warning\"\n                dismissible\n                class=\"my-3\"\n                show\n              >\n                <div>\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t('After the Free trial expires, tunnel data usage will be {localizedDom} to continue enjoying unlimited tunnel usage.')\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\">{{$t(\"capped at 300MB per month\")}}</a>. {{$t(\"You can\")}} <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"upgrade to the {brandName} app Pro plan for 1 Starbucks a month\",{brandName:$syndicateText.brandName})}}</a>\n                    </template>\n                  </i18next>\n\n                </div>\n              </b-alert>\n\n              <div class=\"mt-5\">\n                <p class=\"lead\">\n                  <i18next :translation=\"$t('Tunnel access by {localizedDom} (make sure you trust it)')\">\n                    <template #localizedDom>\n                      <span class=\"font-weight-bold\">{{appDisplayName}}</span>\n                    </template>\n                  </i18next>\n                </p>\n                <h5 v-if=\"printersToShow.length === 0\">{{ $t(\"You have 0 active printers\") }}</h5>\n                <h5 v-else-if=\"printersToShow.length === 1\" class=\"font-weight-bold\">\n                  {{ printersToShow[0].name }}\n                </h5>\n                <select\n                  v-else-if=\"printersToShow.length > 1\"\n                  v-model=\"printerToAuthorize\"\n                  class=\"custom-select\"\n                >\n                  <option :value=\"null\" selected disabled>{{ $t(\"Please select a printer\") }}</option>\n                  <option v-for=\"printer in printersToShow\" :key=\"printer.id\" :value=\"printer.id\">\n                    {{ printer.name }}\n                  </option>\n                </select>\n                <div v-if=\"printersToShow.length\" class=\"d-flex mt-4 mb-3\">\n                  <button\n                    class=\"btn btn-primary\"\n                    style=\"flex: 1\"\n                    :disabled=\"!printerToAuthorize || performingAuthRequest\"\n                    @click=\"authorize\"\n                  >\n                    <b-spinner v-if=\"performingAuthRequest\" small label=\"Loading...\"></b-spinner>\n                    <span v-else>{{ $t(\"Authorize\") }}</span>\n                  </button>\n                  <a\n                    class=\"btn btn-outline-secondary ml-2\"\n                    style=\"flex: 1\"\n                    href=\"/user_preferences/authorized_apps\"\n                    >{{ $t(\"Manage Apps\") }}</a\n                  >\n                </div>\n              </div>\n            </div>\n            <div class=\"mt-4\">\n              <p class=\"text-muted small mb-1\">{{ $t(\"Security notes\") }}:</p>\n              <ul class=\"text-muted small pl-4\">\n                <li>\n                  {{ $t(\"The app can only access the tunnel, not your {brandName} account info such as your email address.\",{brandName:$syndicateText.brandName}) }}\n                </li>\n                <li>\n                  {{ $t(\"The access remains valid until explicitly revoked. You can revoke the access by going to Preferences -> Authorized Apps.\") }}\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n        <div class=\"text-center pt-3 w-100\">\n          <a class=\"btn btn-secondary\" :href=\"logoutUrl\">{{ $t(\"Log Out\") }}</a>\n        </div>\n      </b-col>\n      <b-col v-else class=\"mt-5\">\n        <div>\n          <b-container>\n            <div class=\"d-flex justify-content-center align-items-center\">\n              <img class=\"logo-icon\" :src=\"appLogo\" />\n              <h3>&#8644;</h3>\n              <svg class=\"logo-icon obico\">\n                <use href=\"#svg-logo-compact\" />\n              </svg>\n              <h3>&#8644;</h3>\n              <img class=\"logo-icon\" :src=\"platformLogo\" />\n            </div>\n            <div class=\"my-4\">\n              <div class=\"mx-auto text-center\">\n                <h4>{{ $t(\"Free {platformDisplayName} Tunnel\",{platformDisplayName}) }}</h4>\n                <div class=\"lead\">{{ $t(\"Powered by {brandName}\",{brandName:$syndicateText.brandName}) }}</div>\n              </div>\n            </div>\n            <div class=\"account-details\">\n              <p>\n                {{ $t(\"With the Free {platformDisplayName} Tunnel by {brandName}, you can now use {appDisplayName} to\",{platformDisplayName,brandName:$syndicateText.brandName,appDisplayName}) }}\n                  <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#why-is-the-limit-on-free-account-only-100mb')\" target=\"_blank\"> {{$t(\"securely control and monitor your printer from anywhere\")}}</a>\n              </p>\n              <ul class=\"text-muted\">\n                <li>{{ $t(\"Unlimited realtime webcam at 0.1FPS.\") }}</li>\n                <li>{{ $t(\"300MB monthly tunnel data cap (excluding webcam streaming).\") }}</li>\n                <li>{{ $t(\"10 hours/mo AI failure detection.\") }}</li>\n              </ul>\n              <div>\n                🔥🔥🔥\n                <i18next :translation=\"$t('Upgrade to {brandName} Pro Account ({localizedDom}) to get premium features')\">\n                    <template #localizedDom>\n                      <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\">{{$t(\"from $4/mo\")}}</a>\n                    </template>\n                    <template #brandName>\n                      {{$syndicateText.brandName}}\n                    </template>\n                  </i18next>\n              </div>\n              <ul>\n                <li>📷{{ $t(\"Unlimited realtime webcam streaming.\") }}</li>\n                <li>📶 {{ $t(\"Unlimited tunnel data usage.\") }}</li>\n                <li>🤖 {{ $t(\"50 hours/mo AI failure detection.\") }}</li>\n                <li>\n                  <a :href=\"getAppUrl('/ent_pub/pricing/')\" target=\"_blank\"\n                    >{{ $t(\"And much more...\") }}</a\n                  >\n                </li>\n              </ul>\n            </div>\n            <div>\n              <div class=\"my-5 w-100\">\n                <a class=\"btn btn-primary btn-block\" :href=\"loginUrl\">{{ $t(\"SIGN IN \") }}</a>\n                <div class=\"text-center pt-3 w-100\">\n                  <div class=\"font-weight-light text-muted\">{{ $t(\"- OR -\") }}</div>\n                  <a class=\"btn\" :href=\"signupUrl\">{{ $t(\"SIGN UP\") }}</a>\n                </div>\n              </div>\n            </div>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { user, settings } from '@src/lib/page-context'\nimport octopodLogo from '@static/img/octopod.webp'\nimport octoappLogo from '@static/img/octoapp.webp'\nimport polymerLogo from '@static/img/polymer.webp'\nimport printoidLogo from '@static/img/printoid.webp'\nimport mobilerakerLogo from '@static/img/mobileraker.webp'\nimport genericAppLogo from '@static/img/generic-app.png'\nimport octoprintLogo from '@static/img/octoprint_logo.png'\nimport klipperLogo from '@static/img/klipper_logo.jpg'\n\nexport default {\n  name: 'NewOctoPrintTunnelPage',\n\n  components: {},\n\n  data() {\n    return {\n      user: null,\n      printers: [],\n      printerId: null,\n      printerToAuthorize: null,\n      performingAuthRequest: false,\n      authorized: false,\n    }\n  },\n\n  computed: {\n    printersToShow() {\n      return this.printerId\n        ? this.printers.filter((printer) => printer.id == this.printerId)\n        : this.printers\n    },\n    loginUrl() {\n      return `/accounts/login/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    logoutUrl() {\n      return `/accounts/logout/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    signupUrl() {\n      return `/accounts/signup/?hide_navbar=true&next=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    wizardUrl() {\n      return `/printers/wizard/?redirectToTunnelCreation=${encodeURIComponent(\n        window.location.pathname + window.location.search\n      )}`\n    },\n    appName() {\n      return new URLSearchParams(window.location.search).get('app') || 'Unknown App'\n    },\n    platform() {\n      return new URLSearchParams(window.location.search).get('platform')\n    },\n    trialDaysLeft() {\n      if (this.user?.subscription?.plan_id !== 'pro-trial') {\n        return -1\n      }\n      return moment(this.user.subscription.expired_at).diff(moment(), 'days') + 1\n    },\n    appLogo() {\n      switch (this.appName.toLowerCase()) {\n        case 'octopod':\n          return octopodLogo\n        case 'printoid':\n          return printoidLogo\n        case 'polymer':\n          return polymerLogo\n        case 'octoapp':\n          return octoappLogo\n        case 'mobileraker-ios':\n          return mobilerakerLogo\n        case 'mobileraker-android':\n          return mobilerakerLogo\n        default:\n          return genericAppLogo\n      }\n    },\n    appDisplayName() {\n      if (this.appName.toLowerCase().includes('mobileraker')) {\n        return 'Mobileraker'\n      }\n      return this.appName\n    },\n    isKlipper() {\n      if (this.platform) {\n        if (this.platform.toLowerCase() === 'klipper') {\n          return true\n        }\n      } else {\n        if (this.appName.toLowerCase().includes('mobileraker')) {\n          return true\n        }\n      }\n      return false\n    },\n    platformLogo() {\n      return this.isKlipper ? klipperLogo : octoprintLogo\n    },\n    platformDisplayName() {\n      return this.isKlipper ? 'Klipper' : 'OctoPrint'\n    },\n  },\n\n  created() {\n    this.user = user()\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.printerId = new URLSearchParams(window.location.search).get('printer_id')\n    if (this.user) {\n      this.fetchPrinters()\n    }\n  },\n\n  methods: {\n    fetchPrinters() {\n      return axios.get(urls.printers()).then((response) => {\n        response.data.forEach((p) => {\n          this.printers.push(normalizedPrinter(p))\n        })\n        if (this.printersToShow.length == 1) {\n          this.printerToAuthorize = this.printersToShow[0].id\n        }\n      })\n    },\n\n    authorize() {\n      if (this.printersToShow.length) {\n        this.performingAuthRequest = true\n        axios\n          .post(urls.tunnels(), {\n            app_name: this.appName,\n            target_printer_id: this.printerToAuthorize || this.printersToShow[0].id,\n          })\n          .then((response) => {\n            this.authorized = true\n            const tunnelEndpoint = response.data.tunnel_endpoint\n            const redirectUrl =\n              new URLSearchParams(window.location.search).get('success_redirect_url') ||\n              '/tunnels/succeeded/'\n            window.location.replace(`${redirectUrl}?tunnel_endpoint=${tunnelEndpoint}`)\n          })\n          .catch((error) => {\n            this.performingAuthRequest = false\n            this.errorDialog(error)\n          })\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\nbody\n  padding-bottom: 0\n\n.wizard-container\n  padding: 1.5rem 0.6rem 3rem\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 0.5em\n\n.authorization-successful\n  padding-top: 6rem\n  text-align: center\n\n.logo-img\n  max-height: 4em\n  margin-bottom: 2em\n\n.logo-icon\n  max-height: 50px\n  max-width: 50px\n  margin: 0px 15px\n  border-radius: 50%\n  object-fit: cover\n\n  &.obico\n    max-width: 46px\n    color: var(--color-primary)\n\n.account-details\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-sm)\n  padding: 15px\n  margin-left: -15px\n  margin-right: -15px\n\n.footer-note\n  margin: 3rem 0 -1.5rem\n  text-align: right\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NewOctoPrintTunnelPage.vue?vue&type=template&id=b30f9c60&scoped=true&\"\nimport script from \"./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nexport * from \"./NewOctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewOctoPrintTunnelPage.vue?vue&type=style&index=0&id=b30f9c60&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b30f9c60\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.isPro && _vm.usageFetched)?_c('div',{staticClass:\"floating-panel\"},[(_vm.showDetails)?_c('div',{on:{\"click\":function($event){_vm.showDetails = false},\"mouseover\":function($event){_vm.showDetails = true},\"mouseleave\":function($event){_vm.showDetails = false}}},[_c('div',{staticClass:\"text-muted\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Monthly data usage ({localizedDom})')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Resets in {daysUntilReset} days\",{daysUntilReset: _vm.daysUntilReset})))])]},proxy:true}],null,false,1207903965)})],1),_c('div',{class:_vm.usageClass},[_vm._v(_vm._s(_vm.$t(\"Used {usageMTD} of {humanizedUsageCap}.\",{usageMTD: _vm.usageMTD,humanizedUsageCap: _vm.humanizedUsageCap})))]),(_vm.overage)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Your month-to-date tunnel data usage is over the Free plan limit.\"))+\" \"),_c('a',{staticClass:\"btn btn-sm btn-primary\",attrs:{\"type\":\"button\",\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Get Unlimited Tunnel Data\")))])]):_vm._e()]):_c('div',{class:_vm.usageClass,on:{\"click\":function($event){_vm.showDetails = true},\"mouseover\":function($event){_vm.showDetails = true},\"mouseleave\":function($event){_vm.showDetails = false}}},[_vm._v(\" \"+_vm._s(_vm.percentage)+\"% \")])]):_vm._e(),_c('div',[(_vm.printerId)?_c('iframe',{staticClass:\"tunnel-iframe\",attrs:{\"src\":_vm.iframeUrl() + '#temp'}}):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-if=\"!isPro && usageFetched\" class=\"floating-panel\">\n      <div\n        v-if=\"showDetails\"\n        @click=\"showDetails = false\"\n        @mouseover=\"showDetails = true\"\n        @mouseleave=\"showDetails = false\"\n      >\n        <div class=\"text-muted\">\n          <i18next :translation=\"$t('Monthly data usage ({localizedDom})')\">\n            <template #localizedDom>\n              <a :href=\"getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users')\" target=\"_blank\">{{$t(\"Resets in {daysUntilReset} days\",{daysUntilReset})}}</a>\n            </template>\n          </i18next>\n        </div>\n        <div :class=\"usageClass\">{{ $t(\"Used {usageMTD} of {humanizedUsageCap}.\",{usageMTD,humanizedUsageCap}) }}</div>\n        <div v-if=\"overage\">\n          {{$t(\"Your month-to-date tunnel data usage is over the Free plan limit.\")}}\n          <a type=\"button\" class=\"btn btn-sm btn-primary\" href=\"/ent_pub/pricing/\"\n            >{{ $t(\"Get Unlimited Tunnel Data\") }}</a\n          >\n        </div>\n      </div>\n      <div\n        v-else\n        :class=\"usageClass\"\n        @click=\"showDetails = true\"\n        @mouseover=\"showDetails = true\"\n        @mouseleave=\"showDetails = false\"\n      >\n        {{ percentage }}%\n      </div>\n    </div>\n    <div>\n      <iframe v-if=\"printerId\" :src=\"iframeUrl() + '#temp'\" class=\"tunnel-iframe\"></iframe>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport split from 'lodash/split'\nimport filesize from 'filesize'\nimport urls from '@config/server-urls'\nimport { user } from '@src/lib/page-context'\nimport { isLocalStorageSupported } from '@static/js/utils'\n\nexport default {\n  name: 'OctoPrintTunnelPage',\n\n  components: {},\n\n  props: {},\n  data: function () {\n    return {\n      bytesMTD: null,\n      usageCap: null,\n      usageFetched: false,\n      isPro: true,\n      printerId: null,\n      showDetails: false,\n    }\n  },\n\n  computed: {\n    usageClass() {\n      return {\n        'text-success': this.bytesMTD < this.usageCap * 0.8,\n        'text-warning': this.bytesMTD >= this.usageCap * 0.8 && this.bytesMTD < this.usageCap,\n        'text-danger': this.bytesMTD >= this.usageCap,\n      }\n    },\n    usageMTD() {\n      return filesize(this.bytesMTD)\n    },\n    humanizedUsageCap() {\n      return filesize(this.usageCap)\n    },\n    overage() {\n      return this.bytesMTD >= this.usageCap\n    },\n    percentage() {\n      return Math.round((this.bytesMTD / this.usageCap) * 100)\n    },\n    daysUntilReset() {\n      const endOfMonth = moment().endOf('month')\n      return endOfMonth.diff(moment(), 'days') + 1\n    },\n  },\n\n  created() {\n    this.isPro = user().is_pro\n    this.printerId = split(window.location.pathname, '/').slice(-2, -1).pop()\n  },\n\n  mounted() {\n    const skipWarning = isLocalStorageSupported()\n      ? localStorage.getItem('skip-tunneling-warning')\n      : null\n    if (skipWarning !== 'yes') {\n      this.$swal.Prompt.fire(\n        {\n          html: `\n          <h4 class=\"text-center p-2\">\n            <svg class=\"menu-icon\" style=\"height: 1.1em; width: 1em; margin-right: 0.75em;\">\n              <use href=\"#svg-tunnel\" />\n            </svg>\n            ${this.$i18next.t(\"OctoPrint/Klipper Secure Tunnel\")}\n          </h4>\n          <div class=\"p-1\">\n            ${this.$i18next.t(\"It may take long time for OctoPrint/Mainsail/Fluidd page to load as it is securely tunneled via the {brandName} app server.\",{brandName:this.$syndicateText.brandName})}\n          </div>\n          <div class=\"p-1\">\n            <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/octoprint-tunneling/#is-octoprint-tunneling-free-to-all-users')}\">\n            ${this.$i18next.t(\"Learn more about OctoPrint/Klipper tunnel's security and page load speed.\")}\n            <i class=\"fas fa-external-link-alt\"></i>\n          </a>\n        </div>\n        `,\n          input: 'checkbox',\n          inputPlaceholder: `${this.$i18next.t(\"Don't show again\")}`,\n        },\n        'octoprint-tunnel.warning'\n      ).then((result) => {\n        if (result.isConfirmed) {\n          if (result.value && isLocalStorageSupported()) {\n            localStorage.setItem('skip-tunneling-warning', 'yes')\n          }\n        }\n      })\n\n      // Scale up popup on mobiles, otherwise it's too small (because of disabled meta viewport tag)\n      if (window.matchMedia('(pointer:none), (pointer:coarse)')) {\n        document.querySelector('.swal2-popup').classList.add('x150')\n      }\n    }\n\n    const self = this\n    const fetchUsage = (firstFetch = false) => {\n      axios.get(urls.tunnelUsage()).then((resp) => {\n        self.bytesMTD = resp.data.total\n        self.usageCap = resp.data.monthly_cap\n        if (firstFetch) {\n          self.usageFetched = true\n        }\n      })\n    }\n    setInterval(fetchUsage, 15 * 1000)\n    setTimeout(() => {\n      fetchUsage(true)\n    }, 4000)\n  },\n\n  methods: {\n    iframeUrl() {\n      return `/octoprint/${this.printerId}/`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.tunnel-iframe\n    width: 100%\n    height: 100vh\n    background: var(--color-background)\n    position: absolute\n    top: 0\n    left: 0\n\n.floating-panel\n  position: fixed\n  bottom: 0px\n  right: 0px\n  box-shadow: 2px 2px 10px rgba(0,0,0,.3)\n  background-color: var(--color-surface-primary)\n  padding: 10px\n  max-width: 300px\n  z-index: 10\n  display: flex\n  align-items: center\n</style>\n\n<style lang=\"sass\">\n@media (pointer:none), (pointer:coarse)\n  .swal2-popup.x150\n    transform: scale(1.5)\n  .floating-panel\n    transform: scale(2)\n    transform-origin: right bottom\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./OctoPrintTunnelPage.vue?vue&type=template&id=60f4cf2a&scoped=true&\"\nimport script from \"./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nexport * from \"./OctoPrintTunnelPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./OctoPrintTunnelPage.vue?vue&type=style&index=0&id=60f4cf2a&prod&lang=sass&scoped=true&\"\nimport style1 from \"./OctoPrintTunnelPage.vue?vue&type=style&index=1&id=60f4cf2a&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"60f4cf2a\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"feedback-container\"},[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"lg\":\"8\"}},[_c('div',{staticClass:\"card\"},[_c('h5',{staticClass:\"card-header text-center\"},[_vm._v(\" F \"),_c('i',{staticClass:\"fas fa-search focused-feedback-icon\"}),_vm._v(_vm._s(_vm.$t(\"CUSED FEEDBACK\"))+\" \")]),_c('loading',{attrs:{\"active\":_vm.print === null,\"is-full-page\":true}}),(_vm.print !== null)?_c('div',[(!_vm.print.access_consented_at)?_c('focused-feedback-consent',{attrs:{\"print\":_vm.print},on:{\"continue-btn-pressed\":_vm.consentBtnPressed}}):_c('div',[_c('div',[_c('vue-slick-carousel',{ref:\"carousel\",attrs:{\"arrows\":false,\"dots\":true},on:{\"afterChange\":_vm.onNextShot},scopedSlots:_vm._u([{key:\"customPaging\",fn:function(page){return [_c('div',{class:_vm.pageClass(page)},[_vm._v(\"•\")])]}}],null,false,3226812120)},_vm._l((_vm.shots),function(shot,i){return _c('print-shot-card',{key:i,attrs:{\"shot\":shot},on:{\"shotChanged\":_vm.onShotChanged,\"prev\":_vm.onPrev,\"next\":_vm.onNext}})}),1)],1),_c('br'),_c('div',{staticClass:\"card-body p-3\"},[_c('a',{attrs:{\"href\":`/prints/${_vm.print.id}/`}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Print Page\"))+\" \")])])])],1):_vm._e()],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('img',{staticClass:\"card-img-top\",attrs:{\"src\":_vm.shot.image_url}}),_c('div',{staticClass:\"px-3 pt-4\"},[_c('b-form-group',{attrs:{\"label\":\"Do you see any spaghetti in this picture?\"}},[_c('b-form-radio-group',{attrs:{\"options\":_vm.options},on:{\"change\":_vm.updateShot},model:{value:(_vm.answer),callback:function ($$v) {_vm.answer=$$v},expression:\"answer\"}})],1),_c('small',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Not sure? Look at\"))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#spaghetti-examples')}},[_vm._v(_vm._s(_vm.$t(\"some examples. \"))),_vm._m(0)])]),_c('div',{staticClass:\"navigation-container my-4\",staticStyle:{\"display\":\"flex\"}},[_c('b-button',{attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('prev')}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t(\"Previous\"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('next')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Next\"))+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1)],1)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <img class=\"card-img-top\" :src=\"shot.image_url\" />\n    <div class=\"px-3 pt-4\">\n      <b-form-group label=\"Do you see any spaghetti in this picture?\">\n        <b-form-radio-group\n          v-model=\"answer\"\n          :options=\"options\"\n          @change=\"updateShot\"\n        ></b-form-radio-group>\n      </b-form-group>\n      <small class=\"text-muted\">\n        {{$t(\"Not sure? Look at\")}}\n        <a\n          target=\"_blank\"\n          :href=\"getDocUrl('/user-guides/how-does-credits-work#spaghetti-examples')\"\n          >{{ $t(\"some examples. \") }}<small><i class=\"fas fa-external-link-alt\"></i></small\n        ></a>\n      </small>\n      <div class=\"navigation-container my-4\" style=\"display: flex\">\n        <b-button variant=\"outline-secondary\" @click=\"$emit('prev')\">\n          <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{$t(\"Previous\")}}\n        </b-button>\n\n        <b-button variant=\"outline-secondary\" @click=\"$emit('next')\">\n          {{$t(\"Next\")}}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n        </b-button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\n\nimport urls from '@config/server-urls'\nimport { BFormGroup, BFormRadioGroup } from 'bootstrap-vue'\n\nexport default {\n  name: 'PrintShotCard',\n\n  components: {\n    BFormGroup,\n    BFormRadioGroup,\n  },\n\n  props: {\n    shot: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      answer: this.shot.answer,\n      options: [\n        { text: 'Yes', value: 'LOOKS_BAD' },\n        { text: 'No', value: 'LOOKS_OK' },\n        { text: 'I am not sure', value: 'UNDECIDED' },\n      ],\n    }\n  },\n\n  methods: {\n    updateShot: function (answer) {\n      axios\n        .put(urls.printShotFeedback(this.shot.id, this.shot.print_id), {\n          answer: answer,\n        })\n\n        .then((response) => {\n          const { instance, credited_dhs } = response.data\n\n          if (credited_dhs > 0) {\n            this.$swal.Prompt.fire({\n              title: `${this.$i18next.t('You are awesome!')}`,\n              html: `<p>${this.$i18next.t(\"The AI failure detection just got a little better because of your feedback!\")}</p><p>${this.$i18next.t(\"You just earned 2 non-expirable AI Detection Hours - Yay!\")}</p>`,\n              confirmButtonText: `${this.$i18next.t(\"I'm done!\")}`,\n              showCancelButton: true,\n              cancelButtonText: `${this.$i18next.t('Change feedback')}`,\n            }).then((result) => {\n              if (result.isConfirmed) {\n                window.location.href = '/print_history/'\n              } else {\n                this.$emit('shotChanged', instance)\n              }\n            })\n          } else {\n            this.$emit('shotChanged', instance)\n          }\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.navigation-container\n  display: flex\n  justify-content: space-between\n  align-items: center\n  gap: 1rem\n  margin: -1.5em\n  margin-bottom: .5em\n  padding: 1em 1.5em\n  background-color: var(--color-surface-primary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintShotCard.vue?vue&type=template&id=413ec1b9&scoped=true&\"\nimport script from \"./PrintShotCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintShotCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintShotCard.vue?vue&type=style&index=0&id=413ec1b9&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"413ec1b9\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"page-wrapper\",class:{ collapsed: _vm.collapsed, 'is-in-mobile': _vm.inMobileWebView, 'is-in-popup': _vm.isPopup }},[_c('nav',{staticClass:\"side-nav\"},[_c('a',{staticClass:\"sidebar-header\",attrs:{\"href\":\"/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('ul',{staticClass:\"list-unstyled m-0\"},[(_vm.isEnt && !_vm.user.is_pro)?_c('li',{class:{ active: _vm.path === '/ent_pub/pricing/' }},[_c('a',{staticClass:\"primary\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"star\"}}),_vm._v(\" \"+_vm._s(_vm.$t('Upgrade to'))+\" AI Premium \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/printers/') }},[_c('a',{attrs:{\"href\":\"/printers/\"}},[_c('svg',{staticStyle:{\"margin-bottom\":\"5px\"},attrs:{\"width\":\"1.4em\",\"height\":\"1.4em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})]),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"Printers\"))+\" \")])]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/g_code_') }},[_c('a',{attrs:{\"href\":\"/g_code_folders/cloud/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-file-code\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"G-Codes\"))+\" \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/print_history/') || _vm.path.includes('/prints/') }},[_c('a',{attrs:{\"href\":\"/print_history/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-calendar-days\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Print History\"))+\" \")],1)]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/stats/') }},[_c('a',{attrs:{\"href\":\"/stats/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-chart-pie\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Statistics\"))+\" \")],1)]):_vm._e()]),_c('div',{staticClass:\"side-nav-footer\"},[_c('ul',{staticClass:\"list-unstyled m-0\"},[(_vm.isEnt)?_c('li',{class:{ active: _vm.path === '/ent_pub/pricing/' }},[_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-money-check-dollar\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Pricing\"))+\" \")],1)]):_vm._e(),_c('li',[_c('a',{attrs:{\"href\":\"https://www.obico.io/help/\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-circle-question\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Help\"))+\" \")],1)]),_c('li',[_c('a',{attrs:{\"href\":\"https://obico.io/discord\",\"target\":\"_blank\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-brands fa-discord\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Community\"))+\" \")],1)]),_vm._m(0),(_vm.user)?_c('li',{class:{ active: _vm.path === '/printer_events/' }},[_c('a',{attrs:{\"href\":\"/printer_events/\"}},[_c('div',{staticClass:\"position-relative\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"fas fa-bell\"}}),(_vm.hasUnseenPrinterEvents)?_c('span',{staticClass:\"badge\"},[_vm._v(_vm._s(_vm.unseenPrinterEventsDisplay))]):_vm._e()],1),_c('span',{staticClass:\"trim-text\"},[_vm._v(_vm._s(_vm.$t(\"Notifications\")))])])]):_vm._e(),(_vm.user)?_c('li',{class:{ active: _vm.path.includes('/user_preferences/') }},[_c('a',{attrs:{\"href\":\"/user_preferences/\"}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fas fa-cog\"}}),_c('span',{staticClass:\"trim-text\"},[_vm._v(_vm._s(_vm.$t(\"Preferences\")))])],1)]):_vm._e()])])]),_c('div',{staticClass:\"content-wrapper\",class:{\n      'hide-top-nav': (!_vm.$slots.topBarLeft && !_vm.$slots.topBarRight) || _vm.hideHeader,\n    }},[_c('b-navbar',{staticClass:\"top-nav\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('b-button',{staticClass:\"shadow-none p-0 mr-3 position-relative toggle-sidebar\",attrs:{\"variant\":\"_\"},on:{\"click\":function($event){_vm.collapsed = !_vm.collapsed}}},[_c('i',{staticClass:\"fas fa-bars position-relative\"},[(_vm.hasUnseenPrinterEvents)?_c('div',{staticClass:\"notification-dot\"},[_c('svg',{attrs:{\"width\":\"8px\",\"height\":\"8px\"}},[_c('use',{attrs:{\"href\":\"#svg-circle-icon\"}})])]):_vm._e()])]),_vm._t(\"topBarLeft\")],2),_vm._t(\"topBarRight\")],2),_c('div',{staticClass:\"page-content\"},[_vm._t(\"content\")],2)],1),_c('div',{staticClass:\"content-overlay\",on:{\"click\":function($event){_vm.collapsed = true}}})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('li',[_c('hr',{staticClass:\"my-0 mx-2\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div\n    class=\"page-wrapper\"\n    :class=\"{ collapsed: collapsed, 'is-in-mobile': inMobileWebView, 'is-in-popup': isPopup }\"\n  >\n    <!-- Sidebar -->\n    <nav class=\"side-nav\">\n      <a href=\"/\" class=\"sidebar-header\">\n        <SyndicateAwareSVG href=\"#svg-logo-compact\" width=\"100\" height=\"30\" />\n      </a>\n      <ul class=\"list-unstyled m-0\">\n        <li v-if=\"isEnt && !user.is_pro\" :class=\"{ active: path === '/ent_pub/pricing/' }\">\n          <a href=\"/ent_pub/pricing/\" class=\"primary\">\n            <font-awesome-icon icon=\"star\" />\n            {{ $t('Upgrade to') }} AI Premium\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/printers/') }\">\n          <a href=\"/printers/\">\n            <svg width=\"1.4em\" height=\"1.4em\" style=\"margin-bottom: 5px\">\n              <use href=\"#svg-3d-printer\" />\n            </svg>\n            <br />\n            {{$t(\"Printers\")}}\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/g_code_') }\">\n          <a href=\"/g_code_folders/cloud/\">\n            <font-awesome-icon icon=\"fa-file-code\" />\n            {{$t(\"G-Codes\")}}\n          </a>\n        </li>\n        <li\n          v-if=\"user\"\n          :class=\"{ active: path.includes('/print_history/') || path.includes('/prints/') }\"\n        >\n          <a href=\"/print_history/\">\n            <font-awesome-icon icon=\"fa-calendar-days\" />\n            {{$t(\"Print History\")}}\n          </a>\n        </li>\n        <li v-if=\"user\" :class=\"{ active: path.includes('/stats/') }\">\n          <a href=\"/stats/\">\n            <font-awesome-icon icon=\"fa-chart-pie\" />\n            {{$t(\"Statistics\")}}\n          </a>\n        </li>\n      </ul>\n      <div class=\"side-nav-footer\">\n        <ul class=\"list-unstyled m-0\">\n          <li v-if=\"isEnt\" :class=\"{ active: path === '/ent_pub/pricing/' }\">\n            <a href=\"/ent_pub/pricing/\">\n              <font-awesome-icon icon=\"fa-money-check-dollar\" />\n              {{$t(\"Pricing\")}}\n            </a>\n          </li>\n          <li>\n            <a href=\"https://www.obico.io/help/\" target=\"_blank\">\n              <font-awesome-icon icon=\"fa-circle-question\" />\n              {{$t(\"Help\")}}\n            </a>\n          </li>\n          <li>\n            <a href=\"https://obico.io/discord\" target=\"_blank\">\n              <font-awesome-icon icon=\"fa-brands fa-discord\" />\n              {{$t(\"Community\")}}\n            </a>\n          </li>\n          <li>\n            <hr class=\"my-0 mx-2\" />\n          </li>\n          <li v-if=\"user\" :class=\"{ active: path === '/printer_events/' }\">\n            <a href=\"/printer_events/\">\n              <div class=\"position-relative\">\n                <font-awesome-icon icon=\"fas fa-bell\" />\n                <span v-if=\"hasUnseenPrinterEvents\" class=\"badge\">{{\n                  unseenPrinterEventsDisplay\n                }}</span>\n              </div>\n              <span class=\"trim-text\">{{ $t(\"Notifications\") }}</span>\n            </a>\n          </li>\n          <li v-if=\"user\" :class=\"{ active: path.includes('/user_preferences/') }\">\n            <a href=\"/user_preferences/\">\n              <font-awesome-icon icon=\"fas fa-cog\" />\n              <span class=\"trim-text\">{{ $t(\"Preferences\") }}</span>\n            </a>\n          </li>\n        </ul>\n      </div>\n    </nav>\n    <!-- Main view (with top-bar) -->\n    <div\n      class=\"content-wrapper\"\n      :class=\"{\n        'hide-top-nav': (!$slots.topBarLeft && !$slots.topBarRight) || hideHeader,\n      }\"\n    >\n      <!-- Top-bar -->\n      <b-navbar class=\"top-nav\">\n        <div class=\"d-flex align-items-center\">\n          <b-button\n            variant=\"_\"\n            class=\"shadow-none p-0 mr-3 position-relative toggle-sidebar\"\n            @click=\"collapsed = !collapsed\"\n          >\n            <i class=\"fas fa-bars position-relative\">\n              <div v-if=\"hasUnseenPrinterEvents\" class=\"notification-dot\">\n                <svg width=\"8px\" height=\"8px\">\n                  <use href=\"#svg-circle-icon\" />\n                </svg>\n              </div>\n            </i>\n          </b-button>\n          <slot name=\"topBarLeft\"></slot>\n        </div>\n        <slot name=\"topBarRight\"></slot>\n      </b-navbar>\n      <!-- Page content -->\n      <div class=\"page-content\">\n        <slot name=\"content\"></slot>\n      </div>\n    </div>\n    <div class=\"content-overlay\" @click=\"collapsed = true\"></div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\n\nexport default {\n  name: 'PageLayout',\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      collapsed: true,\n      path: window.location.pathname,\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n    hideHeader() {\n      const urlParams = new URLSearchParams(window.location.search)\n      return urlParams.get('hide_header') === 'true'\n    },\n    hasUnseenPrinterEvents() {\n      return get(this.user, 'unseen_printer_events', 0) > 0\n    },\n    unseenPrinterEventsDisplay() {\n      const num = get(this.user, 'unseen_printer_events', 0)\n      return num > 99 ? '99+' : num\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  mounted() {\n    // Temporary solution to correctly show alerts inserted by `snippets/messages.html` from Django\n    const staticAlert = document.querySelector('.message-snippet')\n    if (staticAlert && this.inMobileWebView) {\n      staticAlert.classList.add('is-in-mobile')\n    }\n    if (this.inMobileWebView) {\n      document.querySelector('body').style.paddingBottom = 0\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\">\n.message-snippet\n  margin-top: 50px\n  margin-left: 100px\n  @media (max-width: 768px)\n    margin-left: 0\n  &.is-in-mobile\n    margin-left: 0\n</style>\n\n<style lang=\"sass\" scoped>\n.page-wrapper\n  display: flex\n  padding-left: 100px\n  background-color: var(--color-background)\n  &.is-in-mobile\n    padding-left: 0\n    .side-nav\n      display: none\n    .toggle-sidebar\n      display: none\n\n    .content-wrapper.hide-top-nav\n      .top-nav\n        display: none\n      .page-content\n        padding: 15px 0\n\n  &.is-in-popup\n    padding-left: 0\n    .side-nav\n      display: none\n    .toggle-sidebar\n      display: none\n\n    .top-nav\n      position: relative\n      padding: 0 15px\n    .page-content\n      padding: 15px 0\n      min-height: unset\n\n.side-nav\n  min-width: 100px\n  max-width: 100px\n  text-align: center\n  background: var(--color-surface-primary)\n  position: fixed\n  left: 0\n  top: 0\n  height: 100%\n  display: flex\n  flex-direction: column\n  z-index: 1000\n  overflow-y: auto\n  transition: all .2s ease-out\n  border-right: 1px solid var(--color-divider)\n  .sidebar-header\n    flex: 0 0 50px\n    display: flex\n    align-items: center\n    justify-content: center\n    border-bottom: 1px solid var(--color-divider)\n  ul\n    li\n      a\n        display: block\n        color: var(--color-text-primary)\n        padding: 10px 5px\n        margin: 4px\n        border-radius: var(--border-radius-sm)\n        text-align: center\n        font-size: 0.85em\n        &:hover, &[aria-expanded=\"true\"]\n          color: var(--color-text-primary)\n        &:hover\n          background: var(--color-hover)\n        &.primary\n          color: var(--color-primary)\n        &.dropdown-toggle\n          cursor: pointer\n          padding-bottom: 20px\n        i, ::v-deep .svg-inline--fa\n          margin-right: 0\n          display: block\n          font-size: 1.4em\n          margin-bottom: 5px\n        ::v-deep .svg-inline--fa\n          margin: 0 auto 5px\n        .badge\n          border-radius: 2em\n          position: absolute\n          top: -0.35em\n          right: 2em\n          padding: 0.25em 0.3em\n          font-family: var(--default-font-family)\n          font-size: .714rem\n          font-weight: bold\n          color: var(--color-on-danger)\n          background-color: var(--color-danger)\n          min-width: 1.6em\n      &.active > a\n        background: var(--color-hover)\n      &.glowing\n        text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px var(--color-primary), 0 0 70px var(--color-primary), 0 0 80px var(--color-primary), 0 0 100px var(--color-primary), 0 0 150px var(--color-primary)\n    ul a\n      font-size: 0.9em !important\n      padding: 10px !important\n    .dropdown-toggle::after\n      top: auto\n      bottom: 10px\n      right: 50%\n      -webkit-transform: translateX(50%)\n      -ms-transform: translateX(50%)\n      transform: translateX(50%)\n  ul.components\n    padding: 20px 0\n  ::v-deep .logo-small\n    width: 30px\n    height: 30px\n    color: var(--color-text-primary)\n  .dropdown-toggle\n    position: relative\n    &::after\n      display: block\n      position: absolute\n      top: 50%\n      right: 20px\n      transform: translateY(-50%)\n  .side-nav-footer\n    margin-top: auto\n  .trim-text\n    white-space: nowrap\n    text-overflow: ellipsis\n    display: inline-block\n    overflow: hidden\n    width: 100%\n.content-wrapper\n  width: 100%\n.top-nav\n  height: 50px\n  background: var(--color-surface-primary) !important\n  position: fixed\n  top: 0\n  left: 0\n  width: 100%\n  padding-left: calc(100px + 15px)\n  padding-right: 32px\n  z-index: 100\n  box-shadow: var(--shadow-top-nav)\n  justify-content: space-between\n\n  ::v-deep .action-panel\n    .action-btn\n      box-sizing: border-box\n      width: 36px\n      padding-left: 0\n      padding-right: 0\n      @media (max-width: 768px)\n        display: none\n\n.is-in-mobile .top-nav\n  padding-left: 15px\n  padding-right: 15px\n  background: var(--color-surface-primary) !important\n\n.toggle-sidebar\n  color: var(--color-text-primary)\n  display: none\n\n.page-content\n  padding: calc(50px + var(--gap-between-blocks)) calc(var(--gap-between-blocks) - 15px) var(--gap-between-blocks)\n  display: flex\n  flex-direction: column\n  min-height: 100vh\n\n.content-overlay\n  position: fixed\n  top: 0\n  left: 0\n  width: 100%\n  height: 100%\n  z-index: 100\n  background: rgb(0,0,0,.5)\n  display: none\n\n::v-deep .search-input input\n  background-color: var(--color-surface-secondary)\n  border-color: var(--color-surface-secondary)\n\n.notification-dot\n  height: 50%\n  top: -9px\n  right: -3px\n  position: absolute\n  width: 50%\n  color: var(--color-danger)\n\n@media (min-width: 769px)\n  .content-wrapper\n    &.hide-top-nav\n      .top-nav\n        display: none\n      .page-content\n        padding-top: 30px\n        min-height: 100vh\n\n@media (max-width: 768px)\n  .page-wrapper\n    padding-left: 0\n    &:not(.collapsed) .content-overlay\n      display: block\n    &.collapsed\n      .side-nav\n        transform: translateX(-100px)\n\n  .top-nav\n    padding-left: 15px\n    padding-right: 15px\n    background: var(--color-surface-primary) !important\n\n  .toggle-sidebar\n    display: block\n\n  .page-content\n    padding: 15px 0\n    padding-top: calc(50px + 15px)\n    justify-content: start\n\n::v-deep .dropdown-menu\n  .dropdown-item\n    padding: 0.25rem 0.75rem\n    .clickable-area\n      margin: -0.25rem -0.75rem\n      padding: 0.25rem 0.75rem\n    i, .custom-svg-icon\n      width: 20px\n      margin-right: .5rem\n  .b-dropdown-text\n    padding-left: 0.75rem\n    padding-right: 0.75rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PageLayout.vue?vue&type=template&id=b5cfcc80&scoped=true&\"\nimport script from \"./PageLayout.vue?vue&type=script&lang=js&\"\nexport * from \"./PageLayout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PageLayout.vue?vue&type=style&index=0&id=b5cfcc80&prod&lang=sass&\"\nimport style1 from \"./PageLayout.vue?vue&type=style&index=1&id=b5cfcc80&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5cfcc80\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-body consent-section\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Number of snapshots\"))+\": \"),_c('span',{staticClass:\"feedback-estimate\"},[_vm._v(_vm._s(_vm.print.printshotfeedback_set.length))])]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Estimated time to finish\"))+\": \"),_c('span',{staticClass:\"feedback-estimate\"},[_vm._v(_vm._s(_vm.estimatedFeedbackTime))])]),_c('p',{staticClass:\"font-weight-light\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Help Obi get better at detecting failures by giving her in-depth feedback on the snapshots of the print. You will earn {localizedDom} after you finish this Focused Feedback. {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',{staticClass:\"text-light\"},[_vm._v(_vm._s(_vm.$t(\"2 non-expirable AI Detection Hours\")))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t('Learn more'))+\". \"),_c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]},proxy:true}])})],1),_c('br'),_c('button',{staticClass:\"btn btn-primary btn-block\",attrs:{\"disabled\":!_vm.consentChecked,\"type\":\"button\"},on:{\"click\":function($event){return _vm.$emit('continue-btn-pressed')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Start Focused Feedback\"))+\" \")]),_c('br'),_c('div',{staticClass:\"custom-control custom-checkbox form-check-inline\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.consentChecked),expression:\"consentChecked\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"consented-checkbox\",\"type\":\"checkbox\",\"name\":\"consented\"},domProps:{\"checked\":Array.isArray(_vm.consentChecked)?_vm._i(_vm.consentChecked,null)>-1:(_vm.consentChecked)},on:{\"change\":function($event){var $$a=_vm.consentChecked,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.consentChecked=$$a.concat([$$v]))}else{$$i>-1&&(_vm.consentChecked=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.consentChecked=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"16px\"},attrs:{\"for\":\"consented-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"I grant the {brandName} app team members the permission to review the time-lapse video of the print shown on this page.\", {brandName:_vm.$syndicateText.brandName}))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-need-to-grant-permission-to-tsd-team-to-review-your-time-lapse')}},[_vm._v(_vm._s(_vm.$t(\"Why is this necessary? \"))),_vm._m(0)])])]),_c('br'),_c('div',[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"File\"))+\":\")]),_vm._v(\" \"+_vm._s(_vm.print.filename)+\" \")]),_c('div',[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"Printed\"))+\":\")]),_vm._v(\" \"+_vm._s(_vm.print.started_at.fromNow())+\" \")]),_c('br'),(_vm.print.video_url)?_c('video-box',{attrs:{\"video-url\":_vm.print.video_url,\"poster-url\":_vm.print.poster_url,\"full-screen-btn\":false}}):_c('div',[_c('detective-working')],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-img-top\"},[_c('video-player',{ref:\"videoPlayer\",staticClass:\"vjs-default-skin vjs-big-play-centered\",attrs:{\"options\":_vm.playerOptions,\"playsinline\":true},on:{\"timeupdate\":_vm.onTimeUpdate}}),_c('div',{staticClass:\"buttons-container\"},[(_vm.downloadBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Download\"},on:{\"click\":function($event){return _vm.$emit('download')}}},[_c('i',{staticClass:\"fas fa-download\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e(),(_vm.fullscreenBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Full screen\"},on:{\"click\":function($event){return _vm.$emit('fullscreen')}}},[_c('i',{staticClass:\"fa fa-expand\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e(),(_vm.exitFullscreenBtn)?_c('a',{staticClass:\"action-btn\",attrs:{\"role\":\"button\",\"title\":\"Exit full screen\"},on:{\"click\":function($event){return _vm.$emit('exitFullscreen')}}},[_c('i',{staticClass:\"fa fa-times\",attrs:{\"aria-hidden\":\"true\"}})]):_vm._e()])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"card-img-top\">\n    <video-player\n      ref=\"videoPlayer\"\n      class=\"vjs-default-skin vjs-big-play-centered\"\n      :options=\"playerOptions\"\n      :playsinline=\"true\"\n      @timeupdate=\"onTimeUpdate\"\n    />\n    <div class=\"buttons-container\">\n      <a\n        v-if=\"downloadBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Download\"\n        @click=\"$emit('download')\"\n      >\n        <i class=\"fas fa-download\" aria-hidden=\"true\"></i>\n      </a>\n      <a\n        v-if=\"fullscreenBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Full screen\"\n        @click=\"$emit('fullscreen')\"\n      >\n        <i class=\"fa fa-expand\" aria-hidden=\"true\"></i>\n      </a>\n      <a\n        v-if=\"exitFullscreenBtn\"\n        class=\"action-btn\"\n        role=\"button\"\n        title=\"Exit full screen\"\n        @click=\"$emit('exitFullscreen')\"\n      >\n        <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\n      </a>\n    </div>\n  </div>\n</template>\n\n<script>\nimport 'video.js/dist/video-js.css'\nimport { videoPlayer } from 'vue-video-player'\n\nexport default {\n  name: 'VideoBox',\n  components: {\n    videoPlayer,\n  },\n  props: {\n    videoUrl: {\n      type: String,\n      required: true,\n    },\n    posterUrl: {\n      type: String,\n      default: null,\n    },\n    fullscreenBtn: {\n      type: Boolean,\n      default: true,\n    },\n    exitFullscreenBtn: {\n      type: Boolean,\n      default: false,\n    },\n    downloadBtn: {\n      type: Boolean,\n      default: false,\n    },\n    fluid: {\n      type: Boolean,\n      default: true,\n    },\n    autoplay: {\n      type: Boolean,\n      default: false,\n    },\n    defaultFullScreenToggle: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  computed: {\n    playerOptions() {\n      return {\n        // videojs options\n        muted: true,\n        preload: 'none',\n        language: 'en',\n        playbackRates: [0.5, 1, 1.5, 2],\n        fluid: this.fluid,\n        fill: !this.fluid,\n        autoplay: this.autoplay,\n        sources: [\n          {\n            type: 'video/mp4',\n            src: this.videoUrl,\n          },\n        ],\n        controlBar: { fullscreenToggle: this.defaultFullScreenToggle },\n        poster: this.posterUrl,\n      }\n    },\n  },\n  methods: {\n    onTimeUpdate(event) {\n      this.$emit('timeupdate', event.currentTime() / event.duration())\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-img-top\n  position: relative\n  background-color: black\n\n  .buttons-container\n    position: absolute\n    top: 0\n    right: 0\n    padding: 0.5rem\n    background-color: rgba(0,0,0,0.7)\n\n  a.action-btn\n    padding: 0.5rem\n    color: rgba(255,255,255,0.5)\n    font-size: 1.5rem\n    transition: all .3s ease-out\n    &:hover\n      color: rgba(255,255,255,0.9)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VideoBox.vue?vue&type=template&id=39b52572&scoped=true&\"\nimport script from \"./VideoBox.vue?vue&type=script&lang=js&\"\nexport * from \"./VideoBox.vue?vue&type=script&lang=js&\"\nimport style0 from \"./VideoBox.vue?vue&type=style&index=0&id=39b52572&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"39b52572\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card bg-dark text-white\"},[_c('img',{staticClass:\"card-img\",attrs:{\"src\":require('@static/img/detective-working.gif'),\"alt\":\"Obi is still working\"}}),_c('div',{staticClass:\"card-img-overlay\",staticStyle:{\"background-color\":\"rgba(0, 0, 0, 0.6)\"}},[_c('h5',{staticClass:\"card-title text-center\"},[_vm._v(_vm._s(_vm.$t(\"Obi is still busy working on your time-lapse\")))])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"card bg-dark text-white\">\n    <img\n      class=\"card-img\"\n      :src=\"require('@static/img/detective-working.gif')\"\n      alt=\"Obi is still working\"\n    />\n    <div class=\"card-img-overlay\" style=\"background-color: rgba(0, 0, 0, 0.6)\">\n      <h5 class=\"card-title text-center\">{{ $t(\"Obi is still busy working on your time-lapse\") }}</h5>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DetectiveWorking',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-img-overlay\n  display: flex\n  align-items: center\n  justify-content: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DetectiveWorking.vue?vue&type=template&id=3c99e284&scoped=true&\"\nimport script from \"./DetectiveWorking.vue?vue&type=script&lang=js&\"\nexport * from \"./DetectiveWorking.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DetectiveWorking.vue?vue&type=style&index=0&id=3c99e284&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3c99e284\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"card-body consent-section\">\n    <div>\n      {{$t(\"Number of snapshots\")}}:\n      <span class=\"feedback-estimate\">{{ print.printshotfeedback_set.length }}</span>\n    </div>\n    <p>\n      {{$t(\"Estimated time to finish\")}}:\n      <span class=\"feedback-estimate\">{{ estimatedFeedbackTime }}</span>\n    </p>\n    <p class=\"font-weight-light\">\n      <i18next :translation=\"$t('Help Obi get better at detecting failures by giving her in-depth feedback on the snapshots of the print. You will earn {localizedDom} after you finish this Focused Feedback. {localizedDom2}')\">\n        <template #localizedDom>\n          <strong class=\"text-light\">{{$t(\"2 non-expirable AI Detection Hours\")}}</strong>\n        </template>\n        <template #localizedDom2>\n          <a target=\"_blank\" :href=\"getDocUrl('/user-guides/how-does-credits-work/')\">{{$t('Learn more')}}. <small><i class=\"fas fa-external-link-alt\"></i></small ></a>\n        </template>\n      </i18next>\n    </p>\n    <br />\n    <button\n      :disabled=\"!consentChecked\"\n      class=\"btn btn-primary btn-block\"\n      type=\"button\"\n      @click=\"$emit('continue-btn-pressed')\"\n    >\n      {{$t(\"Start Focused Feedback\")}}\n    </button>\n    <br />\n    <div class=\"custom-control custom-checkbox form-check-inline\">\n      <input\n        id=\"consented-checkbox\"\n        v-model=\"consentChecked\"\n        type=\"checkbox\"\n        name=\"consented\"\n        class=\"custom-control-input\"\n      />\n      <label class=\"custom-control-label\" style=\"font-size: 16px\" for=\"consented-checkbox\">\n        {{ $t(\"I grant the {brandName} app team members the permission to review the time-lapse video of the print shown on this page.\", {brandName:$syndicateText.brandName}) }}\n\n        <a\n          target=\"_blank\"\n          :href=\"getDocUrl('/user-guides/how-does-credits-work#you-need-to-grant-permission-to-tsd-team-to-review-your-time-lapse')\"\n          >{{$t(\"Why is this necessary? \")}}<small><i class=\"fas fa-external-link-alt\"></i></small\n        ></a>\n      </label>\n    </div>\n    <br />\n    <div>\n      <span class=\"text-muted\">{{ $t(\"File\") }}:</span>\n      {{ print.filename }}\n    </div>\n    <div>\n      <span class=\"text-muted\">{{ $t(\"Printed\") }}:</span>\n      {{ print.started_at.fromNow() }}\n    </div>\n    <br />\n    <video-box\n      v-if=\"print.video_url\"\n      :video-url=\"print.video_url\"\n      :poster-url=\"print.poster_url\"\n      :full-screen-btn=\"false\"\n    />\n    <div v-else>\n      <detective-working />\n    </div>\n  </div>\n</template>\n\n<script>\nimport moment from 'moment'\n\nimport VideoBox from '@src/components/VideoBox'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\n\nexport default {\n  name: 'FocusedFeedbackConsent',\n\n  components: { VideoBox, DetectiveWorking },\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      consentChecked: false,\n    }\n  },\n\n  computed: {\n    estimatedFeedbackTime() {\n      const seconds = this.print.printshotfeedback_set.length * 12\n      if (seconds < 60) {\n        return `${seconds} ${this.$i18next.t('seconds')}`\n      } else {\n        return moment.duration(seconds, 'seconds').humanize()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.consent-section\n  background: var(--color-surface-secondary)\n\n.feedback-estimate\n  font-size: 1.2em\n  font-weight: bolder\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FocusedFeedbackConsent.vue?vue&type=template&id=91f97838&scoped=true&\"\nimport script from \"./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"\nexport * from \"./FocusedFeedbackConsent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FocusedFeedbackConsent.vue?vue&type=style&index=0&id=91f97838&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"91f97838\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container class=\"feedback-container\">\n        <b-row class=\"justify-content-center\">\n          <b-col lg=\"8\">\n            <div class=\"card\">\n              <h5 class=\"card-header text-center\">\n                F\n                <i class=\"fas fa-search focused-feedback-icon\"></i>{{$t(\"CUSED FEEDBACK\")}}\n              </h5>\n              <loading :active=\"print === null\" :is-full-page=\"true\"></loading>\n              <div v-if=\"print !== null\">\n                <focused-feedback-consent\n                  v-if=\"!print.access_consented_at\"\n                  :print=\"print\"\n                  @continue-btn-pressed=\"consentBtnPressed\"\n                />\n                <div v-else>\n                  <div>\n                    <vue-slick-carousel\n                      ref=\"carousel\"\n                      :arrows=\"false\"\n                      :dots=\"true\"\n                      @afterChange=\"onNextShot\"\n                    >\n                      <print-shot-card\n                        v-for=\"(shot, i) in shots\"\n                        :key=\"i\"\n                        :shot=\"shot\"\n                        @shotChanged=\"onShotChanged\"\n                        @prev=\"onPrev\"\n                        @next=\"onNext\"\n                      ></print-shot-card>\n                      <template #customPaging=\"page\">\n                        <div :class=\"pageClass(page)\">&bull;</div>\n                      </template>\n                    </vue-slick-carousel>\n                  </div>\n                  <br />\n                  <div class=\"card-body p-3\">\n                    <a :href=\"`/prints/${print.id}/`\">\n                      <i class=\"fas fa-chevron-left\"></i> {{$t(\"Print Page\")}}\n                    </a>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport sortBy from 'lodash/sortBy'\nimport findIndex from 'lodash/findIndex'\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\n// optional style for arrows & dots\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\n// TODO: this should be configured as global. But for some reason it doesn't work.\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PrintShotCard from '@src/components/print-shot-feedback/PrintShotCard'\nimport urls from '@config/server-urls'\nimport { normalizedPrint } from '@src/lib/normalizers'\nimport PageLayout from '@src/components/PageLayout'\nimport FocusedFeedbackConsent from '../components/print-shot-feedback/FocusedFeedbackConsent.vue'\n\nexport default {\n  name: 'PrintShotFeedbackApp',\n  components: {\n    FocusedFeedbackConsent,\n    Loading,\n    PrintShotCard,\n    VueSlickCarousel,\n    PageLayout,\n  },\n  props: {\n    config: {\n      default: () => {},\n      type: Object,\n    },\n  },\n  data: function () {\n    return {\n      shots: [],\n      currentShot: 0,\n      print: null,\n    }\n  },\n  computed: {},\n\n  mounted() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      axios.get(urls.print(this.config.printId)).then((response) => {\n        this.print = normalizedPrint(response.data)\n        this.shots = sortBy(this.print.printshotfeedback_set, 'id')\n      })\n    },\n\n    updatePrint(data) {\n      axios\n        .patch(urls.print(this.print.id), data)\n\n        .then((response) => (this.print = response.data))\n    },\n\n    consentBtnPressed() {\n      this.updatePrint({ access_consented_at: moment() })\n    },\n\n    onShotChanged(data) {\n      const i = findIndex(this.shots, (shot) => shot.id == data.id)\n      this.$set(this.shots, i, data)\n      this.$refs.carousel.next()\n    },\n\n    onNextShot(shotIndex) {\n      this.currentShot = shotIndex\n    },\n\n    onPrev() {\n      this.$refs.carousel.prev()\n    },\n\n    onNext() {\n      this.$refs.carousel.next()\n    },\n\n    pageClass(page) {\n      if (page === this.currentShot) {\n        return 'page-visiting'\n      }\n      return this.shots[page].answered_at ? 'text-success' : 'page-unvisited'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.prev-btn\n  display: inline\n  position: absolute\n  left: 2%\n  top: 40%\n  opacity: 0.5\n\n.next-btn\n  display: inline\n  position: absolute\n  right: 2%\n  top: 40%\n  opacity: 0.5\n\n.page-visiting\n  color: var(--color-primary)\n\n.page-unvisited\n  color: var(--color-divider)\n\n.feedback-container\n  padding-left: 30px\n  padding-right: 30px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintShotFeedbackApp.vue?vue&type=template&id=3ab8d3da&scoped=true&\"\nimport script from \"./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintShotFeedbackApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintShotFeedbackApp.vue?vue&type=style&index=0&id=3ab8d3da&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3ab8d3da\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"actions-with-selected-desktop\"},[_c('b-form-group',{staticClass:\"m-0\"},[_c('b-form-checkbox',{attrs:{\"size\":\"md\"},model:{value:(_vm.allPrintsSelected),callback:function ($$v) {_vm.allPrintsSelected=$$v},expression:\"allPrintsSelected\"}})],1),_c('div',[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.selectedPrintIds.size),expression:\"!selectedPrintIds.size\"}],staticClass:\"label\",on:{\"click\":function($event){_vm.allPrintsSelected = !_vm.allPrintsSelected}}},[_vm._v(_vm._s(_vm.$t(\"Select all\")))]),_c('b-dropdown',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.selectedPrintIds.size),expression:\"selectedPrintIds.size\"}],attrs:{\"toggle-class\":\"btn btn-sm actions-with-selected-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.selectedPrintIds.size)+\" item\"+_vm._s(_vm.selectedPrintIds.size === 1 ? '' : 's')+\" \"+_vm._s(_vm.$t(\"selected\"))+\" \")]},proxy:true}])},[_c('b-dropdown-item',[_c('div',{staticClass:\"text-danger\",on:{\"click\":_vm.onDeleteBtnClick}},[_c('i',{staticClass:\"far fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1)],1)]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":_vm.$t('Sort By')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":_vm.$t('Filter')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{ref:\"filteringDropdown1\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'sorting',\n              icon: 'fas fa-sort-amount-down',\n              title: _vm.$t(`Sort`),\n              expandable: true,\n            },\n            {\n              key: 'filtering',\n              icon: 'fas fa-filter',\n              title: _vm.$t(`Filter`),\n              expandable: true,\n            },\n          ]},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{ref:\"filteringDropdown2\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),_c('b-container',[_c('b-row',[_c('b-col',[(_vm.prints.length && !_vm.loading)?_c('div',{staticClass:\"prints-summary\"},[_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-hashtag\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Prints done\")))]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.stats.total_print_count)+\" (\"),_c('span',{staticClass:\"text-success\"},[_vm._v(_vm._s(_vm.stats.total_succeeded_print_count))]),_vm._v(\" / \"),_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.stats.total_cancelled_print_count))]),_vm._v(\") \")])])]),_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total print time\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.totalPrintTimeFormatted))])])]),_c('div',{staticClass:\"summary-item\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"})]),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_c('help-widget',{attrs:{\"id\":\"filament-used-may-be-incorrect\",\"highlight\":false,\"show-close-button\":false}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Filament used\"))+\" \")])],1),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.totalFilamentUsedFormatted))])])]),_c('div',{staticClass:\"btn-wrapper\"},[_c('a',{staticClass:\"btn btn-secondary\",attrs:{\"href\":`/stats/`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Full Stats\"))+\" \"),_c('i',{staticClass:\"fas fa-arrow-right\"})])])]):_vm._e()])],1),_c('b-row',[(_vm.prints.length || _vm.loading)?_c('b-col',[_vm._l((_vm.prints),function(print,index){return _c('print-history-item',{key:print.id,staticClass:\"print-item\",attrs:{\"print\":print,\"index\":index,\"selectable\":true,\"selected\":_vm.selectedPrintIds.has(print.id)},on:{\"selectedChanged\":_vm.onSelectedChanged}})}),_c('mugen-scroll',{attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(!_vm.noMoreData)?_c('loading-placeholder'):_vm._e()],1)],2):_c('b-col',{staticClass:\"text-center my-5\"},[_vm._v(_vm._s(_vm.$t(\"No prints found\")))])],1)],1),_c('date-picker-modal',{ref:\"datePickerModal\",on:{\"picked\":_vm.onDatesPicked}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.menuExpanded === null)?_vm._l((_vm.menuOptions),function(option){return _c('b-dropdown-item',{key:option.key,attrs:{\"href\":option.href},on:{\"click\":function($event){return _vm.onClick(option)}}},[(option.expandable)?_c('div',{staticClass:\"d-flex justify-content-between clickable-area\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.menuExpanded = option.key}}},[_c('div',[(option.icon)?_c('i',{class:option.icon}):(option.svgIcon)?_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":`#${option.svgIcon}`}})]):_vm._e(),_c('span',[_vm._v(_vm._s(option.title))])]),_c('div',[_c('i',{staticClass:\"fas fa-chevron-right m-0\"})])]):_c('div',{staticClass:\"d-flex justify-content-between clickable-area\"},[_c('div',{class:option.customMenuOptionClass},[(option.icon)?_c('i',{class:option.icon}):(option.svgIcon)?_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":`#${option.svgIcon}`}})]):_vm._e(),_c('span',[_vm._v(_vm._s(option.title))])])])])}):_vm._e(),(_vm.menuExpanded !== null)?[_c('b-dropdown-item',[_c('div',{staticClass:\"clickable-area\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.menuExpanded = null}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(_vm._s(_vm.$t(\"Back\"))+\" \")])]),_c('b-dropdown-divider'),(_vm.menuExpanded === 'sorting')?_c('div',[_vm._t(\"sorting\")],2):_vm._e(),(_vm.menuExpanded === 'filtering')?_c('div',[_vm._t(\"filtering\")],2):_vm._e(),(_vm.menuExpanded === 'storage')?_c('div',[_vm._t(\"storage\")],2):_vm._e(),(_vm.menuExpanded === 'grouping')?_c('div',[_vm._t(\"grouping\")],2):_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <template v-if=\"menuExpanded === null\">\n      <b-dropdown-item\n        v-for=\"option in menuOptions\"\n        :key=\"option.key\"\n        :href=\"option.href\"\n        @click=\"onClick(option)\"\n      >\n        <div\n          v-if=\"option.expandable\"\n          class=\"d-flex justify-content-between clickable-area\"\n          @click.stop.prevent=\"menuExpanded = option.key\"\n        >\n          <div>\n            <i v-if=\"option.icon\" :class=\"option.icon\"></i>\n            <svg v-else-if=\"option.svgIcon\" class=\"custom-svg-icon\">\n              <use :href=\"`#${option.svgIcon}`\" />\n            </svg>\n            <span>{{ option.title }}</span>\n          </div>\n          <div><i class=\"fas fa-chevron-right m-0\"></i></div>\n        </div>\n        <div v-else class=\"d-flex justify-content-between clickable-area\">\n          <div :class=\"option.customMenuOptionClass\">\n            <i v-if=\"option.icon\" :class=\"option.icon\"></i>\n            <svg v-else-if=\"option.svgIcon\" class=\"custom-svg-icon\">\n              <use :href=\"`#${option.svgIcon}`\" />\n            </svg>\n\n            <span>{{ option.title }}</span>\n          </div>\n        </div>\n      </b-dropdown-item>\n    </template>\n    <template v-if=\"menuExpanded !== null\">\n      <b-dropdown-item>\n        <div class=\"clickable-area\" @click.stop.prevent=\"menuExpanded = null\">\n          <i class=\"fas fa-chevron-left\"></i>{{$t(\"Back\")}}\n        </div>\n      </b-dropdown-item>\n      <b-dropdown-divider />\n\n      <div v-if=\"menuExpanded === 'sorting'\">\n        <slot name=\"sorting\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'filtering'\">\n        <slot name=\"filtering\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'storage'\">\n        <slot name=\"storage\"></slot>\n      </div>\n      <div v-if=\"menuExpanded === 'grouping'\">\n        <slot name=\"grouping\"></slot>\n      </div>\n    </template>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'CascadedDropdown',\n\n  props: {\n    menuOptions: {\n      type: Array,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      menuExpanded: null,\n    }\n  },\n\n  methods: {\n    resetMenuExpanded() {\n      this.menuExpanded = null\n    },\n    onClick(menuOption) {\n      if (menuOption.callback) {\n        this.$emit('menuOptionClicked', menuOption.key)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.custom-svg-icon\n  height: 1.125rem\n  width: 1.125rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CascadedDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CascadedDropdown.vue?vue&type=template&id=e01269fe&scoped=true&\"\nimport script from \"./CascadedDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./CascadedDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CascadedDropdown.vue?vue&type=style&index=0&id=e01269fe&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e01269fe\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"SORT BY\")))]),_vm._l((_vm.sortingOptions.options),function(sorting){return _c('b-dropdown-item',{key:`s_${sorting.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateSorting({ sorting })}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({\n        visibility: _vm.sortingValue.sorting.key === sorting.key ? 'visible' : 'hidden',\n      })}),_vm._v(\" \"+_vm._s(sorting.title)+\" \")])}),_c('b-dropdown-divider'),_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"DIRECTION\")))]),_vm._l((_vm.sortingDirections),function(direction){return _c('b-dropdown-item',{key:`d_${direction.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateSorting({ direction })}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({\n        visibility: _vm.sortingValue.direction.key === direction.key ? 'visible' : 'hidden',\n      })}),_vm._v(\" \"+_vm._s(direction.title)+\" \")])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-dropdown-text class=\"small text-secondary\">{{ $t(\"SORT BY\") }}</b-dropdown-text>\n    <b-dropdown-item\n      v-for=\"sorting in sortingOptions.options\"\n      :key=\"`s_${sorting.key}`\"\n      @click.native.capture.stop.prevent=\"updateSorting({ sorting })\"\n    >\n      <i\n        class=\"fas fa-check text-primary\"\n        :style=\"{\n          visibility: sortingValue.sorting.key === sorting.key ? 'visible' : 'hidden',\n        }\"\n      ></i>\n      {{ sorting.title }}\n    </b-dropdown-item>\n\n    <b-dropdown-divider />\n\n    <b-dropdown-text class=\"small text-secondary\">{{ $t(\"DIRECTION\") }}</b-dropdown-text>\n    <b-dropdown-item\n      v-for=\"direction in sortingDirections\"\n      :key=\"`d_${direction.key}`\"\n      @click.native.capture.stop.prevent=\"updateSorting({ direction })\"\n    >\n      <i\n        class=\"fas fa-check text-primary\"\n        :style=\"{\n          visibility: sortingValue.direction.key === direction.key ? 'visible' : 'hidden',\n        }\"\n      ></i>\n      {{ direction.title }}\n    </b-dropdown-item>\n  </div>\n</template>\n\n<script>\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport i18n from '@src/i18n/i18n.js'\n\nconst SortingDirections = [\n  { key: 'asc', title: `${i18n.t('Ascending')}` },\n  { key: 'desc', title: `${i18n.t('Descending')}` },\n]\n\nexport default {\n  name: 'SortingDropdown',\n\n  props: {\n    localStoragePrefix: {\n      type: String,\n      required: true,\n    },\n    sortingOptions: {\n      type: Object,\n      required: true,\n    },\n    sortingValue: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      sortingDirections: SortingDirections,\n    }\n  },\n\n  methods: {\n    updateSorting({ sorting, direction }) {\n      if (sorting && sorting.key !== this.sortingValue.sorting.key) {\n        setLocalPref(`${this.localStoragePrefix}-sorting`, sorting.key)\n        this.$emit('onSortingUpdated', { ...this.sortingValue, sorting: sorting })\n        return\n      }\n      if (direction && direction.key !== this.sortingValue.direction.key) {\n        setLocalPref(`${this.localStoragePrefix}-direction`, direction.key)\n        this.$emit('onSortingUpdated', { ...this.sortingValue, direction: direction })\n        return\n      }\n    },\n  },\n}\n\nexport const restoreSortingValue = (localStoragePrefix, sortingOptions) => {\n  const sortingKey = getLocalPref(`${localStoragePrefix}-sorting`, sortingOptions.default.sorting)\n  const directionKey = getLocalPref(\n    `${localStoragePrefix}-direction`,\n    sortingOptions.default.direction\n  )\n\n  return {\n    sorting: sortingOptions.options.find((s) => s.key === sortingKey),\n    direction: SortingDirections.find((d) => d.key === directionKey),\n  }\n}\n</script>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SortingDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SortingDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SortingDropdown.vue?vue&type=template&id=7de1b93c&\"\nimport script from \"./SortingDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./SortingDropdown.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',_vm._l((_vm.filterOptions),function(option,key,index){return _c('div',{key:key},[(index !== 0)?_c('b-dropdown-divider'):_vm._e(),_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(option.title.toUpperCase()))]),_vm._l((option.values),function(val){return _c('b-dropdown-item',{key:`f_${key}_${val.key}`,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFiltering({ filterOptionKey: key, filterValueKey: val.key })}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",class:{\n            'checkmark-muted':\n              option.multiple &&\n              !val.includesAll &&\n              (!Array.isArray(_vm.filterValues[key]) || !_vm.filterValues[key].includes(val.key)),\n          },style:({\n            visibility:\n              (Array.isArray(_vm.filterValues[key]) && _vm.filterValues[key].includes(val.key)) ||\n              _vm.filterValues[key] === val.key ||\n              (option.multiple && !val.includesAll)\n                ? 'visible'\n                : 'hidden',\n          })}),_c('div',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(val.title)+\" \"),(val.subtitle)?_c('div',{staticClass:\"subtitle\"},[_vm._v(\" \"+_vm._s(val.subtitle)+\" \")]):_vm._e()])])])})],2)}),0)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-for=\"(option, key, index) in filterOptions\" :key=\"key\">\n      <b-dropdown-divider v-if=\"index !== 0\" />\n      <b-dropdown-text class=\"small text-secondary\">{{\n        option.title.toUpperCase()\n      }}</b-dropdown-text>\n      <b-dropdown-item\n        v-for=\"val in option.values\"\n        :key=\"`f_${key}_${val.key}`\"\n        @click.native.capture.stop.prevent=\"\n          updateFiltering({ filterOptionKey: key, filterValueKey: val.key })\n        \"\n      >\n        <div class=\"dropdown-text-group\">\n          <i\n            class=\"fas fa-check text-primary\"\n            :class=\"{\n              'checkmark-muted':\n                option.multiple &&\n                !val.includesAll &&\n                (!Array.isArray(filterValues[key]) || !filterValues[key].includes(val.key)),\n            }\"\n            :style=\"{\n              visibility:\n                (Array.isArray(filterValues[key]) && filterValues[key].includes(val.key)) ||\n                filterValues[key] === val.key ||\n                (option.multiple && !val.includesAll)\n                  ? 'visible'\n                  : 'hidden',\n            }\"\n          ></i>\n          <div class=\"text\">\n            {{ val.title }}\n            <div v-if=\"val.subtitle\" class=\"subtitle\">\n              {{ val.subtitle }}\n            </div>\n          </div>\n        </div>\n      </b-dropdown-item>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\n\nexport default {\n  name: 'FilteringDropdown',\n\n  props: {\n    localStoragePrefix: {\n      type: String,\n      required: true,\n    },\n    filterOptions: {\n      type: Object,\n      required: true,\n    },\n    filterValues: {\n      type: Object,\n      required: true,\n    },\n    filterUpdateMixin: {\n      type: Function,\n      default: null,\n    },\n  },\n\n  methods: {\n    updateFiltering({ filterOptionKey, filterValueKey }) {\n      if (this.filterUpdateMixin) {\n        const result = this.filterUpdateMixin(filterOptionKey, filterValueKey)\n        if (!result) {\n          return\n        }\n      }\n\n      const filterOption = this.filterOptions[filterOptionKey]\n      const filterValue = filterOption.values.find((v) => v.key === filterValueKey)\n\n      const currentFilterValue = this.filterValues[filterOptionKey]\n      let newFilterValue\n\n      if (filterOption.multiple) {\n        if (filterValue.includesAll) {\n          newFilterValue = filterValue.key\n        } else {\n          if (Array.isArray(currentFilterValue)) {\n            if (currentFilterValue.includes(filterValueKey)) {\n              newFilterValue = currentFilterValue.filter((v) => v !== filterValueKey)\n              if (!newFilterValue.length) {\n                // if user unselects all — switch to \"All\" option if exists\n                newFilterValue = filterOption.values.find((v) => v.includesAll)?.key || []\n              }\n            } else {\n              newFilterValue = [...currentFilterValue, filterValueKey]\n            }\n          } else {\n            newFilterValue = [filterValueKey]\n          }\n        }\n      } else {\n        newFilterValue = filterValueKey\n      }\n\n      if (newFilterValue === currentFilterValue) {\n        return // nothing changed\n      }\n\n      setLocalPref(`${this.localStoragePrefix}-${filterOptionKey}`, newFilterValue)\n      this.$emit('onFilterUpdated', filterOptionKey, newFilterValue)\n    },\n  },\n}\n\nexport const restoreFilterValues = (localStoragePrefix, filterOptions) => {\n  let values = {}\n  for (const [key, option] of Object.entries(filterOptions)) {\n    const val = String(getLocalPref(`${localStoragePrefix}-${key}`, option.default))\n    if (option.multiple) {\n      const allOption = option.values.find((v) => v.includesAll)\n      if (val === allOption.key) {\n        values[key] = val\n      } else {\n        values[key] = val.split(',')\n      }\n    } else {\n      values[key] = val\n    }\n  }\n  return values\n}\n\nexport const getFilterParams = (filterOptions, filterValues, customFilterParamsBuilder) => {\n  let params = {}\n\n  for (const [key, val] of Object.entries(filterValues)) {\n    const filterOption = filterOptions[key]\n\n    if (!filterOption.buildQueryParam) {\n      if (val !== 'none') {\n        params[filterOption.queryParam] = val\n      }\n    } else {\n      const customParams = customFilterParamsBuilder && customFilterParamsBuilder(key, val)\n      if (customParams) {\n        params = { ...params, ...customParams }\n      }\n    }\n  }\n  return params\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.checkmark-muted\n  color: var(--color-divider) !important\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FilteringDropdown.vue?vue&type=template&id=614429e6&scoped=true&\"\nimport script from \"./FilteringDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./FilteringDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FilteringDropdown.vue?vue&type=style&index=0&id=614429e6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"614429e6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.shouldShowFilterWarning)?_c('div',{staticClass:\"active-filter-notice\"},[_c('div',{staticClass:\"filter\"},[_c('i',{staticClass:\"fas fa-filter mr-2\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Filters applied\"))+\" \")]),_c('div',{staticClass:\"action-btn\",on:{\"click\":function($event){return _vm.$emit('onShowAllClicked')}}},[_vm._v(_vm._s(_vm.$t(\"SHOW ALL\")))])]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"shouldShowFilterWarning\" class=\"active-filter-notice\">\n    <div class=\"filter\">\n      <i class=\"fas fa-filter mr-2\"></i>\n      {{$t(\"Filters applied\")}}\n    </div>\n    <div class=\"action-btn\" @click=\"$emit('onShowAllClicked')\">{{ $t(\"SHOW ALL\") }}</div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ActiveFilterNotice',\n\n  props: {\n    filterValues: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    activeFilters() {\n      return Object.values(this.filterValues).filter((v) => v !== 'none')\n    },\n    shouldShowFilterWarning() {\n      return this.activeFilters.length !== 0\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.active-filter-notice\n  display: flex\n  align-items: center\n  justify-content: space-between\n  padding: 0.5rem 1rem\n  background-color: var(--color-surface-secondary)\n  margin: calc(-1 * var(--gap-between-blocks)) -15px var(--gap-between-blocks)\n  .filter\n    color: var(--color-primary)\n  .action-btn\n    color: var(--color-text-primary)\n    cursor: pointer\n\n  @media (max-width: 768px)\n    font-size: .875rem\n    margin-left: 0\n    margin-right: 0\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ActiveFilterNotice.vue?vue&type=template&id=061feff7&scoped=true&\"\nimport script from \"./ActiveFilterNotice.vue?vue&type=script&lang=js&\"\nexport * from \"./ActiveFilterNotice.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ActiveFilterNotice.vue?vue&type=style&index=0&id=061feff7&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"061feff7\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"print-container\",attrs:{\"href\":`/prints/${_vm.print.id}/${_vm.index !== null ? '?index=' + _vm.index : ''}`}},[_c('div',{staticClass:\"status-indicator print-status-bg\",class:_vm.print.status.key}),(_vm.selectable)?_c('div',{staticClass:\"checkbox-wrapper\",class:{ isSelected: _vm.isSelected }},[_c('b-form-checkbox',{attrs:{\"size\":\"md\"},model:{value:(_vm.isSelected),callback:function ($$v) {_vm.isSelected=$$v},expression:\"isSelected\"}})],1):_vm._e(),_c('div',{staticClass:\"main-content truncated-wrapper\"},[_c('div',{staticClass:\"top\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.fileName}},[_vm._v(_vm._s(_vm.fileName))])]),_c('div',{staticClass:\"bottom\"},[_c('div',{staticClass:\"info\"},[_c('svg',{staticClass:\"icon\",attrs:{\"width\":\"1em\",\"height\":\"1em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})]),_c('span',[_vm._v(_vm._s(_vm.print.printer ? _vm.print.printer.name : 'Unavailable'))])]),_c('div',{staticClass:\"info\"},[_c('i',{staticClass:\"fas fa-calendar-alt icon\"}),_c('span',[_vm._v(_vm._s(_vm.print.started_at.format('MMM D, YYYY')))])])])]),(_vm.print.poster_url)?_c('div',{staticClass:\"poster\"},[_c('div',{staticClass:\"img\",style:({ backgroundImage: `url(${_vm.print.poster_url})` })})]):_c('div',{staticClass:\"poster no-photo\"},[_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a\n    :href=\"`/prints/${print.id}/${index !== null ? '?index=' + index : ''}`\"\n    class=\"print-container\"\n  >\n    <div class=\"status-indicator print-status-bg\" :class=\"print.status.key\"></div>\n    <div v-if=\"selectable\" class=\"checkbox-wrapper\" :class=\"{ isSelected }\">\n      <b-form-checkbox v-model=\"isSelected\" size=\"md\"></b-form-checkbox>\n    </div>\n    <div class=\"main-content truncated-wrapper\">\n      <div class=\"top\">\n        <div class=\"title truncated\" :title=\"fileName\">{{ fileName }}</div>\n      </div>\n      <div class=\"bottom\">\n        <div class=\"info\">\n          <svg width=\"1em\" height=\"1em\" class=\"icon\">\n            <use href=\"#svg-3d-printer\" />\n          </svg>\n          <span>{{ print.printer ? print.printer.name : 'Unavailable' }}</span>\n        </div>\n        <div class=\"info\">\n          <i class=\"fas fa-calendar-alt icon\"></i>\n          <span>{{ print.started_at.format('MMM D, YYYY') }}</span>\n        </div>\n      </div>\n    </div>\n    <div v-if=\"print.poster_url\" class=\"poster\">\n      <div class=\"img\" :style=\"{ backgroundImage: `url(${print.poster_url})` }\"></div>\n    </div>\n    <div v-else class=\"poster no-photo\">\n      <svg>\n        <use href=\"#svg-no-photo\" />\n      </svg>\n    </div>\n  </a>\n</template>\n\n<script>\nimport { PrintStatus } from '@src/lib/normalizers'\n\nexport default {\n  name: 'PrintHistoryItem',\n\n  components: {},\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    index: {\n      type: Number,\n      default: null,\n    },\n    selectable: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      PrintStatus,\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    fileName() {\n      return this.print.g_code_file === null ? this.print.filename : this.print.g_code_file.filename\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.print.id, newValue)\n    },\n    selected(newValue) {\n      this.isSelected = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-container\n  display: flex\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  color: var(--color-text-primary)\n  &:hover\n    cursor: pointer\n    background: var(--color-hover-accent)\n    transition: all .3s ease-out\n\n.status-indicator\n  flex: 0 0 5px\n  margin-right: 1rem\n\n.checkbox-wrapper\n  display: flex\n  align-items: flex-start\n  justify-content: flex-end\n  padding-top: 1rem\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n    border-color: var(--color-divider)\n  &.isSelected\n    ::v-deep .custom-checkbox .custom-control-label::before\n      border-color: #00C4B4\n\n.main-content\n  padding: 1rem\n  padding-left: 0\n  flex: 1\n\n.top\n  display: flex\n  align-items: flex-end\n  margin-bottom: .25rem\n\n.title\n  font-weight: bold\n\n.bottom\n  display: flex\n  align-items: center\n  justify-content: flex-start\n  gap: 14px\n  @media (max-width: 768px)\n    flex-direction: column\n    gap: 2px\n    align-items: flex-start\n\n.info\n  display: flex\n  gap: .25em\n  align-items: center\n  font-size: 0.9375rem\n  overflow: hidden\n  max-width: 50%\n\n  span\n    text-overflow: ellipsis\n    white-space: nowrap\n    overflow: hidden\n\n  @media (max-width: 768px)\n    max-width: 100%\n\n.icon\n  color: var(--color-text-secondary)\n  font-size: .8em\n  flex-shrink: 0\n\n  &.fa-clock\n    position: relative\n    top: 1px\n\n.feedback-info\n  background-color: var(--color-surface-primary)\n  padding: .0625em .625em\n  border-radius: var(--border-radius-xs)\n  font-size: 0.8125rem\n  margin: 2px 0\n  &.focused\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n\n.poster\n  margin-left: auto\n  background-color: var(--color-hover)\n  .img\n    background-size: cover\n    background-position: center\n    height: 100%\n    width: 100px\n    display: flex\n    justify-content: center\n    align-items: center\n    color: var(--color-text-secondary)\n    font-size: 0.875rem\n  &.no-photo\n    width: 100px\n    display: flex\n    align-items: center\n    justify-content: center\n    svg\n      width: 3rem\n      height: 3rem\n      color: var(--color-background)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintHistoryItem.vue?vue&type=template&id=a071ad6e&scoped=true&\"\nimport script from \"./PrintHistoryItem.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintHistoryItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintHistoryItem.vue?vue&type=style&index=0&id=a071ad6e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"a071ad6e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-pick-dates\",\"title\":_vm.$t('Select Dates'),\"ok-title\":_vm.$t('Apply'),\"cancel-title\":_vm.$t('Cancel'),\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('b-form-group',{attrs:{\"label\":_vm.$t('Date from'),\"label-for\":\"date_from\",\"description\":_vm.$t('If empty, will default to your registration date')}},[_c('b-form-input',{ref:\"dateFrom\",attrs:{\"id\":\"date_from\",\"type\":\"date\",\"placeholder\":_vm.$t('Enter date')},model:{value:(_vm.dateFrom),callback:function ($$v) {_vm.dateFrom=$$v},expression:\"dateFrom\"}})],1),_c('b-form-group',{attrs:{\"label\":_vm.$t('Date to'),\"label-for\":\"date_to\",\"description\":_vm.$t('If empty, will default to today')}},[_c('b-form-input',{ref:\"dateTo\",attrs:{\"id\":\"date_to\",\"type\":\"date\",\"placeholder\":_vm.$t('Enter date')},model:{value:(_vm.dateTo),callback:function ($$v) {_vm.dateTo=$$v},expression:\"dateTo\"}})],1),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-pick-dates\"\n    :title=\"$t('Select Dates')\"\n    :ok-title=\"$t('Apply')\"\n    :cancel-title=\"$t('Cancel')\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <b-form-group\n          :label=\"$t('Date from')\"\n          label-for=\"date_from\"\n          :description=\"$t('If empty, will default to your registration date')\"\n        >\n          <b-form-input\n            id=\"date_from\"\n            ref=\"dateFrom\"\n            v-model=\"dateFrom\"\n            type=\"date\"\n            :placeholder=\"$t('Enter date')\"\n          ></b-form-input>\n        </b-form-group>\n\n        <b-form-group\n          :label=\"$t('Date to')\"\n          label-for=\"date_to\"\n          :description=\"$t('If empty, will default to today')\"\n        >\n          <b-form-input\n            id=\"date_to\"\n            ref=\"dateTo\"\n            v-model=\"dateTo\"\n            type=\"date\"\n            :placeholder=\"$t('Enter date')\"\n          ></b-form-input>\n        </b-form-group>\n\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nexport default {\n  name: 'DatePickerModal',\n\n  data() {\n    return {\n      dateFrom: '',\n      dateTo: '',\n      isOpen: false,\n      errorMessage: '',\n    }\n  },\n\n  methods: {\n    show(initDateFrom, initDateTo) {\n      this.dateFrom = initDateFrom || ''\n      this.dateTo = initDateTo || ''\n\n      this.isOpen = true\n      this.$bvModal.show('b-modal-pick-dates')\n    },\n    focusInput() {\n      this.$refs.dateFrom.select()\n    },\n    close() {\n      this.$bvModal.hide('b-modal-pick-dates')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      if (!this.dateFrom && !this.dateTo) {\n        this.errorMessage = `${this.$i18next.t('At least one date is needed')}`\n        return\n      }\n\n      this.$emit('picked', this.dateFrom, this.dateTo)\n      this.$nextTick(() => {\n        this.close()\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DatePickerModal.vue?vue&type=template&id=56d59fd8&scoped=true&\"\nimport script from \"./DatePickerModal.vue?vue&type=script&lang=js&\"\nexport * from \"./DatePickerModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DatePickerModal.vue?vue&type=style&index=0&id=56d59fd8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"56d59fd8\",\n  null\n  \n)\n\nexport default component.exports","import moment from 'moment'\n\nconst DateParamFormat = 'YYYY-MM-DD'\n\nexport const queryBuilder = (filterValue, customDateFrom, customDateTo, user) => {\n  return {\n    from_date: getDateFrom(filterValue, customDateFrom, user).format(DateParamFormat),\n    to_date: getDateTo(filterValue, customDateTo).format(DateParamFormat),\n    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n  }\n}\n\nexport const getDateFrom = (filterValue, customDateFrom, user) => {\n  const today = new Date()\n  const firstDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay()))\n  const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1)\n  const firstDayOfYear = new Date(today.getFullYear(), 0, 1)\n\n  switch (filterValue) {\n    case 'this_week':\n      return moment(firstDayOfWeek)\n    case 'this_month':\n      return moment(firstDayOfMonth)\n    case 'this_year':\n      return moment(firstDayOfYear)\n    case 'custom':\n      if (customDateFrom) {\n        return moment(customDateFrom)\n      }\n  }\n  return moment(user.date_joined)\n}\n\nexport const getDateTo = (filterValue, customDateTo) => {\n  const today = new Date()\n  const lastDayOfWeek = new Date(today.setDate(today.getDate() - today.getDay() + 6))\n  const lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0)\n  const lastDayOfYear = new Date(today.getFullYear(), 11, 31)\n\n  switch (filterValue) {\n    case 'this_week':\n      return moment(lastDayOfWeek)\n    case 'this_month':\n      return moment(lastDayOfMonth)\n    case 'this_year':\n      return moment(lastDayOfYear)\n    case 'custom':\n      if (customDateTo) {\n        return moment(customDateTo)\n      }\n  }\n  return moment()\n}\n\nexport const getRecommendedGrouping = (filterValue, customDateFrom, customDateTo, user) => {\n  const fromDate = getDateFrom(filterValue, customDateFrom, user)\n  const toDate = getDateTo(filterValue, customDateTo)\n  const diff = toDate.diff(fromDate, 'days')\n  if (diff <= 31) {\n    return 'day'\n  } else if (diff <= 95) {\n    return 'week'\n  } else if (diff <= 366) {\n    return 'month'\n  } else {\n    return 'year'\n  }\n}\n","<template>\n  <page-layout>\n    <!-- Top bar -->\n    <template #topBarLeft>\n      <div class=\"actions-with-selected-desktop\">\n        <b-form-group class=\"m-0\">\n          <b-form-checkbox v-model=\"allPrintsSelected\" size=\"md\"></b-form-checkbox>\n        </b-form-group>\n        <div>\n          <span\n            v-show=\"!selectedPrintIds.size\"\n            class=\"label\"\n            @click=\"allPrintsSelected = !allPrintsSelected\"\n            >{{ $t(\"Select all\") }}</span\n          >\n          <b-dropdown\n            v-show=\"selectedPrintIds.size\"\n            toggle-class=\"btn btn-sm actions-with-selected-btn\"\n          >\n            <template #button-content>\n              {{ selectedPrintIds.size }} item{{ selectedPrintIds.size === 1 ? '' : 's' }}\n              {{$t(\"selected\")}}\n            </template>\n            <b-dropdown-item>\n              <div class=\"text-danger\" @click=\"onDeleteBtnClick\">\n                <i class=\"far fa-trash-alt\"></i>{{$t(\"Delete\")}}\n              </div>\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" :title=\"$t('Sort By')\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          :title=\"$t('Filter')\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            ref=\"filteringDropdown1\"\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            :filter-update-mixin=\"filterUpdateMixin\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'sorting',\n                icon: 'fas fa-sort-amount-down',\n                title: $t(`Sort`),\n                expandable: true,\n              },\n              {\n                key: 'filtering',\n                icon: 'fas fa-filter',\n                title: $t(`Filter`),\n                expandable: true,\n              },\n            ]\"\n          >\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                ref=\"filteringDropdown2\"\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                :filter-update-mixin=\"filterUpdateMixin\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <!-- Prints list -->\n      <b-container>\n        <b-row>\n          <b-col>\n            <div v-if=\"prints.length && !loading\" class=\"prints-summary\">\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"fas fa-hashtag\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Prints done\") }}</div>\n                  <div class=\"value\">\n                    {{ stats.total_print_count }} (<span class=\"text-success\">{{\n                      stats.total_succeeded_print_count\n                    }}</span>\n                    / <span class=\"text-danger\">{{ stats.total_cancelled_print_count }}</span\n                    >)\n                  </div>\n                </div>\n              </div>\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"far fa-clock\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Total print time\") }}</div>\n                  <div class=\"value\">{{ totalPrintTimeFormatted }}</div>\n                </div>\n              </div>\n              <div class=\"summary-item\">\n                <div class=\"icon\">\n                  <i class=\"fas fa-ruler-horizontal\"></i>\n                </div>\n                <div class=\"info\">\n                  <div class=\"title\">\n                    <help-widget\n                      id=\"filament-used-may-be-incorrect\"\n                      :highlight=\"false\"\n                      :show-close-button=\"false\"\n                    >\n                      {{$t(\"Filament used\")}}\n                    </help-widget>\n                  </div>\n                  <div class=\"value\">{{ totalFilamentUsedFormatted }}</div>\n                </div>\n              </div>\n              <div class=\"btn-wrapper\">\n                <a class=\"btn btn-secondary\" :href=\"`/stats/`\">\n                  {{$t(\"Full Stats\")}}\n                  <i class=\"fas fa-arrow-right\"></i>\n                </a>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row>\n          <b-col v-if=\"prints.length || loading\">\n            <print-history-item\n              v-for=\"(print, index) of prints\"\n              :key=\"print.id\"\n              :print=\"print\"\n              :index=\"index\"\n              :selectable=\"true\"\n              :selected=\"selectedPrintIds.has(print.id)\"\n              class=\"print-item\"\n              @selectedChanged=\"onSelectedChanged\"\n            ></print-history-item>\n            <mugen-scroll :handler=\"fetchMoreData\" :should-handle=\"!loading\">\n              <loading-placeholder v-if=\"!noMoreData\" />\n            </mugen-scroll>\n          </b-col>\n          <b-col v-else class=\"text-center my-5\">{{ $t(\"No prints found\") }}</b-col>\n        </b-row>\n      </b-container>\n\n      <!-- Date picker for filter by time period -->\n      <date-picker-modal ref=\"datePickerModal\" @picked=\"onDatesPicked\" />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport moment from 'moment'\nimport axios from 'axios'\nimport MugenScroll from 'vue-mugen-scroll'\nimport urls from '@config/server-urls'\nimport { normalizedPrint } from '@src/lib/normalizers'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport FilteringDropdown, {\n  restoreFilterValues,\n  getFilterParams,\n} from '@src/components/FilteringDropdown'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport PrintHistoryItem from '@src/components/prints/PrintHistoryItem.vue'\nimport DatePickerModal from '@src/components/DatePickerModal.vue'\nimport { user } from '@src/lib/page-context'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { queryBuilder } from '@src/lib/time-period-filtering'\nimport { humanizedFilamentUsage, humanizedDuration } from '@src/lib/formatters'\nimport i18n from '@src/i18n/i18n.js'\nconst PAGE_SIZE = 24\n\nexport const SortingLocalStoragePrefix = 'printsSorting'\nexport const SortingOptions = {\n  options: [{ title: `${i18n.t('Date')}`, key: 'date' }],\n  default: { sorting: 'date', direction: 'desc' },\n}\n\nconst DateParamFormat = 'YYYY-MM-DD'\nexport const FilterLocalStoragePrefix = 'printsFiltering'\nexport const FilterOptions = {\n  timePeriod: {\n    title: `${i18n.t('Time Period')}`,\n    buildQueryParam: queryBuilder,\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'this_week', title: `${i18n.t('This Week') }`},\n      { key: 'this_month', title: `${i18n.t('This Month') }`},\n      { key: 'this_year', title: `${i18n.t('This Year') }`},\n      { key: 'custom', title: `${i18n.t('Custom') }`},\n    ],\n    default: 'none',\n  },\n  printStatus: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'filter',\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'finished', title: `${i18n.t('Finished') }`},\n      { key: 'cancelled', title: `${i18n.t('Cancelled') }`},\n    ],\n    default: 'none',\n  },\n  feedbackNeeded: {\n    title: `${i18n.t('Feedback Needed')}`,\n    queryParam: 'feedback_needed',\n    values: [\n      { key: 'none', title: `${i18n.t('All' )}`},\n      { key: 'need_alert_overwrite', title: `${i18n.t('Review Needed' )}`},\n      { key: 'need_print_shot_feedback', title: `${i18n.t('Focused Feedback Needed' )}`},\n    ],\n    default: 'none',\n  },\n  printers: {\n    title: `${i18n.t('Printers')}`,\n    queryParam: 'filter_by_printer_ids',\n    multiple: true,\n    values: [\n      { key: 'none', title:`${i18n.t('All')}`, includesAll: true },\n      // Other options are added on printers fetch\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'PrintHistoryPage',\n\n  components: {\n    MugenScroll,\n    PageLayout,\n    CascadedDropdown,\n    DatePickerModal,\n    SortingDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n    PrintHistoryItem,\n    HelpWidget,\n  },\n\n  data: function () {\n    return {\n      stats: {},\n      prints: [],\n      loading: false,\n      noMoreData: false,\n      user: null,\n      selectedPrintIds: new Set(),\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    totalPrintTimeFormatted() {\n      return humanizedDuration(this.stats.total_print_time)\n    },\n    totalFilamentUsedFormatted() {\n      return humanizedFilamentUsage(this.stats?.total_filament_used)\n    },\n    defaultStatsParams() {\n      return {\n        timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        from_date: moment(this.user.date_joined).format(DateParamFormat),\n        to_date: moment(new Date()).format(DateParamFormat),\n        group_by: 'year',\n      }\n    },\n    allPrintsSelected: {\n      get: function () {\n        return this.selectedPrintIds.size >= this.prints.length && this.prints.length !== 0\n      },\n      set: function (newValue) {\n        if (newValue) {\n          this.selectedPrintIds = new Set(this.prints.map((p) => p.id))\n        } else {\n          if (this.selectedPrintIds.size === this.prints.length) {\n            this.selectedPrintIds = new Set()\n          }\n        }\n      },\n    },\n  },\n\n  created() {\n    this.user = user()\n    this.updateCustomPeriodFilterSubtitle()\n\n    // get printers first to remove deleted/archived printers from filtering before fetching prints\n    axios\n      .get(urls.printers(), {\n        params: {\n          with_archived: false,\n        },\n      })\n      .then((response) => {\n        response.data.forEach((p) => {\n          this.filterOptions.printers.values.push({\n            key: String(p.id),\n            title: p.name,\n          })\n        })\n\n        // remove deleted/archived printers from applied filter\n        if (this.filterValues.printers !== 'none') {\n          const validPrinterIds = response.data.map((p) => String(p.id))\n          this.filterValues.printers = this.filterValues.printers.filter((v) =>\n            validPrinterIds.includes(v)\n          )\n          setLocalPref(`${FilterLocalStoragePrefix}-printers`, this.filterValues.printers)\n        }\n\n        this.refetchData()\n      })\n  },\n\n  methods: {\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n      this.loading = true\n      axios\n        .get(urls.prints(), {\n          params: {\n            start: this.prints.length,\n            limit: PAGE_SIZE,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n            sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n          },\n        })\n        .then((response) => {\n          this.loading = false\n          this.noMoreData = response.data.length < PAGE_SIZE\n          this.prints.push(...response.data.map((data) => normalizedPrint(data)))\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n    refetchData() {\n      this.prints = []\n      this.selectedPrintIds = new Set()\n      this.noMoreData = false\n      this.fetchMoreData()\n      this.fetchStats()\n    },\n    fetchStats() {\n      axios\n        .get(urls.stats(), {\n          params: {\n            ...this.defaultStatsParams,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n          },\n        })\n        .then((response) => {\n          this.stats = response.data\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n\n    onSelectedChanged(printId, selected) {\n      const selectedPrintIdsClone = new Set(this.selectedPrintIds)\n      if (selected) {\n        selectedPrintIdsClone.add(printId)\n      } else {\n        selectedPrintIdsClone.delete(printId)\n      }\n      this.selectedPrintIds = selectedPrintIdsClone\n    },\n    onDeleteBtnClick() {\n      const selectedPrintIds = Array.from(this.selectedPrintIds)\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} print(s)? This action can not be undone.`,{name:this.selectedPrintIds.size})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.post(urls.printsBulkDelete(), { print_ids: selectedPrintIds }).then(() => {\n            this.refetchData()\n          })\n        }\n      })\n    },\n\n    // Sorting\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n      this.refetchData()\n    },\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n      this.refetchData()\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n      this.updateCustomPeriodFilterSubtitle()\n      this.refetchData()\n    },\n    // custom logic for time period filters:\n    getCurrentDateFrom() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null\n    },\n    getCurrentDateTo() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null\n    },\n    filterUpdateMixin(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        if (filterValueKey === 'custom') {\n          if (this.filterValues.timePeriod !== 'custom') {\n            this.$refs.datePickerModal.show()\n          } else {\n            const initDateFrom = this.getCurrentDateFrom()\n            const initDateTo = this.getCurrentDateTo()\n            this.$refs.datePickerModal.show(initDateFrom, initDateTo)\n          }\n          return\n        } else {\n          this.$nextTick(() => {\n            this.updateCustomPeriodFilterSubtitle()\n          })\n        }\n      }\n      return true\n    },\n    onDatesPicked(dateFrom, dateTo) {\n      if (!dateFrom && !dateTo) {\n        return\n      }\n      this.filterValues.timePeriod = 'custom'\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod`, 'custom')\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`, dateFrom)\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`, dateTo)\n      this.updateCustomPeriodFilterSubtitle()\n      this.refetchData()\n    },\n    customFilterParamsBuilder(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        return this.filterOptions[filterOptionKey].buildQueryParam(\n          filterValueKey,\n          this.getCurrentDateFrom(),\n          this.getCurrentDateTo(),\n          this.user\n        )\n      }\n    },\n    updateCustomPeriodFilterSubtitle() {\n      let newTitle = ''\n      if (this.filterValues.timePeriod === 'custom') {\n        // variants:\n        // Feb 15, 2023 — Feb 16, 2023\n        // Feb 15, 2023 and later\n        // Until Feb 16, 2023\n        const dateFormat = 'MMM D, YYYY'\n        const currentDateFrom = this.getCurrentDateFrom()\n        const currentDateTo = this.getCurrentDateTo()\n        const dateFromFormatted = currentDateFrom\n          ? moment(currentDateFrom).format(dateFormat)\n          : `${this.$i18next.t('Until')}`\n        const dateToFormatted = currentDateTo\n          ? moment(currentDateTo).format(dateFormat)\n          : `${this.$i18next.t('and later')}`\n\n        newTitle = `${dateFromFormatted}${\n          currentDateFrom && currentDateTo ? ' - ' : ' '\n        }${dateToFormatted}`\n      }\n\n      const index = this.filterOptions.timePeriod.values.findIndex((v) => v.key === 'custom')\n      this.filterOptions.timePeriod.values[index].subtitle = newTitle\n\n      this.$refs.filteringDropdown1 && this.$refs.filteringDropdown1.$forceUpdate()\n      this.$refs.filteringDropdown2 && this.$refs.filteringDropdown2.$forceUpdate()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-item\n  margin-bottom: 10px\n\n.prints-summary\n  margin-bottom: var(--gap-between-blocks)\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-lg)\n  padding: 1.5rem 2rem\n  display: flex\n  justify-content: space-between\n  align-items: center\n  .summary-item\n    display: flex\n    align-items: center\n    gap: 1rem\n  .icon\n    font-size: 1.5rem\n    color: var(--color-divider)\n  .value\n    font-weight: bold\n  .btn\n    display: inline-flex\n    gap: .5rem\n    align-items: center\n    justify-content: center\n    .fa-arrow-right\n      font-size: .8em\n\n  @media (max-width: 768px)\n    flex-direction: column\n    align-items: normal\n    gap: .25rem\n    padding: 1rem\n\n    .summary-item\n      gap: 0\n      .icon\n        font-size: 1rem\n        width: 2rem\n        text-align: center\n      .info\n        flex: 1\n        display: flex\n        justify-content: space-between\n\n    .btn-wrapper\n      text-align: center\n    .btn\n      margin-top: 1rem\n      font-size: .875rem\n\n.actions-with-selected-desktop\n  display: flex\n  align-items: center\n  .label\n    cursor: pointer\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintHistoryPage.vue?vue&type=template&id=29682057&scoped=true&\"\nimport script from \"./PrintHistoryPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintHistoryPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintHistoryPage.vue?vue&type=style&index=0&id=29682057&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29682057\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-chart-bar\"})]},proxy:true}])},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"GROUP BY\")))]),_vm._l((_vm.groupingOptions),function(grouping){return _c('b-dropdown-item',{key:grouping.key,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return (() => _vm.updateChartGrouping(grouping)).apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.activeGrouping === grouping.key ? 'visible' : 'hidden' })}),_c('span',[_vm._v(_vm._s(grouping.title))])])})],2),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":_vm.$t('Filter')},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{ref:\"filteringDropdown1\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'grouping',\n              icon: 'fas fa-chart-bar',\n              title: _vm.$t(`Group By`),\n              expandable: true,\n            },\n            {\n              key: 'filtering',\n              icon: 'fas fa-filter',\n              title: _vm.$t(`Filter`),\n              expandable: true,\n            },\n          ]},scopedSlots:_vm._u([{key:\"grouping\",fn:function(){return [_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"GROUP BY\")))]),_vm._l((_vm.groupingOptions),function(grouping){return _c('b-dropdown-item',{key:grouping.key,nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return (() => _vm.updateChartGrouping(grouping)).apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.activeGrouping === grouping.key ? 'visible' : 'hidden' })}),_c('span',[_vm._v(_vm._s(grouping.title))])])})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{ref:\"filteringDropdown2\",attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues,\"filter-update-mixin\":_vm.filterUpdateMixin},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),(!_vm.stats)?_c('loading-placeholder'):_c('b-container',[_c('b-row',[_c('b-col',[_c('muted-alert',{staticClass:\"muted-alert\"},[_vm._v(_vm._s(_vm.$t(\"Statistics include deleted prints\")))]),(_vm.groupingAdjusted)?_c('muted-alert',{staticClass:\"muted-alert\"},[_vm._v(\" \"+_vm._s(_vm.groupingNotice)+\" \")]):_vm._e()],1)],1),_c('b-row',[_c('b-col',{staticClass:\"mb-4 mb-lg-0\",attrs:{\"lg\":\"6\"}},[_c('div',{staticClass:\"stats-block total-prints\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-hashtag\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Total Prints\")))])]),_c('div',{staticClass:\"chart-wrapper\"},[_c('div',{staticClass:\"legend\"},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"square success\"}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Finished\"))+\":\")]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.stats ? _vm.stats.total_succeeded_print_count : ''))])]),_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"square danger\"}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Cancelled\"))+\":\")]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.stats ? _vm.stats.total_cancelled_print_count : ''))])])]),_c('div',{ref:\"totalPrintsDonutChart\"})])])]),_c('b-col',{attrs:{\"lg\":\"6\"}},[_c('div',{staticClass:\"stats-block print-time\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"far fa-clock\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Print Time\")))])]),_c('div',{staticClass:\"info total-print-time\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total print time\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.total_print_time)))])]),_c('div',{staticClass:\"other-print-time-numbers\"},[_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Longest print\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.longest_print_time)))])]),_c('div',{staticClass:\"divider\"}),_c('div',{staticClass:\"info\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Average print\")))]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.humanizedDuration(_vm.stats.average_print_time)))])])])])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-hashtag\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Prints Count\")))])]),_c('div',{ref:\"printCountGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"far fa-clock\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"Print Time\")))])]),_c('div',{ref:\"printTimeGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1),_c('b-row',{staticClass:\"mt-4\"},[_c('b-col',[_c('div',{staticClass:\"stats-block bar-chart filament-used-groups\"},[_c('div',{staticClass:\"stats-block-title\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"}),_c('div',{staticClass:\"title-group\"},[_c('span',[_c('help-widget',{attrs:{\"id\":\"filament-used-may-be-incorrect\",\"highlight\":false,\"show-close-button\":false}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Filament Usage\"))+\" \")])],1),_c('div',{staticClass:\"divider\"}),_c('div',{staticClass:\"subtitle\"},[_vm._v(_vm._s(_vm.totalFilamentUsedFormatted)+\" \"+_vm._s(_vm.$t(\"total\")))])])]),_c('div',{ref:\"filamentUsedGroupsChart\",staticClass:\"bar-chart-wrapper\"})])])],1)],1),_c('date-picker-modal',{ref:\"datePickerModal\",on:{\"picked\":_vm.onDatesPicked}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert-wrapper\"},[_vm._m(0),_c('p',{staticClass:\"message\"},[_vm._t(\"default\")],2)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info-circle\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"alert-wrapper\">\n    <div class=\"icon\">\n      <i class=\"fas fa-info-circle\"></i>\n    </div>\n    <p class=\"message\">\n      <slot></slot>\n    </p>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'MutedAlert',\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.alert-wrapper\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-md)\n  display: flex\n  align-items: center\n  padding: 1em\n\n  .icon\n    color: var(--color-divider)\n\n  .message\n    margin: 0\n    margin-left: 0.5em\n    line-height: 1.3\n\n  @media (max-width: 768px)\n    font-size: 0.8rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MutedAlert.vue?vue&type=template&id=74f6a500&scoped=true&\"\nimport script from \"./MutedAlert.vue?vue&type=script&lang=js&\"\nexport * from \"./MutedAlert.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MutedAlert.vue?vue&type=style&index=0&id=74f6a500&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"74f6a500\",\n  null\n  \n)\n\nexport default component.exports","// Credit: https://observablehq.com/@d3/donut-chart\n\nimport * as d3 from 'd3'\n\nexport const DonutChart = (\n  data,\n  {\n    name = ([x]) => x, // given d in data, returns the (ordinal) label\n    value = ([, y]) => y, // given d in data, returns the (quantitative) value\n    totalValue = null, // to show in the middle\n    totalValueFormat = ',', // a format specifier for total value\n    title, // given d in data, returns the title text\n    width = 180, // outer width, in pixels\n    height = 180, // outer height, in pixels\n    innerRadius = Math.min(width, height) / 3.6, // inner radius of pie, in pixels (non-zero for donut)\n    outerRadius = Math.min(width, height) / 2, // outer radius of pie, in pixels\n    labelRadius = (innerRadius + outerRadius) / 2, // center radius of labels\n    format = ',', // a format specifier for values (in the label)\n    names, // array of names (the domain of the color scale)\n    colors, // array of colors for names\n    stroke = innerRadius > 0 ? 'none' : 'white', // stroke separating widths\n    strokeWidth = 10, // width of stroke separating wedges\n    strokeLinejoin = 'round', // line join of stroke separating wedges\n    padAngle = stroke === 'none' ? 2 / outerRadius : 0, // angular separation between wedges\n    emptyState = false, // if true, show empty state\n  } = {}\n) => {\n  // Compute values\n  const N = d3.map(data, name)\n  const V = d3.map(data, value)\n  const I = d3.range(N.length).filter((i) => !isNaN(V[i]))\n\n  // Unique the names\n  if (names === undefined) names = N\n  names = new d3.InternSet(names)\n\n  // Chose a default color scheme based on cardinality\n  if (colors === undefined) colors = d3.schemeSpectral[names.size]\n  if (colors === undefined)\n    colors = d3.quantize((t) => d3.interpolateSpectral(t * 0.8 + 0.1), names.size)\n\n  // Construct scales\n  const color = d3.scaleOrdinal(names, colors)\n\n  // Compute titles\n  if (title === undefined) {\n    const formatValue = d3.format(format)\n    title = (i) => `${formatValue(V[i])}`\n  } else {\n    const O = d3.map(data, (d) => d)\n    const T = title\n    title = (i) => T(O[i], i, data)\n  }\n\n  // Construct arcs\n  const arcs = d3\n    .pie()\n    .padAngle(padAngle)\n    .sort(null)\n    .value((i) => V[i])(I)\n  const arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius)\n  const arcLabel = d3.arc().innerRadius(labelRadius).outerRadius(labelRadius)\n\n  const svg = d3\n    .create('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .attr('viewBox', [-width / 2, -height / 2, width, height])\n    .attr('style', 'max-width: 100%; height: auto; height: intrinsic;')\n\n  svg\n    .append('g')\n    .attr('stroke', stroke)\n    .attr('stroke-width', strokeWidth)\n    .attr('stroke-linejoin', strokeLinejoin)\n    .selectAll('path')\n    .data(arcs)\n    .join('path')\n    .attr('fill', (d) => color(N[d.data]))\n    .attr('d', arc)\n    .append('title')\n    .text((d) => title(d.data))\n\n  svg\n    .append('g')\n    .attr('font-family', 'sans-serif')\n    .attr('font-size', 14)\n    .attr('text-anchor', 'middle')\n    .selectAll('text')\n    .data(arcs)\n    .join('text')\n    .attr('transform', (d) => `translate(${arcLabel.centroid(d)})`)\n    .selectAll('tspan')\n    .data((d) => {\n      if (emptyState) return ['0%']\n      const lines = `${title(d.data)}`.split(/\\n/)\n      return d.endAngle - d.startAngle > 0.25 ? lines : lines.slice(0, 1)\n    })\n    .join('tspan')\n    .attr('x', 0)\n    .attr('y', (_, i) => `${0.3}em`)\n    .attr('font-weight', (_, i) => (i ? null : 'bold'))\n    .attr('fill', '#fff')\n    .text((d) => d)\n\n  // Total value at the center\n  if (totalValue) {\n    svg\n      .append('text')\n      .attr('font-size', 12)\n      .attr('dy', '-.75em')\n      .attr('text-anchor', 'middle')\n      .attr('fill', 'var(--color-text-secondary)')\n      .text('Total')\n\n    const formatTotalValue = d3.format(totalValueFormat)\n\n    svg\n      .append('text')\n      .attr('dy', '.75em')\n      .attr('font-size', 14)\n      .attr('text-anchor', 'middle')\n      .attr('font-weight', 'bold')\n      .attr('fill', 'var(--color-text-primary)')\n      .text(formatTotalValue(totalValue))\n  }\n\n  return Object.assign(svg.node(), { scales: { color } })\n}\n","// Credit: https://observablehq.com/@d3/bar-chart\n\nimport * as d3 from 'd3'\nimport moment from 'moment'\nimport { formatWithoutDaylightSavingShift as format } from '@src/lib/utils'\n\nexport const BarChart = (\n  data,\n  {\n    x = (d, i) => i, // given d in data, returns the (ordinal) x-value\n    y = (d) => d, // given d in data, returns the (quantitative) y-value\n    title, // given d in data, returns the title text\n    marginTop = 20, // the top margin, in pixels\n    marginRight = 0, // the right margin, in pixels\n    marginBottom = 40, // the bottom margin, in pixels\n    marginLeft = 40, // the left margin, in pixels\n    width = 640, // the outer width of the chart, in pixels\n    height = 210, // the outer height of the chart, in pixels\n    xDomain, // an array of (ordinal) x-values\n    xRange = [marginLeft, width - marginRight], // [left, right]\n    xLabelShow = (i) => true, // whether to show the x-axis label\n    xLabelRotation = 0, // the rotation of the x-axis label, in degrees\n    yType = d3.scaleLinear, // y-scale type\n    yDomain, // [ymin, ymax]\n    yRange = [height - marginBottom, marginTop], // [bottom, top]\n    yTicks = height / 40,\n    xPadding = 0.1, // amount of x-range to reserve to separate bars\n    yFormat, // a format specifier string for the y-axis\n    yTickFormat = null,\n    yLabel, // a label for the y-axis\n    color = 'currentColor', // bar fill color\n  } = {}\n) => {\n  // Compute values\n  const X = d3.map(data, x)\n  const Y = d3.map(data, y)\n\n  // Compute default domains, and unique the x-domain\n  if (xDomain === undefined) xDomain = X\n  if (yDomain === undefined) yDomain = [0, d3.max(Y)]\n  xDomain = new d3.InternSet(xDomain)\n\n  // Omit any data not present in the x-domain\n  const I = d3.range(X.length).filter((i) => xDomain.has(X[i]))\n\n  // Construct scales, axes, and formats\n  const xScale = d3.scaleBand(xDomain, xRange).padding(xPadding)\n  const yScale = yType(yDomain, yRange)\n  const xAxis = d3.axisBottom(xScale).tickSizeOuter(0)\n  const yAxis = d3.axisLeft(yScale).ticks(yTicks, yFormat)\n  if (yTickFormat) {\n    yAxis.tickFormat(yTickFormat)\n  }\n\n  // Compute titles\n  if (title === undefined) {\n    const formatValue = yScale.tickFormat(100, yFormat)\n    title = (i) => `${X[i]}: ${formatValue(Y[i])}`\n  } else {\n    const O = d3.map(data, (d) => d)\n    const T = title\n    title = (i) => T(O[i], i, data)\n  }\n\n  const svg = d3\n    .create('svg')\n    .attr('width', width)\n    .attr('height', height)\n    .attr('viewBox', [0, 0, width, height])\n    .attr('style', 'max-width: 100%; height: auto; height: intrinsic;')\n\n  svg\n    .append('g')\n    .attr('transform', `translate(${marginLeft},0)`)\n    .call(yAxis)\n    .call((g) =>\n      g\n        .selectAll('.tick line')\n        .clone()\n        .attr('x2', width - marginLeft - marginRight)\n        .attr('stroke-opacity', 0.1)\n    )\n    .call((g) => g.selectAll('text').attr('font-size', 11))\n\n  const bar = svg\n    .append('g')\n    .attr('fill', color)\n    .selectAll('rect')\n    .data(I)\n    .join('rect')\n    .attr('x', (i) => xScale(X[i]))\n    .attr('y', (i) => yScale(Y[i]))\n    .attr('height', (i) => yScale(0) - yScale(Y[i]))\n    .attr('width', xScale.bandwidth())\n    .attr('rx', 2)\n\n  if (title) bar.append('title').text(title)\n\n  svg\n    .append('g')\n    .attr('transform', `translate(0,${height - marginBottom})`)\n    .call(xAxis)\n    .selectAll('text')\n    .attr('transform', xLabelRotation ? `translate(-10,0)rotate(-${xLabelRotation})` : '')\n    .attr('font-size', 11)\n    .call(function (t) {\n      t.each(function (d, i) {\n        var self = d3.select(this)\n        var lines = self.text().split('\\r')[0].split('\\n') // get the text and split it\n        self.text('') // clear it out\n\n        if (xLabelShow(i)) {\n          self\n            .append('tspan')\n            .attr('x', 0)\n            .attr('dy', '1em')\n            .attr('text-anchor', xLabelRotation ? 'end' : 'middle')\n            .text(lines[0])\n\n          if (lines.length === 2) {\n            self.append('tspan').attr('x', 0).attr('dy', '1.2em').text(lines[1])\n          }\n        }\n      })\n    })\n\n  return svg.node()\n}\n\n// Adaptive x-axis labels based on the width of the chart and number of bars\nexport const xAxisLabelsFormat = (wrapperWidth, barsCount, grouping = 'day', lastDayInDataset) => {\n  const barWidth = wrapperWidth / barsCount\n\n  const horizontalLabelRequiredWidth = grouping === 'day' ? 30 : grouping === 'week' ? 70 : 35\n  const rotatedLabelRequiredWidth = 20\n\n  let frequency, rotation\n  if (barWidth >= horizontalLabelRequiredWidth) {\n    frequency = 1\n    rotation = 0\n  } else {\n    frequency = Math.ceil(rotatedLabelRequiredWidth / barWidth)\n    rotation = 45\n  }\n\n  return {\n    frequency,\n    rotation,\n\n    value: (d) => {\n      const date = moment(d.key)\n\n      let firstLine,\n        secondLine = ''\n      if (grouping === 'day') {\n        firstLine = format(date, 'M/D')\n        secondLine = format(date, 'ddd')\n      } else if (grouping === 'week') {\n        firstLine = format(date, 'M/D')\n\n        const endOfWeek = date.clone().endOf('week')\n        const lastDayOfWeek = endOfWeek.isBefore(lastDayInDataset) ? endOfWeek : lastDayInDataset\n\n        firstLine += `-${\n          lastDayOfWeek.month() === date.month()\n            ? lastDayOfWeek.format('D')\n            : lastDayOfWeek.format('M/D')\n        }`\n        secondLine = lastDayOfWeek.diff(date, 'days') === 6 ? `Week ${date.week()}` : ''\n      } else if (grouping === 'month') {\n        firstLine = format(date, 'MMM')\n        secondLine = format(date, 'YYYY')\n      } else {\n        firstLine = format(date, 'YYYY')\n      }\n\n      let label = firstLine\n      if (rotation === 0) {\n        label += `\\n${secondLine}`\n      }\n\n      const uniqueDateKey = format(date, 'M/D/YYYY')\n      label += `\\r${uniqueDateKey}` // so d3 won't skip same labels\n\n      return label\n    },\n\n    shouldShow: (index) => {\n      return index % frequency === 0\n    },\n  }\n}\n","export async function fetchPrintStats(request, params) {\n  const groupings = ['day', 'week', 'month', 'year']\n  const requestedGrouping = params.group_by.toLowerCase()\n  let effectiveGrouping = requestedGrouping\n\n  for (;;) {\n    try {\n      const response = await request({ ...params, group_by: effectiveGrouping })\n      return { response, requestedGrouping, effectiveGrouping }\n    } catch (error) {\n      const suggestedGrouping = error.response?.data?.suggested_group_by\n      if (\n        error.response?.status !== 400 ||\n        error.response?.data?.code !== 'too_many_stats_buckets' ||\n        !groupings.includes(suggestedGrouping) ||\n        groupings.indexOf(suggestedGrouping) <= groupings.indexOf(effectiveGrouping)\n      ) {\n        throw error\n      }\n      effectiveGrouping = suggestedGrouping\n    }\n  }\n}\n","<template>\n  <page-layout>\n    <!-- Top bar -->\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Grouping -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-chart-bar\"></i>\n          </template>\n          <b-dropdown-text class=\"small text-secondary\">{{ $t(\"GROUP BY\") }}</b-dropdown-text>\n          <b-dropdown-item\n            v-for=\"grouping in groupingOptions\"\n            :key=\"grouping.key\"\n            @click.native.capture.stop.prevent=\"() => updateChartGrouping(grouping)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: activeGrouping === grouping.key ? 'visible' : 'hidden' }\"\n            ></i>\n            <span>{{ grouping.title }}</span>\n          </b-dropdown-item>\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          :title=\"$t('Filter')\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            ref=\"filteringDropdown1\"\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            :filter-update-mixin=\"filterUpdateMixin\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'grouping',\n                icon: 'fas fa-chart-bar',\n                title: $t(`Group By`),\n                expandable: true,\n              },\n              {\n                key: 'filtering',\n                icon: 'fas fa-filter',\n                title: $t(`Filter`),\n                expandable: true,\n              },\n            ]\"\n          >\n            <template #grouping>\n              <b-dropdown-text class=\"small text-secondary\">{{ $t(\"GROUP BY\") }}</b-dropdown-text>\n              <b-dropdown-item\n                v-for=\"grouping in groupingOptions\"\n                :key=\"grouping.key\"\n                @click.native.capture.stop.prevent=\"() => updateChartGrouping(grouping)\"\n              >\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: activeGrouping === grouping.key ? 'visible' : 'hidden' }\"\n                ></i>\n                <span>{{ grouping.title }}</span>\n              </b-dropdown-item>\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                ref=\"filteringDropdown2\"\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                :filter-update-mixin=\"filterUpdateMixin\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <loading-placeholder v-if=\"!stats\" />\n      <b-container v-else>\n        <b-row>\n          <b-col>\n            <muted-alert class=\"muted-alert\">{{ $t(\"Statistics include deleted prints\") }}</muted-alert>\n            <muted-alert v-if=\"groupingAdjusted\" class=\"muted-alert\">\n              {{ groupingNotice }}\n            </muted-alert>\n          </b-col>\n        </b-row>\n        <b-row>\n          <b-col lg=\"6\" class=\"mb-4 mb-lg-0\">\n            <div class=\"stats-block total-prints\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-hashtag\"></i>\n                <span>{{ $t(\"Total Prints\") }}</span>\n              </div>\n              <div class=\"chart-wrapper\">\n                <div class=\"legend\">\n                  <div class=\"line\">\n                    <div class=\"square success\"></div>\n                    <div class=\"title\">{{ $t(\"Finished\") }}:</div>\n                    <div class=\"value\">{{ stats ? stats.total_succeeded_print_count : '' }}</div>\n                  </div>\n                  <div class=\"line\">\n                    <div class=\"square danger\"></div>\n                    <div class=\"title\">{{ $t(\"Cancelled\") }}:</div>\n                    <div class=\"value\">{{ stats ? stats.total_cancelled_print_count : '' }}</div>\n                  </div>\n                </div>\n                <div ref=\"totalPrintsDonutChart\"></div>\n              </div>\n            </div>\n          </b-col>\n          <b-col lg=\"6\">\n            <div class=\"stats-block print-time\">\n              <div class=\"stats-block-title\">\n                <i class=\"far fa-clock\"></i>\n                <span>{{ $t(\"Print Time\") }}</span>\n              </div>\n              <div class=\"info total-print-time\">\n                <div class=\"title\">{{ $t(\"Total print time\") }}</div>\n                <div class=\"value\">{{ humanizedDuration(stats.total_print_time) }}</div>\n              </div>\n              <div class=\"other-print-time-numbers\">\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Longest print\") }}</div>\n                  <div class=\"value\">{{ humanizedDuration(stats.longest_print_time) }}</div>\n                </div>\n                <div class=\"divider\"></div>\n                <div class=\"info\">\n                  <div class=\"title\">{{ $t(\"Average print\") }}</div>\n                  <div class=\"value\">{{ humanizedDuration(stats.average_print_time) }}</div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-hashtag\"></i>\n                <span>{{ $t(\"Prints Count\") }}</span>\n              </div>\n              <div ref=\"printCountGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart\">\n              <div class=\"stats-block-title\">\n                <i class=\"far fa-clock\"></i>\n                <span>{{ $t(\"Print Time\") }}</span>\n              </div>\n              <div ref=\"printTimeGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n        <b-row class=\"mt-4\">\n          <b-col>\n            <div class=\"stats-block bar-chart filament-used-groups\">\n              <div class=\"stats-block-title\">\n                <i class=\"fas fa-ruler-horizontal\"></i>\n                <div class=\"title-group\">\n                  <span>\n                    <help-widget\n                      id=\"filament-used-may-be-incorrect\"\n                      :highlight=\"false\"\n                      :show-close-button=\"false\"\n                    >\n                      {{$t(\"Filament Usage\")}}\n                    </help-widget>\n                  </span>\n                  <div class=\"divider\"></div>\n                  <div class=\"subtitle\">{{ totalFilamentUsedFormatted }} {{$t(\"total\")}}</div>\n                </div>\n              </div>\n              <div ref=\"filamentUsedGroupsChart\" class=\"bar-chart-wrapper\"></div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n\n      <!-- Date picker for filter by time period -->\n      <date-picker-modal ref=\"datePickerModal\" @picked=\"onDatesPicked\" />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { user } from '@src/lib/page-context'\nimport MutedAlert from '../components/MutedAlert.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport FilteringDropdown, {\n  restoreFilterValues,\n  getFilterParams,\n} from '@src/components/FilteringDropdown'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport DatePickerModal from '@src/components/DatePickerModal.vue'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { DonutChart } from '@src/lib/charts/donut-chart'\nimport { BarChart, xAxisLabelsFormat } from '@src/lib/charts/bar-chart'\nimport { queryBuilder, getDateTo, getRecommendedGrouping } from '@src/lib/time-period-filtering'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { humanizedDuration, humanizedFilamentUsage } from '@src/lib/formatters'\nimport { fetchPrintStats } from '@src/lib/printStats'\nimport i18n from \"@src/i18n/i18n.js\"\nconst GroupingLocalStorageKey = 'statsGrouping'\n\nconst DateParamFormat = 'YYYY-MM-DD'\nconst FilterLocalStoragePrefix = 'statsFiltering'\nconst FilterOptions = {\n  timePeriod: {\n    title: `${i18n.t('Time Period')}`,\n    buildQueryParam: queryBuilder,\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'this_week', title: `${i18n.t('This Week') }`},\n      { key: 'this_month', title: `${i18n.t('This Month') }`},\n      { key: 'this_year', title: `${i18n.t('This Year') }`},\n      { key: 'custom', title: `${i18n.t('Custom') }`},\n    ],\n    default: 'none',\n  },\n  printStatus: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'filter',\n    values: [\n      { key: 'none', title: `${i18n.t('All') }`},\n      { key: 'finished', title: `${i18n.t('Finished') }`},\n      { key: 'cancelled', title: `${i18n.t('Cancelled') }`},\n    ],\n    default: 'none',\n  },\n  printers: {\n    title: `${i18n.t('Printers')}`,\n    queryParam: 'filter_by_printer_ids',\n    multiple: true,\n    values: [\n      { key: 'none', title: `${i18n.t('All')}`, includesAll: true },\n      // Other options are added on printers fetch\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'StatsPage',\n\n  components: {\n    PageLayout,\n    MutedAlert,\n    CascadedDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n    DatePickerModal,\n    HelpWidget,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      stats: null,\n      requestedGrouping: null,\n      effectiveGrouping: null,\n\n      groupingOptions: [\n        { key: 'auto', title: 'Auto' },\n        { key: 'day', title: 'Day' },\n        { key: 'week', title: 'Week' },\n        { key: 'month', title: 'Month' },\n        { key: 'year', title: 'Year' },\n      ],\n      activeGrouping: getLocalPref(GroupingLocalStorageKey, 'auto'),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    groupingAdjusted() {\n      return this.requestedGrouping !== this.effectiveGrouping\n    },\n    effectiveGroupingTitle() {\n      return this.groupingOptions.find((grouping) => grouping.key === this.effectiveGrouping)?.title || ''\n    },\n    groupingNotice() {\n      return this.$t('Grouped by {{grouping}} to show the full selected period.', {\n        grouping: this.$t(this.effectiveGroupingTitle),\n      })\n    },\n    defaultStatsParams() {\n      return {\n        timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        from_date: moment(this.user.date_joined).format(DateParamFormat),\n        to_date: moment(new Date()).format(DateParamFormat),\n        group_by: this.getActiveGrouping(),\n      }\n    },\n\n    isEmptyState() {\n      return !this.stats?.total_print_count\n    },\n\n    // Total prints count\n    finishedPrintsPercentage() {\n      const finished = this.stats?.total_succeeded_print_count\n      const total = this.stats?.total_print_count\n\n      if (!finished || !total) {\n        return 0\n      }\n\n      return Math.round((finished / total) * 100)\n    },\n    cancelledPrintsPercentage() {\n      const total = this.stats?.total_print_count\n\n      if (!total) {\n        return 0\n      } else {\n        return 100 - this.finishedPrintsPercentage\n      }\n    },\n\n    totalFilamentUsedFormatted() {\n      return humanizedFilamentUsage(this.stats?.total_filament_used)\n    },\n  },\n\n  created() {\n    this.user = user()\n    this.updateCustomPeriodFilterSubtitle()\n\n    // get printers first to remove deleted/archived printers from filtering before fetching prints\n    axios\n      .get(urls.printers(), {\n        params: {\n          with_archived: false,\n        },\n      })\n      .then((response) => {\n        response.data.forEach((p) => {\n          this.filterOptions.printers.values.push({\n            key: String(p.id),\n            title: p.name,\n          })\n        })\n\n        // remove deleted/archived printers from applied filter\n        if (this.filterValues.printers !== 'none') {\n          const validPrinterIds = response.data.map((p) => String(p.id))\n          this.filterValues.printers = this.filterValues.printers.filter((v) =>\n            validPrinterIds.includes(v)\n          )\n          setLocalPref(`${FilterLocalStoragePrefix}-printers`, this.filterValues.printers)\n        }\n\n        this.fetchStats()\n      })\n  },\n\n  mounted() {\n    addEventListener('resize', this.drawCharts)\n  },\n\n  unmounted() {\n    removeEventListener('resize', this.drawCharts)\n  },\n\n  methods: {\n    getFilterParamsFromQuery() {\n      let params = {}\n      const urlParams = new URLSearchParams(window.location.search)\n      const entries = urlParams.entries()\n\n      // frontend params without need to be passed to backend\n      const excludeParams = ['hide_header']\n\n      for (const [key, value] of entries) {\n        if (key && value && !excludeParams.includes(key)) {\n          params[key] = params[key]\n            ? Array.isArray(params[key])\n              ? [...params[key], value]\n              : [params[key], value]\n            : value\n        }\n      }\n      console.log('params', params)\n      return params\n    },\n    async fetchStats() {\n      try {\n        const { response, requestedGrouping, effectiveGrouping } = await fetchPrintStats(\n          (params) => axios.get(urls.stats(), { params }),\n          {\n            with_deleted: true,\n            ...this.defaultStatsParams,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              this.customFilterParamsBuilder\n            ),\n            ...this.getFilterParamsFromQuery(),\n          }\n        )\n        this.stats = response.data\n        this.requestedGrouping = requestedGrouping\n        this.effectiveGrouping = effectiveGrouping\n        this.$nextTick(this.drawCharts)\n      } catch (error) {\n        this.errorDialog(error, `${this.$i18next.t('Failed to fetch statistics')}`)\n      }\n    },\n    updateChartGrouping(grouping) {\n      this.activeGrouping = grouping.key\n      setLocalPref(GroupingLocalStorageKey, grouping.key)\n      this.fetchStats()\n    },\n    drawCharts() {\n      if (!this.stats) {\n        return\n      }\n\n      this.$refs.totalPrintsDonutChart.replaceChildren(\n        DonutChart(\n          [\n            {\n              name: 'Finished',\n              value: this.isEmptyState ? 0.5 : this.finishedPrintsPercentage / 100,\n            },\n            {\n              name: 'Cancelled',\n              value: this.isEmptyState ? 0.5 : this.cancelledPrintsPercentage / 100,\n            },\n          ],\n          {\n            name: (d) => d.name,\n            value: (d) => d.value,\n            format: '.0%',\n            totalValue: this.isEmptyState\n              ? '0'\n              : this.stats.total_succeeded_print_count + this.stats.total_cancelled_print_count,\n            names: ['Finished', 'Cancelled'],\n            colors: ['var(--color-success)', 'var(--color-danger)'],\n            emptyState: this.isEmptyState,\n          }\n        )\n      )\n\n      // Print count groups bars\n      const printCountMaxValue = Math.max(...this.stats.print_count_groups.map((d) => d.value))\n      this.drawBarChart({\n        data: this.stats.print_count_groups,\n        ref: this.$refs.printCountGroupsChart,\n        yFormat: 'd',\n        titleValue: (v) => `${v} print(s)`,\n        yDomain: [0, printCountMaxValue || 1],\n        yTicks: Math.min(printCountMaxValue || 1, 5),\n      })\n\n      // Print time groups bars\n      const printTimeMaxValue = Math.max(...this.stats.print_time_groups.map((d) => d.value))\n      const printTimeMaxvalueHours = Math.round(printTimeMaxValue / 3600)\n      this.drawBarChart({\n        data: this.stats.print_time_groups.map((d) => ({ ...d, value: d.value / 3600 })),\n        ref: this.$refs.printTimeGroupsChart,\n        yFormat: 'd',\n        yTickFormat: (h) => {\n          if (h > 24 * 365) {\n            return `${Math.round(h / (24 * 365))}y`\n          } else if (h >= 24) {\n            return `${Math.round(h / 24)}d`\n          } else {\n            return `${h}h`\n          }\n        },\n        titleValue: (v) => this.humanizedDuration(v * 3600),\n        yDomain: [0, printTimeMaxvalueHours || 1],\n        yTicks: Math.min(printTimeMaxvalueHours || 1, 5),\n      })\n\n      // Filament used groups bars\n      const filamentUsedMaxValue = Math.max(...this.stats.filament_used_groups.map((d) => d.value))\n      const filamentUsedMaxvalueMeters = Math.round(filamentUsedMaxValue / 1000)\n      this.drawBarChart({\n        data: this.stats.filament_used_groups.map((d) => ({ ...d, value: d.value / 1000 })),\n        ref: this.$refs.filamentUsedGroupsChart,\n        yFormat: 'd',\n        yTickFormat: (m) => `${m}m`,\n        titleValue: (v) => (v >= 1000 ? Math.round(v / 1000) + 'km' : v + 'm'),\n        yDomain: [0, filamentUsedMaxvalueMeters || 1],\n        yTicks: Math.min(filamentUsedMaxvalueMeters || 1, 5),\n      })\n    },\n    drawBarChart({ data, ref, yFormat, yTickFormat, yTicks, yDomain, titleValue }) {\n      const chartWidth = ref.offsetWidth\n      const barsCount = data.length\n      const xLabelsFormat = xAxisLabelsFormat(\n        chartWidth,\n        barsCount,\n        this.effectiveGrouping,\n        getDateTo(this.filterValues.timePeriod, this.getCurrentDateTo())\n      )\n\n      ref.replaceChildren(\n        BarChart(data, {\n          xLabelRotation: xLabelsFormat.rotation,\n          xLabelShow: xLabelsFormat.shouldShow,\n          x: xLabelsFormat.value,\n          y: (d) => d.value,\n          yFormat,\n          yTickFormat,\n          yDomain,\n          yTicks,\n          width: chartWidth,\n          color: 'var(--color-divider)',\n          title: (d) => {\n            const label = xLabelsFormat.value(d).split('\\r')[0].split('\\n')\n            return `${label[0] + (label[1] ? ', ' + label[1] : '')} — ${\n              titleValue ? titleValue(d.value) : d.value\n            }`\n          },\n          marginBottom: 55,\n        })\n      )\n    },\n\n    humanizedDuration,\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n      this.fetchStats()\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n      this.updateCustomPeriodFilterSubtitle()\n      this.fetchStats()\n    },\n    // time periods grouping\n    getActiveGrouping() {\n      return this.activeGrouping === 'auto'\n        ? getRecommendedGrouping(\n            this.filterValues.timePeriod,\n            this.getCurrentDateFrom(),\n            this.getCurrentDateTo(),\n            this.user\n          )\n        : this.activeGrouping\n    },\n    // custom logic for time period filters:\n    getCurrentDateFrom() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null\n    },\n    getCurrentDateTo() {\n      return getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null\n    },\n    filterUpdateMixin(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        if (filterValueKey === 'custom') {\n          if (this.filterValues.timePeriod !== 'custom') {\n            this.$refs.datePickerModal.show()\n          } else {\n            const initDateFrom = this.getCurrentDateFrom()\n            const initDateTo = this.getCurrentDateTo()\n            this.$refs.datePickerModal.show(initDateFrom, initDateTo)\n          }\n          return\n        } else {\n          this.$nextTick(() => {\n            this.updateCustomPeriodFilterSubtitle()\n          })\n        }\n      }\n      return true\n    },\n    onDatesPicked(dateFrom, dateTo) {\n      if (!dateFrom && !dateTo) {\n        return\n      }\n      this.filterValues.timePeriod = 'custom'\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod`, 'custom')\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`, dateFrom)\n      setLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`, dateTo)\n      this.updateCustomPeriodFilterSubtitle()\n      this.fetchStats()\n    },\n    customFilterParamsBuilder(filterOptionKey, filterValueKey) {\n      if (filterOptionKey === 'timePeriod') {\n        return this.filterOptions[filterOptionKey].buildQueryParam(\n          filterValueKey,\n          this.getCurrentDateFrom(),\n          this.getCurrentDateTo(),\n          this.user\n        )\n      }\n    },\n    updateCustomPeriodFilterSubtitle() {\n      let newTitle = ''\n      if (this.filterValues.timePeriod === 'custom') {\n        // variants:\n        // Feb 15, 2023 — Feb 16, 2023\n        // Feb 15, 2023 and later\n        // Until Feb 16, 2023\n        const dateFormat = 'MMM D, YYYY'\n        const currentDateFrom = this.getCurrentDateFrom()\n        const currentDateTo = this.getCurrentDateTo()\n        const dateFromFormatted = currentDateFrom\n          ? moment(currentDateFrom).format(dateFormat)\n          : 'Until'\n        const dateToFormatted = currentDateTo\n          ? moment(currentDateTo).format(dateFormat)\n          : 'and later'\n\n        newTitle = `${dateFromFormatted}${\n          currentDateFrom && currentDateTo ? ' - ' : ' '\n        }${dateToFormatted}`\n      }\n\n      const index = this.filterOptions.timePeriod.values.findIndex((v) => v.key === 'custom')\n      this.filterOptions.timePeriod.values[index].subtitle = newTitle\n\n      this.$refs.filteringDropdown1 && this.$refs.filteringDropdown1.$forceUpdate()\n      this.$refs.filteringDropdown2 && this.$refs.filteringDropdown2.$forceUpdate()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.muted-alert\n  margin-bottom: var(--gap-between-blocks)\n\n.stats-block\n  background-color: var(--color-surface-secondary)\n  padding: 1.75em 2.25em\n  border-radius: var(--border-radius-lg)\n  height: 280px\n  display: flex\n  flex-direction: column\n  &.bar-chart\n    height: auto\n    .chart-wrapper\n      height: 210px\n  @media (max-width: 768px)\n    padding: 1.25em 1.5em\n\n.stats-block-title\n  font-size: 1.125rem\n  color: var(--color-text-primary)\n  font-weight: medium\n  span\n    display: inline-block\n    margin-left: .5em\n  i\n    color: var(--color-divider)\n\n.print-time\n  justify-content: space-between\n  .title\n    font-size: 1.125rem\n    color: var(--color-text-secondary)\n  .value\n    font-size: 1.5rem\n    color: var(--color-text-primary)\n  .other-print-time-numbers\n    display: flex\n    .divider\n      width: 1px\n      background-color: var(--color-divider)\n      margin: 0 2rem\n    .info\n      .title\n        font-size: .875rem\n      .value\n        font-size: 1.125rem\n\n.total-prints\n  .chart-wrapper\n    flex: 1\n    display: flex\n    justify-content: space-between\n    align-items: center\n    gap: 1rem\n  .legend\n    display: flex\n    flex-direction: column\n    justify-content: center\n  .line\n    display: flex\n    align-items: center\n    gap: .3rem\n    margin: .25rem 0\n    @media (max-width: 768px)\n      font-size: .875rem\n  .square\n    width: 1.125rem\n    height: 1.125rem\n    border-radius: var(--border-radius-xs)\n    margin-right: .2rem\n    &.success\n      background-color: var(--color-success)\n    &.danger\n      background-color: var(--color-danger)\n  .value\n    font-weight: bold\n\n.filament-used-groups\n  .title-group\n    display: inline-flex\n    align-items: center\n    gap: .875rem\n    @media (max-width: 768px)\n      margin-left: 0.5rem\n      flex-direction: column\n      align-items: flex-start\n      gap: 0\n      .divider\n        display: none\n      span\n        margin-left: 0\n    .divider\n      width: 1px\n      background-color: var(--color-divider)\n      height: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatsPage.vue?vue&type=template&id=1a9239ba&scoped=true&\"\nimport script from \"./StatsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./StatsPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatsPage.vue?vue&type=style&index=0&id=1a9239ba&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1a9239ba\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [(_vm.isLoading)?_c('loading-placeholder'):_c('b-container',{attrs:{\"fluid\":\"\"}},[_c('b-row',[_c('b-col',{attrs:{\"lg\":\"5\"}},[_c('div',{staticClass:\"print-info\"},[_c('div',{staticClass:\"card-container print-details\"},[(_vm.currentIndex || _vm.currentIndex === 0)?_c('div',{staticClass:\"navigation-container\"},[_c('b-button',{attrs:{\"variant\":\"outline-secondary\",\"disabled\":!_vm.prevPrint},on:{\"click\":function($event){$event.preventDefault();return _vm.switchToPrint(_vm.prevPrint)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.PrevPrintButtonTitle)+\" \")]),_c('div',{staticClass:\"summary truncated-wrapper\"},[_c('div',{staticClass:\"date truncated\"},[_vm._v(\" \"+_vm._s(_vm.print.started_at.format(_vm.absoluteDateFormat))+\" \")])]),_c('b-button',{attrs:{\"variant\":\"outline-secondary\",\"disabled\":!_vm.nextPrint},on:{\"click\":function($event){$event.preventDefault();return _vm.switchToPrint(_vm.nextPrint)}}},[_vm._v(\" \"+_vm._s(_vm.NextPrintButtonTitle)+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1):_vm._e(),_c('div',[_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{staticClass:\"print-status-color\",class:_vm.print.status.key},[_vm._v(\" \"+_vm._s(_vm.print.status.title)+\" \")])])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Start time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.started_at.format(_vm.absoluteDateFormat)))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"End time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.ended_at ? _vm.print.ended_at.format(_vm.absoluteDateFormat) : '-')+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Duration\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.duration || '-'))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-ruler-horizontal\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Filament used\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.filament_used ? _vm.humanizedFilamentUsage(_vm.print.filament_used) : '-')+\" \")])])])]),_c('g-code-details',{attrs:{\"file\":_vm.print.g_code_file || { filename: _vm.print.filename },\"show-open-button\":_vm.canOpenFile}}),(_vm.print.printer)?_c('div',{staticClass:\"card-container printer\"},[_c('div',{staticClass:\"icon\"},[_c('svg',{staticStyle:{\"margin-bottom\":\"5px\"},attrs:{\"width\":\"1em\",\"height\":\"1em\"}},[_c('use',{attrs:{\"href\":\"#svg-3d-printer\"}})])]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.print.printer.name}},[_vm._v(\" \"+_vm._s(_vm.print.printer.name)+\" \")]),_c('div',{staticClass:\"subtitle truncated\",class:[\n                    _vm.printer\n                      ? _vm.printer.isPrintable() && !_vm.printer.inTransientState()\n                        ? 'text-success'\n                        : 'text-warning'\n                      : 'text-danger',\n                  ]},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.printabilityText() : 'Deleted')+\" \")])]),(\n                  _vm.printer &&\n                  _vm.print.g_code_file &&\n                  !_vm.print.g_code_file.deleted &&\n                  _vm.print.g_code_file.url\n                )?_c('div',{staticClass:\"action\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":!_vm.printer.isPrintable() || _vm.printer.inTransientState()},on:{\"click\":_vm.onRepeatPrintClicked}},[(_vm.isSending)?_c('b-spinner',{staticClass:\"mr-2\",attrs:{\"small\":\"\"}}):_vm._e(),_c('span',[_vm._v(_vm._s(_vm.$t(\"Reprint\")))])],1)]):_vm._e()]):_c('div',{staticClass:\"card-container printer\"},[_c('p',[_vm._v(\"Unknown Printer\")])])],1)]),_c('b-col',{attrs:{\"lg\":\"7\"}},[_c('div',{staticClass:\"print-info\"},[(_vm.firstLayerInspection.id)?_c('div',{staticClass:\"card-container\"},[_c('b-row',{staticClass:\"m-0\"},[_c('b-col',{staticClass:\"first-layer-info-column\",attrs:{\"cols\":\"12\",\"sm\":\"6\",\"md\":\"6\",\"lg\":\"12\",\"xl\":\"6\"}},[_c('div',[_c('b-row',{staticClass:\"mb-4\"},[_c('span',{staticClass:\"ml-3\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Report\")))])]),_c('div',{staticClass:\"first-layer-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Grade\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{staticClass:\"print-status-color\",class:_vm.gradeResult.gradeAccent},[_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeTitle || ' ')+\" \")])])]),_c('div',{staticClass:\"first-layer-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Print Time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.firstLayerPrintTime))])])],1),_c('b-row',{staticClass:\"m-0\"},[_c('b-button',{staticClass:\"open-detailed-report-button\",on:{\"click\":_vm.onOpenDetailedReport}},[_vm._v(_vm._s(_vm.$t(\"Open Detailed Report\")))])],1)],1),_c('b-col',{staticClass:\"first-layer-report-block-video-container\",attrs:{\"cols\":\"12\",\"sm\":\"6\",\"md\":\"6\",\"lg\":\"12\",\"xl\":\"6\"}},[_c('div',{staticClass:\"first-layer-video-wrapper\",class:{\n                            'is-fullscreen original':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.firstLayerInspection.tagged_video_url,\n                          }},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.tagged_video_url,\"poster-url\":_vm.aiTimeLapsePosterImageUrl,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"fullscreen\":() => _vm.enterFullscreen(_vm.firstLayerInspection.tagged_video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.tagged_video_url, `${_vm.print.id}_tagged_video_inspection.mp4`)}})],1)])],1)],1):_vm._e(),_c('div',{staticClass:\"time-lapse\"},[(_vm.print.video_archived_at)?_c('div',{staticClass:\"card-container\"},[_c('h2',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Time-Lapse video deleted\")))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('i18next',{attrs:{\"translation\":_vm.$t(`If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\"}},[_vm._v(_vm._s(_vm.$t(\"contact us\")))])]},proxy:true}],null,false,4060562873)}),_vm._v(\" . \")],1)]):(_vm.print.video_url || _vm.print.tagged_video_url)?_c('div',[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-tabs',{attrs:{\"pills\":\"\",\"card\":\"\"}},[_c('b-tab',{attrs:{\"title\":\"Detective Time-Lapse\",\"disabled\":!_vm.canShowDetectiveView}},[_c('b-card-text',[(_vm.print.tagged_video_url)?_c('div',{class:{\n                            'is-fullscreen':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.print.tagged_video_url,\n                          }},[_c('div',{staticClass:\"video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.print.tagged_video_url,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":() => _vm.enterFullscreen(_vm.print.tagged_video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.print.tagged_video_url, `${_vm.print.id}_tagged.mp4`)}})],1),_c('div',{staticClass:\"detective-footer\"},[(_vm.print.prediction_json_url)?_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}}):_vm._e(),_c('div',{staticClass:\"feedback-section\"},[_c('div',{staticClass:\"lead\",class:[_vm.print.alerted_at ? 'text-danger' : 'text-success']},[_vm._v(\" \"+_vm._s(_vm.print.alerted_at ? 'Failure detected' : 'No failure detected')+\" \")]),_c('div',{staticClass:\"py-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Did we get it right?\"))+\" \"),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedUp ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbUpClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-up\"})],1),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedDown ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbDownClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-down\"})],1)],1),_c('transition',{attrs:{\"name\":\"bounce\"}},[(_vm.print.printShotFeedbackEligible)?_c('div',{staticClass:\"pt-2\"},[_c('b-button',{attrs:{\"variant\":\"outline-primary\",\"size\":\"sm\",\"href\":`/prints/shot-feedback/${_vm.print.id}/`}},[(!_vm.print.need_print_shot_feedback)?_c('i',{staticClass:\"fas fa-check mr-2\"}):_vm._e(),_vm._v(\" \"+_vm._s(_vm.$t(\"FOCUSED FEEDBACK\"))+\" \")])],1):_vm._e()]),_c('div',{staticClass:\"about-feedback\"},[(_vm.print.printShotFeedbackEligible)?_c('small',[(!_vm.print.need_print_shot_feedback)?_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\"))+\" \")]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\"))+\" \")])])]):_c('small',[_vm._v(\" \"+_vm._s(_vm.$t(\"Every time you give us feedback,\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"you help us get better at detecting failures\"))+\" \")])])])],1)],1)]):_c('div',[_c('detective-working',{staticClass:\"detective-placeholder\"})],1)])],1),(_vm.print.video_url)?_c('b-tab',{attrs:{\"active\":!_vm.print.tagged_video_url,\"title\":\"Original Time-Lapse\"}},[_c('b-card-text',[_c('div',{class:{\n                            'is-fullscreen original':\n                              !!_vm.fullscreenUrl && _vm.fullscreenUrl === _vm.print.video_url,\n                          }},[_c('div',{staticClass:\"video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.print.video_url,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"fullscreen-btn\":_vm.fullscreenUrl === null,\"exit-fullscreen-btn\":_vm.fullscreenUrl !== null,\"download-btn\":true},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":() => _vm.enterFullscreen(_vm.print.video_url),\"exitFullscreen\":_vm.exitFullscreen,\"download\":() => _vm.downloadFile(_vm.print.video_url, `${_vm.print.id}.mp4`)}})],1)])])],1):_vm._e()],1)],1)],1):_c('div',{staticClass:\"card-container\"},[_c('p',{staticClass:\"text-secondary mt-3\"},[_vm._v(_vm._s(_vm.$t(\"Time-Lapse video unavailable because\"))+\":\")]),_c('ul',[_c('li',{staticClass:\"text-secondary mt-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"The {brandName} server is still processing the time-lapse;\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',{staticClass:\"text-secondary mt-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Or, the print time was shorter than the threshold. You can change the threshold in {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":`/printers/${_vm.print.printer.id}/`}},[_vm._v(_vm._s(_vm.$t(\"the printer settings\"))+\".\")])]},proxy:true}])})],1)])])])])])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"obico-gauge-container\"},[_c('span',{style:({ color: _vm.titleColor }),attrs:{\"id\":\"title\"}},[_vm._v(_vm._s(_vm.titleText))]),_c('div',{staticClass:\"obico-gauge\"},[_c('radial-gauge',{attrs:{\"value\":_vm.value,\"options\":_vm.computedOptions}})],1),_c('hr')])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"obico-gauge-container\">\n    <span id=\"title\" :style=\"{ color: titleColor }\">{{ titleText }}</span>\n    <div class=\"obico-gauge\">\n      <radial-gauge :value=\"value\" :options=\"computedOptions\"></radial-gauge>\n    </div>\n    <hr />\n  </div>\n</template>\n\n<script>\nimport RadialGauge from 'vue2-canvas-gauges/src/RadialGauge'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'FailureDetectionGauge',\n  components: {\n    RadialGauge,\n  },\n  props: {\n    normalizedP: {\n      type: Number,\n      required: true,\n    },\n\n    isWatching: {\n      type: Boolean,\n      default: true,\n    },\n\n    options: {\n      // https://canvas-gauges.com/documentation/user-guide/configuration\n      type: Object,\n      default: null,\n    },\n  },\n\n  computed: {\n    computedOptions() {\n      if (this.options !== null) {\n        return this.options\n      }\n\n      const inactiveColor = {\n        highlight1: currentThemeValue() === Themes.Light ? '#929292' : '#8395a7',\n        highlight2: currentThemeValue() === Themes.Light ? '#b7b7b7' : '#a8bacc',\n        highlight3: currentThemeValue() === Themes.Light ? '#7b7b7b' : '#6c7e90',\n        needle: currentThemeValue() === Themes.Light ? '#2d3e4f' : '#ffffff',\n      }\n\n      return {\n        valueDec: 0,\n        valueInt: 0,\n        width: 240,\n        height: 240,\n        units: false,\n        box: false,\n        minValue: 0,\n        maxValue: 100,\n        majorTicks: ['', '', '', ''],\n        minorTicks: 4,\n        highlights: [\n          { from: 0, to: 33, color: this.isWatching ? '#5cb85c' : inactiveColor.highlight1 },\n          { from: 33, to: 67, color: this.isWatching ? '#f0ad4e' : inactiveColor.highlight2 },\n          { from: 67, to: 100, color: this.isWatching ? '#d9534f' : inactiveColor.highlight3 },\n        ],\n        colorPlate: 'rgba(255,255,255,.0)',\n        colorTitle: '#5cb85c',\n        colorStrokeTicks: '#EBEBEB',\n        colorNeedleEnd: this.isWatching ? 'rgba(255, 160, 122, .9)' : inactiveColor.needle,\n        colorNeedle: this.isWatching ? 'rgba(240, 128, 128, 1)' : inactiveColor.needle,\n        colorNeedleShadowUp: this.isWatching ? 'rgba(2,255,255,0.2)' : inactiveColor.needle,\n        valueBox: false,\n        animationRule: 'bounce',\n        animationDuration: 500,\n        animatedValue: true,\n        startAngle: 90,\n        ticksAngle: 180,\n        borders: false,\n      }\n    },\n    value() {\n      return this.normalizedP * 100\n    },\n    titleText() {\n      if (!this.isWatching) {\n        return `${this.$i18next.t('Not Watching')}`\n      }\n      switch (this.level()) {\n        case 0:\n          return `${this.$i18next.t('Looking Good')}`\n        case 1:\n          return `${this.$i18next.t('Fishy...')}`\n        case 2:\n          return `${this.$i18next.t('Failing!')}`\n        default:\n          return `${this.$i18next.t(\"Looking Good\")}`\n      }\n    },\n    titleColor() {\n      if (!this.isWatching) {\n        return 'var(--color-text-secondary)'\n      }\n      switch (this.level()) {\n        case 0:\n          return '#5cb85c'\n        case 1:\n          return '#f0ad4e'\n        case 2:\n          return '#d9534f'\n        default:\n          return '#5cb85c'\n      }\n    },\n  },\n\n  methods: {\n    level() {\n      if (this.value > 66) {\n        return 2\n      } else if (this.value > 33) {\n        return 1\n      } else {\n        return 0\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n#title\n  position: absolute\n  left: 0px\n  text-align: center\n  width: 100%\n  top: 50%\n\n.obico-gauge-container\n  position: relative\n  padding: 0 16px\n  .obico-gauge\n    text-align: center\n    padding: 8px\n    margin-bottom: -150px\n    pointer-events: none\n  hr\n    background-color: #EBEBEB\n    height: 1px\n    margin-top: 15px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionGauge.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FailureDetectionGauge.vue?vue&type=template&id=1f5952c0&scoped=true&\"\nimport script from \"./FailureDetectionGauge.vue?vue&type=script&lang=js&\"\nexport * from \"./FailureDetectionGauge.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FailureDetectionGauge.vue?vue&type=style&index=0&id=1f5952c0&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1f5952c0\",\n  null\n  \n)\n\nexport default component.exports","'use strict'\nimport assign from 'lodash/assign'\nimport Vue from 'vue'\nimport ifvisible from 'ifvisible'\nimport pako from 'pako'\nimport { toArrayBuffer, sanitizeEventText } from '@src/lib/utils'\nimport { clearPrinterTransientState } from '@src/lib/printer-transient-state'\nimport i18n from '@src/i18n/i18n.js'\n\n// PrinterCommManager is a singleton: https://www.sitepoint.com/javascript-design-patterns-singleton/\nclass PrinterCommManager {\n  constructor() {\n    if (!PrinterCommManager.instance) {\n      this.printerCommMap = new Map()\n      PrinterCommManager.instance = this\n    }\n    return PrinterCommManager.instance\n  }\n\n  setPrinterComm(printerId, printerComm) {\n    this.printerCommMap.set(printerId, printerComm)\n  }\n\n  getPrinterComm(printerId) {\n    return this.printerCommMap.get(printerId)\n  }\n\n  getOrCreatePrinterComm(...props) {\n    const printerId = String(props[0]) // assuming same args as for PrinterComm function\n    if (!this.getPrinterComm(printerId)) {\n      this.setPrinterComm(printerId, PrinterComm(...props))\n    }\n    return this.getPrinterComm(printerId)\n  }\n\n  closeConnection(printerId) {\n    const printerComm = this.getPrinterComm(printerId)\n    if (printerComm) {\n      printerComm.closeServerWebSocket()\n      printerComm.webrtcConnections.forEach((webrtc) => {\n        if (webrtc) webrtc.close();\n      });\n      this.printerCommMap.delete(printerId)\n    }\n  }\n\n  closeAllConnections() {\n    this.printerCommMap.forEach((_, token) => this.closeConnection(token))\n  }\n}\n\nexport const printerCommManager = new PrinterCommManager()\nObject.freeze(printerCommManager)\n\nexport default function PrinterComm(printerId, wsUri, callbacks) {\n  const self = { printerId, wsUri, ...callbacks }\n\n  self.ws = null\n  self.webrtcConnections = new Map(); // key: webcamName. Null if it's data channel-only WebRTC\n  self.passthruQueue = new Map()\n\n  ifvisible.on('blur', function () {\n    self.closeWebSocket()\n  })\n\n  ifvisible.on('focus', function () {\n    self.connect()\n  })\n\n  self.onPassThruReceived = function (msg) {\n    const refId = msg.ref\n    if (refId && self.passthruQueue.get(refId)) {\n      const callback = self.passthruQueue.get(refId)\n      self.passthruQueue.delete(refId)\n      callback(msg.error, msg.ret)\n    } else if ('terminal_feed' in msg) {\n      self.onTerminalFeedReceived && self.onTerminalFeedReceived(msg.terminal_feed)\n    } else if ('printer_event' in msg) {\n      const printerEvent = msg.printer_event\n      Vue.swal.Toast.fire({\n        icon: printerEvent.event_class.toLowerCase(),\n        titleText: printerEvent.event_title,\n        html: sanitizeEventText(printerEvent.event_text),\n      }).then((result) => {\n        if (result.isDismissed && result.dismiss === 'close') {\n          // SWAL returns 'close' as the reason when user clicks on the toast\n          window.location.href = '/printer_events/'\n        }\n      })\n    }\n  }\n\n  self.connect = function (onOpenCallback = null) {\n    if (self.ws && self.ws.readyState === WebSocket.OPEN) {\n      onOpenCallback && onOpenCallback()\n      return\n    }\n\n    self.ws = new WebSocket(\n      window.location.protocol.replace('http', 'ws') + '//' + window.location.host + self.wsUri\n    )\n    self.ws.onmessage = function (e) {\n      let msg = {}\n      try {\n        msg = JSON.parse(e.data)\n      } catch (error) {\n        console.log(e.data)\n        throw error\n      }\n      if ('passthru' in msg) {\n        self.onPassThruReceived(msg.passthru)\n      } else {\n        self.onPrinterUpdateReceived && self.onPrinterUpdateReceived(msg)\n      }\n    }\n\n    if (onOpenCallback) {\n      self.ws.onopen = onOpenCallback\n    }\n\n    self.ensureWebsocketClosed()\n    setTimeout(function () {\n      self.heartbeat()\n    }, 30 * 1000)\n  }\n\n  self.setWebRTCConnection = function(webcamName, webrtc) {\n    if (self.webrtcConnections.has(webcamName)) {\n      console.log(`WARNING: Existing WebRTC connection for ${webcamName} in printerComm. Closing it.`);\n      self.webrtcConnections.get(webcamName).close();\n    }\n\n    self.webrtcConnections.set(webcamName, webrtc);\n\n    function parseJsonData(jsonData) {\n      let msg = {}\n      try {\n        msg = JSON.parse(jsonData)\n      } catch (error) {\n        // Any garbage sent to the Janus UDP port will be forwarded here.\n        return\n      }\n\n      if (msg && 'ref' in msg && 'ret' in msg) {\n        self.onPassThruReceived(msg)\n        return\n      }\n\n      self.onStatusReceived && self.onStatusReceived(msg)\n    }\n\n\n    const callbacksFuncs = {\n      onDestroy: () => {\n        if (self.webrtcConnections.get(webcamName) === webrtc) {  // only remove if it's the same object\n          self.webrtcConnections.delete(webcamName);\n        }\n      },\n    };\n\n    if (webcamName === null) { // data channel-only WebRTC\n      callbacksFuncs.onData = function (maybeBin) {\n        if (typeof maybeBin === 'string' || maybeBin instanceof String) {\n          parseJsonData(maybeBin)\n        } else {\n          toArrayBuffer(maybeBin, (arrayBuffer) => {\n            parseJsonData(pako.ungzip(new Uint8Array(arrayBuffer), { to: 'string' }))\n          })\n        }\n      }\n    }\n\n    self.webrtcConnections.get(webcamName).setCallbacks(callbacksFuncs);\n  };\n\n  self.passThruToPrinter = function (msg, callback) {\n    if (self.canSend()) {\n      var refId = Math.random().toString()\n      assign(msg, { ref: refId })\n      if (callback) {\n        self.passthruQueue.set(refId, callback)\n        setTimeout(function () {\n          if (self.passthruQueue.has(refId)) {\n            clearPrinterTransientState(self.printerId)\n            Vue.swal.Toast.fire({\n              icon: 'error',\n              title: `${i18n.t('Failed to contact printer. Is it powered on and connected to Internet?')}`,\n            })\n          }\n        }, 60 * 1000)\n      }\n\n      const dataChannelWebrtc = self.webrtcConnections.get(null); // key == null -> data channel-only WebRTC\n      if (dataChannelWebrtc) {\n        dataChannelWebrtc.sendData(JSON.stringify(msg))\n      }\n\n      self.ws.send(JSON.stringify({ passthru: msg }))\n    } else {\n      if (callback) {\n        clearPrinterTransientState(self.printerId)\n        callback('Message not passed through. No suitable WebSocket.')\n      }\n    }\n  }\n\n  // Helper methods\n\n  self.ensureWebsocketClosed = function () {\n    self.ws.onclose = function (ev) {\n      if (self.ws === ev.target) {\n        self.ws = null\n      }\n    }\n    self.ws.onerror = function () {\n      if (self.ws) {\n        self.ws.close()\n      }\n    }\n  }\n\n  self.closeWebSocket = function () {\n    if (self.ws) {\n      self.ws.close()\n    }\n  }\n\n  // Heartbeat to maintain the presence of connection\n  // Adapted from https://stackoverflow.com/questions/50876766/how-to-implement-ping-pong-request-for-websocket-connection-alive-in-javascript\n\n  self.heartbeat = function () {\n    if (!self.canSend()) {\n      return\n    }\n    self.ws.send(JSON.stringify({}))\n    setTimeout(function () {\n      self.heartbeat()\n    }, 30 * 1000)\n  }\n\n  self.canSend = function () {\n    return self.ws && self.ws.readyState === 1\n  }\n\n  return self\n}\n","import { toMomentOrNull } from '@src/lib/normalizers'\nimport filesize from 'filesize'\nimport _ from 'lodash'\n\nexport function listPrinterLocalGCodesOctoPrint(printerComm, path, searchKeyword) {\n  const listRecoursively = (fileObj) => {\n    const fileList = []\n    for (const item of Object.values(fileObj)) {\n      if (item.children) {\n        fileList.push(...listRecoursively(item.children))\n      } else {\n        fileList.push(item)\n      }\n    }\n    return fileList\n  }\n\n  return new Promise((resolve, reject) => {\n    let kwargs\n    if (searchKeyword) {\n      // In OctoPrint we can do global search for better user experience. Hence path is ignored\n      kwargs = { filter: String(searchKeyword), recursive: true }\n    } else {\n      kwargs = { path: path, recursive: false, level: 1 } // Return 1 level children so that we can do item count\n    }\n\n    printerComm.passThruToPrinter(\n      {\n        func: 'list_files',\n        target: '_file_manager',\n        kwargs,\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        }\n\n        let folders = []\n        let files = []\n\n        if (!ret?.local || !Object.keys(ret.local).length) {\n          resolve()\n          return\n        }\n\n        // ObicoUpload is used to cache Obico Cloud files and should be hidden from the users\n        delete ret.local.ObicoUpload\n\n        const items = searchKeyword ? listRecoursively(ret.local) : Object.values(ret.local)\n        for (const item of items) {\n          if (item.type === 'folder') {\n            folders.push({\n              id: item.path,\n              path: item.path,\n              name: item.display,\n              numItems: Object.keys(item.children).length,\n            })\n          } else {\n            files.push({\n              ...item,\n              id: item.path,\n              filename: item.name,\n              num_bytes: item.size,\n              filesize: filesize(item.size),\n              created_at: toMomentOrNull(new Date(item.date * 1000)),\n              getBigThumbnailUrl: () => null,\n              getSmallThumbnailUrl: () => null,\n            })\n          }\n        }\n        resolve({ folders, files })\n      }\n    )\n  })\n}\n\nexport function listPrinterLocalGCodesMoonraker(printerComm, path, searchKeyword) {\n  return new Promise((resolve, reject) => {\n    const pathPrefix = path == null ? '' : `${path}/`\n    printerComm.passThruToPrinter(\n      {\n        target: 'moonraker_api',\n        func: 'server/files/directory',\n        kwargs: {\n          path: `gcodes/${path ? path : ''}`,\n          extended: true,\n        },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        }\n        // subdirs should be ignored when user is searching\n        const dirsInServerFormat = searchKeyword\n          ? []\n          : _.map(\n              _.filter(\n                _.get(ret, 'dirs', []),\n                (d) => !d.dirname.startsWith('.') && !d.dirname.startsWith('Obico_Upload')\n              ),\n              (d) => {\n                const path = `${pathPrefix}${d.dirname}`\n                return {\n                  name: d.dirname,\n                  id: path,\n                  path,\n                  created_at: toMomentOrNull(new Date(d.modified * 1000)),\n                  children: [], // To signify this is a folder, not a file\n                }\n              }\n            )\n\n        const filesInServerFormat = _.map(\n          _.filter(\n            _.get(ret, 'files', []),\n            (f) =>\n              !f.filename.startsWith('.') &&\n              (!searchKeyword || f.filename.toLowerCase().includes(searchKeyword.toLowerCase()))\n          ),\n          (f) => {\n            return {\n              ...f,\n              num_bytes: f.size,\n              filesize: filesize(f.size),\n              created_at: toMomentOrNull(new Date(f.modified * 1000)),\n              path: `${pathPrefix}${f.filename}`,\n              getBigThumbnailUrl: () => null,\n              getSmallThumbnailUrl: () => null,\n            }\n          }\n        )\n        resolve({ folders: dirsInServerFormat, files: filesInServerFormat })\n      }\n    )\n  })\n}\n\nexport function printPrinterLocalGCodeOctoPrint(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    const path = gcode.path\n    printerComm.passThruToPrinter(\n      {\n        func: 'select_file',\n        target: '_printer',\n        args: [`${path}`, null],\n        kwargs: { printAfterSelect: 'true' },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function printPrinterLocalGCodeMoonraker(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    const path = gcode.path\n    printerComm.passThruToPrinter(\n      {\n        target: 'moonraker_api',\n        func: 'printer/print/start',\n        kwargs: {\n          verb: 'post',\n          filename: path,\n        },\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function repeatPrinterLocalGCode(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        target: 'file_operations',\n        func: 'start_printer_local_print',\n        args: [gcode],\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport function getMoonrakerWebcams(printerComm) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: `server/webcams/list`,\n        target: 'moonraker_api',\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve(ret?.webcams)\n        }\n      }\n    )\n  })\n}\n\nexport function requestSnapshot(printerComm, url) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: `web_snapshot_request`,\n        target: 'jpeg_poster',\n        args: [url],\n      },\n      (err, ret) => {\n        if (err || ret?.error) {\n          reject(err || ret?.error)\n        } else {\n          resolve(ret.pic)\n        }\n      }\n    )\n  })\n}\n","import Vue from 'vue'\nimport axios from 'axios'\nimport get from 'lodash/get'\nimport escape from 'lodash/escape'\nimport { clearPrinterTransientState } from '@src/lib/printer-transient-state'\n\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  printPrinterLocalGCodeOctoPrint,\n  printPrinterLocalGCodeMoonraker,\n} from '@src/lib/printer-local-comm'\nimport urls from '@config/server-urls'\nimport { repeatPrinterLocalGCode } from '../../lib/printer-local-comm'\nimport i18n from \"@src/i18n/i18n.js\"\n\nexport const confirmPrint = (gcode, printer) => {\n  return new Promise((resolve, reject) => {\n    Vue.swal\n      .fire({\n        html: `<h5 style=\"text-align: center; line-height: 1.5;\">${i18n.t(\"Print\")} \"${escape(gcode.filename)}\" on <b>${escape(printer.name)}</b>?</h5>`,\n        imageUrl: gcode.getBigThumbnailUrl && gcode.getBigThumbnailUrl(),\n        showCancelButton: true,\n        confirmButtonText: `${i18n.t('Print!')}`,\n        cancelButtonText: `${i18n.t('Cancel')}`,\n        reverseButtons: true,\n      })\n      .then((result) => {\n        if (result.value) {\n          resolve()\n        }\n      })\n  })\n}\n\nexport function printCloudGCode(printerComm, gcode) {\n  return new Promise((resolve, reject) => {\n    printerComm.passThruToPrinter(\n      {\n        func: 'download',\n        target: 'file_downloader',\n        args: [\n          {\n            id: gcode.id,\n            url: gcode.url,\n            filename: gcode.filename,\n            safe_filename: gcode.safe_filename,\n          },\n        ],\n      },\n      (err, ret) => {\n        if (err) {\n          reject(err)\n        } else {\n          resolve()\n        }\n      }\n    )\n  })\n}\n\nexport const sendToPrint = (args) => {\n  const { printer, gcode, isCloud, Swal, onCommandSent, onPrinterStatusChanged } = args\n\n  const printerId = printer.id\n  const isAgentMoonraker = printer.isAgentMoonraker()\n\n  const printerComm = printerCommManager.getOrCreatePrinterComm(\n    printerId,\n    urls.printerWebSocket(printerId)\n  )\n\n  printerComm.connect(() => {\n    const printGCode = isCloud\n      ? printCloudGCode\n      : !gcode.path\n      ? repeatPrinterLocalGCode\n      : isAgentMoonraker\n      ? printPrinterLocalGCodeMoonraker\n      : printPrinterLocalGCodeOctoPrint\n\n    printer.setTransientState(isCloud ? 'G-Code Downloading' : 'Starting')\n    printGCode(printerComm, gcode).catch((err) => {\n      clearPrinterTransientState(printerId)\n      Swal.Toast.fire({\n        icon: 'error',\n        title: err,\n      })\n    })\n  })\n\n  onCommandSent && onCommandSent()\n\n  const checkPrinterStatus = async () => {\n    let printer\n    try {\n      printer = await axios.get(urls.printer(printerId))\n      printer = printer.data\n    } catch (e) {\n      console.error(e)\n      return\n    }\n\n    if (\n      get(printer, 'status.state.text') === 'Operational' ||\n      get(printer, 'status.state.text') === 'G-Code Downloading' ||\n      get(printer, 'status.state.text') === 'Downloading G-Code' // Backward compatibility with OctoPrint-Obico 2.3.7 - 2.3.9\n    ) {\n      setTimeout(checkPrinterStatus, 1000)\n    } else {\n      onPrinterStatusChanged && onPrinterStatusChanged()\n    }\n  }\n\n  checkPrinterStatus()\n}\n\nconst REDIRECT_TIMER = 3000\nexport const showRedirectModal = (Swal, onClose, printerId) => {\n  let timerInterval\n  Swal.Prompt.fire({\n    html: `\n      <div class=\"text-center\">\n        <h5 class=\"py-3\">\n          ${i18n.t(\"You'll be redirected to printers page in\")} <strong>${Math.round(\n            REDIRECT_TIMER / 1000\n          )}</strong> ${i18n.t(\"seconds\")}\n        </h5>\n      </div>\n    `,\n    timer: REDIRECT_TIMER,\n    showConfirmButton: true,\n    showCancelButton: true,\n    confirmButtonText: 'Redirect now',\n    onOpen: () => {\n      timerInterval = setInterval(() => {\n        const htmlContainer = Swal.getHtmlContainer()\n        const timerElement = htmlContainer?.querySelector('strong')\n        if (!htmlContainer || !timerElement) return\n        timerElement.textContent = (Swal.getTimerLeft() / 1000).toFixed(0)\n      }, 1000)\n    },\n    onClose: () => {\n      clearInterval(timerInterval)\n      timerInterval = null\n    },\n  }).then((result) => {\n    if (result.isConfirmed || result.dismiss === 'timer') {\n      window.location.assign(`/printers/${printerId}/control/`)\n    } else {\n      onClose && onClose()\n    }\n  })\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"card-container file\"},[_c('div',{staticClass:\"file-header\",class:{\n      'mb-4': _vm.showDetails && _vm.fileDetailsToShow.length > 0,\n      compact: _vm.compactView,\n    }},[(_vm.showThumbnail)?_c('div',[(_vm.bigThumbnailUrl)?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.bigThumbnailUrl}})]):_c('div',{staticClass:\"thumbnail-placeholder\"},[_c('span',{staticClass:\"help\"},[_c('help-widget',{attrs:{\"id\":\"thumbnail-setup-guide\",\"highlight\":false,\"show-close-button\":false}})],1),_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])]):_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-file-code\"})]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"title truncated\",attrs:{\"title\":_vm.file.filename}},[_vm._v(\" \"+_vm._s(_vm.file.filename)+\" \")]),(_vm.file.filesize || _vm.file.deleted)?_c('div',{staticClass:\"subtitle text-secondary truncated-wrapper\"},[(_vm.file.deleted)?_c('div',{staticClass:\"truncated\"},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\"Deleted\")))])]):_c('div',{staticClass:\"truncated\"},[_c('span',[_vm._v(_vm._s(_vm.file.filesize))])])]):_vm._e()]),(_vm.showOpenButton && _vm.file.id)?_c('div',{staticClass:\"action\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":_vm.openButtonVariant,\"href\":`/g_code_files/cloud/${_vm.file.id}/`}},[_vm._v(\" \"+_vm._s(_vm.openButtonText)+\" \")])],1):_vm._e()]),(_vm.showDetails)?[_vm._l((_vm.fileDetailsToShow.slice(0, _vm.numberOfVisibleLines)),function(item){return _c('div',{key:item.name},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[(item.faIcon)?_c('i',{class:item.faIcon}):(item.svgIcon)?_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":`#${item.svgIcon}`}})]):_vm._e()]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(item.title))])]),_c('div',{staticClass:\"value\"},[(item.html)?_c('span',{domProps:{\"innerHTML\":_vm._s(item.html)}}):_c('span',[_vm._v(_vm._s(item.value))])])])])}),(_vm.shouldShowDataNotice && _vm.fileDetailsToShow.length <= _vm.numberOfVisibleLines)?_c('muted-alert',{staticClass:\"mt-2 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\"))+\" \")]):_vm._e(),(_vm.fileDetailsToShow.length > _vm.numberOfVisibleLines)?_c('collapsable-details',[_vm._l((_vm.fileDetailsToShow.slice(_vm.numberOfVisibleLines)),function(item){return _c('div',{key:item.name},[_c('div',{staticClass:\"line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[(item.faIcon)?_c('i',{class:item.faIcon}):(item.svgIcon)?_c('svg',{attrs:{\"width\":\"16\",\"height\":\"16\"}},[_c('use',{attrs:{\"href\":`#${item.svgIcon}`}})]):_vm._e()]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(item.title))])]),_c('div',{staticClass:\"value\"},[(item.html)?_c('span',{domProps:{\"innerHTML\":_vm._s(item.html)}}):_c('span',[_vm._v(_vm._s(item.value))])])])])}),(_vm.shouldShowDataNotice && _vm.fileDetailsToShow.length > _vm.numberOfVisibleLines)?_c('muted-alert',{staticClass:\"mt-2 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\"))+\" \")]):_vm._e()],2):_vm._e()]:_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('b-collapse',{model:{value:(_vm.expanded),callback:function ($$v) {_vm.expanded=$$v},expression:\"expanded\"}},[_vm._t(\"default\")],2),_c('button',{staticClass:\"collapse-toggle\",class:_vm.expanded ? 'opened' : 'closed',on:{\"click\":function($event){_vm.expanded = !_vm.expanded}}},[(_vm.expanded)?_c('span',[_vm._v(_vm._s(_vm.$t(\"Show less\")))]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Show more\")))]),_c('font-awesome-icon',{class:{ rotated: _vm.expanded },attrs:{\"icon\":['fas', 'chevron-down']}})],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <!-- Content -->\n    <b-collapse v-model=\"expanded\">\n      <slot></slot>\n    </b-collapse>\n\n    <!-- Toggle -->\n    <button\n      class=\"collapse-toggle\"\n      :class=\"expanded ? 'opened' : 'closed'\"\n      @click=\"expanded = !expanded\"\n    >\n      <span v-if=\"expanded\">{{ $t(\"Show less\") }}</span>\n      <span v-else>{{ $t(\"Show more\") }}</span>\n      <font-awesome-icon :icon=\"['fas', 'chevron-down']\" :class=\"{ rotated: expanded }\" />\n    </button>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'CollapsableDetails',\n\n  data() {\n    return {\n      expanded: false,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.collapse-toggle\n  width: 100%\n  font-weight: bold\n  display: flex\n  align-items: center\n  justify-content: center\n  gap: .5rem\n  background: none\n  border: none\n  color: var(--color-text-primary)\n  margin-top: .5rem\n  svg\n    transition: all .3s ease-in-out\n    &.rotated\n      transform: rotate(180deg)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CollapsableDetails.vue?vue&type=template&id=48fdd412&scoped=true&\"\nimport script from \"./CollapsableDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./CollapsableDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CollapsableDetails.vue?vue&type=style&index=0&id=48fdd412&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"48fdd412\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"card-container file\">\n    <div\n      class=\"file-header\"\n      :class=\"{\n        'mb-4': showDetails && fileDetailsToShow.length > 0,\n        compact: compactView,\n      }\"\n    >\n      <div v-if=\"showThumbnail\">\n        <div v-if=\"bigThumbnailUrl\" class=\"thumbnail\">\n          <img :src=\"bigThumbnailUrl\" />\n        </div>\n        <div v-else class=\"thumbnail-placeholder\">\n          <span class=\"help\">\n            <help-widget id=\"thumbnail-setup-guide\" :highlight=\"false\" :show-close-button=\"false\" />\n          </span>\n          <svg>\n            <use href=\"#svg-no-photo\" />\n          </svg>\n        </div>\n      </div>\n      <div v-else class=\"icon\">\n        <i class=\"fas fa-file-code\"></i>\n      </div>\n      <div class=\"info truncated-wrapper\">\n        <div class=\"title truncated\" :title=\"file.filename\">\n          {{ file.filename }}\n        </div>\n        <div v-if=\"file.filesize || file.deleted\" class=\"subtitle text-secondary truncated-wrapper\">\n          <div v-if=\"file.deleted\" class=\"truncated\">\n            <span class=\"text-danger\">{{$t(\"Deleted\")}}</span>\n          </div>\n          <div v-else class=\"truncated\">\n            <span>{{ file.filesize }}</span>\n          </div>\n        </div>\n      </div>\n      <div v-if=\"showOpenButton && file.id\" class=\"action\">\n        <b-button\n          :variant=\"openButtonVariant\"\n          class=\"custom-button\"\n          :href=\"`/g_code_files/cloud/${file.id}/`\"\n        >\n          {{ openButtonText }}\n        </b-button>\n      </div>\n    </div>\n    <template v-if=\"showDetails\">\n      <!-- First visible lines -->\n      <div v-for=\"item in fileDetailsToShow.slice(0, numberOfVisibleLines)\" :key=\"item.name\">\n        <div class=\"line\">\n          <div class=\"label\">\n            <div class=\"icon\">\n              <i v-if=\"item.faIcon\" :class=\"item.faIcon\"></i>\n              <svg v-else-if=\"item.svgIcon\" width=\"16\" height=\"16\">\n                <use :href=\"`#${item.svgIcon}`\" />\n              </svg>\n            </div>\n            <div class=\"title\">{{ item.title }}</div>\n          </div>\n          <div class=\"value\">\n            <!-- eslint-disable-next-line vue/no-v-html -->\n            <span v-if=\"item.html\" v-html=\"item.html\"></span>\n            <span v-else>{{ item.value }}</span>\n          </div>\n        </div>\n      </div>\n      <muted-alert\n        v-if=\"shouldShowDataNotice && fileDetailsToShow.length <= numberOfVisibleLines\"\n        class=\"mt-2 mb-1\"\n      >\n        {{$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\")}}\n      </muted-alert>\n\n      <!-- Hidden lines -->\n      <collapsable-details v-if=\"fileDetailsToShow.length > numberOfVisibleLines\">\n        <div v-for=\"item in fileDetailsToShow.slice(numberOfVisibleLines)\" :key=\"item.name\">\n          <div class=\"line\">\n            <div class=\"label\">\n              <div class=\"icon\">\n                <i v-if=\"item.faIcon\" :class=\"item.faIcon\"></i>\n                <svg v-else-if=\"item.svgIcon\" width=\"16\" height=\"16\">\n                  <use :href=\"`#${item.svgIcon}`\" />\n                </svg>\n              </div>\n              <div class=\"title\">{{ item.title }}</div>\n            </div>\n            <div class=\"value\">\n              <!-- eslint-disable-next-line vue/no-v-html -->\n              <span v-if=\"item.html\" v-html=\"item.html\"></span>\n              <span v-else>{{ item.value }}</span>\n            </div>\n          </div>\n        </div>\n        <muted-alert\n          v-if=\"shouldShowDataNotice && fileDetailsToShow.length > numberOfVisibleLines\"\n          class=\"mt-2 mb-1\"\n        >\n          {{$t(\"Fields above were embedded in the G-Code file by your slicer. Consult your slicer's manual if some fields are not accurate or missing.\")}}\n        </muted-alert>\n      </collapsable-details>\n    </template>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport { gcodeMetadata } from '@src/components/g-codes/gcode-metadata'\nimport CollapsableDetails from '@src/components/CollapsableDetails.vue'\n\nexport default {\n  name: 'GCodeDetails',\n\n  components: {\n    MutedAlert,\n    HelpWidget,\n    CollapsableDetails,\n  },\n\n  props: {\n    file: {\n      type: Object,\n      required: true,\n    },\n    showPrintStats: {\n      type: Boolean,\n      default: false,\n    },\n    showDetails: {\n      type: Boolean,\n      default: true,\n    },\n    showOpenButton: {\n      type: Boolean,\n      default: false,\n    },\n    compactView: {\n      type: Boolean,\n      default: true,\n    },\n    openButtonVariant: {\n      type: String,\n      default: 'outline-secondary',\n    },\n    openButtonText: {\n      type: String,\n      default: 'Open File',\n    },\n  },\n\n  data() {\n    return {\n      numberOfVisibleLines: 3,\n    }\n  },\n\n  computed: {\n    bigThumbnailUrl() {\n      return this.file.getBigThumbnailUrl && this.file.getBigThumbnailUrl()\n    },\n    showThumbnail() {\n      return !this.compactView || this.bigThumbnailUrl\n    },\n    fileDetailsToShow() {\n      let result = []\n      if (!this.file.deleted && this.file.metadata) {\n        result = gcodeMetadata\n          .filter((item) => this.file.metadata[item.name])\n          .map((item) => {\n            return {\n              ...item,\n              value: item.formatter(this.file.metadata[item.name]),\n            }\n          })\n      }\n      if (this.showPrintStats) {\n        result.unshift({\n          name: 'total_prints',\n          faIcon: 'fas fa-hashtag',\n          title: `${this.$i18next.t('Total prints')}`,\n          html: `\n            ${this.file.totalPrints || 0}\n            (<span class=\"text-success\">${this.file.successPrints || 0}</span> /\n            <span class=\"text-danger\">${this.file.failedPrints || 0}</span>)\n          `,\n        })\n      }\n      if (this.file.created_at) {\n        result.unshift({\n          name: 'created_at',\n          faIcon: 'fas fa-calendar-alt',\n          title: `${this.$i18next.t('Uploaded')}`,\n          value: this.file.created_at.fromNow(),\n        })\n      }\n      return result\n    },\n    shouldShowDataNotice() {\n      return (\n        !this.file.analysis &&\n        Object.keys(this.file.metadata || {}).length !== 0 &&\n        !this.file.deleted\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.file\n  display: flex\n  flex-direction: column\n\n.file-header\n  display: flex\n  align-items: center\n  gap: 1rem\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n  .thumbnail, .thumbnail-placeholder\n    width: 100px\n    height: 100px\n    border-radius: var(--border-radius-md)\n    background-color: var(--color-surface-primary)\n    display: flex\n    align-items: center\n    justify-content: center\n    overflow: hidden\n    img\n      height: 100%\n      width: auto\n      border-radius: 8px\n  .title\n    font-weight: bold\n    font-size: 1.25rem\n  .thumbnail-placeholder\n    position: relative\n    overflow: visible\n    svg\n      width: 3rem\n      height: 3rem\n      color: var(--color-background)\n    .help\n      position: absolute\n      top: 4px\n      right: 8px\n\n  &.compact\n    gap: .7rem\n    .thumbnail\n      width: 52px\n      height: 52px\n    .title\n      font-size: 1rem\n\n.line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  border-top: 1px solid var(--color-divider-muted)\n  gap: .5rem\n\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n\n  .value\n    font-weight: bold\n    text-align: right\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeDetails.vue?vue&type=template&id=090fe65d&scoped=true&\"\nimport script from \"./GCodeDetails.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeDetails.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeDetails.vue?vue&type=style&index=0&id=090fe65d&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"090fe65d\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('b-row',[_c('h4',{staticClass:\"mb-4 report-title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Report\")))])]),_c('b-row',[_c('b-col',{attrs:{\"lg\":\"7\"}},[_c('div',{staticClass:\"file-block mb-3\"},[_c('div',{staticClass:\"file-header compact\",class:{compact: _vm.compactView}},[(_vm.showIconThumbnail)?_c('div',[(_vm.bigThumbnailUrl)?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.bigThumbnailUrl}})]):_c('div',{staticClass:\"thumbnail-placeholder\"},[_c('span',{staticClass:\"help\"},[_c('help-widget',{attrs:{\"id\":\"thumbnail-setup-guide\",\"highlight\":false,\"show-close-button\":false}})],1),_c('svg',[_c('use',{attrs:{\"href\":\"#svg-no-photo\"}})])])]):_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-file-code\"})]),_c('div',{staticClass:\"info truncated-wrapper\"},[_c('div',{staticClass:\"truncated\",attrs:{\"title\":_vm.file.filename}},[_vm._v(\" \"+_vm._s(_vm.file.filename)+\" \")]),(_vm.file.filesize || _vm.file.deleted)?_c('div',{staticClass:\"subtitle text-secondary truncated-wrapper\"},[(_vm.file.deleted)?_c('div',{staticClass:\"truncated\"},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\"Deleted\")))])]):_c('div',{staticClass:\"truncated\"},[_c('span',[_vm._v(_vm._s(_vm.file.filesize)+\", \"+_vm._s(_vm.$t(\"uploaded\"))+\" \"+_vm._s(_vm.fileUploadedTime))])])]):_vm._e()]),_c('div',{staticClass:\"button\"},[(_vm.showOpenButton && _vm.file.id)?_c('b-button',{attrs:{\"href\":`/g_code_files/cloud/${_vm.file.id}/`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Open File\"))+\" \")]):_vm._e()],1)]),_c('div',{staticClass:\"first-layer-report-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"First Layer Grade\")))])]),_c('div',{staticClass:\"value\"},[_c('div',{class:_vm.gradeResult.gradeAccent},[_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeTitle || ' ')+\" \")])])]),_c('div',{staticClass:\"first-layer-report-info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"First Layer Print Time\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.firstLayerPrintTime))])])]),_c('div',{staticClass:\"notes-block mb-3\"},[_c('b-row',[_c('span',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"First Layer Notes\")))])]),_c('hr'),_c('b-row',[_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"You're first layer score is\"))+\": \"),_c('span',{staticClass:\"font-bold\",class:_vm.gradeResult.gradeAccent},[_vm._v(_vm._s(_vm.gradeResult.grade))]),_c('br'),_vm._v(\" \"+_vm._s(_vm.gradeResult.gradeRemarks)+\" \")])])]),(!_vm.isGradeA)?_c('hr'):_vm._e(),_c('b-row',[(!_vm.isGradeA)?_c('div',{staticClass:\"info\"},[_c('p',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Grade {localizedDom} usually means one of the following`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('span',{class:_vm.gradeResult.gradeAccent},[_vm._v(_vm._s(_vm.gradeResult.grade))])]},proxy:true}],null,false,3047815858)})],1),_c('ul',_vm._l((_vm.gradeResult.gradeSuggestion),function(suggestion,index){return _c('li',{key:index,domProps:{\"innerHTML\":_vm._s(suggestion)}})}),0)]):_vm._e()])],1)]),_c('b-col',{staticClass:\"heatmap-column\",attrs:{\"lg\":\"5\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-tabs',{attrs:{\"pills\":\"\",\"card\":\"\"}},[_c('b-tab',{attrs:{\"title\":_vm.$t('AI Time-Lapse')}},[_c('b-card-text',[_c('div',{staticClass:\"first-layer-modal-video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.tagged_video_url,\"poster-url\":_vm.aiTimeLapsePosterImageUrl,\"fluid\":false,\"fullscreen-btn\":false,\"download-btn\":true,\"default-full-screen-toggle\":true},on:{\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.tagged_video_url, `${_vm.print.id}_tagged_video_inspection.mp4`)}})],1)])],1),_c('b-tab',{attrs:{\"title\":_vm.$t('Original Time-Lapse')}},[_c('b-card-text',[_c('div',{staticClass:\"first-layer-modal-video-wrapper\"},[_c('video-box',{attrs:{\"video-url\":_vm.firstLayerInspection.video_url,\"poster-url\":_vm.firstLayerInspection.images.length ? _vm.firstLayerInspection.images[0].image_url : null,\"fluid\":false,\"fullscreen-btn\":false,\"download-btn\":true,\"default-full-screen-toggle\":true},on:{\"download\":() => _vm.downloadFile(_vm.firstLayerInspection.video_url, `${_vm.print.id}_video_inspection.mp4`)}})],1)])],1)],1)],1)],1)],1),_c('b-row',{staticClass:\"buttons-row\"},[_c('b-col',{attrs:{\"cols\":\"12\",\"lg\":\"7\"}},[_c('a',{staticClass:\"feedback-button\",attrs:{\"href\":`/first_layer_inspection_images/?print_id=${_vm.print.id}`}},[_vm._v(_vm._s(_vm.$t(\"Give Feedback About This Report\")))])])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class=\"p-2\">\n      <b-row>\n        <h4 class=\"mb-4 report-title\">{{ $t(\"First Layer Report\") }}</h4>\n      </b-row>\n      <b-row>\n        <b-col lg=\"7\">\n          <!-- File Block Start -->\n          <div class=\"file-block mb-3\">\n            <!-- File Block 1st row -->\n            <div\n              class=\"file-header compact\"\n              :class=\"{compact: compactView}\"\n            >\n              <div v-if=\"showIconThumbnail\">\n                <div v-if=\"bigThumbnailUrl\" class=\"thumbnail\">\n                  <img :src=\"bigThumbnailUrl\" />\n                </div>\n                <div v-else class=\"thumbnail-placeholder\">\n                  <span class=\"help\">\n                    <help-widget id=\"thumbnail-setup-guide\" :highlight=\"false\" :show-close-button=\"false\" />\n                  </span>\n                  <svg>\n                    <use href=\"#svg-no-photo\" />\n                  </svg>\n                </div>\n              </div>\n              <div v-else class=\"icon\">\n                <i class=\"fas fa-file-code\"></i>\n              </div>\n              <div class=\"info truncated-wrapper\">\n                <div class=\"truncated\" :title=\"file.filename\">\n                  {{ file.filename }}\n                </div>\n                <div v-if=\"file.filesize || file.deleted\" class=\"subtitle text-secondary truncated-wrapper\">\n                  <div v-if=\"file.deleted\" class=\"truncated\">\n                    <span class=\"text-danger\">{{ $t(\"Deleted\") }}</span>\n                  </div>\n                  <div v-else class=\"truncated\">\n                    <span>{{ file.filesize }}, {{$t(\"uploaded\")}} {{ fileUploadedTime }}</span>\n                  </div>\n                </div>\n              </div>\n              <div class=\"button\">\n                  <b-button\n                    :href=\"`/g_code_files/cloud/${file.id}/`\"\n                    v-if=\"showOpenButton && file.id\"\n                  >\n                    {{$t(\"Open File\")}}\n                  </b-button>\n                </div>\n            </div>\n            <!-- File Block 2nd row -->\n            <div class=\"first-layer-report-info-line\">\n              <div class=\"label\">\n                <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                <div>{{ $t(\"First Layer Grade\") }}</div>\n              </div>\n              <div class=\"value\">\n                <div :class=\"gradeResult.gradeAccent\">\n                  {{ gradeResult.gradeTitle || '&nbsp;' }}\n                </div>\n              </div>\n            </div>\n            <!-- File Block 3rd row -->\n            <div class=\"first-layer-report-info-line\">\n              <div class=\"label\">\n                <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                <div>{{ $t(\"First Layer Print Time\") }}</div>\n              </div>\n              <div class=\"value\">{{ firstLayerPrintTime }}</div>\n            </div>\n          </div>\n\n          <!-- File Block End -->\n          <!-- Notes Block Start -->\n          <div class=\"notes-block mb-3\">\n            <!-- Notes Block 1st row -->\n            <b-row>\n              <span class=\"title\">{{ $t(\"First Layer Notes\") }}</span>\n            </b-row>\n            <hr />\n            <!-- File Block 2nd row -->\n            <b-row>\n              <div class=\"description\">\n                <p>\n                  {{ $t(\"You're first layer score is\") }}:\n                   <span class=\"font-bold\" :class=\"gradeResult.gradeAccent\">{{ gradeResult.grade }}</span><br>\n                  {{ gradeResult.gradeRemarks }}\n                </p>\n              </div>\n            </b-row>\n            <hr v-if=\"!isGradeA\" />\n            <!-- File Block 3rd row -->\n            <b-row>\n              <div v-if=\"!isGradeA\" class=\"info\">\n                <p>\n                  <i18next :translation=\"$t(`Grade {localizedDom} usually means one of the following`)\">\n                    <template #localizedDom>\n                      <span :class=\"gradeResult.gradeAccent\">{{gradeResult.grade}}</span>\n                    </template>\n                  </i18next>\n                </p>\n                <ul>\n                  <li v-for=\"(suggestion, index) in gradeResult.gradeSuggestion\" :key=\"index\" v-html=\"suggestion\"></li>\n                </ul>\n              </div>\n            </b-row>\n          </div>\n        </b-col>\n        <!-- Map Section -->\n        <b-col lg=\"5\" class=\"heatmap-column\">\n          <b-card no-body>\n            <b-tabs pills card>\n              <b-tab :title=\"$t('AI Time-Lapse')\">\n                <b-card-text>\n                  <div class=\"first-layer-modal-video-wrapper\">\n                    <video-box\n                      :video-url=\"firstLayerInspection.tagged_video_url\"\n                      :poster-url=\"aiTimeLapsePosterImageUrl\"\n                      :fluid=\"false\"\n                      :fullscreen-btn=\"false\"\n                      :download-btn=\"true\"\n                      :default-full-screen-toggle=\"true\"\n                      @download=\"\n                        () => downloadFile(firstLayerInspection.tagged_video_url, `${print.id}_tagged_video_inspection.mp4`)\n                      \"\n                    />\n                  </div>\n                </b-card-text>\n              </b-tab>\n              <b-tab :title=\"$t('Original Time-Lapse')\">\n                <b-card-text>\n                  <div class=\"first-layer-modal-video-wrapper\">\n                    <video-box\n                      :video-url=\"firstLayerInspection.video_url\"\n                      :poster-url=\"firstLayerInspection.images.length ? firstLayerInspection.images[0].image_url : null\"\n                      :fluid=\"false\"\n                      :fullscreen-btn=\"false\"\n                      :download-btn=\"true\"\n                      :default-full-screen-toggle=\"true\"\n                      @download=\"\n                        () => downloadFile(firstLayerInspection.video_url, `${print.id}_video_inspection.mp4`)\n                      \"\n                    />\n                  </div>\n                </b-card-text>\n              </b-tab>\n            </b-tabs>\n          </b-card>\n          \n        </b-col>\n      </b-row>\n      <b-row class=\"buttons-row\">\n        <!-- Notes Block End -->\n        <b-col cols=\"12\" lg=\"7\">\n            <a :href=\"`/first_layer_inspection_images/?print_id=${print.id}`\" class=\"feedback-button\">{{ $t(\"Give Feedback About This Report\") }}</a\n            >\n        </b-col>\n      </b-row>\n    </div>\n</template>\n\n<script>\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PageLayout from '@src/components/PageLayout'\nimport VideoBox from '@src/components/VideoBox'\nimport { downloadFile } from '@src/lib/utils'\n\nexport default {\n  name: 'FirstLayerReportModal',\n  components: {\n    VueSlickCarousel,\n    PageLayout,\n    VideoBox\n  },\n\n  data: function () {\n    return {\n      showCarouselAnimation: true,\n      first_layer_info: {},\n      carouselItems: [],\n      settings: {\n        dots: true,\n        infinite: true,\n        speed: 500,\n        slidesToShow: 1,\n        slidesToScroll: 1,\n        adaptiveHeight: true,\n        initialSlide: 0,\n      },\n      activeTab: 0,\n      carouselKey: 0,\n      activeThumbnail: null,\n      thumbnailStyle: {\n        width: '150px',\n        height: '150px',\n        position: 'absolute',\n        zIndex: '1070',\n      },\n    }\n  },\n  props: {\n    firstLayerInspection: {\n      type: Object,\n      required: true,\n    },\n    firstLayerPrintTime: {\n      type: String,\n      required: true\n    },\n    gradeResult: {\n      type: Object,\n      required: true,\n    },\n    print: {\n      type: Object,\n      required: true,\n    },\n    showOpenButton: {\n      type: Boolean,\n      default: false,\n    },\n    compactView: {\n      type: Boolean,\n      default: true,\n    },\n  },\n  computed: {\n    aiTimeLapsePosterImageUrl() {\n      if (this.firstLayerInspection.poster_url) {\n        return this.firstLayerInspection.poster_url\n      }\n      return this.firstLayerInspection.images?.length ? this.firstLayerInspection.images[0].image_url : null\n    },\n    file() {\n      return this.print.g_code_file || { filename: this.print.filename }\n    },\n    isGradeA() {\n      return this.gradeResult.grade === 'A'\n    },\n    showIconThumbnail() {\n      return !this.compactView || this.bigThumbnailUrl\n    },\n    bigThumbnailUrl() {\n      return this.file.getBigThumbnailUrl && this.file.getBigThumbnailUrl()\n    },\n    fileUploadedTime() {\n      return this.file.created_at.fromNow()\n    },\n  },\n  watch: {\n    firstLayerInfo: {\n      handler: function (value) {\n        if (value) {\n          this.prepareFirstLayerInfo()\n        }\n      },\n      immediate: true,\n    },\n  },\n  methods: {\n    downloadFile,\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.buttons-row\n  @media (max-width: 991px)\n    margin-top: 2em\n.heatmap-column\n  display: flex\n  flex-direction: column\n  align-items: center\n  .card\n    background-color: var(--color-background)\n    border-radius: var(--border-radius-lg)\n.file-header\n  display: flex\n  align-items: center\n  gap: 1rem\n  padding-bottom: 5px\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n.font-bold\n  font-weight: bold\n.first-layer-report-info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &:first-of-type\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.report-title\n  padding-left: 15px\n\n.feedback-button\n  border: 1px solid var(--color-primary)\n  display: block\n  text-align: center\n  border-radius: 17px\n  padding: 8px\n  color: var(--color-primary)\n  background-color: transparent\n  &:hover\n    background-color: var(--color-hover)\nhr\n  width: 100%\n  margin-top: 7px\n  margin-bottom: 7px\n.notes-block\n  background-color: var(--color-background)\n  padding: 1.5em\n  border-radius: var(--border-radius-lg)\n\n  display: flex\n  flex-direction: column\n  .title\n    padding: 0 1em\n  .description\n    padding: 0 1em\n    font-size: 0.9em\n    p\n      margin: 0\n  .info\n    padding: 0 1em\n    font-size: 0.9em\n    p\n      margin: 0\n    ul\n      margin: 0 -15px\n      li\n        font-size: 0.9em\n\n\n.file-block\n  background-color: var(--color-background)\n  padding: 1.5em\n  border-radius: var(--border-radius-lg)\n  display: flex\n  flex-direction: column\n  .title\n    width:100%\n    display: flex\n    padding: 0 1em\n    font-size: 1.125rem\n    color: var(--color-text-primary)\n    font-weight: medium\n    span\n      margin-left: .5em\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      i\n        font-size: 2em\n    .info\n      flex: 15\n      font-size: 1rem\n      grid-column: span 1\n      .file-size\n        color: var(--color-divider)\n    .button\n      display: flex\n      align-items: center\n      justify-content: flex-end\n  @media (max-width: 768px)\n    grid-template-columns: 8% 60% 32%\n  .first-layer-grade\n    width:100%\n    display: flex\n    justify-content: space-between\n    align-items: center\n    padding: 0 1em\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      justify-content: center\n    .name\n      flex: 15\n      @media (max-width: 768px)\n        flex: 11\n    .status\n      display: flex\n      justify-content: flex-end\n  .first-layer-print-time\n    width:100%\n    display: flex\n    justify-content: space-between\n    padding: 0 1em\n    grid-template-columns: 3% 67% 30%\n    .icon\n      flex: 1\n      display: flex\n      align-items: center\n      justify-content: center\n\n    .name\n      flex: 18\n      @media (max-width: 768px)\n        flex: 15\n    .status\n      display: flex\n      justify-content: flex-end\n\n  &.bar-chart\n    height: auto\n    .chart-wrapper\n      height: 210px\n  @media (max-width: 768px)\n    padding: 1.25em 1.5em\n\n\n.dark-icon\n  color: var(--color-divider)\n\n\n$border-color: #dee2e6\n.card-map\n  border-radius: var(--border-radius-lg)\n  background: white\n  @media (min-width: 991px)\n    max-width: 490px\n  .card-body\n    padding: 10%\n    \n.border-right\n  border-right: 1px solid $border-color\n\n.transparent-button\n  background-color: transparent\n  border-color: #007bff\n  color: #007bff\n  &:hover\n    background-color: rgba(#007bff, 0.1)\n\n\n\n\n@media (max-width: 768px)\n  .file-block-title\n    grid-template-columns: 7% 65% 28%\n\n  @media (max-width: 1198px)\n    .file-block-title\n      grid-template-columns: 7% 65% 28%\n\n.is-fullscreen\n  position: fixed\n  top: 0\n  left: 0\n  bottom: 0\n  right: 0\n  z-index: 9999\n  background-color: var(--color-background)\n  display: flex\n  flex: 1\n  order: 1\n  ::v-deep .video-js\n    height: 100vh !important\n</style>\n\n<style>\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n  to {\n    opacity: 1;\n  }\n}\n.carousel-active-tab {\n  border: none !important;\n  background-color: var(--color-background) !important;\n}\n.carousel-tab {\n  &:hover {\n    background-color: var(--color-hover);\n  }\n}\ndiv#carousal-modal {\n  animation: swal2-show .3s !important;\n  transition: none !important;\n}\n.modal-dialog.modal-lg {\n  transition: none !important\n}\ndiv#carousal-modal___BV_modal_outer_ {\n  z-index: 1100 !important;\n}\n\nbutton.btn.feedback-button.btn-secondary {\n  border: 1px solid var(--color-primary) !important\n}\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerReportModal.vue?vue&type=template&id=21ff5370&scoped=true&\"\nimport script from \"./FirstLayerReportModal.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerReportModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerReportModal.vue?vue&type=style&index=0&id=21ff5370&prod&lang=sass&scoped=true&\"\nimport style1 from \"./FirstLayerReportModal.vue?vue&type=style&index=1&id=21ff5370&prod&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"21ff5370\",\n  null\n  \n)\n\nexport default component.exports","export function calculateGrade(score) {\n  if (score >= 80) {\n    return {\n      grade: 'A',\n      gradeTitle: 'A - Flawless First Layer',\n      gradeAccent: 'text-success',\n      gradeRemarks: \"You have got a perfect first layer! Way to go!\",\n      gradeSuggestion: [],\n    }\n  } else if (score >= 60) {\n    return {\n      grade: 'B',\n      gradeTitle: 'B - Barely a Blemish, Bravo!',\n      gradeAccent: 'text-success',\n      gradeRemarks: \"You’re first layer is almost perfect! The risk of the first layer to cause  a failure later is VERY LOW.\",\n      gradeSuggestion: [\n        \"Minor under-extrusion.\",\n        \"Minor over-extrusion.\",\n        \"Suboptimal z-offset setting that causes the material to not bond perfectly.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Other problems that cause the first layer to have defects.\"\n      ],\n    }\n  } else if (score >= 40) {\n    return {\n      grade: 'C',\n      gradeTitle: 'C - Okay First Layer',\n      gradeAccent: 'text-warning',\n      gradeRemarks: \"The risk for the first layer to cause your print to fail later is LOW. However, if you want a perfect bottom surface finish and structural strength, you can stop the print, perfect your first layer, and restart the print.\",\n      gradeSuggestion: [\n        \"Under-extrusion.\",\n        \"Over-extrusion.\",\n        \"Suboptimal z-offset setting that causes the material to not bond perfectly.\",\n        \"Contaminated print bed that causes the material in some areas to slightly bubble or wrap.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Other problems that cause the first layer to have defects.\"\n      ],\n    }\n  } else if (score >= 20) {\n    return {\n      grade: 'D',\n      gradeTitle: 'D - Definitely Needs Tuning',\n      gradeAccent: 'text-danger',\n      gradeRemarks: \"It looks like your printer has run into some trouble on the first layer. The risk for the first layer to cause your print to failure later is MEDIUM. Although these first layer issues probably won't cause the print to fail later, you should consider fixing them and restarting the print, especially if you want to have a good bottom surface finish and structural strength.\",\n      gradeSuggestion: [\n        \"Significant under-extrusion.\",\n        \"Uneven print bed coupled with suboptimal auto-bed-leveling.\",\n        \"Contaminated print bed that causes the material in some areas to bubble or wrap.\",\n        \"Other problems that cause the first layer to show serious defects.\"\n      ],\n    }\n  } else {\n    return {\n      grade: 'F',\n      gradeTitle: 'F - First Layer Fail',\n      gradeAccent: 'text-danger',\n      gradeRemarks: \"It looks like your printer has run into some trouble on the first layer. The risk for the first layer to cause your print to failure later is HIGH. I recommend you stop the print now and fix the problem.\",\n      gradeSuggestion: [\n        \"Serious bed-leveling problems that cause material to detach from the print bed.\",\n        \"Wrong/suboptimal z-offset setting.\",\n        \"Serious bubbling or wrapping.\",\n        \"Other problems that will probably cause the print to fail later in the process.\"\n      ]\n    }\n  }\n}","<template>\n  <page-layout>\n    <template #content>\n      <loading-placeholder v-if=\"isLoading\" />\n      <b-container v-else fluid>\n        <b-row>\n          <b-col lg=\"5\">\n            <div class=\"print-info\">\n              <!-- Print details -->\n              <div class=\"card-container print-details\">\n                <div v-if=\"currentIndex || currentIndex === 0\" class=\"navigation-container\">\n                  <b-button\n                    variant=\"outline-secondary\"\n                    :disabled=\"!prevPrint\"\n                    @click.prevent=\"switchToPrint(prevPrint)\"\n                  >\n                    <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{ PrevPrintButtonTitle }}\n                  </b-button>\n                  <div class=\"summary truncated-wrapper\">\n                    <div class=\"date truncated\">\n                      {{ print.started_at.format(absoluteDateFormat) }}\n                    </div>\n                  </div>\n                  <b-button\n                    variant=\"outline-secondary\"\n                    :disabled=\"!nextPrint\"\n                    @click.prevent=\"switchToPrint(nextPrint)\"\n                  >\n                    {{ NextPrintButtonTitle }}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n                  </b-button>\n                </div>\n                <div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                      <div class=\"title\">{{ $t(\"Status\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      <div class=\"print-status-color\" :class=\"print.status.key\">\n                        {{ print.status.title }}\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Start time\") }}</div>\n                    </div>\n                    <div class=\"value\">{{ print.started_at.format(absoluteDateFormat) }}</div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"End time\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.ended_at ? print.ended_at.format(absoluteDateFormat) : '-' }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Duration\") }}</div>\n                    </div>\n                    <div class=\"value\">{{ print.duration || '-' }}</div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-ruler-horizontal\"></i></div>\n                      <div class=\"title\">{{ $t(\"Filament used\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.filament_used ? humanizedFilamentUsage(print.filament_used) : '-' }}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <!-- GCode details -->\n              <g-code-details\n                :file=\"print.g_code_file || { filename: print.filename }\"\n                :show-open-button=\"canOpenFile\"\n              />\n              <!-- Printer -->\n              <div v-if=\"print.printer\" class=\"card-container printer\">\n                <div class=\"icon\">\n                  <svg width=\"1em\" height=\"1em\" style=\"margin-bottom: 5px\">\n                    <use href=\"#svg-3d-printer\" />\n                  </svg>\n                </div>\n                <div class=\"info truncated-wrapper\">\n                  <div class=\"title truncated\" :title=\"print.printer.name\">\n                    {{ print.printer.name }}\n                  </div>\n                  <div\n                    class=\"subtitle truncated\"\n                    :class=\"[\n                      printer\n                        ? printer.isPrintable() && !printer.inTransientState()\n                          ? 'text-success'\n                          : 'text-warning'\n                        : 'text-danger',\n                    ]\"\n                  >\n                    {{ printer ? printer.printabilityText() : 'Deleted' }}\n                  </div>\n                </div>\n                <div\n                  v-if=\"\n                    printer &&\n                    print.g_code_file &&\n                    !print.g_code_file.deleted &&\n                    print.g_code_file.url\n                  \"\n                  class=\"action\"\n                >\n                  <button\n                    class=\"btn btn-primary\"\n                    :disabled=\"!printer.isPrintable() || printer.inTransientState()\"\n                    @click=\"onRepeatPrintClicked\"\n                  >\n                    <b-spinner v-if=\"isSending\" class=\"mr-2\" small />\n                    <span>{{ $t(\"Reprint\") }}</span>\n                  </button>\n                </div>\n              </div>\n              <div v-else=\"print.printer\" class=\"card-container printer\">\n                <p>Unknown Printer</p>\n              </div>\n\n            </div>\n          </b-col>\n          <b-col lg=\"7\">\n            <div class=\"print-info\">\n              <!-- First Layer Report Card -->\n              <div v-if=\"firstLayerInspection.id\" class=\"card-container\">\n                <b-row class=\"m-0\">\n                  <b-col cols=\"12\" sm=\"6\" md=\"6\" lg=\"12\" xl=\"6\"   class=\"first-layer-info-column\">\n                    <div>\n                      <b-row class=\"mb-4\">\n                        <span class=\"ml-3\">{{ $t(\"First Layer Report\") }}</span>\n                      </b-row>\n                      <div class=\"first-layer-info-line\">\n                        <div class=\"label\">\n                          <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                          <div class=\"title\">{{ $t(\"First Layer Grade\") }}</div>\n                        </div>\n                        <div class=\"value\">\n                          <div class=\"print-status-color\" :class=\"gradeResult.gradeAccent\">\n                            {{ gradeResult.gradeTitle || '&nbsp;' }}\n                          </div>\n                        </div>\n                      </div>\n                      <div class=\"first-layer-info-line\">\n                        <div class=\"label\">\n                          <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                          <div class=\"title\">{{ $t(\"First Layer Print Time\") }}</div>\n                        </div>\n                        <div class=\"value\">{{ firstLayerPrintTime }}</div>\n                      </div>\n                    </div>\n                    <b-row class=\"m-0\">\n                      <b-button class=\"open-detailed-report-button\" @click=\"onOpenDetailedReport\"\n                        >{{ $t(\"Open Detailed Report\") }}</b-button\n                      >\n                    </b-row>\n                  </b-col>\n                  <b-col cols=\"12\" sm=\"6\" md=\"6\" lg=\"12\" xl=\"6\" class=\"first-layer-report-block-video-container\">\n                    <div class=\"first-layer-video-wrapper\" :class=\"{\n                              'is-fullscreen original':\n                                !!fullscreenUrl && fullscreenUrl === firstLayerInspection.tagged_video_url,\n                            }\">\n                      <video-box\n                        :video-url=\"firstLayerInspection.tagged_video_url\"\n                        :poster-url=\"aiTimeLapsePosterImageUrl\"\n                        :fluid=\"false\"\n                        :fullscreen-btn=\"fullscreenUrl === null\"\n                        :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                        :download-btn=\"true\"\n                        @fullscreen=\"() => enterFullscreen(firstLayerInspection.tagged_video_url)\"\n                        @exitFullscreen=\"exitFullscreen\"\n                        @download=\"\n                          () => downloadFile(firstLayerInspection.tagged_video_url, `${print.id}_tagged_video_inspection.mp4`)\n                        \"\n                      />\n                    </div>\n                  </b-col>\n                </b-row>\n              </div>\n\n              <div class=\"time-lapse\">\n                <div v-if=\"print.video_archived_at\" class=\"card-container\">\n                  <h2 class=\"title\">{{ $t(\"Time-Lapse video deleted\") }}</h2>\n                  <p>\n                    {{ $t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:$syndicateText.brandName}) }}\n                  </p>\n                  <p>\n                    <i18next :translation=\"$t(`If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please {localizedDom}`)\">\n                      <template #localizedDom>\n                        <a href=\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\">{{$t(\"contact us\")}}</a>\n                      </template>\n                    </i18next>\n                    .\n                  </p>\n                </div>\n                <div v-else-if=\"print.video_url || print.tagged_video_url\">\n                  <b-card no-body>\n                    <b-tabs pills card>\n                      <b-tab title=\"Detective Time-Lapse\" :disabled=\"!canShowDetectiveView\">\n                        <b-card-text>\n                          <div\n                            v-if=\"print.tagged_video_url\"\n                            :class=\"{\n                              'is-fullscreen':\n                                !!fullscreenUrl && fullscreenUrl === print.tagged_video_url,\n                            }\"\n                          >\n                            <div class=\"video-wrapper\">\n                              <video-box\n                                :video-url=\"print.tagged_video_url\"\n                                :poster-url=\"print.poster_url\"\n                                :fluid=\"false\"\n                                :fullscreen-btn=\"fullscreenUrl === null\"\n                                :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                                :download-btn=\"true\"\n                                @timeupdate=\"onTimeUpdate\"\n                                @fullscreen=\"() => enterFullscreen(print.tagged_video_url)\"\n                                @exitFullscreen=\"exitFullscreen\"\n                                @download=\"\n                                  () => downloadFile(print.tagged_video_url, `${print.id}_tagged.mp4`)\n                                \"\n                              />\n                            </div>\n                            <div class=\"detective-footer\">\n                              <failure-detection-gauge\n                                v-if=\"print.prediction_json_url\"\n                                :normalized-p=\"normalizedP\"\n                              />\n                              <div class=\"feedback-section\">\n                                <div\n                                  class=\"lead\"\n                                  :class=\"[print.alerted_at ? 'text-danger' : 'text-success']\"\n                                >\n                                  {{ print.alerted_at ? 'Failure detected' : 'No failure detected' }}\n                                </div>\n                                <div class=\"py-2\">\n                                  {{$t(\"Did we get it right?\")}}\n                                  <b-button\n                                    :variant=\"thumbedUp ? 'primary' : 'outline'\"\n                                    class=\"mx-2 btn-sm\"\n                                    @click=\"onThumbUpClick\"\n                                  >\n                                    <b-spinner\n                                      v-if=\"inflightAlertOverwrite\"\n                                      type=\"grow\"\n                                      small\n                                    ></b-spinner>\n                                    <i v-else class=\"fas fa-thumbs-up\"></i>\n                                  </b-button>\n                                  <b-button\n                                    :variant=\"thumbedDown ? 'primary' : 'outline'\"\n                                    class=\"mx-2 btn-sm\"\n                                    @click=\"onThumbDownClick\"\n                                  >\n                                    <b-spinner\n                                      v-if=\"inflightAlertOverwrite\"\n                                      type=\"grow\"\n                                      small\n                                    ></b-spinner>\n                                    <i v-else class=\"fas fa-thumbs-down\"></i>\n                                  </b-button>\n                                </div>\n                                <transition name=\"bounce\">\n                                  <div v-if=\"print.printShotFeedbackEligible\" class=\"pt-2\">\n                                    <b-button\n                                      variant=\"outline-primary\"\n                                      size=\"sm\"\n                                      :href=\"`/prints/shot-feedback/${print.id}/`\"\n                                    >\n                                      <i\n                                        v-if=\"!print.need_print_shot_feedback\"\n                                        class=\"fas fa-check mr-2\"\n                                      ></i>\n                                      {{$t(\"FOCUSED FEEDBACK\")}}\n                                    </b-button>\n                                  </div>\n                                </transition>\n\n                                <div class=\"about-feedback\">\n                                  <small v-if=\"print.printShotFeedbackEligible\">\n                                    <span v-if=\"!print.need_print_shot_feedback\">\n                                      {{$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")}}\n                                    </span>\n                                    <span v-else>\n                                      {{$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\")}}\n                                      <a\n                                        :href=\"getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')\"\n                                        target=\"_blank\"\n                                      >\n                                        {{$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\")}}\n                                      </a>\n                                    </span>\n                                  </small>\n                                  <small v-else>\n                                    {{$t(\"Every time you give us feedback,\")}}\n                                    <a\n                                      :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                                      target=\"_blank\"\n                                    >\n                                      {{$t(\"you help us get better at detecting failures\")}}\n                                    </a>\n                                  </small>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div v-else>\n                            <detective-working class=\"detective-placeholder\" />\n                          </div>\n                        </b-card-text>\n                      </b-tab>\n                      <b-tab\n                        v-if=\"print.video_url\"\n                        :active=\"!print.tagged_video_url\"\n                        title=\"Original Time-Lapse\"\n                      >\n                        <b-card-text>\n                          <div\n                            :class=\"{\n                              'is-fullscreen original':\n                                !!fullscreenUrl && fullscreenUrl === print.video_url,\n                            }\"\n                          >\n                            <div class=\"video-wrapper\">\n                              <video-box\n                                :video-url=\"print.video_url\"\n                                :poster-url=\"print.poster_url\"\n                                :fluid=\"false\"\n                                :fullscreen-btn=\"fullscreenUrl === null\"\n                                :exit-fullscreen-btn=\"fullscreenUrl !== null\"\n                                :download-btn=\"true\"\n                                @timeupdate=\"onTimeUpdate\"\n                                @fullscreen=\"() => enterFullscreen(print.video_url)\"\n                                @exitFullscreen=\"exitFullscreen\"\n                                @download=\"() => downloadFile(print.video_url, `${print.id}.mp4`)\"\n                              />\n                            </div>\n                          </div>\n                        </b-card-text>\n                      </b-tab>\n                    </b-tabs>\n                  </b-card>\n                </div>\n                <div v-else class=\"card-container\">\n                  <p class=\"text-secondary mt-3\">{{ $t(\"Time-Lapse video unavailable because\") }}:</p>\n                  <ul>\n                    <li class=\"text-secondary mt-3\">\n                      {{ $t(\"The {brandName} server is still processing the time-lapse;\",{brandName:$syndicateText.brandName}) }}\n                    </li>\n                    <li class=\"text-secondary mt-3\">\n                      <i18next :translation=\"$t(`Or, the print time was shorter than the threshold. You can change the threshold in {localizedDom}`)\">\n                        <template #localizedDom>\n                          <a :href=\"`/printers/${print.printer.id}/`\">{{$t(\"the printer settings\")}}.</a>\n                        </template>\n                      </i18next>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport { humanizedDuration } from '@src/lib/formatters'\nimport axios from 'axios'\nimport moment from 'moment'\nimport { getNormalizedP, downloadFile } from '@src/lib/utils'\nimport urls from '@config/server-urls'\nimport { getLocalPref } from '@src/lib/pref'\nimport { humanizedFilamentUsage } from '@src/lib/formatters'\nimport { user, settings } from '@src/lib/page-context'\nimport { normalizedPrint, PrintStatus, normalizedPrinter, toMomentOrNull } from '@src/lib/normalizers'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport VideoBox from '@src/components/VideoBox'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport { sendToPrint, showRedirectModal, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { restoreFilterValues, getFilterParams } from '@src/components/FilteringDropdown'\nimport { restoreSortingValue } from '@src/components/SortingDropdown'\nimport {\n  FilterOptions,\n  FilterLocalStoragePrefix,\n  SortingLocalStoragePrefix,\n  SortingOptions,\n} from '@src/views/PrintHistoryPage'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport FirstLayerReportModal from '@src/components/prints/FirstLayerReportModal.vue'\nimport { calculateGrade } from '../services/gradeCalculator';\n\nexport default {\n  name: 'PrintPage',\n\n  components: {\n    PageLayout,\n    VideoBox,\n    DetectiveWorking,\n    FailureDetectionGauge,\n    GCodeDetails,\n  },\n\n  props: {\n    printId: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      image: '',\n      gradeResult: {},\n      firstLayerInspection: {},\n      isFirstLayerReportModalOpen: false,\n      PrintStatus,\n      absoluteDateFormat: 'MMM D, YYYY h:mm a',\n      print: null,\n      predictions: [],\n      printer: null,\n      isLoading: true,\n      currentPosition: 0,\n      inflightAlertOverwrite: null,\n      fullscreenUrl: null,\n      user: null,\n      currentPrint: null,\n\n      // Pagination\n      prevPrint: null,\n      nextPrint: null,\n      // Sorting for pagination\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n      // Filtering for pagination\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n\n      printerStateCheckInterval: null,\n      firstLayerPrintTime: '-'\n    }\n  },\n\n  computed: {\n    aiTimeLapsePosterImageUrl() {\n      if (this.firstLayerInspection.poster_url) {\n        return this.firstLayerInspection.poster_url\n      }\n      return this.firstLayerInspection.images?.length ? this.firstLayerInspection.images[0].image_url : null\n    },\n    canOpenFile() {\n      return this.print.g_code_file &&\n            !this.print.g_code_file.resident_printer &&\n            !this.print.g_code_file.deleted\n    },\n    PrevPrintButtonTitle() {\n      return this.sortingValue.direction.key === 'asc' ? `${this.$i18next.t('Older')}` : `${this.$i18next.t('Newer')}`\n    },\n    NextPrintButtonTitle() {\n      return this.sortingValue.direction.key === 'asc' ? `${this.$i18next.t('Newer')}` : `${this.$i18next.t('Older')}`\n    },\n    fileName() {\n      return this.print.g_code_file === null ? this.print.filename : this.print.g_code_file.filename\n    },\n    currentPrintId() {\n      return this.currentPrint?.id || this.printId\n    },\n    currentIndex() {\n      if (this.currentPrint) {\n        return this.currentPrint.index\n      }\n\n      const urlParams = new URLSearchParams(window.location.search)\n      let indexParam = urlParams.get('index')\n      if (!indexParam) {\n        return\n      }\n\n      return parseInt(indexParam)\n    },\n\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, false)\n    },\n\n    canShowDetectiveView() {\n      if (this.print.prediction_json_url !== null && this.print.tagged_video_url !== null) {\n        return true\n      }\n      // Time-lapses that was uploaded within the past 24 hours are presumably still be processed\n      if (this.print.uploaded_at && moment().diff(this.print.uploaded_at, 'hours') < 24) {\n        return true\n      }\n      return false\n    },\n\n    thumbedUp() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'NOT_FAILED')\n    },\n\n    thumbedDown() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'FAILED')\n    },\n    isSending() {\n      const printerState = this.printer?.calculatedState()\n      return printerState && ['G-Code Downloading', 'Starting'].includes(printerState)\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n\n    this.user = user()\n    this.fetchData()\n    this.fetchSiblingPrints()\n  },\n\n  mounted() {\n    const exitFullscreen = this.exitFullscreen\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape') {\n        exitFullscreen()\n      }\n    })\n  },\n\n  unmounted() {\n    clearInterval(this.printerStateCheckInterval)\n  },\n\n  methods: {\n    downloadFile,\n    humanizedFilamentUsage,\n    async fetchData(clearPreviousData = true) {\n      if (clearPreviousData) {\n        this.print = null\n        this.predictions = []\n        this.printer = null\n      }\n\n      this.isLoading = true\n      try {\n        const printResponse = await axios.get(urls.print(this.currentPrintId))\n        this.print = normalizedPrint(printResponse.data)\n\n        this.prepareFirstLayerReport(printResponse.data.firstlayerinspection_set.length ? printResponse.data.firstlayerinspection_set[0] : {})\n\n        if (this.print.prediction_json_url) {\n          axios.get(this.print.prediction_json_url).then((response) => {\n            this.predictions = response.data\n          })\n        }\n\n        axios\n          .get(urls.printer(this.print.printer.id), { params: { with_archived: true } })\n          .then((response) => {\n            this.printer = normalizedPrinter(response.data)\n\n            this.printerComm = printerCommManager.getOrCreatePrinterComm(\n              this.printer.id,\n              urls.printerWebSocket(this.printer.id),\n              {\n                onPrinterUpdateReceived: (data) => {\n                  this.printer = normalizedPrinter(data, this.printer)\n                },\n              }\n            )\n            this.printerComm.connect()\n          })\n          .catch((error) => {\n            // Printer could be old and deleted from account (404 error)\n            this.printer = null\n            if (error?.response?.status !== 404) {\n              this.errorDialog(error, `${this.$i18next.t('Failed to fetch printer information')}`)\n            }\n          })\n          .finally(() => {\n            this.isLoading = false\n          })\n      } catch (error) {\n        console.log(error)\n        this.isLoading = false\n      }\n    },\n    prepareFirstLayerReport(firstLayerInspectionData) {\n      this.firstLayerInspection = firstLayerInspectionData;\n      if (firstLayerInspectionData.id) {\n        this.gradeResult = calculateGrade(firstLayerInspectionData.score);\n        const createdAt = toMomentOrNull(this.firstLayerInspection.created_at)\n        const duration = moment.duration(createdAt.diff(this.print.started_at))\n        this.firstLayerPrintTime = humanizedDuration(duration.asSeconds())\n      }\n    },\n    switchToPrint(print) {\n      this.currentPrint = print\n      const newUrl = `/prints/${print.id}/?index=${print.index}`\n      window.history.replaceState({}, '', newUrl)\n      this.fetchData()\n      this.fetchSiblingPrints()\n    },\n    fetchSiblingPrints() {\n      if (!this.currentIndex && this.currentIndex !== 0) {\n        return\n      }\n\n      const prevExists = this.currentIndex > 0\n      const start = prevExists ? this.currentIndex - 1 : 0\n      const limit = prevExists ? 3 : 2\n\n      axios\n        .get(urls.prints(), {\n          params: {\n            start,\n            limit,\n            ...getFilterParams(\n              this.filterOptions,\n              this.filterValues,\n              (filterOptionKey, filterValueKey) => {\n                if (filterOptionKey === 'timePeriod') {\n                  return this.filterOptions[filterOptionKey].buildQueryParam(\n                    filterValueKey,\n                    getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateFrom`) || null,\n                    getLocalPref(`${FilterLocalStoragePrefix}-timePeriod-dateTo`) || null,\n                    this.user\n                  )\n                }\n              }\n            ),\n            sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n          },\n        })\n        .then((response) => {\n          const data = response.data\n          let prev\n          let next\n          if (prevExists) {\n            if (data.length === 3 && data[1].id === this.currentPrintId) {\n              // prev and next exist\n              prev = data[0]\n              next = data[2]\n            } else if (data.length === 2 && data[1].id === this.currentPrintId) {\n              // only prev exists\n              prev = data[0]\n            } else {\n              // no prev or next\n              return\n            }\n          } else {\n            if (data.length === 2 && data[0].id === this.currentPrintId) {\n              // only next exists\n              next = data[1]\n            } else {\n              // no prev or next\n              return\n            }\n          }\n\n          this.prevPrint = prev ? { id: prev.id, index: this.currentIndex - 1 } : null\n          this.nextPrint = next ? { id: next.id, index: this.currentIndex + 1 } : null\n        })\n        .catch((error) => {\n          this.errorDialog(error)\n        })\n    },\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n    onThumbUpClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'FAILED' : 'NOT_FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n    onThumbDownClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'NOT_FAILED' : 'FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n    alertOverwrite(value) {\n      axios\n        .patch(urls.print(this.print.id), {\n          alert_overwrite: value,\n        })\n        .then((response) => {\n          this.inflightAlertOverwrite = null\n          this.fetchData(false)\n        })\n    },\n    onRepeatPrintClicked() {\n      confirmPrint(this.print.g_code_file, this.printer).then(() => {\n        sendToPrint({\n          printer: this.printer,\n          gcode: this.print.g_code_file,\n          isCloud: this.print.g_code_file?.resident_printer === null,\n          Swal: this.$swal,\n          onPrinterStatusChanged: () => {\n            showRedirectModal(this.$swal, () => this.fetchData(), this.printer.id)\n          },\n        })\n      })\n    },\n    enterFullscreen(url) {\n      this.fullscreenUrl = url\n    },\n    exitFullscreen() {\n      this.fullscreenUrl = null\n    },\n    onOpenDetailedReport() {\n      this.$swal.openModalWithComponent(\n        FirstLayerReportModal,\n        {\n          printer: this.printer,\n          firstLayerInspection: this.firstLayerInspection,\n          firstLayerPrintTime: this.firstLayerPrintTime,\n          gradeResult: this.gradeResult,\n          print: this.print,\n          showOpenButton: this.canOpenFile\n        },\n        {\n          showCloseButton: true,\n          showConfirmButton: false,\n          width: '75em'\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.fade-enter-active, .fade-leave-active\n  transition: opacity 0.5s\n.fade-enter, .fade-leave-to\n  opacity: 0\n.first-layer-info-column\n  display: flex\n  flex-direction: column\n  justify-content: space-between\n  height: 240px\n  padding: 0\n  @media (max-width: 576px)\n    height: auto\n    gap: 1em\n  @media (max-width: 1198px) and (min-width: 991px)\n    height: auto\n    gap: 1em\n.open-detailed-report-button\n  width: 100%\n\n.first-layer-report-block-video-container\n  display: flex\n  justify-content: flex-end\n  padding-right: 0\n  @media (max-width: 576px)\n    padding: 0\n    margin-top: 1em\n    justify-content: center\n  @media (max-width: 577px) and (max-width: 767px)\n    padding: 0 0 0 5px\n    justify-content: center\n  @media (max-width: 1198px) and (min-width: 991px)\n    margin-top: 1em\n    padding: 0\n    justify-content: center\n.heatmap-image-container\n  border-radius: var(--border-radius-lg)\n  background: white\n  padding: 32px\n  @media (max-width: 576px)\n    height: 393px\n    width: 100%\n    margin-top: 1.4em\n  @media (max-width: 991px) and (min-width: 577px)\n    width: 15em\n  @media (max-width: 1198px) and (min-width: 992px)\n    height: 393px\n    width: 100%\n    margin-top: 0.5em\n  @media (min-width: 1199px)\n    width: 15em\n\n.heatmap-image\n  border: 1px solid #cac8c8\n  height: 176px\n\n  @media (max-width: 576px)\n    height: 330px\n    width: 100%\n  @media (max-width: 1198px) and (min-width: 991px)\n    height: 100%\n    width: 100%\n\n.first-layer-print-time\n  width:100%\n  display: flex\n  justify-content: space-between\n  padding: 0 1em\n  grid-template-columns: 3% 67% 30%\n  .icon\n    flex: 1\n    display: flex\n    align-items: center\n    justify-content: center\n    opacity: 0.5\n  .name\n    flex: 12\n    @media (max-width: 768px)\n      flex: 15\n  .status\n    display: flex\n    justify-content: flex-end\n.first-layer-grade\n  width:100%\n  display: flex\n  justify-content: space-between\n  align-items: center\n  padding: 0 1em\n  .icon\n    flex: 1\n    display: flex\n    align-items: center\n    justify-content: center\n    opacity: 0.5\n  .name\n    flex: 7\n    @media (max-width: 768px)\n      flex: 11\n  .status\n    display: flex\n    justify-content: flex-end\n\n.print-info\n  display: flex\n  flex-direction: column\n  gap: var(--gap-between-blocks)\n\n.print-details\n  overflow: hidden\n  display: flex\n  flex-direction: column\n  gap: 10px\n  .navigation-container\n    display: flex\n    justify-content: space-between\n    align-items: center\n    gap: 1rem\n    margin: -1.5em\n    margin-bottom: .5em\n    padding: 1em 1.5em\n    background-color: var(--color-surface-primary)\n    .btn\n      flex-shrink: 0\n    .summary\n      text-align: center\n      @media (max-width: 576px)\n        display: none\n  .info-line\n    display: flex\n    align-items: center\n    justify-content: space-between\n    margin-bottm: 6px\n    padding: 6px 0\n    gap: .5rem\n    border-top: 1px solid var(--color-divider-muted)\n    &:first-of-type\n      border-top: none\n    .label\n      display: flex\n      align-items: center\n      flex: 1\n      gap: .5rem\n      line-height: 1.1\n      .icon\n        opacity: .5\n        width: 1rem\n        text-align: center\n    .value\n      font-weight: bold\n\n.first-layer-info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &:first-of-type\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      opacity: .5\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.printer\n  display: flex\n  align-items: center\n  gap: .7rem\n  margin-bottom: var(--gap-between-blocks)\n  .title\n    font-weight: bold\n  .info\n    flex: 1\n  .icon\n    flex: 0 0 2rem\n    text-align: center\n    *\n      font-size: 2rem\n\n.time-lapse\n  .title\n    font-size: 1.5rem\n    font-weight: normal\n    margin-bottom: 1rem\n  ::v-deep\n    .card\n      border-radius: var(--border-radius-lg)\n      border: none\n      background-color: var(--color-surface-secondary)\n    .nav-pills .nav-link\n      border-radius: var(--border-radius-sm)\n    .nav-pills .nav-link.active\n      background-color: var(--color-surface-primary)\n    .card-header\n      border-bottom: 1px solid var(--color-divider-muted)\n\n.video-wrapper\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n\n  ::v-deep .video-js\n    height: 500px !important\n\n  ::v-deep video:focus-visible\n    outline: none !important\n    box-shadow: none !important\n    border: none !important\n\n.detective-footer\n  margin-top: 30px\n\n.feedback-section\n  margin-top: 30px\n  text-align: center\n\n.about-feedback\n  max-width: 600px\n  display: inline-block\n  margin-top: 30px\n\n.detective-placeholder\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n\n.first-layer-video-wrapper.is-fullscreen\n  flex: 1\n  order: 1\n  ::v-deep .video-js\n    height: 100vh !important\n\n.is-fullscreen\n  position: fixed\n  top: 0\n  left: 0\n  bottom: 0\n  right: 0\n  z-index: 9999\n  background-color: var(--color-background)\n  padding: 1rem\n  display: flex\n\n  .video-wrapper\n    flex: 1\n    order: 1\n    ::v-deep .video-js\n      height: calc(100vh - 2rem) !important\n\n  .detective-footer\n    flex: 0 0 200px\n    padding: 0 1rem\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: relative\n\n  @media (max-width: 996px)\n    flex-direction: column\n\n    .video-wrapper\n      order: 0\n      flex: 0 0 400px\n      ::v-deep .video-js\n        height: 400px !important\n\n    .detective-footer\n      flex: 1\n      .feedback-section\n        display: none\n\n  &.original\n    padding: 0\n\n    .video-wrapper\n      flex: 1 !important\n      border-radius: 0\n      ::v-deep .video-js\n        height: 100vh !important\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintPage.vue?vue&type=template&id=3b8e9439&scoped=true&\"\nimport script from \"./PrintPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintPage.vue?vue&type=style&index=0&id=3b8e9439&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3b8e9439\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.isEnt)?_c('a',{staticClass:\"btn shadow-none action-btn icon-btn hours-btn\",style:({ marginRight: `${String(_vm.dhBadgeNum).length * 0.25}rem` }),attrs:{\"href\":\"/user_preferences/dh/\",\"title\":_vm.dhBadgeNum + ' ' + _vm.$t('AI Detection Hours')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-glass\"}})]),_c('span',{staticClass:\"badge badge-light\",attrs:{\"id\":\"user-credits\"}},[_vm._v(_vm._s(_vm.dhBadgeNum))]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours\")))])]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":\"Sort By\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":\"Filter\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('filtering-dropdown',{attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.mobileMenuOptions},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"filtering\",fn:function(){return [_c('filtering-dropdown',{attrs:{\"local-storage-prefix\":_vm.filterLocalStoragePrefix,\"filter-options\":_vm.filterOptions,\"filter-values\":_vm.filterValues},on:{\"onFilterUpdated\":_vm.onFilterUpdated}})]},proxy:true}])})],1)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('active-filter-notice',{attrs:{\"filter-values\":_vm.filterValues},on:{\"onShowAllClicked\":_vm.resetFilters}}),_c('b-container',{staticClass:\"printer-list-page\"},[(_vm.loading)?_c('b-row',[_c('b-col',{staticClass:\"text-center\"},[_c('b-spinner',{staticClass:\"my-5\",attrs:{\"label\":\"Loading...\"}})],1)],1):_vm._e(),(_vm.visiblePrinters.length)?_c('b-row',{staticClass:\"printer-cards justify-content-center\"},_vm._l((_vm.visiblePrinters),function(printer){return _c('printer-card',{key:printer.id,staticClass:\"printer-card-wrapper\",attrs:{\"printer\":printer,\"is-pro-account\":_vm.user.is_pro},on:{\"PrinterUpdated\":_vm.onPrinterUpdated}})}),1):_vm._e(),(!_vm.loading)?_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6\",attrs:{\"id\":\"new-printer\"}},[_c('div',{staticClass:\"new-printer-container\"},[_c('a',{attrs:{\"href\":\"/printers/wizard/\"}},[_c('svg',{staticClass:\"icon\"},[_c('use',{attrs:{\"href\":\"#svg-add-printer\"}})]),_c('div',[_vm._v(_vm._s(_vm.$t(\"Link New Printer\")))])])])])]):_vm._e(),(!_vm.loading)?_c('b-row',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.shouldShowArchiveWarning),expression:\"shouldShowArchiveWarning\"}],staticClass:\"bottom-messages\"},[_c('b-col',[_c('div',{staticClass:\"alert alert-warning alert-dismissible fade show mb-3\",attrs:{\"role\":\"alert\"}},[_c('div',{staticClass:\"warning\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.archivedPrinterNum)+\" \"+_vm._s(_vm._f(\"pluralize\")('printer',_vm.archivedPrinterNum))+\" \"+_vm._s(_vm.$t(\"have been archived.\"))+\" \")]),_c('div',[_c('a',{staticClass:\"warning-action\",attrs:{\"href\":\"/ent/printers/archived/\"}},[_vm._v(_vm._s(_vm.$t(\"Show Archived Printers\")))]),_c('a',{staticClass:\"warning-action\",on:{\"click\":_vm.handleNeverShowAgain}},[_vm._v(_vm._s(_vm.$t(\"Never Show Again\")))])])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"data-dismiss\":\"alert\",\"aria-label\":\"Close\"}},[_c('span',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"×\")])])])])],1):_vm._e()],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-sm-12 col-lg-6 printer-card\",attrs:{\"id\":_vm.printer.id}},[_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_c('div',{staticClass:\"title-box\"},[_c('div',{staticClass:\"printer-name\"},[_vm._v(\" \"+_vm._s(_vm.printer.name)+\" \")]),(_vm.hasCurrentPrintFilename)?_c('div',{staticClass:\"secondary-title print-filename\"},[_vm._v(\" \"+_vm._s(_vm.printer.current_print.filename)+\" \")]):_c('div',{staticClass:\"secondary-title\",class:_vm.statusClass},[_vm._v(_vm._s(_vm.statusText))])]),_c('div',{staticClass:\"d-flex ml-2\"},[_c('b-button',{staticClass:\"px-4 mr-2\",attrs:{\"variant\":\"outline-secondary\",\"href\":`/printers/${_vm.printer.id}/control/`}},[_vm._v(_vm._s(_vm.$t(\"Open\"))+\" \"+_vm._s(_vm.$t(\"Details\"))+\" \")]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('b-dropdown-item',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onSharePrinter()}}},[_c('i',{staticClass:\"fas fa-share-alt fa-lg\"}),_vm._v(_vm._s(_vm.$t(\"Share\"))+\" \")]),_c('b-dropdown-item',{attrs:{\"href\":_vm.octoPrintTunnelUrl()}},[_c('svg',{staticClass:\"menu-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_vm._v(\" \"+_vm._s(_vm.printer.agentDisplayName())+\" \"+_vm._s(_vm.$t(\"Tunnel\"))+\" \")]),_c('div',{staticClass:\"dropdown-divider\"}),_c('b-dropdown-item',{attrs:{\"href\":_vm.settingsUrl()}},[_c('i',{staticClass:\"fas fa-wrench fa-lg\"}),_vm._v(_vm._s(_vm.$t(\"Configure\"))+\" \")])],1)],1)]),_c('div',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.webrtc,\"autoplay\":_vm.isProAccount,\"webcam\":_vm.webcam}})],1)]),(_vm.printer.alertUnacknowledged())?_c('div',{staticClass:\"failure-alert card-body bg-warning px-2 py-1\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle align-middle\"}),_c('span',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detected!\")))]),_c('button',{staticClass:\"btn btn-outline-primary btn-sm float-right\",attrs:{\"id\":\"not-a-failure\",\"type\":\"button\"},on:{\"click\":function($event){return _vm.onNotAFailureClicked($event, false)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Not a failure?\"))+\" \")])]):_vm._e(),_c('div',{staticClass:\"card-body gauge-container\",class:{ overlay: !_vm.isWatching }},[(!_vm.isWatching)?_c('div',{staticClass:\"overlay-top text-center\",staticStyle:{\"left\":\"0\",\"width\":\"100%\",\"top\":\"50%\",\"margin-top\":\"-55px\"}},[_c('H1',[_c('i',{staticClass:\"far fa-eye-slash\"})]),_c('h5',{staticClass:\"text-warning\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detection is Off\")))]),(_vm.printer.not_watching_reason)?_c('small',[_vm._v(_vm._s(_vm.printer.not_watching_reason)+\". \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/detective-not-watching/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn more. \"))),_vm._m(0)])]):_vm._e(),_c('div')],1):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.printer.normalized_p,\"is-watching\":_vm.isWatching}}),_c('hr')],1),_c('print-job-control-widget',{attrs:{\"inside-card\":true,\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm},on:{\"notAFailureClicked\":_vm.onNotAFailureClicked,\"sendPrinterAction\":_vm.sendPrinterAction}}),_c('div',{staticClass:\"info-section settings\"},[_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.settings },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onSettingsToggleClicked()}}},[_c('i',{staticClass:\"fas fa-cog fa-lg\"})]),_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.time },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onTimeToggleClicked()}}},[_c('i',{staticClass:\"fas fa-clock fa-lg\"})]),_c('button',{staticClass:\"info-section-toggle btn btn-sm no-corner mx-2\",class:{ pressed: _vm.section_toggles.statusTemp },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.onStatusTempToggleClicked()}}},[_c('i',{staticClass:\"fas fa-thermometer-half fa-lg\"})])]),_c('div',{staticClass:\"info-section\",staticStyle:{\"height\":\"0.3rem\"}}),_c('div',[_c('div',{staticClass:\"info-section container\"},[(_vm.section_toggles.settings)?_c('div',{attrs:{\"id\":\"panel-settings\"}},[_c('div',{staticClass:\"pt-2 pb-3\"},[_c('div',{staticClass:\"row justify-content-center px-3\"},[_c('div',{staticClass:\"col-12 setting-item\"},[_c('label',{staticClass:\"toggle-label\",attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}},[_c('i18next',{attrs:{\"translation\":_vm.$t('Enable AI failure detection {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [(!_vm.watchForFailures)?_c('div',{staticClass:\"text-muted font-weight-light font-size-sm\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI failure detection is disabled. You are on your own\"))+\".\")]):_vm._e()]},proxy:true}],null,false,2325561323)})],1),_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'watching_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"watching_enabled\"},domProps:{\"checked\":_vm.watchForFailures},on:{\"click\":_vm.onWatchForFailuresToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}})])])]),_c('div',{staticClass:\"row justify-content-center px-3\"},[_c('div',{staticClass:\"col-12 setting-item\"},[_c('label',{staticClass:\"toggle-label\",attrs:{\"for\":'pause-toggle-' + _vm.printer.id}},[_c('i18next',{attrs:{\"translation\":_vm.$t('Pause on detected failures {localizedDom}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [(!_vm.pauseOnFailure)?_c('div',{staticClass:\"text-muted font-weight-light font-size-sm\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will still be alerted via notifications\")))]):_vm._e()]},proxy:true}],null,false,4050608119)})],1),_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'pause-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":_vm.pauseOnFailure},on:{\"click\":_vm.onPauseOnFailureToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'pause-toggle-' + _vm.printer.id}})])])])])]):_vm._e(),(_vm.section_toggles.time)?_c('div',{attrs:{\"id\":\"print-time\"}},[_c('div',{staticClass:\"py-2\"},[_c('div',{staticClass:\"row text-muted\"},[_c('small',{staticClass:\"col-5 offset-2\"},[_vm._v(_vm._s(_vm.$t(\" Remaining \")))]),_c('small',{staticClass:\"col-5\"},[_vm._v(_vm._s(_vm.$t(\" Total \")))])]),_c('div',{staticClass:\"row\"},[_vm._m(1),_c('duration-block',_vm._b({staticClass:\"col-5 numbers\",attrs:{\"id\":\"print-time-remaining\"}},'duration-block',_vm.timeRemaining,false)),_c('duration-block',_vm._b({staticClass:\"col-5 numbers\",attrs:{\"id\":\"print-time-total\"}},'duration-block',_vm.timeTotal,false)),_c('div',{staticClass:\"col-12\"},[_c('div',{staticClass:\"progress\",staticStyle:{\"height\":\"2px\"}},[_c('div',{staticClass:\"progress-bar\",class:{\n                      'progress-bar-striped': _vm.progressPct < 100,\n                      'progress-bar-animated': _vm.progressPct < 100,\n                    },style:(`width: ${_vm.progressPct}%;`),attrs:{\"id\":\"print-progress\",\"role\":\"progressbar\",\"aria-valuenow\":\"0\",\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}})])])],1)])]):_vm._e(),(_vm.section_toggles.statusTemp && _vm.tempProps.show)?_c('status-temp',_vm._b({attrs:{\"id\":\"status_temp_block\"},on:{\"TempEditClicked\":_vm.onTempEditClicked}},'status-temp',_vm.tempProps,false)):_vm._e()],1)])],1)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-2 text-muted\"},[_c('i',{staticClass:\"fas fa-clock\"})])\n}]\n\nexport { render, staticRenderFns }","/*\n  The MIT License (MIT)\n\n  Copyright (c) 2016 Meetecho\n\n  Permission is hereby granted, free of charge, to any person obtaining\n  a copy of this software and associated documentation files (the \"Software\"),\n  to deal in the Software without restriction, including without limitation\n  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n  and/or sell copies of the Software, and to permit persons to whom the\n  Software is furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n  OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* eslint-disable no-global-assign, no-redeclare, no-unused-vars, no-empty, no-inner-declarations */\n\nimport adapter from 'webrtc-adapter'\n\n// List of sessions\nJanus.sessions = {}\n\nJanus.isExtensionEnabled = function() {\n  if(navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {\n    // No need for the extension, getDisplayMedia is supported\n    return true\n  }\n  if(window.navigator.userAgent.match('Chrome')) {\n    var chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10)\n    var maxver = 33\n    if(window.navigator.userAgent.match('Linux'))\n      maxver = 35 // \"known\" crash in chrome 34 and 35 on linux\n    if(chromever >= 26 && chromever <= maxver) {\n      // Older versions of Chrome don't support this extension-based approach, so lie\n      return true\n    }\n    return Janus.extension.isInstalled()\n  } else {\n    // Firefox and others, no need for the extension (but this doesn't mean it will work)\n    return true\n  }\n}\n\nvar defaultExtension = {\n  // Screensharing Chrome Extension ID\n  extensionId: 'hapfgfdkleiggjjpfpenajgdnfckjpaj',\n  isInstalled: function() { return document.querySelector('#janus-extension-installed') !== null },\n  getScreen: function (callback) {\n    var pending = window.setTimeout(function () {\n      var error = new Error('NavigatorUserMediaError')\n      error.name = 'The required Chrome extension is not installed: click <a href=\"#\">here</a> to install it. (NOTE: this will need you to refresh the page)'\n      return callback(error)\n    }, 1000)\n    this.cache[pending] = callback\n    window.postMessage({ type: 'janusGetScreen', id: pending }, '*')\n  },\n  init: function () {\n    var cache = {}\n    this.cache = cache\n    // Wait for events from the Chrome Extension\n    window.addEventListener('message', function (event) {\n      if(event.origin != window.location.origin)\n        return\n      if(event.data.type == 'janusGotScreen' && cache[event.data.id]) {\n        var callback = cache[event.data.id]\n        delete cache[event.data.id]\n\n        if (event.data.sourceId === '') {\n          // user canceled\n          var error = new Error('NavigatorUserMediaError')\n          error.name = 'You cancelled the request for permission, giving up...'\n          callback(error)\n        } else {\n          callback(null, event.data.sourceId)\n        }\n      } else if (event.data.type == 'janusGetScreenPending') {\n        console.log('clearing ', event.data.id)\n        window.clearTimeout(event.data.id)\n      }\n    })\n  }\n}\n\nJanus.useDefaultDependencies = function (deps) {\n  var f = (deps && deps.fetch) || fetch\n  var p = (deps && deps.Promise) || Promise\n  var socketCls = (deps && deps.WebSocket) || WebSocket\n\n  return {\n    newWebSocket: function(server, proto) { return new socketCls(server, proto) },\n    extension: (deps && deps.extension) || defaultExtension,\n    isArray: function(arr) { return Array.isArray(arr) },\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function(url, options) {\n      var fetchOptions = {\n        method: options.verb,\n        headers: {\n          'Accept': 'application/json, text/plain, */*'\n        },\n        cache: 'no-cache'\n      }\n      if(options.verb === 'POST') {\n        fetchOptions.headers['Content-Type'] = 'application/json'\n      }\n      if(options.withCredentials !== undefined) {\n        fetchOptions.credentials = options.withCredentials === true ? 'include' : (options.withCredentials ? options.withCredentials : 'omit')\n      }\n      if(options.body) {\n        fetchOptions.body = JSON.stringify(options.body)\n      }\n\n      var fetching = f(url, fetchOptions).catch(function(error) {\n        return p.reject({message: 'Probably a network error, is the server down?', error: error})\n      })\n\n      /*\n       * fetch() does not natively support timeouts.\n       * Work around this by starting a timeout manually, and racing it agains the fetch() to see which thing resolves first.\n       */\n\n      if(options.timeout) {\n        var timeout = new p(function(resolve, reject) {\n          var timerId = setTimeout(function() {\n            clearTimeout(timerId)\n            return reject({message: 'Request timed out', timeout: options.timeout})\n          }, options.timeout)\n        })\n        fetching = p.race([fetching, timeout])\n      }\n\n      fetching.then(function(response) {\n        if(response.ok) {\n          if(typeof(options.success) === typeof(Janus.noop)) {\n            return response.json().then(function(parsed) {\n              try {\n                options.success(parsed)\n              } catch(error) {\n                Janus.error('Unhandled httpAPICall success callback error', error)\n              }\n            }, function(error) {\n              return p.reject({message: 'Failed to parse response body', error: error, response: response})\n            })\n          }\n        }\n        else {\n          return p.reject({message: 'API call failed', response: response})\n        }\n      }).catch(function(error) {\n        if(typeof(options.error) === typeof(Janus.noop)) {\n          options.error(error.message || '<< internal error >>', error)\n        }\n      })\n\n      return fetching\n    }\n  }\n}\n\nJanus.useOldDependencies = function (deps) {\n  var jq = (deps && deps.jQuery) || jQuery // eslint-disable-line no-undef\n  var socketCls = (deps && deps.WebSocket) || WebSocket\n  return {\n    newWebSocket: function(server, proto) { return new socketCls(server, proto) },\n    isArray: function(arr) { return jq.isArray(arr) },\n    extension: (deps && deps.extension) || defaultExtension,\n    webRTCAdapter: (deps && deps.adapter) || adapter,\n    httpAPICall: function(url, options) {\n      var payload = options.body !== undefined ? {\n        contentType: 'application/json',\n        data: JSON.stringify(options.body)\n      } : {}\n      var credentials = options.withCredentials !== undefined ? {xhrFields: {withCredentials: options.withCredentials}} : {}\n\n      return jq.ajax(jq.extend(payload, credentials, {\n        url: url,\n        type: options.verb,\n        cache: false,\n        dataType: 'json',\n        async: options.async,\n        timeout: options.timeout,\n        success: function(result) {\n          if(typeof(options.success) === typeof(Janus.noop)) {\n            options.success(result)\n          }\n        },\n        error: function(xhr, status, err) {\n          if(typeof(options.error) === typeof(Janus.noop)) {\n            options.error(status, err)\n          }\n        }\n      }))\n    }\n  }\n}\n\nJanus.noop = function() {}\n\nJanus.dataChanDefaultLabel = 'JanusDataChannel'\n\n// Note: in the future we may want to change this, e.g., as was\n// attempted in https://github.com/meetecho/janus-gateway/issues/1670\nJanus.endOfCandidates = null\n\n// Stop all tracks from a given stream\nJanus.stopAllTracks = function(stream) {\n  try {\n    // Try a MediaStreamTrack.stop() for each track\n    var tracks = stream.getTracks()\n    for(var mst of tracks) {\n      Janus.log(mst)\n      if(mst) {\n        mst.stop()\n      }\n    }\n  } catch(e) {\n    // Do nothing if this fails\n  }\n}\n\n// Initialization\nJanus.init = function(options) {\n  options = options || {}\n  options.callback = (typeof options.callback == 'function') ? options.callback : Janus.noop\n  if(Janus.initDone) {\n    // Already initialized\n    options.callback()\n  } else {\n    if(typeof console == 'undefined' || typeof console.log == 'undefined') {\n      console = { log: function() {} }\n    }\n    // Console logging (all debugging disabled by default)\n    Janus.trace = Janus.noop\n    Janus.debug = Janus.noop\n    Janus.vdebug = Janus.noop\n    Janus.log = Janus.noop\n    Janus.warn = Janus.noop\n    Janus.error = Janus.noop\n    if(options.debug === true || options.debug === 'all') {\n      // Enable all debugging levels\n      Janus.trace = console.trace.bind(console)\n      Janus.debug = console.debug.bind(console)\n      Janus.vdebug = console.debug.bind(console)\n      Janus.log = console.log.bind(console)\n      Janus.warn = console.warn.bind(console)\n      Janus.error = console.error.bind(console)\n    } else if(Array.isArray(options.debug)) {\n      for(var d of options.debug) {\n        switch(d) {\n        case 'trace':\n          Janus.trace = console.trace.bind(console)\n          break\n        case 'debug':\n          Janus.debug = console.debug.bind(console)\n          break\n        case 'vdebug':\n          Janus.vdebug = console.debug.bind(console)\n          break\n        case 'log':\n          Janus.log = console.log.bind(console)\n          break\n        case 'warn':\n          Janus.warn = console.warn.bind(console)\n          break\n        case 'error':\n          Janus.error = console.error.bind(console)\n          break\n        default:\n          console.error('Unknown debugging option \\'' + d + '\\' (supported: \\'trace\\', \\'debug\\', \\'vdebug\\', \\'log\\', warn\\', \\'error\\')')\n          break\n        }\n      }\n    }\n    Janus.log('Initializing library')\n\n    var usedDependencies = options.dependencies || Janus.useDefaultDependencies()\n    Janus.isArray = usedDependencies.isArray\n    Janus.webRTCAdapter = usedDependencies.webRTCAdapter\n    Janus.httpAPICall = usedDependencies.httpAPICall\n    Janus.newWebSocket = usedDependencies.newWebSocket\n    Janus.extension = usedDependencies.extension\n    Janus.extension.init()\n\n    // Helper method to enumerate devices\n    Janus.listDevices = function(callback, config) {\n      callback = (typeof callback == 'function') ? callback : Janus.noop\n      if (config == null) config = { audio: true, video: true }\n      if(Janus.isGetUserMediaAvailable()) {\n        navigator.mediaDevices.getUserMedia(config)\n          .then(function(stream) {\n            navigator.mediaDevices.enumerateDevices().then(function(devices) {\n              Janus.debug(devices)\n              callback(devices)\n              // Get rid of the now useless stream\n              Janus.stopAllTracks(stream)\n            })\n          })\n          .catch(function(err) {\n            Janus.error(err)\n            callback([])\n          })\n      } else {\n        Janus.warn('navigator.mediaDevices unavailable')\n        callback([])\n      }\n    }\n    // Helper methods to attach/reattach a stream to a video element (previously part of adapter.js)\n    Janus.attachMediaStream = function(element, stream) {\n      try {\n        element.srcObject = stream\n      } catch (e) {\n        try {\n          element.src = URL.createObjectURL(stream)\n        } catch (e) {\n          Janus.error('Error attaching stream to element')\n        }\n      }\n    }\n    Janus.reattachMediaStream = function(to, from) {\n      try {\n        to.srcObject = from.srcObject\n      } catch (e) {\n        try {\n          to.src = from.src\n        } catch (e) {\n          Janus.error('Error reattaching stream to element')\n        }\n      }\n    }\n    // Detect tab close: make sure we don't loose existing onbeforeunload handlers\n    // (note: for iOS we need to subscribe to a different event, 'pagehide', see\n    // https://gist.github.com/thehunmonkgroup/6bee8941a49b86be31a787fe8f4b8cfe)\n    var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0\n    var eventName = iOS ? 'pagehide' : 'beforeunload'\n    var oldOBF = window['on' + eventName]\n    window.addEventListener(eventName, function(event) {\n      Janus.log('Closing window')\n      for(var s in Janus.sessions) {\n        if(Janus.sessions[s] && Janus.sessions[s].destroyOnUnload) {\n          Janus.log('Destroying session ' + s)\n          Janus.sessions[s].destroy({unload: true, notifyDestroyed: false})\n        }\n      }\n      if(oldOBF && typeof oldOBF == 'function') {\n        oldOBF()\n      }\n    })\n    // If this is a Safari Technology Preview, check if VP8 is supported\n    Janus.safariVp8 = false\n    if(Janus.webRTCAdapter.browserDetails.browser === 'safari' &&\n        Janus.webRTCAdapter.browserDetails.version >= 605) {\n      // Let's see if RTCRtpSender.getCapabilities() is there\n      if(RTCRtpSender && RTCRtpSender.getCapabilities && RTCRtpSender.getCapabilities('video') &&\n          RTCRtpSender.getCapabilities('video').codecs && RTCRtpSender.getCapabilities('video').codecs.length) {\n        for(var codec of RTCRtpSender.getCapabilities('video').codecs) {\n          if(codec && codec.mimeType && codec.mimeType.toLowerCase() === 'video/vp8') {\n            Janus.safariVp8 = true\n            break\n          }\n        }\n        if(Janus.safariVp8) {\n          Janus.log('This version of Safari supports VP8')\n        } else {\n          Janus.warn('This version of Safari does NOT support VP8: if you\\'re using a Technology Preview, ' +\n            'try enabling the \\'WebRTC VP8 codec\\' setting in the \\'Experimental Features\\' Develop menu')\n        }\n      } else {\n        // We do it in a very ugly way, as there's no alternative...\n        // We create a PeerConnection to see if VP8 is in an offer\n        var testpc = new RTCPeerConnection({})\n        testpc.createOffer({offerToReceiveVideo: true}).then(function(offer) {\n          Janus.safariVp8 = offer.sdp.indexOf('VP8') !== -1\n          if(Janus.safariVp8) {\n            Janus.log('This version of Safari supports VP8')\n          } else {\n            Janus.warn('This version of Safari does NOT support VP8: if you\\'re using a Technology Preview, ' +\n              'try enabling the \\'WebRTC VP8 codec\\' setting in the \\'Experimental Features\\' Develop menu')\n          }\n          testpc.close()\n          testpc = null\n        })\n      }\n    }\n    // Check if this browser supports Unified Plan and transceivers\n    // Based on https://codepen.io/anon/pen/ZqLwWV?editors=0010\n    Janus.unifiedPlan = false\n    if(Janus.webRTCAdapter.browserDetails.browser === 'firefox' &&\n        Janus.webRTCAdapter.browserDetails.version >= 59) {\n      // Firefox definitely does, starting from version 59\n      Janus.unifiedPlan = true\n    } else if(Janus.webRTCAdapter.browserDetails.browser === 'chrome' &&\n        Janus.webRTCAdapter.browserDetails.version >= 72) {\n      // Chrome does, but it's only usable from version 72 on\n      Janus.unifiedPlan = true\n    } else if(!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) { // eslint-disable-line no-undef\n      // Safari supports addTransceiver() but not Unified Plan when\n      // currentDirection is not defined (see codepen above).\n      Janus.unifiedPlan = false\n    } else {\n      // Check if addTransceiver() throws an exception\n      var tempPc = new RTCPeerConnection()\n      try {\n        tempPc.addTransceiver('audio')\n        Janus.unifiedPlan = true\n      } catch (e) {}\n      tempPc.close()\n    }\n    Janus.initDone = true\n    options.callback()\n  }\n}\n\n// Helper method to check whether WebRTC is supported by this browser\nJanus.isWebrtcSupported = function() {\n  return !!window.RTCPeerConnection\n}\n// Helper method to check whether devices can be accessed by this browser (e.g., not possible via plain HTTP)\nJanus.isGetUserMediaAvailable = function() {\n  return navigator.mediaDevices && navigator.mediaDevices.getUserMedia\n}\n\n// Helper method to create random identifiers (e.g., transaction)\nJanus.randomString = function(len) {\n  var charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n  var randomString = ''\n  for (var i = 0; i < len; i++) {\n    var randomPoz = Math.floor(Math.random() * charSet.length)\n    randomString += charSet.substring(randomPoz,randomPoz+1)\n  }\n  return randomString\n}\n\nfunction Janus(gatewayCallbacks) {\n  gatewayCallbacks = gatewayCallbacks || {}\n  gatewayCallbacks.success = (typeof gatewayCallbacks.success == 'function') ? gatewayCallbacks.success : Janus.noop\n  gatewayCallbacks.error = (typeof gatewayCallbacks.error == 'function') ? gatewayCallbacks.error : Janus.noop\n  gatewayCallbacks.wsopened = (typeof gatewayCallbacks.wsopened == 'function') ? gatewayCallbacks.wsopened : Janus.noop\n  gatewayCallbacks.destroyed = (typeof gatewayCallbacks.destroyed == 'function') ? gatewayCallbacks.destroyed : Janus.noop\n  if(!Janus.initDone) {\n    gatewayCallbacks.error('Library not initialized')\n    return {}\n  }\n  if(!Janus.isWebrtcSupported()) {\n    gatewayCallbacks.error('WebRTC not supported by this browser')\n    return {}\n  }\n  Janus.log('Library initialized: ' + Janus.initDone)\n  if(!gatewayCallbacks.server) {\n    gatewayCallbacks.error('Invalid server url')\n    return {}\n  }\n  var websockets = false\n  var ws = null\n  var wsHandlers = {}\n  var wsKeepaliveTimeoutId = null\n  var servers = null\n  var serversIndex = 0\n  var server = gatewayCallbacks.server\n  if(Janus.isArray(server)) {\n    Janus.log('Multiple servers provided (' + server.length + '), will use the first that works')\n    server = null\n    servers = gatewayCallbacks.server\n    Janus.debug(servers)\n  } else {\n    if(server.indexOf('ws') === 0) {\n      websockets = true\n      Janus.log('Using WebSockets to contact Janus: ' + server)\n    } else {\n      websockets = false\n      Janus.log('Using REST API to contact Janus: ' + server)\n    }\n  }\n  var iceServers = gatewayCallbacks.iceServers || [{urls: 'stun:stun.l.google.com:19302'}]\n  var iceTransportPolicy = gatewayCallbacks.iceTransportPolicy\n  var bundlePolicy = gatewayCallbacks.bundlePolicy\n  // Whether IPv6 candidates should be gathered\n  var ipv6Support = (gatewayCallbacks.ipv6 === true)\n  // Whether we should enable the withCredentials flag for XHR requests\n  var withCredentials = false\n  if(gatewayCallbacks.withCredentials !== undefined && gatewayCallbacks.withCredentials !== null)\n    withCredentials = gatewayCallbacks.withCredentials === true\n  // Optional max events\n  var maxev = 10\n  if(gatewayCallbacks.max_poll_events !== undefined && gatewayCallbacks.max_poll_events !== null)\n    maxev = gatewayCallbacks.max_poll_events\n  if(maxev < 1)\n    maxev = 1\n  // Token to use (only if the token based authentication mechanism is enabled)\n  var token = null\n  if(gatewayCallbacks.token !== undefined && gatewayCallbacks.token !== null)\n    token = gatewayCallbacks.token\n  // API secret to use (only if the shared API secret is enabled)\n  var apisecret = null\n  if(gatewayCallbacks.apisecret !== undefined && gatewayCallbacks.apisecret !== null)\n    apisecret = gatewayCallbacks.apisecret\n  // Whether we should destroy this session when onbeforeunload is called\n  this.destroyOnUnload = true\n  if(gatewayCallbacks.destroyOnUnload !== undefined && gatewayCallbacks.destroyOnUnload !== null)\n    this.destroyOnUnload = (gatewayCallbacks.destroyOnUnload === true)\n  // Some timeout-related values\n  var keepAlivePeriod = 25000\n  if(gatewayCallbacks.keepAlivePeriod !== undefined && gatewayCallbacks.keepAlivePeriod !== null)\n    keepAlivePeriod = gatewayCallbacks.keepAlivePeriod\n  if(isNaN(keepAlivePeriod))\n    keepAlivePeriod = 25000\n  var longPollTimeout = 60000\n  if(gatewayCallbacks.longPollTimeout !== undefined && gatewayCallbacks.longPollTimeout !== null)\n    longPollTimeout = gatewayCallbacks.longPollTimeout\n  if(isNaN(longPollTimeout))\n    longPollTimeout = 60000\n\n  // overrides for default maxBitrate values for simulcasting\n  function getMaxBitrates(simulcastMaxBitrates) {\n    var maxBitrates = {\n      high: 900000,\n      medium: 300000,\n      low: 100000,\n    }\n\n    if (simulcastMaxBitrates !== undefined && simulcastMaxBitrates !== null) {\n      if (simulcastMaxBitrates.high)\n        maxBitrates.high = simulcastMaxBitrates.high\n      if (simulcastMaxBitrates.medium)\n        maxBitrates.medium = simulcastMaxBitrates.medium\n      if (simulcastMaxBitrates.low)\n        maxBitrates.low = simulcastMaxBitrates.low\n    }\n\n    return maxBitrates\n  }\n\n  var connected = false\n  var sessionId = null\n  var pluginHandles = {}\n  var that = this\n  var retries = 0\n  var transactions = {}\n  createSession(gatewayCallbacks)\n\n  // Public methods\n  this.getServer = function() { return server }\n  this.isConnected = function() { return connected }\n  this.reconnect = function(callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks['reconnect'] = true\n    createSession(callbacks)\n  }\n  this.getSessionId = function() { return sessionId }\n  this.getInfo = function(callbacks) { getInfo(callbacks) }\n  this.destroy = function(callbacks) { destroySession(callbacks) }\n  this.attach = function(callbacks) { createHandle(callbacks) }\n\n  function eventHandler() {\n    if(sessionId == null)\n      return\n    Janus.debug('Long poll...')\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      return\n    }\n    var longpoll = server + '/' + sessionId + '?rid=' + new Date().getTime()\n    if(maxev)\n      longpoll = longpoll + '&maxev=' + maxev\n    if(token)\n      longpoll = longpoll + '&token=' + encodeURIComponent(token)\n    if(apisecret)\n      longpoll = longpoll + '&apisecret=' + encodeURIComponent(apisecret)\n    Janus.httpAPICall(longpoll, {\n      verb: 'GET',\n      withCredentials: withCredentials,\n      success: handleEvent,\n      timeout: longPollTimeout,\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown)\n        retries++\n        if(retries > 3) {\n          // Did we just lose the server? :-(\n          connected = false\n          gatewayCallbacks.error('Lost connection to the server (is it down?)')\n          return\n        }\n        eventHandler()\n      }\n    })\n  }\n\n  // Private event handler: this will trigger plugin callbacks, if set\n  function handleEvent(json, skipTimeout) {\n    retries = 0\n    if(!websockets && sessionId !== undefined && sessionId !== null && skipTimeout !== true)\n      eventHandler()\n    if(!websockets && Janus.isArray(json)) {\n      // We got an array: it means we passed a maxev > 1, iterate on all objects\n      for(var i=0; i<json.length; i++) {\n        handleEvent(json[i], true)\n      }\n      return\n    }\n\n    if (json.session_id && json.session_id !== sessionId) {\n      return\n    }\n\n    if(json['janus'] === 'keepalive') {\n      // Nothing happened\n      Janus.vdebug('Got a keepalive on session ' + sessionId)\n      return\n    } else if(json['janus'] === 'server_info') {\n      // Just info on the Janus instance\n      Janus.debug('Got info on the Janus instance')\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'ack') {\n      // Just an ack, we can probably ignore\n      Janus.debug('Got an ack on session ' + sessionId)\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'success') {\n      // Success!\n      Janus.debug('Got a success on session ' + sessionId)\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess)\n          reportSuccess(json)\n        delete transactions[transaction]\n      }\n      return\n    } else if(json['janus'] === 'trickle') {\n      // We got a trickle candidate from Janus\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      var candidate = json['candidate']\n      Janus.debug('Got a trickled candidate on session ' + sessionId)\n      Janus.debug(candidate)\n      var config = pluginHandle.webrtcStuff\n      if(config.pc && config.remoteSdp) {\n        // Add candidate right now\n        Janus.debug('Adding remote candidate:', candidate)\n        if(!candidate || candidate.completed === true) {\n          // end-of-candidates\n          config.pc.addIceCandidate(Janus.endOfCandidates)\n        } else {\n          // New candidate\n          config.pc.addIceCandidate(candidate)\n        }\n      } else {\n        // We didn't do setRemoteDescription (trickle got here before the offer?)\n        Janus.debug('We didn\\'t do setRemoteDescription (trickle got here before the offer?), caching candidate')\n        if(!config.candidates)\n          config.candidates = []\n        config.candidates.push(candidate)\n        Janus.debug(config.candidates)\n      }\n    } else if(json['janus'] === 'webrtcup') {\n      // The PeerConnection with the server is up! Notify this\n      Janus.debug('Got a webrtcup event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.webrtcState(true)\n      return\n    } else if(json['janus'] === 'hangup') {\n      // A plugin asked the core to hangup a PeerConnection on one of our handles\n      Janus.debug('Got a hangup event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.webrtcState(false, json['reason'])\n      pluginHandle.hangup()\n    } else if(json['janus'] === 'detached') {\n      // A plugin asked the core to detach one of our handles\n      Janus.debug('Got a detached event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        // Don't warn here because destroyHandle causes this situation.\n        return\n      }\n\n      // copied from our prev custom release, possibly a bug fix, maybe no longer necessary.\n      pluginHandle.detached = true\n\n      pluginHandle.ondetached()\n      pluginHandle.detach()\n    } else if(json['janus'] === 'media') {\n      // Media started/stopped flowing\n      Janus.debug('Got a media event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.mediaState(json['type'], json['receiving'])\n    } else if(json['janus'] === 'slowlink') {\n      Janus.debug('Got a slowlink event on session ' + sessionId)\n      Janus.debug(json)\n      // Trouble uplink or downlink\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.debug('This handle is not attached to this session')\n        return\n      }\n      pluginHandle.slowLink(json['uplink'], json['lost'])\n    } else if(json['janus'] === 'error') {\n      // Oops, something wrong happened\n      Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n      Janus.debug(json)\n      var transaction = json['transaction']\n      if(transaction) {\n        var reportSuccess = transactions[transaction]\n        if(reportSuccess) {\n          reportSuccess(json)\n        }\n        delete transactions[transaction]\n      }\n\n      if (json.error.code === 458) {\n        if (websockets) {\n          ws.close(3505, 'No such session')\n        }\n      }\n\n      return\n    } else if(json['janus'] === 'event') {\n      Janus.debug('Got a plugin event on session ' + sessionId)\n      Janus.debug(json)\n      var sender = json['sender']\n      if(!sender) {\n        Janus.warn('Missing sender...')\n        return\n      }\n      var plugindata = json['plugindata']\n      if(!plugindata) {\n        Janus.warn('Missing plugindata...')\n        return\n      }\n      Janus.debug('  -- Event is coming from ' + sender + ' (' + plugindata['plugin'] + ')')\n      var data = plugindata['data']\n      Janus.debug(data)\n      var pluginHandle = pluginHandles[sender]\n      if(!pluginHandle) {\n        Janus.warn('This handle is not attached to this session')\n        return\n      }\n      var jsep = json['jsep']\n      if(jsep) {\n        Janus.debug('Handling SDP as well...')\n        Janus.debug(jsep)\n      }\n      var callback = pluginHandle.onmessage\n      if(callback) {\n        Janus.debug('Notifying application...')\n        // Send to callback specified when attaching plugin handle\n        callback(data, jsep)\n      } else {\n        // Send to generic callback (?)\n        Janus.debug('No provided notification callback')\n      }\n    } else if(json['janus'] === 'timeout') {\n      Janus.error('Timeout on session ' + sessionId)\n      Janus.debug(json)\n      if (websockets) {\n        ws.close(3504, 'Gateway timeout')\n      }\n      return\n    } else {\n      Janus.warn('Unknown message/event  \\'' + json['janus'] + '\\' on session ' + sessionId)\n      Janus.debug(json)\n    }\n  }\n\n  // Private helper to send keep-alive messages on WebSockets\n  function keepAlive() {\n    if(!server || !websockets || !connected)\n      return\n    wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod)\n    var request = { 'janus': 'keepalive', 'session_id': sessionId, 'transaction': Janus.randomString(12) }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    ws.send(JSON.stringify(request))\n  }\n\n  // Private method to create a session\n  function createSession(callbacks) {\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'create', 'transaction': transaction }\n    if(callbacks['reconnect']) {\n      // We're reconnecting, claim the session\n      connected = false\n      request['janus'] = 'claim'\n      request['session_id'] = sessionId\n      // If we were using websockets, ignore the old connection\n      if(ws) {\n        ws.onopen = null\n        ws.onerror = null\n        ws.onclose = null\n        if(wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId)\n          wsKeepaliveTimeoutId = null\n        }\n      }\n    }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(!server && Janus.isArray(servers)) {\n      // We still need to find a working server from the list we were given\n      server = servers[serversIndex]\n      if(server.indexOf('ws') === 0) {\n        websockets = true\n        Janus.log('Server #' + (serversIndex+1) + ': trying WebSockets to contact Janus (' + server + ')')\n      } else {\n        websockets = false\n        Janus.log('Server #' + (serversIndex+1) + ': trying REST API to contact Janus (' + server + ')')\n      }\n    }\n    if(websockets) {\n      ws = Janus.newWebSocket(server, 'janus-protocol')\n      wsHandlers = {\n        'error': function() {\n          Janus.error('Error connecting to the Janus WebSockets server... ' + server)\n          if (Janus.isArray(servers) && !callbacks['reconnect']) {\n            serversIndex++\n            if (serversIndex === servers.length) {\n              // We tried all the servers the user gave us and they all failed\n              callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?')\n              return\n            }\n            // Let's try the next server\n            server = null\n            setTimeout(function() {\n              createSession(callbacks)\n            }, 200)\n            return\n          }\n          callbacks.error('Error connecting to the Janus WebSockets server: Is the server down?')\n        },\n\n        'open': function() {\n          callbacks.wsopened()\n\n          // We need to be notified about the success\n          transactions[transaction] = function(json) {\n            Janus.debug(json)\n            if (json['janus'] !== 'success') {\n              Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n              callbacks.error(json['error'].reason)\n              return\n            }\n            wsKeepaliveTimeoutId = setTimeout(keepAlive, keepAlivePeriod)\n            connected = true\n            sessionId = json['session_id'] ? json['session_id'] : json.data['id']\n            if(callbacks['reconnect']) {\n              Janus.log('Claimed session: ' + sessionId)\n            } else {\n              Janus.log('Created session: ' + sessionId)\n            }\n            Janus.sessions[sessionId] = that\n            callbacks.success()\n          }\n          ws.send(JSON.stringify(request))\n        },\n\n        'message': function(event) {\n          handleEvent(JSON.parse(event.data))\n        },\n\n        'close': function() {\n          if (!server || !connected) {\n            return\n          }\n          connected = false\n          // FIXME What if this is called when the page is closed?\n          gatewayCallbacks.error('Lost connection to the server (is it down?)')\n        }\n      }\n\n      for(var eventName in wsHandlers) {\n        ws.addEventListener(eventName, wsHandlers[eventName])\n      }\n\n      return\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error(json['error'].reason)\n          return\n        }\n        connected = true\n        sessionId = json['session_id'] ? json['session_id'] : json.data['id']\n        if(callbacks['reconnect']) {\n          Janus.log('Claimed session: ' + sessionId)\n        } else {\n          Janus.log('Created session: ' + sessionId)\n        }\n        Janus.sessions[sessionId] = that\n        eventHandler()\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(Janus.isArray(servers) && !callbacks['reconnect']) {\n          serversIndex++\n          if(serversIndex === servers.length) {\n            // We tried all the servers the user gave us and they all failed\n            callbacks.error('Error connecting to any of the provided Janus servers: Is the server down?')\n            return\n          }\n          // Let's try the next server\n          server = null\n          setTimeout(function() { createSession(callbacks) }, 200)\n          return\n        }\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to get info on the server\n  function getInfo(callbacks) {\n    callbacks = callbacks || {}\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    Janus.log('Getting info on Janus instance')\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    // We just need to send an \"info\" request\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'info', 'transaction': transaction }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      transactions[transaction] = function(json) {\n        Janus.log('Server info:')\n        Janus.debug(json)\n        if(json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success(json)\n      }\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Server info:')\n        Janus.debug(json)\n        if(json['janus'] !== 'server_info') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success(json)\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to destroy a session\n  function destroySession(callbacks) {\n    callbacks = callbacks || {}\n    // FIXME This method triggers a success even when we fail\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var unload = (callbacks.unload === true)\n    var notifyDestroyed = true\n    if(callbacks.notifyDestroyed !== undefined && callbacks.notifyDestroyed !== null)\n      notifyDestroyed = (callbacks.notifyDestroyed === true)\n    var cleanupHandles = (callbacks.cleanupHandles === true)\n    Janus.log('Destroying session ' + sessionId + ' (unload=' + unload + ')')\n    if(!sessionId) {\n      Janus.warn('No session to destroy')\n      callbacks.success()\n      if(notifyDestroyed)\n        gatewayCallbacks.destroyed()\n      return\n    }\n    if(cleanupHandles) {\n      for(var handleId in pluginHandles)\n        destroyHandle(handleId, { noRequest: true })\n    }\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      sessionId = null\n      callbacks.success()\n      return\n    }\n    // No need to destroy all handles first, Janus will do that itself\n    var request = { 'janus': 'destroy', 'transaction': Janus.randomString(12) }\n    if(token)\n      request['token'] = token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(unload) {\n      // We're unloading the page: use sendBeacon for HTTP instead,\n      // or just close the WebSocket connection if we're using that\n      if(websockets) {\n        ws.onclose = null\n        ws.close()\n        ws = null\n      } else {\n        navigator.sendBeacon(server + '/' + sessionId, JSON.stringify(request))\n      }\n      Janus.log('Destroyed session:')\n      sessionId = null\n      connected = false\n      callbacks.success()\n      if(notifyDestroyed)\n        gatewayCallbacks.destroyed()\n      return\n    }\n    if(websockets) {\n      request['session_id'] = sessionId\n\n      var unbindWebSocket = function() {\n        for(var eventName in wsHandlers) {\n          ws.removeEventListener(eventName, wsHandlers[eventName])\n        }\n        ws.removeEventListener('message', onUnbindMessage)\n        ws.removeEventListener('error', onUnbindError)\n        if(wsKeepaliveTimeoutId) {\n          clearTimeout(wsKeepaliveTimeoutId)\n        }\n        ws.close()\n      }\n\n      var onUnbindMessage = function(event){\n        var data = JSON.parse(event.data)\n        if(data.session_id == request.session_id && data.transaction == request.transaction) {\n          unbindWebSocket()\n          callbacks.success()\n          if(notifyDestroyed)\n            gatewayCallbacks.destroyed()\n        }\n      }\n      var onUnbindError = function(event) {\n        unbindWebSocket()\n        callbacks.error('Failed to destroy the server: Is the server down?')\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      }\n\n      ws.addEventListener('message', onUnbindMessage)\n      ws.addEventListener('error', onUnbindError)\n\n      if (ws.readyState === 1) {\n        ws.send(JSON.stringify(request))\n      } else {\n        onUnbindError()\n      }\n\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Destroyed session:')\n        Janus.debug(json)\n        sessionId = null\n        connected = false\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        callbacks.success()\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        // Reset everything anyway\n        sessionId = null\n        connected = false\n        callbacks.success()\n        if(notifyDestroyed)\n          gatewayCallbacks.destroyed()\n      }\n    })\n  }\n\n  // Private method to create a plugin handle\n  function createHandle(callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.consentDialog = (typeof callbacks.consentDialog == 'function') ? callbacks.consentDialog : Janus.noop\n    callbacks.iceState = (typeof callbacks.iceState == 'function') ? callbacks.iceState : Janus.noop\n    callbacks.mediaState = (typeof callbacks.mediaState == 'function') ? callbacks.mediaState : Janus.noop\n    callbacks.webrtcState = (typeof callbacks.webrtcState == 'function') ? callbacks.webrtcState : Janus.noop\n    callbacks.slowLink = (typeof callbacks.slowLink == 'function') ? callbacks.slowLink : Janus.noop\n    callbacks.onmessage = (typeof callbacks.onmessage == 'function') ? callbacks.onmessage : Janus.noop\n    callbacks.onlocalstream = (typeof callbacks.onlocalstream == 'function') ? callbacks.onlocalstream : Janus.noop\n    callbacks.onremotestream = (typeof callbacks.onremotestream == 'function') ? callbacks.onremotestream : Janus.noop\n    callbacks.ondata = (typeof callbacks.ondata == 'function') ? callbacks.ondata : Janus.noop\n    callbacks.ondataopen = (typeof callbacks.ondataopen == 'function') ? callbacks.ondataopen : Janus.noop\n    callbacks.oncleanup = (typeof callbacks.oncleanup == 'function') ? callbacks.oncleanup : Janus.noop\n    callbacks.ondetached = (typeof callbacks.ondetached == 'function') ? callbacks.ondetached : Janus.noop\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var plugin = callbacks.plugin\n    if(!plugin) {\n      Janus.error('Invalid plugin')\n      callbacks.error('Invalid plugin')\n      return\n    }\n    var opaqueId = callbacks.opaqueId\n    var handleToken = callbacks.token ? callbacks.token : token\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'attach', 'plugin': plugin, 'opaque_id': opaqueId, 'transaction': transaction }\n    if(handleToken)\n      request['token'] = handleToken\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      transactions[transaction] = function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason)\n          return\n        }\n        var handleId = json.data['id']\n        Janus.log('Created handle: ' + handleId)\n        var pluginHandle =\n          {\n            session : that,\n            plugin : plugin,\n            id : handleId,\n            token : handleToken,\n            detached : false,\n            webrtcStuff : {\n              started : false,\n              myStream : null,\n              streamExternal : false,\n              remoteStream : null,\n              mySdp : null,\n              mediaConstraints : null,\n              pc : null,\n              dataChannel : {},\n              dtmfSender : null,\n              trickle : true,\n              iceDone : false,\n              volume : {\n                value : null,\n                timer : null\n              },\n              bitrate : {\n                value : null,\n                bsnow : null,\n                bsbefore : null,\n                tsnow : null,\n                tsbefore : null,\n                timer : null\n              }\n            },\n            getId : function() { return handleId },\n            getPlugin : function() { return plugin },\n            getVolume : function() { return getVolume(handleId, true) },\n            getRemoteVolume : function() { return getVolume(handleId, true) },\n            getLocalVolume : function() { return getVolume(handleId, false) },\n            isAudioMuted : function() { return isMuted(handleId, false) },\n            muteAudio : function() { return mute(handleId, false, true) },\n            unmuteAudio : function() { return mute(handleId, false, false) },\n            isVideoMuted : function() { return isMuted(handleId, true) },\n            muteVideo : function() { return mute(handleId, true, true) },\n            unmuteVideo : function() { return mute(handleId, true, false) },\n            getBitrate : function() { return getBitrate(handleId) },\n            send : function(callbacks) { sendMessage(handleId, callbacks) },\n            data : function(callbacks) { sendData(handleId, callbacks) },\n            dtmf : function(callbacks) { sendDtmf(handleId, callbacks) },\n            consentDialog : callbacks.consentDialog,\n            iceState : callbacks.iceState,\n            mediaState : callbacks.mediaState,\n            webrtcState : callbacks.webrtcState,\n            slowLink : callbacks.slowLink,\n            onmessage : callbacks.onmessage,\n            createOffer : function(callbacks) { prepareWebrtc(handleId, true, callbacks) },\n            createAnswer : function(callbacks) { prepareWebrtc(handleId, false, callbacks) },\n            handleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks) },\n            onlocalstream : callbacks.onlocalstream,\n            onremotestream : callbacks.onremotestream,\n            ontrackmuted : callbacks.ontrackmuted,\n            ontrackunmuted : callbacks.ontrackunmuted,\n            ondata : callbacks.ondata,\n            ondataopen : callbacks.ondataopen,\n            oncleanup : callbacks.oncleanup,\n            ondetached : callbacks.ondetached,\n            hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true) },\n            detach : function(callbacks) { destroyHandle(handleId, callbacks) }\n          }\n        pluginHandles[handleId] = pluginHandle\n        callbacks.success(pluginHandle)\n      }\n      request['session_id'] = sessionId\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          callbacks.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason)\n          return\n        }\n        var handleId = json.data['id']\n        Janus.log('Created handle: ' + handleId)\n        var pluginHandle =\n          {\n            session : that,\n            plugin : plugin,\n            id : handleId,\n            token : handleToken,\n            detached : false,\n            webrtcStuff : {\n              started : false,\n              myStream : null,\n              streamExternal : false,\n              remoteStream : null,\n              mySdp : null,\n              mediaConstraints : null,\n              pc : null,\n              dataChannel : {},\n              dtmfSender : null,\n              trickle : true,\n              iceDone : false,\n              volume : {\n                value : null,\n                timer : null\n              },\n              bitrate : {\n                value : null,\n                bsnow : null,\n                bsbefore : null,\n                tsnow : null,\n                tsbefore : null,\n                timer : null\n              }\n            },\n            getId : function() { return handleId },\n            getPlugin : function() { return plugin },\n            getVolume : function() { return getVolume(handleId, true) },\n            getRemoteVolume : function() { return getVolume(handleId, true) },\n            getLocalVolume : function() { return getVolume(handleId, false) },\n            isAudioMuted : function() { return isMuted(handleId, false) },\n            muteAudio : function() { return mute(handleId, false, true) },\n            unmuteAudio : function() { return mute(handleId, false, false) },\n            isVideoMuted : function() { return isMuted(handleId, true) },\n            muteVideo : function() { return mute(handleId, true, true) },\n            unmuteVideo : function() { return mute(handleId, true, false) },\n            getBitrate : function() { return getBitrate(handleId) },\n            send : function(callbacks) { sendMessage(handleId, callbacks) },\n            data : function(callbacks) { sendData(handleId, callbacks) },\n            dtmf : function(callbacks) { sendDtmf(handleId, callbacks) },\n            consentDialog : callbacks.consentDialog,\n            iceState : callbacks.iceState,\n            mediaState : callbacks.mediaState,\n            webrtcState : callbacks.webrtcState,\n            slowLink : callbacks.slowLink,\n            onmessage : callbacks.onmessage,\n            createOffer : function(callbacks) { prepareWebrtc(handleId, true, callbacks) },\n            createAnswer : function(callbacks) { prepareWebrtc(handleId, false, callbacks) },\n            handleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks) },\n            onlocalstream : callbacks.onlocalstream,\n            onremotestream : callbacks.onremotestream,\n            ontrackmuted : callbacks.ontrackmuted,\n            ontrackunmuted : callbacks.ontrackunmuted,\n            ondata : callbacks.ondata,\n            ondataopen : callbacks.ondataopen,\n            oncleanup : callbacks.oncleanup,\n            ondetached : callbacks.ondetached,\n            hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true) },\n            detach : function(callbacks) { destroyHandle(handleId, callbacks) }\n          }\n        pluginHandles[handleId] = pluginHandle\n        callbacks.success(pluginHandle)\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        if(errorThrown === '')\n          callbacks.error(textStatus + ': Is the server down?')\n        else\n          callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to send a message\n  function sendMessage(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var message = callbacks.message\n    var jsep = callbacks.jsep\n    var transaction = Janus.randomString(12)\n    var request = { 'janus': 'message', 'body': message, 'transaction': transaction }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(jsep) {\n      request.jsep = {\n        type: jsep.type,\n        sdp: jsep.sdp\n      }\n      if(jsep.e2ee)\n        request.jsep.e2ee = true\n      if(jsep.rid_order === 'hml' || jsep.rid_order === 'lmh')\n        request.jsep.rid_order = jsep.rid_order\n    }\n    Janus.debug('Sending message to plugin (handle=' + handleId + '):')\n    Janus.debug(request)\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      transactions[transaction] = function(json) {\n        Janus.debug('Message sent!')\n        Janus.debug(json)\n        if(json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          var plugindata = json['plugindata']\n          if(!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...')\n            callbacks.success()\n            return\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')')\n          var data = plugindata['data']\n          Janus.debug(data)\n          callbacks.success(data)\n          return\n        } else if(json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if(json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason)\n          } else {\n            Janus.error('Unknown error') // FIXME\n            callbacks.error('Unknown error')\n          }\n          return\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success()\n      }\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.debug('Message sent!')\n        Janus.debug(json)\n        if(json['janus'] === 'success') {\n          // We got a success, must have been a synchronous transaction\n          var plugindata = json['plugindata']\n          if(!plugindata) {\n            Janus.warn('Request succeeded, but missing plugindata...')\n            callbacks.success()\n            return\n          }\n          Janus.log('Synchronous transaction successful (' + plugindata['plugin'] + ')')\n          var data = plugindata['data']\n          Janus.debug(data)\n          callbacks.success(data)\n          return\n        } else if(json['janus'] !== 'ack') {\n          // Not a success and not an ack, must be an error\n          if(json['error']) {\n            Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n            callbacks.error(json['error'].code + ' ' + json['error'].reason)\n          } else {\n            Janus.error('Unknown error') // FIXME\n            callbacks.error('Unknown error')\n          }\n          return\n        }\n        // If we got here, the plugin decided to handle the request asynchronously\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        callbacks.error(textStatus + ': ' + errorThrown)\n      }\n    })\n  }\n\n  // Private method to send a trickle candidate\n  function sendTrickleCandidate(handleId, candidate) {\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      return\n    }\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return\n    }\n    var request = { 'janus': 'trickle', 'candidate': candidate, 'transaction': Janus.randomString(12) }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    Janus.vdebug('Sending trickle candidate (handle=' + handleId + '):')\n    Janus.vdebug(request)\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      ws.send(JSON.stringify(request))\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.vdebug('Candidate sent!')\n        Janus.vdebug(json)\n        if(json['janus'] !== 'ack') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n          return\n        }\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n      }\n    })\n  }\n\n  // Private method to create a data channel\n  function createDataChannel(handleId, dclabel, dcprotocol, incoming, pendingData) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return\n    }\n    var onDataChannelMessage = function(event) {\n      var label = event.target.label\n      pluginHandle.ondata(event.data, label)\n    }\n    var onDataChannelStateChange = function(event) {\n      Janus.log('Received state change on data channel:', event)\n      var label = event.target.label\n      var protocol = event.target.protocol\n      var dcState = config.dataChannel[label] ? config.dataChannel[label].readyState : 'null'\n      Janus.log('State change on <' + label + '> data channel: ' + dcState)\n      if(dcState === 'open') {\n        // Any pending messages to send?\n        if(config.dataChannel[label].pending && config.dataChannel[label].pending.length > 0) {\n          Janus.log('Sending pending messages on <' + label + '>:', config.dataChannel[label].pending.length)\n          for(var data of config.dataChannel[label].pending) {\n            Janus.log('Sending data on data channel <' + label + '>')\n            Janus.debug(data)\n            config.dataChannel[label].send(data)\n          }\n          config.dataChannel[label].pending = []\n        }\n        // Notify the open data channel\n        pluginHandle.ondataopen(label, protocol)\n      }\n    }\n    var onDataChannelError = function(error) {\n      Janus.error('Got error on data channel:', error)\n      // TODO\n    }\n    if(!incoming) {\n      // FIXME Add options (ordered, maxRetransmits, etc.)\n      var dcoptions = { ordered: true }\n      if(dcprotocol)\n        dcoptions.protocol = dcprotocol\n      config.dataChannel[dclabel] = config.pc.createDataChannel(dclabel, dcoptions)\n    } else {\n      // The channel was created by Janus\n      config.dataChannel[dclabel] = incoming\n    }\n    config.dataChannel[dclabel].onmessage = onDataChannelMessage\n    config.dataChannel[dclabel].onopen = onDataChannelStateChange\n    config.dataChannel[dclabel].onclose = onDataChannelStateChange\n    config.dataChannel[dclabel].onerror = onDataChannelError\n    config.dataChannel[dclabel].pending = []\n    if(pendingData)\n      config.dataChannel[dclabel].pending.push(pendingData)\n  }\n\n  // Private method to send a data channel message\n  function sendData(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var data = callbacks.text || callbacks.data\n    if(!data) {\n      Janus.warn('Invalid data')\n      callbacks.error('Invalid data')\n      return\n    }\n    var label = callbacks.label ? callbacks.label : Janus.dataChanDefaultLabel\n    if(!config.dataChannel[label]) {\n      // Create new data channel and wait for it to open\n      createDataChannel(handleId, label, callbacks.protocol, false, data, callbacks.protocol)\n      callbacks.success()\n      return\n    }\n    if(config.dataChannel[label].readyState !== 'open') {\n      config.dataChannel[label].pending.push(data)\n      callbacks.success()\n      return\n    }\n    Janus.log('Sending data on data channel <' + label + '>')\n    Janus.debug(data)\n    config.dataChannel[label].send(data)\n    callbacks.success()\n  }\n\n  // Private method to send a DTMF tone\n  function sendDtmf(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.dtmfSender) {\n      // Create the DTMF sender the proper way, if possible\n      if(config.pc) {\n        var senders = config.pc.getSenders()\n        var audioSender = senders.find(function(sender) {\n          return sender.track && sender.track.kind === 'audio'\n        })\n        if(!audioSender) {\n          Janus.warn('Invalid DTMF configuration (no audio track)')\n          callbacks.error('Invalid DTMF configuration (no audio track)')\n          return\n        }\n        config.dtmfSender = audioSender.dtmf\n        if(config.dtmfSender) {\n          Janus.log('Created DTMF Sender')\n          config.dtmfSender.ontonechange = function(tone) { Janus.debug('Sent DTMF tone: ' + tone.tone) }\n        }\n      }\n      if(!config.dtmfSender) {\n        Janus.warn('Invalid DTMF configuration')\n        callbacks.error('Invalid DTMF configuration')\n        return\n      }\n    }\n    var dtmf = callbacks.dtmf\n    if(!dtmf) {\n      Janus.warn('Invalid DTMF parameters')\n      callbacks.error('Invalid DTMF parameters')\n      return\n    }\n    var tones = dtmf.tones\n    if(!tones) {\n      Janus.warn('Invalid DTMF string')\n      callbacks.error('Invalid DTMF string')\n      return\n    }\n    var duration = (typeof dtmf.duration === 'number') ? dtmf.duration : 500 // We choose 500ms as the default duration for a tone\n    var gap = (typeof dtmf.gap === 'number') ? dtmf.gap : 50 // We choose 50ms as the default gap between tones\n    Janus.debug('Sending DTMF string ' + tones + ' (duration ' + duration + 'ms, gap ' + gap + 'ms)')\n    config.dtmfSender.insertDTMF(tones, duration, gap)\n    callbacks.success()\n  }\n\n  // Private method to destroy a plugin handle\n  function destroyHandle(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var noRequest = (callbacks.noRequest === true)\n    Janus.log('Destroying handle ' + handleId + ' (only-locally=' + noRequest + ')')\n    cleanupWebrtc(handleId)\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || pluginHandle.detached) {\n      // Plugin was already detached by Janus, calling detach again will return a handle not found error, so just exit here\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    pluginHandle.detached = true\n    if(noRequest) {\n      // We're only removing the handle locally\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    if(!connected) {\n      Janus.warn('Is the server down? (connected=false)')\n      callbacks.error('Is the server down? (connected=false)')\n      return\n    }\n    var request = { 'janus': 'detach', 'transaction': Janus.randomString(12) }\n    if(pluginHandle.token)\n      request['token'] = pluginHandle.token\n    if(apisecret)\n      request['apisecret'] = apisecret\n    if(websockets) {\n      request['session_id'] = sessionId\n      request['handle_id'] = handleId\n      ws.send(JSON.stringify(request))\n      delete pluginHandles[handleId]\n      callbacks.success()\n      return\n    }\n    Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n      verb: 'POST',\n      withCredentials: withCredentials,\n      body: request,\n      success: function(json) {\n        Janus.log('Destroyed handle:')\n        Janus.debug(json)\n        if(json['janus'] !== 'success') {\n          Janus.error('Ooops: ' + json['error'].code + ' ' + json['error'].reason) // FIXME\n        }\n        delete pluginHandles[handleId]\n        callbacks.success()\n      },\n      error: function(textStatus, errorThrown) {\n        Janus.error(textStatus + ':', errorThrown) // FIXME\n        // We cleanup anyway\n        delete pluginHandles[handleId]\n        callbacks.success()\n      }\n    })\n  }\n\n  // WebRTC stuff\n  function streamsDone(handleId, jsep, media, callbacks, stream) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      // Close all tracks if the given stream has been created internally\n      if(!callbacks.stream) {\n        Janus.stopAllTracks(stream)\n      }\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    Janus.debug('streamsDone:', stream)\n    if(stream) {\n      Janus.debug('  -- Audio tracks:', stream.getAudioTracks())\n      Janus.debug('  -- Video tracks:', stream.getVideoTracks())\n    }\n    // We're now capturing the new stream: check if we're updating or if it's a new thing\n    var addTracks = false\n    if(!config.myStream || !media.update || (config.streamExternal && !media.replaceAudio && !media.replaceVideo)) {\n      config.myStream = stream\n      addTracks = true\n    } else {\n      // We only need to update the existing stream\n      if(((!media.update && isAudioSendEnabled(media)) || (media.update && (media.addAudio || media.replaceAudio))) &&\n          stream.getAudioTracks() && stream.getAudioTracks().length) {\n        config.myStream.addTrack(stream.getAudioTracks()[0])\n        if(Janus.unifiedPlan) {\n          // Use Transceivers\n          Janus.log((media.replaceAudio ? 'Replacing' : 'Adding') + ' audio track:', stream.getAudioTracks()[0])\n          var audioTransceiver = null\n          var transceivers = config.pc.getTransceivers()\n          if(transceivers && transceivers.length > 0) {\n            for(var t of transceivers) {\n              if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n                  (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n                audioTransceiver = t\n                break\n              }\n            }\n          }\n          if(audioTransceiver && audioTransceiver.sender) {\n            audioTransceiver.sender.replaceTrack(stream.getAudioTracks()[0])\n          } else {\n            config.pc.addTrack(stream.getAudioTracks()[0], stream)\n          }\n        } else {\n          Janus.log((media.replaceAudio ? 'Replacing' : 'Adding') + ' audio track:', stream.getAudioTracks()[0])\n          config.pc.addTrack(stream.getAudioTracks()[0], stream)\n        }\n      }\n      if(((!media.update && isVideoSendEnabled(media)) || (media.update && (media.addVideo || media.replaceVideo))) &&\n          stream.getVideoTracks() && stream.getVideoTracks().length) {\n        config.myStream.addTrack(stream.getVideoTracks()[0])\n        if(Janus.unifiedPlan) {\n          // Use Transceivers\n          Janus.log((media.replaceVideo ? 'Replacing' : 'Adding') + ' video track:', stream.getVideoTracks()[0])\n          var videoTransceiver = null\n          var transceivers = config.pc.getTransceivers()\n          if(transceivers && transceivers.length > 0) {\n            for(var t of transceivers) {\n              if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n                  (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n                videoTransceiver = t\n                break\n              }\n            }\n          }\n          if(videoTransceiver && videoTransceiver.sender) {\n            videoTransceiver.sender.replaceTrack(stream.getVideoTracks()[0])\n          } else {\n            config.pc.addTrack(stream.getVideoTracks()[0], stream)\n          }\n        } else {\n          Janus.log((media.replaceVideo ? 'Replacing' : 'Adding') + ' video track:', stream.getVideoTracks()[0])\n          config.pc.addTrack(stream.getVideoTracks()[0], stream)\n        }\n      }\n    }\n    // If we still need to create a PeerConnection, let's do that\n    if(!config.pc) {\n      var pc_config = {'iceServers': iceServers, 'iceTransportPolicy': iceTransportPolicy, 'bundlePolicy': bundlePolicy}\n      if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n        // For Chrome versions before 72, we force a plan-b semantic, and unified-plan otherwise\n        pc_config['sdpSemantics'] = (Janus.webRTCAdapter.browserDetails.version < 72) ? 'plan-b' : 'unified-plan'\n      }\n      var pc_constraints = {\n        'optional': [{'DtlsSrtpKeyAgreement': true}]\n      }\n      if(ipv6Support) {\n        pc_constraints.optional.push({'googIPv6':true})\n      }\n      // Any custom constraint to add?\n      if(callbacks.rtcConstraints && typeof callbacks.rtcConstraints === 'object') {\n        Janus.debug('Adding custom PeerConnection constraints:', callbacks.rtcConstraints)\n        for(var i in callbacks.rtcConstraints) {\n          pc_constraints.optional.push(callbacks.rtcConstraints[i])\n        }\n      }\n      if(Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n        // This is Edge, enable BUNDLE explicitly\n        pc_config.bundlePolicy = 'max-bundle'\n      }\n      // Check if a sender or receiver transform has been provided\n      if(RTCRtpSender && (RTCRtpSender.prototype.createEncodedStreams ||\n          (RTCRtpSender.prototype.createEncodedAudioStreams &&\n          RTCRtpSender.prototype.createEncodedVideoStreams)) &&\n          (callbacks.senderTransforms || callbacks.receiverTransforms)) {\n        config.senderTransforms = callbacks.senderTransforms\n        config.receiverTransforms = callbacks.receiverTransforms\n        pc_config['forceEncodedAudioInsertableStreams'] = true\n        pc_config['forceEncodedVideoInsertableStreams'] = true\n        pc_config['encodedInsertableStreams'] = true\n      }\n      Janus.log('Creating PeerConnection')\n      Janus.debug(pc_constraints)\n      config.pc = new RTCPeerConnection(pc_config, pc_constraints)\n      Janus.debug(config.pc)\n      if(config.pc.getStats) { // FIXME\n        config.volume = {}\n      }\n      Janus.log('Preparing local SDP and gathering candidates (trickle=' + config.trickle + ')')\n      config.pc.oniceconnectionstatechange = function(e) {\n        if(config.pc)\n          pluginHandle.iceState(config.pc.iceConnectionState)\n      }\n      config.pc.onicecandidate = function(event) {\n        if (!event.candidate ||\n            (Janus.webRTCAdapter.browserDetails.browser === 'edge' && event.candidate.candidate.indexOf('endOfCandidates') > 0)) {\n          Janus.log('End of candidates.')\n          config.iceDone = true\n          if(config.trickle === true) {\n            // Notify end of candidates\n            sendTrickleCandidate(handleId, {'completed': true})\n          } else {\n            // No trickle, time to send the complete SDP (including all candidates)\n            sendSDP(handleId, callbacks)\n          }\n        } else {\n          // JSON.stringify doesn't work on some WebRTC objects anymore\n          // See https://code.google.com/p/chromium/issues/detail?id=467366\n          var candidate = {\n            'candidate': event.candidate.candidate,\n            'sdpMid': event.candidate.sdpMid,\n            'sdpMLineIndex': event.candidate.sdpMLineIndex\n          }\n          if(config.trickle === true) {\n            // Send candidate\n            sendTrickleCandidate(handleId, candidate)\n          }\n        }\n      }\n      config.pc.ontrack = function(event) {\n        Janus.log('Handling Remote Track')\n        Janus.debug(event)\n        if(!event.streams)\n          return\n        config.remoteStream = event.streams[0]\n        pluginHandle.onremotestream(config.remoteStream)\n        if(event.track.onended)\n          return\n        if(config.receiverTransforms) {\n          var receiverStreams = null\n          if(RTCRtpSender.prototype.createEncodedStreams) {\n            receiverStreams = event.receiver.createEncodedStreams()\n          } else if(RTCRtpSender.prototype.createAudioEncodedStreams || RTCRtpSender.prototype.createEncodedVideoStreams) {\n            if(event.track.kind === 'audio' && config.receiverTransforms['audio']) {\n              receiverStreams = event.receiver.createEncodedAudioStreams()\n            } else if(event.track.kind === 'video' && config.receiverTransforms['video']) {\n              receiverStreams = event.receiver.createEncodedVideoStreams()\n            }\n          }\n          if(receiverStreams) {\n            console.log(receiverStreams)\n            if(receiverStreams.readableStream && receiverStreams.writableStream) {\n              receiverStreams.readableStream\n                .pipeThrough(config.receiverTransforms[event.track.kind])\n                .pipeTo(receiverStreams.writableStream)\n            } else if(receiverStreams.readable && receiverStreams.writable) {\n              receiverStreams.readable\n                .pipeThrough(config.receiverTransforms[event.track.kind])\n                .pipeTo(receiverStreams.writable)\n            }\n          }\n        }\n        var trackMutedTimeoutId = null\n        Janus.log('Adding onended callback to track:', event.track)\n        event.track.onended = function(ev) {\n          Janus.log('Remote track removed:', ev)\n          if(config.remoteStream) {\n            clearTimeout(trackMutedTimeoutId)\n            config.remoteStream.removeTrack(ev.target)\n            pluginHandle.onremotestream(config.remoteStream)\n          }\n        }\n        event.track.onmute = function(ev) {\n          Janus.log('Remote track muted:', ev)\n          if(config.remoteStream && trackMutedTimeoutId == null) {\n            trackMutedTimeoutId = setTimeout(function() {\n              Janus.log('Removing remote track')\n              if (config.remoteStream) {\n                config.remoteStream.removeTrack(ev.target)\n                pluginHandle.onremotestream(config.remoteStream)\n                pluginHandle.ontrackmuted()\n              }\n              trackMutedTimeoutId = null\n            // Chrome seems to raise mute events only at multiples of 834ms;\n            // we set the timeout to three times this value (rounded to 840ms)\n            }, 3 * 840)\n          }\n        }\n        event.track.onunmute = function(ev) {\n          Janus.log('Remote track flowing again:', ev)\n          if(trackMutedTimeoutId != null) {\n            clearTimeout(trackMutedTimeoutId)\n            trackMutedTimeoutId = null\n          } else {\n            try {\n              config.remoteStream.addTrack(ev.target)\n              pluginHandle.onremotestream(config.remoteStream)\n              pluginHandle.ontrackunmuted()\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        }\n      }\n    }\n    if(addTracks && stream) {\n      Janus.log('Adding local stream')\n      var simulcast2 = (callbacks.simulcast2 === true)\n      stream.getTracks().forEach(function(track) {\n        Janus.log('Adding local track:', track)\n        var sender = null\n        if(!simulcast2 || track.kind === 'audio') {\n          sender = config.pc.addTrack(track, stream)\n        } else {\n          Janus.log('Enabling rid-based simulcasting:', track)\n          var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n          var tr = config.pc.addTransceiver(track, {\n            direction: 'sendrecv',\n            streams: [stream],\n            sendEncodings: callbacks.sendEncodings || [\n              { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n              { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2 },\n              { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4 }\n            ]\n          })\n          if(tr)\n            sender = tr.sender\n        }\n        // Check if insertable streams are involved\n        if(sender && config.senderTransforms) {\n          var senderStreams = null\n          if(RTCRtpSender.prototype.createEncodedStreams) {\n            senderStreams = sender.createEncodedStreams()\n          } else if(RTCRtpSender.prototype.createAudioEncodedStreams || RTCRtpSender.prototype.createEncodedVideoStreams) {\n            if(sender.track.kind === 'audio' && config.senderTransforms['audio']) {\n              senderStreams = sender.createEncodedAudioStreams()\n            } else if(sender.track.kind === 'video' && config.senderTransforms['video']) {\n              senderStreams = sender.createEncodedVideoStreams()\n            }\n          }\n          if(senderStreams) {\n            console.log(senderStreams)\n            if(senderStreams.readableStream && senderStreams.writableStream) {\n              senderStreams.readableStream\n                .pipeThrough(config.senderTransforms[sender.track.kind])\n                .pipeTo(senderStreams.writableStream)\n            } else if(senderStreams.readable && senderStreams.writable) {\n              senderStreams.readable\n                .pipeThrough(config.senderTransforms[sender.track.kind])\n                .pipeTo(senderStreams.writable)\n            }\n          }\n        }\n      })\n    }\n    // Any data channel to create?\n    if(isDataEnabled(media) && !config.dataChannel[Janus.dataChanDefaultLabel]) {\n      Janus.log('Creating default data channel')\n      createDataChannel(handleId, Janus.dataChanDefaultLabel, null, false)\n      config.pc.ondatachannel = function(event) {\n        Janus.log('Data channel created by Janus:', event)\n        createDataChannel(handleId, event.channel.label, event.channel.protocol, event.channel)\n      }\n    }\n    // If there's a new local stream, let's notify the application\n    if(config.myStream) {\n      pluginHandle.onlocalstream(config.myStream)\n    }\n    // Create offer/answer now\n    if(!jsep) {\n      createOffer(handleId, media, callbacks)\n    } else {\n      // some firefox vs 420029 fix here, copied from our prev custom release\n      var oldsdp = jsep['sdp']\n      var pattern = /420029/gi\n      var newsdp = oldsdp.replace(pattern,'42e01f')\n      Janus.log(newsdp)\n      jsep['sdp'] = newsdp\n      config.pc.setRemoteDescription(jsep)\n        .then(function() {\n          Janus.log('Remote description accepted!')\n          config.remoteSdp = jsep.sdp\n          // Any trickle candidate we cached?\n          if(config.candidates && config.candidates.length > 0) {\n            for(var i = 0; i< config.candidates.length; i++) {\n              var candidate = config.candidates[i]\n              Janus.debug('Adding remote candidate:', candidate)\n              if(!candidate || candidate.completed === true) {\n                // end-of-candidates\n                config.pc.addIceCandidate(Janus.endOfCandidates)\n              } else {\n                // New candidate\n                config.pc.addIceCandidate(candidate)\n              }\n            }\n            config.candidates = []\n          }\n          // Create the answer now\n          createAnswer(handleId, media, callbacks)\n        }, callbacks.error)\n    }\n  }\n\n  function prepareWebrtc(handleId, offer, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : webrtcError\n    var jsep = callbacks.jsep\n    if(offer && jsep) {\n      Janus.error('Provided a JSEP to a createOffer')\n      callbacks.error('Provided a JSEP to a createOffer')\n      return\n    } else if(!offer && (!jsep || !jsep.type || !jsep.sdp)) {\n      Janus.error('A valid JSEP is required for createAnswer')\n      callbacks.error('A valid JSEP is required for createAnswer')\n      return\n    }\n    /* Check that callbacks.media is a (not null) Object */\n    callbacks.media = (typeof callbacks.media === 'object' && callbacks.media) ? callbacks.media : { audio: true, video: true }\n    var media = callbacks.media\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    config.trickle = isTrickleEnabled(callbacks.trickle)\n    // Are we updating a session?\n    if(!config.pc) {\n      // Nope, new PeerConnection\n      media.update = false\n      media.keepAudio = false\n      media.keepVideo = false\n    } else {\n      Janus.log('Updating existing media session')\n      media.update = true\n      // Check if there's anything to add/remove/replace, or if we\n      // can go directly to preparing the new SDP offer or answer\n      if(callbacks.stream) {\n        // External stream: is this the same as the one we were using before?\n        if(callbacks.stream !== config.myStream) {\n          Janus.log('Renegotiation involves a new external stream')\n        }\n      } else {\n        // Check if there are changes on audio\n        if(media.addAudio) {\n          media.keepAudio = false\n          media.replaceAudio = false\n          media.removeAudio = false\n          media.audioSend = true\n          if(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n            Janus.error('Can\\'t add audio stream, there already is one')\n            callbacks.error('Can\\'t add audio stream, there already is one')\n            return\n          }\n        } else if(media.removeAudio) {\n          media.keepAudio = false\n          media.replaceAudio = false\n          media.addAudio = false\n          media.audioSend = false\n        } else if(media.replaceAudio) {\n          media.keepAudio = false\n          media.addAudio = false\n          media.removeAudio = false\n          media.audioSend = true\n        }\n        if(!config.myStream) {\n          // No media stream: if we were asked to replace, it's actually an \"add\"\n          if(media.replaceAudio) {\n            media.keepAudio = false\n            media.replaceAudio = false\n            media.addAudio = true\n            media.audioSend = true\n          }\n          if(isAudioSendEnabled(media)) {\n            media.keepAudio = false\n            media.addAudio = true\n          }\n        } else {\n          if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n            // No audio track: if we were asked to replace, it's actually an \"add\"\n            if(media.replaceAudio) {\n              media.keepAudio = false\n              media.replaceAudio = false\n              media.addAudio = true\n              media.audioSend = true\n            }\n            if(isAudioSendEnabled(media)) {\n              media.keepAudio = false\n              media.addAudio = true\n            }\n          } else {\n            // We have an audio track: should we keep it as it is?\n            if(isAudioSendEnabled(media) &&\n                !media.removeAudio && !media.replaceAudio) {\n              media.keepAudio = true\n            }\n          }\n        }\n        // Check if there are changes on video\n        if(media.addVideo) {\n          media.keepVideo = false\n          media.replaceVideo = false\n          media.removeVideo = false\n          media.videoSend = true\n          if(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n            Janus.error('Can\\'t add video stream, there already is one')\n            callbacks.error('Can\\'t add video stream, there already is one')\n            return\n          }\n        } else if(media.removeVideo) {\n          media.keepVideo = false\n          media.replaceVideo = false\n          media.addVideo = false\n          media.videoSend = false\n        } else if(media.replaceVideo) {\n          media.keepVideo = false\n          media.addVideo = false\n          media.removeVideo = false\n          media.videoSend = true\n        }\n        if(!config.myStream) {\n          // No media stream: if we were asked to replace, it's actually an \"add\"\n          if(media.replaceVideo) {\n            media.keepVideo = false\n            media.replaceVideo = false\n            media.addVideo = true\n            media.videoSend = true\n          }\n          if(isVideoSendEnabled(media)) {\n            media.keepVideo = false\n            media.addVideo = true\n          }\n        } else {\n          if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n            // No video track: if we were asked to replace, it's actually an \"add\"\n            if(media.replaceVideo) {\n              media.keepVideo = false\n              media.replaceVideo = false\n              media.addVideo = true\n              media.videoSend = true\n            }\n            if(isVideoSendEnabled(media)) {\n              media.keepVideo = false\n              media.addVideo = true\n            }\n          } else {\n            // We have a video track: should we keep it as it is?\n            if(isVideoSendEnabled(media) && !media.removeVideo && !media.replaceVideo) {\n              media.keepVideo = true\n            }\n          }\n        }\n        // Data channels can only be added\n        if(media.addData) {\n          media.data = true\n        }\n      }\n      // If we're updating and keeping all tracks, let's skip the getUserMedia part\n      if((isAudioSendEnabled(media) && media.keepAudio) &&\n          (isVideoSendEnabled(media) && media.keepVideo)) {\n        pluginHandle.consentDialog(false)\n        streamsDone(handleId, jsep, media, callbacks, config.myStream)\n        return\n      }\n    }\n    // If we're updating, check if we need to remove/replace one of the tracks\n    if(media.update && (!config.streamExternal || (config.streamExternal && (media.replaceAudio || media.replaceVideo)))) {\n      if(media.removeAudio || media.replaceAudio) {\n        if(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n          var at = config.myStream.getAudioTracks()[0]\n          Janus.log('Removing audio track:', at)\n          config.myStream.removeTrack(at)\n          try {\n            at.stop()\n          } catch(e) {}\n        }\n        if(config.pc.getSenders() && config.pc.getSenders().length) {\n          var ra = true\n          if(media.replaceAudio && Janus.unifiedPlan) {\n            // We can use replaceTrack\n            ra = false\n          }\n          if(ra) {\n            for(var asnd of config.pc.getSenders()) {\n              if(asnd && asnd.track && asnd.track.kind === 'audio') {\n                Janus.log('Removing audio sender:', asnd)\n                config.pc.removeTrack(asnd)\n              }\n            }\n          }\n        }\n      }\n      if(media.removeVideo || media.replaceVideo) {\n        if(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n          var vt = config.myStream.getVideoTracks()[0]\n          Janus.log('Removing video track:', vt)\n          config.myStream.removeTrack(vt)\n          try {\n            vt.stop()\n          } catch(e) {}\n        }\n        if(config.pc.getSenders() && config.pc.getSenders().length) {\n          var rv = true\n          if(media.replaceVideo && Janus.unifiedPlan) {\n            // We can use replaceTrack\n            rv = false\n          }\n          if(rv) {\n            for(var vsnd of config.pc.getSenders()) {\n              if(vsnd && vsnd.track && vsnd.track.kind === 'video') {\n                Janus.log('Removing video sender:', vsnd)\n                config.pc.removeTrack(vsnd)\n              }\n            }\n          }\n        }\n      }\n    }\n    // Was a MediaStream object passed, or do we need to take care of that?\n    if(callbacks.stream) {\n      var stream = callbacks.stream\n      Janus.log('MediaStream provided by the application')\n      Janus.debug(stream)\n      // If this is an update, let's check if we need to release the previous stream\n      if(media.update && config.myStream && config.myStream !== callbacks.stream && !config.streamExternal && !media.replaceAudio && !media.replaceVideo) {\n        // We're replacing a stream we captured ourselves with an external one\n        Janus.stopAllTracks(config.myStream)\n        config.myStream = null\n      }\n      // Skip the getUserMedia part\n      config.streamExternal = true\n      pluginHandle.consentDialog(false)\n      streamsDone(handleId, jsep, media, callbacks, stream)\n      return\n    }\n    if(isAudioSendEnabled(media) || isVideoSendEnabled(media)) {\n      if(!Janus.isGetUserMediaAvailable()) {\n        callbacks.error('getUserMedia not available')\n        return\n      }\n      var constraints = { mandatory: {}, optional: []}\n      pluginHandle.consentDialog(true)\n      var audioSupport = isAudioSendEnabled(media)\n      if(audioSupport && media && typeof media.audio === 'object')\n        audioSupport = media.audio\n      var videoSupport = isVideoSendEnabled(media)\n      if(videoSupport && media) {\n        var simulcast = (callbacks.simulcast === true)\n        var simulcast2 = (callbacks.simulcast2 === true)\n        if((simulcast || simulcast2) && !jsep && !media.video)\n          media.video = 'hires'\n        if(media.video && media.video != 'screen' && media.video != 'window') {\n          if(typeof media.video === 'object') {\n            videoSupport = media.video\n          } else {\n            var width = 0\n            var height = 0, maxHeight = 0\n            if(media.video === 'lowres') {\n              // Small resolution, 4:3\n              height = 240\n              maxHeight = 240\n              width = 320\n            } else if(media.video === 'lowres-16:9') {\n              // Small resolution, 16:9\n              height = 180\n              maxHeight = 180\n              width = 320\n            } else if(media.video === 'hires' || media.video === 'hires-16:9' || media.video === 'hdres') {\n              // High(HD) resolution is only 16:9\n              height = 720\n              maxHeight = 720\n              width = 1280\n            } else if(media.video === 'fhdres') {\n              // Full HD resolution is only 16:9\n              height = 1080\n              maxHeight = 1080\n              width = 1920\n            } else if(media.video === '4kres') {\n              // 4K resolution is only 16:9\n              height = 2160\n              maxHeight = 2160\n              width = 3840\n            } else if(media.video === 'stdres') {\n              // Normal resolution, 4:3\n              height = 480\n              maxHeight = 480\n              width = 640\n            } else if(media.video === 'stdres-16:9') {\n              // Normal resolution, 16:9\n              height = 360\n              maxHeight = 360\n              width = 640\n            } else {\n              Janus.log('Default video setting is stdres 4:3')\n              height = 480\n              maxHeight = 480\n              width = 640\n            }\n            Janus.log('Adding media constraint:', media.video)\n            videoSupport = {\n              'height': {'ideal': height},\n              'width': {'ideal': width}\n            }\n            Janus.log('Adding video constraint:', videoSupport)\n          }\n        } else if(media.video === 'screen' || media.video === 'window') {\n          if(navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {\n            // The new experimental getDisplayMedia API is available, let's use that\n            // https://groups.google.com/forum/#!topic/discuss-webrtc/Uf0SrR4uxzk\n            // https://webrtchacks.com/chrome-screensharing-getdisplaymedia/\n            constraints.video = {}\n            if(media.screenshareFrameRate) {\n              constraints.video.frameRate = media.screenshareFrameRate\n            }\n            if(media.screenshareHeight) {\n              constraints.video.height = media.screenshareHeight\n            }\n            if(media.screenshareWidth) {\n              constraints.video.width = media.screenshareWidth\n            }\n            constraints.audio = media.captureDesktopAudio\n            navigator.mediaDevices.getDisplayMedia(constraints)\n              .then(function(stream) {\n                pluginHandle.consentDialog(false)\n                if(isAudioSendEnabled(media) && !media.keepAudio) {\n                  navigator.mediaDevices.getUserMedia({ audio: true, video: false })\n                    .then(function (audioStream) {\n                      stream.addTrack(audioStream.getAudioTracks()[0])\n                      streamsDone(handleId, jsep, media, callbacks, stream)\n                    })\n                } else {\n                  streamsDone(handleId, jsep, media, callbacks, stream)\n                }\n              }, function (error) {\n                pluginHandle.consentDialog(false)\n                callbacks.error(error)\n              })\n            return\n          }\n          // We're going to try and use the extension for Chrome 34+, the old approach\n          // for older versions of Chrome, or the experimental support in Firefox 33+\n          function callbackUserMedia (error, stream) {\n            pluginHandle.consentDialog(false)\n            if(error) {\n              callbacks.error(error)\n            } else {\n              streamsDone(handleId, jsep, media, callbacks, stream)\n            }\n          }\n          function getScreenMedia(constraints, gsmCallback, useAudio) {\n            Janus.log('Adding media constraint (screen capture)')\n            Janus.debug(constraints)\n            navigator.mediaDevices.getUserMedia(constraints)\n              .then(function(stream) {\n                if(useAudio) {\n                  navigator.mediaDevices.getUserMedia({ audio: true, video: false })\n                    .then(function (audioStream) {\n                      stream.addTrack(audioStream.getAudioTracks()[0])\n                      gsmCallback(null, stream)\n                    })\n                } else {\n                  gsmCallback(null, stream)\n                }\n              })\n              .catch(function(error) { pluginHandle.consentDialog(false); gsmCallback(error) })\n          }\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n            var chromever = Janus.webRTCAdapter.browserDetails.version\n            var maxver = 33\n            if(window.navigator.userAgent.match('Linux'))\n              maxver = 35 // \"known\" crash in chrome 34 and 35 on linux\n            if(chromever >= 26 && chromever <= maxver) {\n              // Chrome 26->33 requires some awkward chrome://flags manipulation\n              constraints = {\n                video: {\n                  mandatory: {\n                    googLeakyBucket: true,\n                    maxWidth: window.screen.width,\n                    maxHeight: window.screen.height,\n                    minFrameRate: media.screenshareFrameRate,\n                    maxFrameRate: media.screenshareFrameRate,\n                    chromeMediaSource: 'screen'\n                  }\n                },\n                audio: isAudioSendEnabled(media) && !media.keepAudio\n              }\n              getScreenMedia(constraints, callbackUserMedia)\n            } else {\n              // Chrome 34+ requires an extension\n              Janus.extension.getScreen(function (error, sourceId) {\n                if (error) {\n                  pluginHandle.consentDialog(false)\n                  return callbacks.error(error)\n                }\n                constraints = {\n                  audio: false,\n                  video: {\n                    mandatory: {\n                      chromeMediaSource: 'desktop',\n                      maxWidth: window.screen.width,\n                      maxHeight: window.screen.height,\n                      minFrameRate: media.screenshareFrameRate,\n                      maxFrameRate: media.screenshareFrameRate,\n                    },\n                    optional: [\n                      {googLeakyBucket: true},\n                      {googTemporalLayeredScreencast: true}\n                    ]\n                  }\n                }\n                constraints.video.mandatory.chromeMediaSourceId = sourceId\n                getScreenMedia(constraints, callbackUserMedia,\n                  isAudioSendEnabled(media) && !media.keepAudio)\n              })\n            }\n          } else if(Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n            if(Janus.webRTCAdapter.browserDetails.version >= 33) {\n              // Firefox 33+ has experimental support for screen sharing\n              constraints = {\n                video: {\n                  mozMediaSource: media.video,\n                  mediaSource: media.video\n                },\n                audio: isAudioSendEnabled(media) && !media.keepAudio\n              }\n              getScreenMedia(constraints, function (err, stream) {\n                callbackUserMedia(err, stream)\n                // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n                if (!err) {\n                  var lastTime = stream.currentTime\n                  var polly = window.setInterval(function () {\n                    if(!stream)\n                      window.clearInterval(polly)\n                    if(stream.currentTime == lastTime) {\n                      window.clearInterval(polly)\n                      if(stream.onended) {\n                        stream.onended()\n                      }\n                    }\n                    lastTime = stream.currentTime\n                  }, 500)\n                }\n              })\n            } else {\n              var error = new Error('NavigatorUserMediaError')\n              error.name = 'Your version of Firefox does not support screen sharing, please install Firefox 33 (or more recent versions)'\n              pluginHandle.consentDialog(false)\n              callbacks.error(error)\n              return\n            }\n          }\n          return\n        }\n      }\n      // If we got here, we're not screensharing\n      if(!media || media.video !== 'screen') {\n        // Check whether all media sources are actually available or not\n        navigator.mediaDevices.enumerateDevices().then(function(devices) {\n          var audioExist = devices.some(function(device) {\n              return device.kind === 'audioinput'\n            }),\n            videoExist = isScreenSendEnabled(media) || devices.some(function(device) {\n              return device.kind === 'videoinput'\n            })\n\n          // Check whether a missing device is really a problem\n          var audioSend = isAudioSendEnabled(media)\n          var videoSend = isVideoSendEnabled(media)\n          var needAudioDevice = isAudioSendRequired(media)\n          var needVideoDevice = isVideoSendRequired(media)\n          if(audioSend || videoSend || needAudioDevice || needVideoDevice) {\n            // We need to send either audio or video\n            var haveAudioDevice = audioSend ? audioExist : false\n            var haveVideoDevice = videoSend ? videoExist : false\n            if(!haveAudioDevice && !haveVideoDevice) {\n              // FIXME Should we really give up, or just assume recvonly for both?\n              pluginHandle.consentDialog(false)\n              callbacks.error('No capture device found')\n              return false\n            } else if(!haveAudioDevice && needAudioDevice) {\n              pluginHandle.consentDialog(false)\n              callbacks.error('Audio capture is required, but no capture device found')\n              return false\n            } else if(!haveVideoDevice && needVideoDevice) {\n              pluginHandle.consentDialog(false)\n              callbacks.error('Video capture is required, but no capture device found')\n              return false\n            }\n          }\n\n          var gumConstraints = {\n            audio: (audioExist && !media.keepAudio) ? audioSupport : false,\n            video: (videoExist && !media.keepVideo) ? videoSupport : false\n          }\n          Janus.debug('getUserMedia constraints', gumConstraints)\n          if (!gumConstraints.audio && !gumConstraints.video) {\n            pluginHandle.consentDialog(false)\n            streamsDone(handleId, jsep, media, callbacks, stream)\n          } else {\n            navigator.mediaDevices.getUserMedia(gumConstraints)\n              .then(function(stream) {\n                pluginHandle.consentDialog(false)\n                streamsDone(handleId, jsep, media, callbacks, stream)\n              }).catch(function(error) {\n                pluginHandle.consentDialog(false)\n                callbacks.error({code: error.code, name: error.name, message: error.message})\n              })\n          }\n        })\n          .catch(function(error) {\n            pluginHandle.consentDialog(false)\n            callbacks.error(error)\n          })\n      }\n    } else {\n      // No need to do a getUserMedia, create offer/answer right away\n      streamsDone(handleId, jsep, media, callbacks)\n    }\n  }\n\n  function prepareWebrtcPeer(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : webrtcError\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var jsep = callbacks.jsep\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(jsep) {\n      if(!config.pc) {\n        Janus.warn('Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep')\n        callbacks.error('No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep')\n        return\n      }\n      callbacks.customizeSdp(jsep)\n      config.pc.setRemoteDescription(jsep)\n        .then(function() {\n          Janus.log('Remote description accepted!')\n          config.remoteSdp = jsep.sdp\n          // Any trickle candidate we cached?\n          if(config.candidates && config.candidates.length > 0) {\n            for(var i = 0; i< config.candidates.length; i++) {\n              var candidate = config.candidates[i]\n              Janus.debug('Adding remote candidate:', candidate)\n              if(!candidate || candidate.completed === true) {\n                // end-of-candidates\n                config.pc.addIceCandidate(Janus.endOfCandidates)\n              } else {\n                // New candidate\n                config.pc.addIceCandidate(candidate)\n              }\n            }\n            config.candidates = []\n          }\n          // Done\n          callbacks.success()\n        }, callbacks.error)\n    } else {\n      callbacks.error('Invalid JSEP')\n    }\n  }\n\n  function createOffer(handleId, media, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var simulcast = (callbacks.simulcast === true)\n    if(!simulcast) {\n      Janus.log('Creating offer (iceDone=' + config.iceDone + ')')\n    } else {\n      Janus.log('Creating offer (iceDone=' + config.iceDone + ', simulcast=' + simulcast + ')')\n    }\n    // https://code.google.com/p/webrtc/issues/detail?id=3508\n    var mediaConstraints = {}\n    if(Janus.unifiedPlan) {\n      // We can use Transceivers\n      var audioTransceiver = null, videoTransceiver = null\n      var transceivers = config.pc.getTransceivers()\n      if(transceivers && transceivers.length > 0) {\n        for(var t of transceivers) {\n          if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n            if(!audioTransceiver) {\n              audioTransceiver = t\n            }\n            continue\n          }\n          if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n            if(!videoTransceiver) {\n              videoTransceiver = t\n            }\n            continue\n          }\n        }\n      }\n      // Handle audio (and related changes, if any)\n      var audioSend = isAudioSendEnabled(media)\n      var audioRecv = isAudioRecvEnabled(media)\n      if(!audioSend && !audioRecv) {\n        // Audio disabled: have we removed it?\n        if(media.removeAudio && audioTransceiver) {\n          if (audioTransceiver.setDirection) {\n            audioTransceiver.setDirection('inactive')\n          } else {\n            audioTransceiver.direction = 'inactive'\n          }\n          Janus.log('Setting audio transceiver to inactive:', audioTransceiver)\n        }\n      } else {\n        // Take care of audio m-line\n        if(audioSend && audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendrecv')\n            } else {\n              audioTransceiver.direction = 'sendrecv'\n            }\n            Janus.log('Setting audio transceiver to sendrecv:', audioTransceiver)\n          }\n        } else if(audioSend && !audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly')\n            } else {\n              audioTransceiver.direction = 'sendonly'\n            }\n            Janus.log('Setting audio transceiver to sendonly:', audioTransceiver)\n          }\n        } else if(!audioSend && audioRecv) {\n          if(audioTransceiver) {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('recvonly')\n            } else {\n              audioTransceiver.direction = 'recvonly'\n            }\n            Janus.log('Setting audio transceiver to recvonly:', audioTransceiver)\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            audioTransceiver = config.pc.addTransceiver('audio', { direction: 'recvonly' })\n            Janus.log('Adding recvonly audio transceiver:', audioTransceiver)\n          }\n        }\n      }\n      // Handle video (and related changes, if any)\n      var videoSend = isVideoSendEnabled(media)\n      var videoRecv = isVideoRecvEnabled(media)\n      if(!videoSend && !videoRecv) {\n        // Video disabled: have we removed it?\n        if(media.removeVideo && videoTransceiver) {\n          if (videoTransceiver.setDirection) {\n            videoTransceiver.setDirection('inactive')\n          } else {\n            videoTransceiver.direction = 'inactive'\n          }\n          Janus.log('Setting video transceiver to inactive:', videoTransceiver)\n        }\n      } else {\n        // Take care of video m-line\n        if(videoSend && videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendrecv')\n            } else {\n              videoTransceiver.direction = 'sendrecv'\n            }\n            Janus.log('Setting video transceiver to sendrecv:', videoTransceiver)\n          }\n        } else if(videoSend && !videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendonly')\n            } else {\n              videoTransceiver.direction = 'sendonly'\n            }\n            Janus.log('Setting video transceiver to sendonly:', videoTransceiver)\n          }\n        } else if(!videoSend && videoRecv) {\n          if(videoTransceiver) {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('recvonly')\n            } else {\n              videoTransceiver.direction = 'recvonly'\n            }\n            Janus.log('Setting video transceiver to recvonly:', videoTransceiver)\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            videoTransceiver = config.pc.addTransceiver('video', { direction: 'recvonly' })\n            Janus.log('Adding recvonly video transceiver:', videoTransceiver)\n          }\n        }\n      }\n    } else {\n      mediaConstraints['offerToReceiveAudio'] = isAudioRecvEnabled(media)\n      mediaConstraints['offerToReceiveVideo'] = isVideoRecvEnabled(media)\n    }\n    var iceRestart = (callbacks.iceRestart === true)\n    if(iceRestart) {\n      mediaConstraints['iceRestart'] = true\n    }\n    Janus.debug(mediaConstraints)\n    // Check if this is Firefox and we've been asked to do simulcasting\n    var sendVideo = isVideoSendEnabled(media)\n    if(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n      // FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n      Janus.log('Enabling Simulcasting for Firefox (RID)')\n      var sender = config.pc.getSenders().find(function(s) {return s.track && s.track.kind === 'video'})\n      if(sender) {\n        var parameters = sender.getParameters()\n        if(!parameters) {\n          parameters = {}\n        }\n        var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n        parameters.encodings = callbacks.sendEncodings || [\n          { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n          { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2 },\n          { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4 }\n        ]\n        sender.setParameters(parameters)\n      }\n    }\n    config.pc.createOffer(mediaConstraints)\n      .then(function(offer) {\n        Janus.debug(offer)\n        // JSON.stringify doesn't work on some WebRTC objects anymore\n        // See https://code.google.com/p/chromium/issues/detail?id=467366\n        var jsep = {\n          'type': offer.type,\n          'sdp': offer.sdp\n        }\n        callbacks.customizeSdp(jsep)\n        offer.sdp = jsep.sdp\n        Janus.log('Setting local description')\n        if(sendVideo && simulcast) {\n          // This SDP munging only works with Chrome (Safari STP may support it too)\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome' ||\n              Janus.webRTCAdapter.browserDetails.browser === 'safari') {\n            Janus.log('Enabling Simulcasting for Chrome (SDP munging)')\n            offer.sdp = mungeSdpForSimulcasting(offer.sdp)\n          } else if(Janus.webRTCAdapter.browserDetails.browser !== 'firefox') {\n            Janus.warn('simulcast=true, but this is not Chrome nor Firefox, ignoring')\n          }\n        }\n        config.mySdp = {\n          type: 'offer',\n          sdp: offer.sdp\n        }\n        config.pc.setLocalDescription(offer)\n          .catch(callbacks.error)\n        config.mediaConstraints = mediaConstraints\n        if(!config.iceDone && !config.trickle) {\n          // Don't do anything until we have all candidates\n          Janus.log('Waiting for all candidates...')\n          return\n        }\n        // If transforms are present, notify Janus that the media is end-to-end encrypted\n        if(config.senderTransforms || config.receiverTransforms) {\n          offer['e2ee'] = true\n        }\n        callbacks.success(offer)\n      }, callbacks.error)\n  }\n\n  function createAnswer(handleId, media, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    callbacks.customizeSdp = (typeof callbacks.customizeSdp == 'function') ? callbacks.customizeSdp : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      callbacks.error('Invalid handle')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    var simulcast = (callbacks.simulcast === true)\n    if(!simulcast) {\n      Janus.log('Creating answer (iceDone=' + config.iceDone + ')')\n    } else {\n      Janus.log('Creating answer (iceDone=' + config.iceDone + ', simulcast=' + simulcast + ')')\n    }\n    var mediaConstraints = null\n    if(Janus.unifiedPlan) {\n      // We can use Transceivers\n      mediaConstraints = {}\n      var audioTransceiver = null, videoTransceiver = null\n      var transceivers = config.pc.getTransceivers()\n      if(transceivers && transceivers.length > 0) {\n        for(var t of transceivers) {\n          if((t.sender && t.sender.track && t.sender.track.kind === 'audio') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'audio')) {\n            if(!audioTransceiver)\n              audioTransceiver = t\n            continue\n          }\n          if((t.sender && t.sender.track && t.sender.track.kind === 'video') ||\n              (t.receiver && t.receiver.track && t.receiver.track.kind === 'video')) {\n            if(!videoTransceiver)\n              videoTransceiver = t\n            continue\n          }\n        }\n      }\n      // Handle audio (and related changes, if any)\n      var audioSend = isAudioSendEnabled(media)\n      var audioRecv = isAudioRecvEnabled(media)\n      if(!audioSend && !audioRecv) {\n        // Audio disabled: have we removed it?\n        if(media.removeAudio && audioTransceiver) {\n          try {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive')\n            } else {\n              audioTransceiver.direction = 'inactive'\n            }\n            Janus.log('Setting audio transceiver to inactive:', audioTransceiver)\n          } catch(e) {\n            Janus.error(e)\n          }\n        }\n      } else {\n        // Take care of audio m-line\n        if(audioSend && audioRecv) {\n          if(audioTransceiver) {\n            try {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('sendrecv')\n              } else {\n                audioTransceiver.direction = 'sendrecv'\n              }\n              Janus.log('Setting audio transceiver to sendrecv:', audioTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(audioSend && !audioRecv) {\n          try {\n            if(audioTransceiver) {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('sendonly')\n              } else {\n                audioTransceiver.direction = 'sendonly'\n              }\n              Janus.log('Setting audio transceiver to sendonly:', audioTransceiver)\n            }\n          } catch(e) {\n            Janus.error(e)\n          }\n        } else if(!audioSend && audioRecv) {\n          if(audioTransceiver) {\n            try {\n              if (audioTransceiver.setDirection) {\n                audioTransceiver.setDirection('recvonly')\n              } else {\n                audioTransceiver.direction = 'recvonly'\n              }\n              Janus.log('Setting audio transceiver to recvonly:', audioTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            audioTransceiver = config.pc.addTransceiver('audio', { direction: 'recvonly' })\n            Janus.log('Adding recvonly audio transceiver:', audioTransceiver)\n          }\n        }\n      }\n      // Handle video (and related changes, if any)\n      var videoSend = isVideoSendEnabled(media)\n      var videoRecv = isVideoRecvEnabled(media)\n      if(!videoSend && !videoRecv) {\n        // Video disabled: have we removed it?\n        if(media.removeVideo && videoTransceiver) {\n          try {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('inactive')\n            } else {\n              videoTransceiver.direction = 'inactive'\n            }\n            Janus.log('Setting video transceiver to inactive:', videoTransceiver)\n          } catch(e) {\n            Janus.error(e)\n          }\n        }\n      } else {\n        // Take care of video m-line\n        if(videoSend && videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('sendrecv')\n              } else {\n                videoTransceiver.direction = 'sendrecv'\n              }\n              Janus.log('Setting video transceiver to sendrecv:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(videoSend && !videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('sendonly')\n              } else {\n                videoTransceiver.direction = 'sendonly'\n              }\n              Janus.log('Setting video transceiver to sendonly:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          }\n        } else if(!videoSend && videoRecv) {\n          if(videoTransceiver) {\n            try {\n              if (videoTransceiver.setDirection) {\n                videoTransceiver.setDirection('recvonly')\n              } else {\n                videoTransceiver.direction = 'recvonly'\n              }\n              Janus.log('Setting video transceiver to recvonly:', videoTransceiver)\n            } catch(e) {\n              Janus.error(e)\n            }\n          } else {\n            // In theory, this is the only case where we might not have a transceiver yet\n            videoTransceiver = config.pc.addTransceiver('video', { direction: 'recvonly' })\n            Janus.log('Adding recvonly video transceiver:', videoTransceiver)\n          }\n        }\n      }\n    } else {\n      if(Janus.webRTCAdapter.browserDetails.browser === 'firefox' || Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n        mediaConstraints = {\n          offerToReceiveAudio: isAudioRecvEnabled(media),\n          offerToReceiveVideo: isVideoRecvEnabled(media)\n        }\n      } else {\n        mediaConstraints = {\n          mandatory: {\n            OfferToReceiveAudio: isAudioRecvEnabled(media),\n            OfferToReceiveVideo: isVideoRecvEnabled(media)\n          }\n        }\n      }\n    }\n    Janus.debug(mediaConstraints)\n    // Check if this is Firefox and we've been asked to do simulcasting\n    var sendVideo = isVideoSendEnabled(media)\n    if(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === 'firefox') {\n      // FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n      Janus.log('Enabling Simulcasting for Firefox (RID)')\n      var sender = config.pc.getSenders()[1]\n      Janus.log(sender)\n      var parameters = sender.getParameters()\n      Janus.log(parameters)\n\n      var maxBitrates = getMaxBitrates(callbacks.simulcastMaxBitrates)\n      sender.setParameters({encodings: callbacks.sendEncodings || [\n        { rid: 'h', active: true, maxBitrate: maxBitrates.high },\n        { rid: 'm', active: true, maxBitrate: maxBitrates.medium, scaleResolutionDownBy: 2},\n        { rid: 'l', active: true, maxBitrate: maxBitrates.low, scaleResolutionDownBy: 4}\n      ]})\n    }\n    config.pc.createAnswer(mediaConstraints)\n      .then(function(answer) {\n        Janus.debug(answer)\n        // JSON.stringify doesn't work on some WebRTC objects anymore\n        // See https://code.google.com/p/chromium/issues/detail?id=467366\n        var jsep = {\n          'type': answer.type,\n          'sdp': answer.sdp\n        }\n        callbacks.customizeSdp(jsep)\n        answer.sdp = jsep.sdp\n        Janus.log('Setting local description')\n        if(sendVideo && simulcast) {\n          // This SDP munging only works with Chrome\n          if(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n            // FIXME Apparently trying to simulcast when answering breaks video in Chrome...\n            //~ Janus.log(\"Enabling Simulcasting for Chrome (SDP munging)\");\n            //~ answer.sdp = mungeSdpForSimulcasting(answer.sdp);\n            Janus.warn('simulcast=true, but this is an answer, and video breaks in Chrome if we enable it')\n          } else if(Janus.webRTCAdapter.browserDetails.browser !== 'firefox') {\n            Janus.warn('simulcast=true, but this is not Chrome nor Firefox, ignoring')\n          }\n        }\n        config.mySdp = {\n          type: 'answer',\n          sdp: answer.sdp\n        }\n        config.pc.setLocalDescription(answer)\n          .catch(callbacks.error)\n        config.mediaConstraints = mediaConstraints\n        if(!config.iceDone && !config.trickle) {\n          // Don't do anything until we have all candidates\n          Janus.log('Waiting for all candidates...')\n          return\n        }\n        // If transforms are present, notify Janus that the media is end-to-end encrypted\n        if(config.senderTransforms || config.receiverTransforms) {\n          answer['e2ee'] = true\n        }\n        callbacks.success(answer)\n      }, callbacks.error)\n  }\n\n  function sendSDP(handleId, callbacks) {\n    callbacks = callbacks || {}\n    callbacks.success = (typeof callbacks.success == 'function') ? callbacks.success : Janus.noop\n    callbacks.error = (typeof callbacks.error == 'function') ? callbacks.error : Janus.noop\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle, not sending anything')\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    Janus.log('Sending offer/answer SDP...')\n    if(!config.mySdp) {\n      Janus.warn('Local SDP instance is invalid, not sending anything...')\n      return\n    }\n    config.mySdp = {\n      'type': config.pc.localDescription.type,\n      'sdp': config.pc.localDescription.sdp\n    }\n    if(config.trickle === false)\n      config.mySdp['trickle'] = false\n    Janus.debug(callbacks)\n    config.sdpSent = true\n    callbacks.success(config.mySdp)\n  }\n\n  function getVolume(handleId, remote) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return 0\n    }\n    var stream = remote ? 'remote' : 'local'\n    var config = pluginHandle.webrtcStuff\n    if(!config.volume[stream])\n      config.volume[stream] = { value: 0 }\n    // Start getting the volume, if audioLevel in getStats is supported (apparently\n    // they're only available in Chrome/Safari right now: https://webrtc-stats.callstats.io/)\n    if(config.pc.getStats && (Janus.webRTCAdapter.browserDetails.browser === 'chrome' ||\n        Janus.webRTCAdapter.browserDetails.browser === 'safari')) {\n      if(remote && !config.remoteStream) {\n        Janus.warn('Remote stream unavailable')\n        return 0\n      } else if(!remote && !config.myStream) {\n        Janus.warn('Local stream unavailable')\n        return 0\n      }\n      if(!config.volume[stream].timer) {\n        Janus.log('Starting ' + stream + ' volume monitor')\n        config.volume[stream].timer = setInterval(function() {\n          config.pc.getStats()\n            .then(function(stats) {\n              stats.forEach(function (res) {\n                if(!res || res.kind !== 'audio')\n                  return\n                if((remote && !res.remoteSource) || (!remote && res.type !== 'media-source'))\n                  return\n                config.volume[stream].value = (res.audioLevel ? res.audioLevel : 0)\n              })\n            })\n        }, 200)\n        return 0 // We don't have a volume to return yet\n      }\n      return config.volume[stream].value\n    } else {\n      // audioInputLevel and audioOutputLevel seem only available in Chrome? audioLevel\n      // seems to be available on Chrome and Firefox, but they don't seem to work\n      Janus.warn('Getting the ' + stream + ' volume unsupported by browser')\n      return 0\n    }\n  }\n\n  function isMuted(handleId, video) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return true\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return true\n    }\n    if(!config.myStream) {\n      Janus.warn('Invalid local MediaStream')\n      return true\n    }\n    if(video) {\n      // Check video track\n      if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track')\n        return true\n      }\n      return !config.myStream.getVideoTracks()[0].enabled\n    } else {\n      // Check audio track\n      if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track')\n        return true\n      }\n      return !config.myStream.getAudioTracks()[0].enabled\n    }\n  }\n\n  function mute(handleId, video, mute) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return false\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc) {\n      Janus.warn('Invalid PeerConnection')\n      return false\n    }\n    if(!config.myStream) {\n      Janus.warn('Invalid local MediaStream')\n      return false\n    }\n    if(video) {\n      // Mute/unmute video track\n      if(!config.myStream.getVideoTracks() || config.myStream.getVideoTracks().length === 0) {\n        Janus.warn('No video track')\n        return false\n      }\n      config.myStream.getVideoTracks()[0].enabled = !mute\n      return true\n    } else {\n      // Mute/unmute audio track\n      if(!config.myStream.getAudioTracks() || config.myStream.getAudioTracks().length === 0) {\n        Janus.warn('No audio track')\n        return false\n      }\n      config.myStream.getAudioTracks()[0].enabled = !mute\n      return true\n    }\n  }\n\n  function getBitrate(handleId) {\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle || !pluginHandle.webrtcStuff) {\n      Janus.warn('Invalid handle')\n      return 'Invalid handle'\n    }\n    var config = pluginHandle.webrtcStuff\n    if(!config.pc)\n      return 'Invalid PeerConnection'\n    // Start getting the bitrate, if getStats is supported\n    if(config.pc.getStats) {\n      if(!config.bitrate.timer) {\n        Janus.log('Starting bitrate timer (via getStats)')\n        config.bitrate.timer = setInterval(function() {\n          config.pc.getStats()\n            .then(function(stats) {\n              stats.forEach(function (res) {\n                if(!res)\n                  return\n                var inStats = false\n                // Check if these are statistics on incoming media\n                if((res.mediaType === 'video' || res.id.toLowerCase().indexOf('video') > -1) &&\n                    res.type === 'inbound-rtp' && res.id.indexOf('rtcp') < 0) {\n                  // New stats\n                  inStats = true\n                } else if(res.type == 'ssrc' && res.bytesReceived &&\n                    (res.googCodecName === 'VP8' || res.googCodecName === '')) {\n                  // Older Chromer versions\n                  inStats = true\n                }\n                // Parse stats now\n                if(inStats) {\n                  config.bitrate.fps = res.framesPerSecond\n                  config.bitrate.bsnow = res.bytesReceived\n                  config.bitrate.tsnow = res.timestamp\n                  if(config.bitrate.bsbefore === null || config.bitrate.tsbefore === null) {\n                    // Skip this round\n                    config.bitrate.bsbefore = config.bitrate.bsnow\n                    config.bitrate.tsbefore = config.bitrate.tsnow\n                  } else {\n                    // Calculate bitrate\n                    var timePassed = config.bitrate.tsnow - config.bitrate.tsbefore\n                    if(Janus.webRTCAdapter.browserDetails.browser === 'safari')\n                      timePassed = timePassed/1000 // Apparently the timestamp is in microseconds, in Safari\n                    var bitRate = Math.round((config.bitrate.bsnow - config.bitrate.bsbefore) * 8 / timePassed)\n                    if(Janus.webRTCAdapter.browserDetails.browser === 'safari')\n                      bitRate = parseInt(bitRate/1000)\n                    config.bitrate.value = bitRate + ' kbps'\n                    //~ Janus.log(\"Estimated bitrate is \" + config.bitrate.value);\n                    config.bitrate.bsbefore = config.bitrate.bsnow\n                    config.bitrate.tsbefore = config.bitrate.tsnow\n                  }\n                }\n              })\n            })\n        }, 1000)\n      }\n      return config.bitrate\n    } else {\n      Janus.warn('Getting the video bitrate unsupported by browser')\n      return 'Feature unsupported by browser'\n    }\n  }\n\n  function webrtcError(error) {\n    Janus.error('WebRTC error:', error)\n  }\n\n  function cleanupWebrtc(handleId, hangupRequest) {\n    Janus.log('Cleaning WebRTC stuff')\n    var pluginHandle = pluginHandles[handleId]\n    if(!pluginHandle) {\n      // Nothing to clean\n      return\n    }\n    var config = pluginHandle.webrtcStuff\n    if(config) {\n      if(hangupRequest === true) {\n        // Send a hangup request (we don't really care about the response)\n        var request = { 'janus': 'hangup', 'transaction': Janus.randomString(12) }\n        if(pluginHandle.token)\n          request['token'] = pluginHandle.token\n        if(apisecret)\n          request['apisecret'] = apisecret\n        Janus.debug('Sending hangup request (handle=' + handleId + '):')\n        Janus.debug(request)\n        if(websockets) {\n          request['session_id'] = sessionId\n          request['handle_id'] = handleId\n          ws.send(JSON.stringify(request))\n        } else {\n          Janus.httpAPICall(server + '/' + sessionId + '/' + handleId, {\n            verb: 'POST',\n            withCredentials: withCredentials,\n            body: request\n          })\n        }\n      }\n      // Cleanup stack\n      config.remoteStream = null\n      if(config.volume) {\n        if(config.volume['local'] && config.volume['local'].timer)\n          clearInterval(config.volume['local'].timer)\n        if(config.volume['remote'] && config.volume['remote'].timer)\n          clearInterval(config.volume['remote'].timer)\n      }\n      config.volume = {}\n      if(config.bitrate.timer)\n        clearInterval(config.bitrate.timer)\n      config.bitrate.timer = null\n      config.bitrate.bsnow = null\n      config.bitrate.bsbefore = null\n      config.bitrate.tsnow = null\n      config.bitrate.tsbefore = null\n      config.bitrate.value = null\n      if(!config.streamExternal && config.myStream) {\n        Janus.log('Stopping local stream tracks')\n        Janus.stopAllTracks(config.myStream)\n      }\n      config.streamExternal = false\n      config.myStream = null\n      // Close PeerConnection\n      try {\n        config.pc.close()\n      } catch(e) {\n        // Do nothing\n      }\n      config.pc = null\n      config.candidates = null\n      config.mySdp = null\n      config.remoteSdp = null\n      config.iceDone = false\n      config.dataChannel = {}\n      config.dtmfSender = null\n      config.senderTransforms = null\n      config.receiverTransforms = null\n    }\n    pluginHandle.oncleanup()\n  }\n\n  // Helper method to munge an SDP to enable simulcasting (Chrome only)\n  function mungeSdpForSimulcasting(sdp) {\n    // Let's munge the SDP to add the attributes for enabling simulcasting\n    // (based on https://gist.github.com/ggarber/a19b4c33510028b9c657)\n    var lines = sdp.split('\\r\\n')\n    var video = false\n    var ssrc = [ -1 ], ssrc_fid = [ -1 ]\n    var cname = null, msid = null, mslabel = null, label = null\n    var insertAt = -1\n    for(var i=0; i<lines.length; i++) {\n      var mline = lines[i].match(/m=(\\w+) */)\n      if(mline) {\n        var medium = mline[1]\n        if(medium === 'video') {\n          // New video m-line: make sure it's the first one\n          if(ssrc[0] < 0) {\n            video = true\n          } else {\n            // We're done, let's add the new attributes here\n            insertAt = i\n            break\n          }\n        } else {\n          // New non-video m-line: do we have what we were looking for?\n          if(ssrc[0] > -1) {\n            // We're done, let's add the new attributes here\n            insertAt = i\n            break\n          }\n        }\n        continue\n      }\n      if(!video)\n        continue\n      var sim = lines[i].match(/a=ssrc-group:SIM (\\d+) (\\d+) (\\d+)/)\n      if(sim) {\n        Janus.warn('The SDP already contains a SIM attribute, munging will be skipped')\n        return sdp\n      }\n      var fid = lines[i].match(/a=ssrc-group:FID (\\d+) (\\d+)/)\n      if(fid) {\n        ssrc[0] = fid[1]\n        ssrc_fid[0] = fid[2]\n        lines.splice(i, 1); i--\n        continue\n      }\n      if(ssrc[0]) {\n        var match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)')\n        if(match) {\n          cname = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)')\n        if(match) {\n          msid = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)')\n        if(match) {\n          mslabel = match[1]\n        }\n        match = lines[i].match('a=ssrc:' + ssrc[0] + ' label:(.+)')\n        if(match) {\n          label = match[1]\n        }\n        if(lines[i].indexOf('a=ssrc:' + ssrc_fid[0]) === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n        if(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n      }\n      if(lines[i].length == 0) {\n        lines.splice(i, 1); i--\n        continue\n      }\n    }\n    if(ssrc[0] < 0) {\n      // Couldn't find a FID attribute, let's just take the first video SSRC we find\n      insertAt = -1\n      video = false\n      for(var i=0; i<lines.length; i++) {\n        var mline = lines[i].match(/m=(\\w+) */)\n        if(mline) {\n          var medium = mline[1]\n          if(medium === 'video') {\n            // New video m-line: make sure it's the first one\n            if(ssrc[0] < 0) {\n              video = true\n            } else {\n              // We're done, let's add the new attributes here\n              insertAt = i\n              break\n            }\n          } else {\n            // New non-video m-line: do we have what we were looking for?\n            if(ssrc[0] > -1) {\n              // We're done, let's add the new attributes here\n              insertAt = i\n              break\n            }\n          }\n          continue\n        }\n        if(!video)\n          continue\n        if(ssrc[0] < 0) {\n          var value = lines[i].match(/a=ssrc:(\\d+)/)\n          if(value) {\n            ssrc[0] = value[1]\n            lines.splice(i, 1); i--\n            continue\n          }\n        } else {\n          var match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)')\n          if(match) {\n            cname = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)')\n          if(match) {\n            msid = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)')\n          if(match) {\n            mslabel = match[1]\n          }\n          match = lines[i].match('a=ssrc:' + ssrc[0] + ' label:(.+)')\n          if(match) {\n            label = match[1]\n          }\n          if(lines[i].indexOf('a=ssrc:' + ssrc_fid[0]) === 0) {\n            lines.splice(i, 1); i--\n            continue\n          }\n          if(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n            lines.splice(i, 1); i--\n            continue\n          }\n        }\n        if(lines[i].length === 0) {\n          lines.splice(i, 1); i--\n          continue\n        }\n      }\n    }\n    if(ssrc[0] < 0) {\n      // Still nothing, let's just return the SDP we were asked to munge\n      Janus.warn('Couldn\\'t find the video SSRC, simulcasting NOT enabled')\n      return sdp\n    }\n    if(insertAt < 0) {\n      // Append at the end\n      insertAt = lines.length\n    }\n    // Generate a couple of SSRCs (for retransmissions too)\n    // Note: should we check if there are conflicts, here?\n    ssrc[1] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc[2] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc_fid[1] = Math.floor(Math.random()*0xFFFFFFFF)\n    ssrc_fid[2] = Math.floor(Math.random()*0xFFFFFFFF)\n    // Add attributes to the SDP\n    for(var i=0; i<ssrc.length; i++) {\n      if(cname) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' cname:' + cname)\n        insertAt++\n      }\n      if(msid) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' msid:' + msid)\n        insertAt++\n      }\n      if(mslabel) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' mslabel:' + mslabel)\n        insertAt++\n      }\n      if(label) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' label:' + label)\n        insertAt++\n      }\n      // Add the same info for the retransmission SSRC\n      if(cname) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' cname:' + cname)\n        insertAt++\n      }\n      if(msid) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' msid:' + msid)\n        insertAt++\n      }\n      if(mslabel) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' mslabel:' + mslabel)\n        insertAt++\n      }\n      if(label) {\n        lines.splice(insertAt, 0, 'a=ssrc:' + ssrc_fid[i] + ' label:' + label)\n        insertAt++\n      }\n    }\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[2] + ' ' + ssrc_fid[2])\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[1] + ' ' + ssrc_fid[1])\n    lines.splice(insertAt, 0, 'a=ssrc-group:FID ' + ssrc[0] + ' ' + ssrc_fid[0])\n    lines.splice(insertAt, 0, 'a=ssrc-group:SIM ' + ssrc[0] + ' ' + ssrc[1] + ' ' + ssrc[2])\n    sdp = lines.join('\\r\\n')\n    if(!sdp.endsWith('\\r\\n'))\n      sdp += '\\r\\n'\n    return sdp\n  }\n\n  // Helper methods to parse a media object\n  function isAudioSendEnabled(media) {\n    Janus.debug('isAudioSendEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.audio === false)\n      return false // Generic audio has precedence\n    if(media.audioSend === undefined || media.audioSend === null)\n      return true // Default\n    return (media.audioSend === true)\n  }\n\n  function isAudioSendRequired(media) {\n    Janus.debug('isAudioSendRequired:', media)\n    if(!media)\n      return false // Default\n    if(media.audio === false || media.audioSend === false)\n      return false // If we're not asking to capture audio, it's not required\n    if(media.failIfNoAudio === undefined || media.failIfNoAudio === null)\n      return false // Default\n    return (media.failIfNoAudio === true)\n  }\n\n  function isAudioRecvEnabled(media) {\n    Janus.debug('isAudioRecvEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.audio === false)\n      return false // Generic audio has precedence\n    if(media.audioRecv === undefined || media.audioRecv === null)\n      return true // Default\n    return (media.audioRecv === true)\n  }\n\n  function isVideoSendEnabled(media) {\n    Janus.debug('isVideoSendEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.video === false)\n      return false // Generic video has precedence\n    if(media.videoSend === undefined || media.videoSend === null)\n      return true // Default\n    return (media.videoSend === true)\n  }\n\n  function isVideoSendRequired(media) {\n    Janus.debug('isVideoSendRequired:', media)\n    if(!media)\n      return false // Default\n    if(media.video === false || media.videoSend === false)\n      return false // If we're not asking to capture video, it's not required\n    if(media.failIfNoVideo === undefined || media.failIfNoVideo === null)\n      return false // Default\n    return (media.failIfNoVideo === true)\n  }\n\n  function isVideoRecvEnabled(media) {\n    Janus.debug('isVideoRecvEnabled:', media)\n    if(!media)\n      return true // Default\n    if(media.video === false)\n      return false // Generic video has precedence\n    if(media.videoRecv === undefined || media.videoRecv === null)\n      return true // Default\n    return (media.videoRecv === true)\n  }\n\n  function isScreenSendEnabled(media) {\n    Janus.debug('isScreenSendEnabled:', media)\n    if (!media)\n      return false\n    if (typeof media.video !== 'object' || typeof media.video.mandatory !== 'object')\n      return false\n    var constraints = media.video.mandatory\n    if (constraints.chromeMediaSource)\n      return constraints.chromeMediaSource === 'desktop' || constraints.chromeMediaSource === 'screen'\n    else if (constraints.mozMediaSource)\n      return constraints.mozMediaSource === 'window' || constraints.mozMediaSource === 'screen'\n    else if (constraints.mediaSource)\n      return constraints.mediaSource === 'window' || constraints.mediaSource === 'screen'\n    return false\n  }\n\n  function isDataEnabled(media) {\n    Janus.debug('isDataEnabled:', media)\n    if(Janus.webRTCAdapter.browserDetails.browser === 'edge') {\n      Janus.warn('Edge doesn\\'t support data channels yet')\n      return false\n    }\n    if(media === undefined || media === null)\n      return false // Default\n    return (media.data === true)\n  }\n\n  function isTrickleEnabled(trickle) {\n    Janus.debug('isTrickleEnabled:', trickle)\n    return (trickle === false) ? false : true\n  }\n}\n\nexport default Janus\n","import get from 'lodash/get'\nimport find from 'lodash/find'\n\nimport Janus from '@src/lib/janus'\nimport { syndicate } from '@src/lib/page-context'\n\nlet printerWebRTCUrl = (printerId) => `/ws/janus/${printerId}/`\nlet printerSharedWebRTCUrl = (token) => `/ws/share_token/janus/${token}/`\n\nfunction iceServers(authToken) {\n  const turnServer = syndicate()?.turn_server\n  const servers = [\n    {\n      urls: ['stun:stun.l.google.com:19302'],\n    }\n  ]\n\n  if (turnServer) {\n    servers.push(\n      {\n        urls: `turn:${turnServer}:80?transport=udp`,\n        credential: authToken,\n        username: authToken,\n      },\n      {\n        urls: `turn:${turnServer}:80?transport=tcp`,\n        credential: authToken,\n        username: authToken,\n      }\n    );\n  }\n\n  return servers\n}\n\nexport default function WebRTCConnection(streamMode, streamIdToTest) {\n  let h264Webrtc, mjpegWebrtc\n  if (streamMode === undefined && streamIdToTest === undefined) {\n    // The agent is an old version that doesn't support dynamic streaming\n    h264Webrtc = H264WebRTCConnection([0, 1])\n    mjpegWebrtc = MJpegWebRTCConnection([2])\n  } else if (streamMode.includes('h264')) {\n    h264Webrtc = H264WebRTCConnection([streamIdToTest])\n  } else if (streamMode.includes('mjpeg')) {\n    mjpegWebrtc = MJpegWebRTCConnection([streamIdToTest])\n  }\n\n  let self = {\n    callbacks: {},\n    initialized: false,\n    h264WebRTCConn: h264Webrtc,\n    mjpegWebRTCConn: mjpegWebrtc,\n\n    openForShareToken(shareToken) {\n      self.connect(printerSharedWebRTCUrl(shareToken), shareToken)\n    },\n\n    openForPrinter(printerId, authToken) {\n      self.connect(printerWebRTCUrl(printerId), authToken)\n    },\n    connect(wsUri, token) {\n      self.initialized = true\n      if (self.h264WebRTCConn) self.h264WebRTCConn.connect(wsUri, token)\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.connect(wsUri, token)\n    },\n    disconnect() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.janus.destroy()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.janus.destroy()\n    },\n    stopStream() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.stopStream()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.stopStream()\n    },\n    sendData(data) {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.sendData(data) // Data channel in the default stream is used to pass data from client to agent\n    },\n    startStream() {\n      if (self.h264WebRTCConn) self.h264WebRTCConn.startStream()\n      if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.startStream()\n    },\n    setCallbacks(callbacks) {\n        if (self.h264WebRTCConn) self.h264WebRTCConn.setCallbacks(callbacks)\n        if (self.mjpegWebRTCConn) self.mjpegWebRTCConn.setCallbacks(callbacks)\n    },\n  }\n  return self\n}\n\nfunction MJpegWebRTCConnection(streamIdsToTest) {\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest);\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const mjpegStreamExisting =\n        get(stream, 'data') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'data' }) // Janus 1.x format\n\n      if (mjpegStreamExisting && baseConnection.callbacks.onStreamAvailable) {\n        baseConnection.callbacks.onStreamAvailable(baseConnection)\n      }\n    } else {\n      baseConnection.janus.destroy()\n    }\n  };\n\n  baseConnection.onRawData = function (rawData) {\n    if ('onMJpegData' in baseConnection.callbacks) {\n      baseConnection.callbacks.onMJpegData(rawData)\n    }\n  };\n\n  baseConnection.startStream = function () {\n    if (!baseConnection.channelOpen()) {\n      return\n    }\n    const body = { request: 'watch', offer_video: false, id: parseInt(baseConnection.streamId) }\n    baseConnection.streaming?.send({ message: body })\n  };\n  return baseConnection;\n}\n\nfunction H264WebRTCConnection(streamIdsToTest) {\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest);\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const videoStreamExisting =\n        get(stream, 'video') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'video' }) // Janus 1.x format\n\n      if (videoStreamExisting && baseConnection.callbacks.onStreamAvailable) {\n        baseConnection.callbacks.onStreamAvailable(baseConnection)\n      }\n    }\n  };\n  baseConnection.onRawData = function (rawData) {\n    if ('onData' in baseConnection.callbacks) {\n      baseConnection.callbacks.onData(rawData)\n    }\n  };\n\n  baseConnection.startStream = function () {\n    if (!baseConnection.channelOpen()) {\n      return\n    }\n    const body = { request: 'watch', offer_video: true, id: parseInt(baseConnection.streamId) }\n    baseConnection.streaming?.send({ message: body })\n\n    baseConnection.clearBitrateInterval()\n    baseConnection.bitrateInterval = setInterval(function () {\n      if (baseConnection.streaming) {\n        const bitrate = baseConnection.streaming.getBitrate()\n        if (bitrate && bitrate.value) {\n          baseConnection.callbacks.onBitrateUpdated(baseConnection.streaming.getBitrate())\n        } else {\n          baseConnection.callbacks.onBitrateUpdated({ value: null })\n        }\n      } else {\n        baseConnection.callbacks.onBitrateUpdated({ value: null })\n      }\n    }, 5000)\n  };\n  return baseConnection;\n}\n\nexport function DataChannelOnlyWebRTCConnection(streamIdsToTest) {\n\n  let baseConnection = BaseWebRTCConnection(streamIdsToTest); // webcamName is null for data channel-only WebRTC\n\n  baseConnection.openForPrinter = function (printerId, authToken) {\n    baseConnection.connect(printerWebRTCUrl(printerId), authToken)\n  };\n\n  baseConnection.infoSuccessCallback = function (result, pluginHandle) {\n    let stream = get(result, 'info')\n    if (stream) {\n      baseConnection.streamId = stream.id\n      baseConnection.streaming = pluginHandle\n\n      const dataStreamExisting =\n        get(stream, 'data') || // Janus 0.x format\n        find(get(stream, 'media', []), { type: 'data' }) // Janus 1.x format\n\n      if (dataStreamExisting) {\n        baseConnection.startStream();\n      } else {\n        baseConnection.close();\n      }\n    }\n  };\n\n  baseConnection.onRawData = function (rawData) {\n    baseConnection.callbacks.onData(rawData);\n  };\n\n  return baseConnection;\n}\n\nfunction BaseWebRTCConnection(streamIdsToTest) {\n  let self = {\n    callbacks: {},\n    streamId: undefined,\n    streaming: undefined,\n    bitrateInterval: null,\n\n    setCallbacks(callbacks) {\n      self.callbacks = {...self.callbacks, ...callbacks};\n    },\n\n    connect(wsUri, token) {\n      Janus.init({\n        debug: 'all',\n        callback: () => {\n          if (!Janus.isWebrtcSupported()) {\n            return\n          }\n          self.connectJanusWebSocket(wsUri, token)\n        },\n      })\n    },\n\n    connectJanusWebSocket(wsUri, token) {\n      self.janus = new Janus({\n        server:\n          window.location.protocol.replace('http', 'ws') + '//' + window.location.host + wsUri,\n        iceServers: iceServers(token),\n        ipv6: true,\n        success: () => {\n          self.janus.attach({\n            plugin: 'janus.plugin.streaming',\n            opaqueId: 'streamingtest-' + Janus.randomString(12),\n            success: function (pluginHandle) {\n              streamIdsToTest.forEach((streamIdToTest) => {\n                const body = { request: 'info', id: streamIdToTest }\n                Janus.debug('Sending message (' + JSON.stringify(body) + ')')\n                pluginHandle.send({\n                  message: body,\n                  success: function(result) { self.infoSuccessCallback(result, pluginHandle) },\n                })\n              })\n            },\n            error: function (error) {\n              Janus.error('  -- Error attaching plugin... ', error)\n              self.janus.destroy()\n            },\n            onmessage: function (msg, jsep) {\n              self.onMessage(msg, jsep)\n            },\n            onremotestream: function (stream) {\n              Janus.debug(' ::: Got a remote stream :::')\n              Janus.debug(stream)\n              if ('onRemoteStream' in self.callbacks) {\n                self.callbacks.onRemoteStream(stream)\n              }\n            },\n            ontrackmuted: function () {\n              if ('onTrackMuted' in self.callbacks) {\n                self.callbacks.onTrackMuted()\n              }\n            },\n            ontrackunmuted: function () {\n              if ('onTrackUnmuted' in self.callbacks) {\n                self.callbacks.onTrackUnmuted()\n              }\n            },\n            slowLink: function (uplink, lost) {\n              if ('onSlowLink' in self.callbacks) {\n                self.callbacks.onSlowLink(lost)\n              }\n            },\n            ondataopen: function () {},\n            ondata: self.onRawData,\n            oncleanup: function () {\n              if ('onDefaultStreamCleanup' in self.callbacks) {\n                self.callbacks.onDefaultStreamCleanup()\n              }\n            },\n          })\n        },\n        error(e) {\n          Janus.error('  -- Error -- ', e)\n          self.janus.destroy()\n        },\n        destroyed() {\n          self.streaming = undefined\n          self.streamId = undefined\n          self.clearBitrateInterval()\n        },\n      })\n    },\n    onMessage(msg, jsep) {\n      let self = this\n      Janus.debug(' ::: Got a message :::')\n      Janus.debug(msg)\n      let result = msg['result']\n      if (result !== null && result !== undefined) {\n        if (result['status'] !== undefined && result['status'] !== null) {\n          var status = result['status']\n          if (status === 'starting') console.log('Starting')\n          else if (status === 'started') console.log('Started')\n          else if (status === 'stopped') {\n            self.stopStream()\n          }\n        }\n      } else if (msg['error'] !== undefined && msg['error'] !== null) {\n        Janus.error(msg)\n        self.stopStream()\n        return\n      }\n      if (jsep !== undefined && jsep !== null) {\n        // Offer from the plugin, let's answer\n        self.streaming?.createAnswer({\n          jsep: jsep,\n          // We want recvonly audio/video and, if negotiated, datachannels\n          media: { audioSend: false, videoSend: false, data: true },\n          success: function (jsep) {\n            Janus.debug('Got SDP!')\n            Janus.debug(jsep)\n            var body = { request: 'start' }\n            self.streaming?.send({ message: body, jsep: jsep })\n          },\n          error: function (error) {\n            Janus.error('WebRTC error:', error)\n          },\n        })\n      }\n    },\n    channelOpen() {\n      return !(self.streamId === undefined || self.streaming === undefined)\n    },\n    startStream() {\n      if (!self.channelOpen()) {\n        return\n      }\n      const body = { request: 'watch', offer_video: false, id: parseInt(self.streamId) }\n      self.streaming?.send({ message: body })\n    },\n    stopStream() {\n      self.clearBitrateInterval()\n      if (!self.channelOpen()) {\n        return\n      }\n      const body = { request: 'stop' }\n      self.streaming?.send({ message: body })\n      self.streaming?.hangup()\n    },\n    sendData(data) {\n      if (self.channelOpen()) {\n        self.streaming?.data({ text: data, success: () => {} })\n      }\n    },\n    clearBitrateInterval() {\n      if (self.bitrateInterval) {\n        clearInterval(self.bitrateInterval)\n        self.bitrateInterval = null\n        self.callbacks.onBitrateUpdated({ value: null })\n      }\n    },\n  }\n\n  return self\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.slowLinkLoss > 50),expression:\"slowLinkLoss > 50\"}],ref:\"slowLinkWrapper\",staticClass:\"slow-link-wrapper\",on:{\"click\":_vm.slowLinkClicked,\"mouseenter\":function($event){_vm.fixSlowLinkTextWidth()\n      _vm.slowLinkShowing = true\n      _vm.slowLinkHiding = false},\"mouseleave\":function($event){_vm.fixSlowLinkTextWidth()\n      _vm.slowLinkShowing = false\n      _vm.slowLinkHiding = true}}},[_vm._m(0),_c('div',{ref:\"slowLinkText\",staticClass:\"text\",class:{\n        'show-and-hide': !_vm.slowLinkShowing && !_vm.slowLinkHiding,\n        showing: _vm.slowLinkShowing && !_vm.slowLinkHiding,\n        hiding: !_vm.slowLinkShowing && _vm.slowLinkHiding,\n      }},[_vm._v(\" \"+_vm._s(_vm.$t(\"Video frames dropped\"))+\" \")])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.trackMuted),expression:\"trackMuted\"}],staticClass:\"muted-status-wrapper\"},[_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Buffering...\")))]),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.showMutedStatusDescription($event)}}},[_vm._v(_vm._s(_vm.$t(\"Why is it stuck?\")))])]),(\n      _vm.isVideoAvailable && !_vm.autoplay && (_vm.isBasicStreamingReadyToPlay || _vm.isBasicStreamingFrozen)\n    )?_c('b-button',{staticClass:\"centered-element p-0\",attrs:{\"disabled\":_vm.isBasicStreamingFrozen},on:{\"click\":_vm.onPlayBtnClicked}},[(_vm.isBasicStreamingReadyToPlay)?_c('i',{staticClass:\"fas fa-play ml-1\"}):_vm._e(),(_vm.isBasicStreamingFrozen)?_c('span',{staticClass:\"medium\"},[_vm._v(_vm._s(_vm.remainingSecondsUntilNextCycle)+\"s\")]):_vm._e()]):_vm._e(),(_vm.trackMuted || _vm.videoLoading)?_c('b-spinner',{staticClass:\"centered-element\",attrs:{\"label\":\"Buffering...\"}}):_vm._e(),(_vm.taggedSrc && !_vm.showMJpeg && !_vm.showVideo)?_c('div',{staticClass:\"streaming-info overlay-info small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Real-time stream unavailable, showing last captured image\"))+\" \")]):_vm._e(),(_vm.isVideoAvailable)?_c('div',[((!_vm.autoplay && _vm.isBasicStreamingInProgress) || _vm.currentBitrate)?_c('div',{staticClass:\"streaming-info overlay-info small\",class:{ clickable: _vm.isBasicStreamingInProgress },on:{\"click\":_vm.onInfoClicked}},[(_vm.isBasicStreamingInProgress)?_c('div',{staticClass:\"text-success\"},[_vm._v(\" \"+_vm._s(_vm.remainingSecondsCurrentVideoCycle)+\" \")]):_vm._e(),(_vm.currentBitrate)?_c('div',[_vm._v(_vm._s(_vm.currentBitrate))]):_vm._e()]):_vm._e(),(!_vm.autoplay && (_vm.isBasicStreamingReadyToPlay || _vm.isBasicStreamingFrozen))?_c('div',{staticClass:\"streaming-guide overlay-info\",on:{\"click\":_vm.onInfoClicked}},[(_vm.isBasicStreamingReadyToPlay)?_c('div',{staticClass:\"message\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Webcam streams up to 5 FPS for Free\"))+\" \")]):_vm._e(),(_vm.isBasicStreamingFrozen)?_c('div',{staticClass:\"message text-warning\"},[_vm._v(\" \"+_vm._s(_vm.remainingSecondsUntilNextCycle)+\"s left in the cooldown period \")]):_vm._e(),_c('a',{staticClass:\"learn-more\",attrs:{\"href\":\"#\"}},[_vm._v(_vm._s(_vm.$t(\"Learn more...\")))])]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"image-container\"},[_c('img',{staticClass:\"webcamImage\",style:(_vm.webcamStyle),attrs:{\"src\":require('@static/img/print-padded.png')}}),(_vm.taggedSrc)?_c('img',{staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"src\":_vm.taggedSrc,\"alt\":_vm.printer.name + ' current image'}}):_vm._e(),_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showMJpeg),expression:\"showMJpeg\"}],staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"src\":_vm.mjpgSrc}}),_c('video',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showVideo),expression:\"showVideo\"}],ref:\"video\",staticClass:\"webcamImage stackedImage\",style:(_vm.webcamStyle),attrs:{\"poster\":_vm.taggedSrc,\"autoplay\":\"\",\"muted\":\"\",\"playsinline\":\"\"},domProps:{\"muted\":true},on:{\"loadstart\":function($event){return _vm.onLoadStart()},\"canplay\":function($event){return _vm.onCanPlay()}}})]),_c('div',{staticClass:\"extra-controls\"},[(_vm.showVideo || _vm.showVideo || _vm.taggedSrc)?_c('div',{staticClass:\"video-control-btn\",on:{\"click\":_vm.onRotateRightClicked}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-rotate-right\"}})],1):_vm._e()])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"icon bg-warning\"},[_c('i',{staticClass:\"fas fa-exclamation\"})])\n}]\n\nexport { render, staticRenderFns }","import { isLocalStorageSupported } from '@static/js/utils'\n\nexport default function ViewingThrottle(printerId, countDownCallback) {\n  const localStorageItemId = `tsNextVideoCycle-${printerId}`\n  let self = {\n    countDownTimer: null,\n  }\n\n  self.startOrResumeVideoCycle = function () {\n    if (!self.countDownTimer) {\n      self.countDownTimer = setInterval(() => self.countDown(), 1000)\n    }\n  }\n\n  self.resumeVideoCycle = function () {\n    if (remainingSeconds < 60 && !self.countDownTimer) {\n      self.countDownTimer = setInterval(() => self.countDown(), 1000)\n    }\n  }\n\n  self.countDown = function () {\n    self.updateRemainingSeconds(remainingSeconds - 1)\n\n    if (isLocalStorageSupported()) {\n      localStorage.setItem(localStorageItemId, new Date().getTime() / 1000 + remainingSeconds)\n    }\n\n    if (remainingSeconds < 0) {\n      self.updateRemainingSeconds(60)\n      clearInterval(this.countDownTimer)\n      this.countDownTimer = null\n    }\n  }\n\n  self.updateRemainingSeconds = function (newValue) {\n    remainingSeconds = newValue\n    const remainingViewableSeconds = remainingSeconds - 30\n    const remainingSecondsUntilNextCycle = remainingSeconds > 30 ? -1 : remainingSeconds\n    countDownCallback(remainingViewableSeconds, remainingSecondsUntilNextCycle)\n  }\n\n  let remainingSeconds\n  if (isLocalStorageSupported()) {\n    const tsNextVideoCycle = parseFloat(localStorage.getItem(localStorageItemId))\n    const now = new Date().getTime() / 1000\n    if (!tsNextVideoCycle || now > tsNextVideoCycle) {\n      self.updateRemainingSeconds(60)\n    } else {\n      self.updateRemainingSeconds(Math.round(tsNextVideoCycle - now))\n    }\n  } else {\n    self.updateRemainingSeconds(60)\n  }\n\n  return self\n}\n","<template>\n  <div>\n    <div\n      v-show=\"slowLinkLoss > 50\"\n      ref=\"slowLinkWrapper\"\n      class=\"slow-link-wrapper\"\n      @click=\"slowLinkClicked\"\n      @mouseenter=\"\n        fixSlowLinkTextWidth()\n        slowLinkShowing = true\n        slowLinkHiding = false\n      \"\n      @mouseleave=\"\n        fixSlowLinkTextWidth()\n        slowLinkShowing = false\n        slowLinkHiding = true\n      \"\n    >\n      <div class=\"icon bg-warning\">\n        <i class=\"fas fa-exclamation\"></i>\n      </div>\n      <div\n        ref=\"slowLinkText\"\n        class=\"text\"\n        :class=\"{\n          'show-and-hide': !slowLinkShowing && !slowLinkHiding,\n          showing: slowLinkShowing && !slowLinkHiding,\n          hiding: !slowLinkShowing && slowLinkHiding,\n        }\"\n      >\n        {{$t(\"Video frames dropped\")}}\n      </div>\n    </div>\n    <div v-show=\"trackMuted\" class=\"muted-status-wrapper\">\n      <div class=\"text\">{{ $t(\"Buffering...\") }}</div>\n      <a href=\"#\" @click=\"showMutedStatusDescription($event)\">{{ $t(\"Why is it stuck?\") }}</a>\n    </div>\n    <b-button\n      v-if=\"\n        isVideoAvailable && !autoplay && (isBasicStreamingReadyToPlay || isBasicStreamingFrozen)\n      \"\n      class=\"centered-element p-0\"\n      :disabled=\"isBasicStreamingFrozen\"\n      @click=\"onPlayBtnClicked\"\n    >\n      <i v-if=\"isBasicStreamingReadyToPlay\" class=\"fas fa-play ml-1\"></i>\n      <span v-if=\"isBasicStreamingFrozen\" class=\"medium\"\n        >{{ remainingSecondsUntilNextCycle }}s</span\n      >\n    </b-button>\n    <b-spinner\n      v-if=\"trackMuted || videoLoading\"\n      class=\"centered-element\"\n      label=\"Buffering...\"\n    ></b-spinner>\n    <div v-if=\"taggedSrc && !showMJpeg && !showVideo\" class=\"streaming-info overlay-info small\">\n      {{$t(\"Real-time stream unavailable, showing last captured image\")}}\n    </div>\n    <div v-if=\"isVideoAvailable\">\n      <!-- show countdown and bitrate while streaming -->\n      <div\n        v-if=\"(!autoplay && isBasicStreamingInProgress) || currentBitrate\"\n        class=\"streaming-info overlay-info small\"\n        :class=\"{ clickable: isBasicStreamingInProgress }\"\n        @click=\"onInfoClicked\"\n      >\n        <div v-if=\"isBasicStreamingInProgress\" class=\"text-success\">\n          {{ remainingSecondsCurrentVideoCycle }}\n        </div>\n        <div v-if=\"currentBitrate\">{{ currentBitrate }}</div>\n      </div>\n      <!-- show full-width info message -->\n      <div\n        v-if=\"!autoplay && (isBasicStreamingReadyToPlay || isBasicStreamingFrozen)\"\n        class=\"streaming-guide overlay-info\"\n        @click=\"onInfoClicked\"\n      >\n        <div v-if=\"isBasicStreamingReadyToPlay\" class=\"message\">\n          {{$t(\"Webcam streams up to 5 FPS for Free\")}}\n        </div>\n        <div v-if=\"isBasicStreamingFrozen\" class=\"message text-warning\">\n          {{ remainingSecondsUntilNextCycle }}s left in the cooldown period\n        </div>\n        <a href=\"#\" class=\"learn-more\">{{ $t(\"Learn more...\") }}</a>\n      </div>\n    </div>\n    <div class=\"image-container\">\n      <img\n        class=\"webcamImage\"\n        :style=\"webcamStyle\"\n        :src=\"require('@static/img/print-padded.png')\"\n      />\n      <img\n        v-if=\"taggedSrc\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n        :src=\"taggedSrc\"\n        :alt=\"printer.name + ' current image'\"\n      />\n      <img\n        :src=\"mjpgSrc\"\n        v-show=\"showMJpeg\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n      />\n      <video\n        v-show=\"showVideo\"\n        ref=\"video\"\n        class=\"webcamImage stackedImage\"\n        :style=\"webcamStyle\"\n        :poster=\"taggedSrc\"\n        autoplay\n        muted\n        playsinline\n        @loadstart=\"onLoadStart()\"\n        @canplay=\"onCanPlay()\"\n      >\n      </video>\n    </div>\n\n    <div class=\"extra-controls\">\n      <div\n        v-if=\"showVideo || showVideo || taggedSrc\"\n        class=\"video-control-btn\"\n        @click=\"onRotateRightClicked\"\n      >\n        <font-awesome-icon icon=\"fa-solid fa-rotate-right\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport ifvisible from 'ifvisible'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport Janus from '@src/lib/janus'\nimport { toArrayBuffer } from '@src/lib/utils'\nimport ViewingThrottle from '@src/lib/viewing-throttle'\n\nfunction MJpegStreamDecoder(onFrame) {\n  const self = {\n    onFrame,\n    contentLength: NaN,\n    imageBuffer: '',\n    bytesRead: 0,\n    originalJpgLength: 0,\n  }\n\n  self.onMJpegChunk = function (maybeBin) {\n    toArrayBuffer(maybeBin, (arrayBuffer) => {\n      const value = new TextDecoder('utf-8').decode(new Uint8Array(arrayBuffer))\n      if (self.contentLength) {\n        self.imageBuffer += value\n        self.bytesRead += value.length\n\n        if (self.bytesRead >= self.contentLength) {\n          const jpg = self.imageBuffer\n          const jpgLength = self.originalJpgLength\n          self.contentLength = NaN\n          self.imageBuffer = ''\n          self.bytesRead = 0\n          self.originalJpgLength = 0\n          self.onFrame(jpg, jpgLength)\n        }\n      } else {\n        if (value.slice(0, 2) == '\\r\\n' && value.slice(value.length - 2) == '\\r\\n') {\n          // if (isEqual(value.slice(0, 2), crlf) && isEqual(value.slice(value.byteLength-2), crlf) ) {\n          // const lengthHeaders = (new TextDecoder(\"utf-8\")).decode( value.slice(2, value.byteLength - 2) ).split(':');\n          const lengthHeaders = value.slice(2, value.length - 2).split(':')\n          self.contentLength = parseInt(lengthHeaders[0])\n          self.originalJpgLength = parseInt(lengthHeaders[1])\n        }\n      }\n    })\n  }\n\n  return self\n}\n\nexport default {\n  name: 'StreamingBox',\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    webrtc: {\n      type: Object,\n      default: null,\n    },\n    webcam: {\n      type: Object,\n      default: null,\n    },\n    halfHeight: {\n      type: Boolean,\n      default: false,\n    },\n    autoplay: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      stickyStreamingSrc: null,\n      isVideoAvailable: false,\n      isVideoVisible: false,\n      remainingSecondsCurrentVideoCycle: 30,\n      remainingSecondsUntilNextCycle: -1,\n      currentBitrate: null,\n      slowLinkLoss: 0,\n      slowLinkShowing: false, // show on mousenter\n      slowLinkHiding: false, // hide on moseleave\n      trackMuted: false,\n      videoLoading: false,\n      mjpgSrc: null,\n      localStorageRotationKey: `${this.printer.id}_${this.webcam?.stream_id || 0}`,\n      customRotationDeg: 0,\n    }\n  },\n\n  computed: {\n    showVideo() {\n      return this.isVideoVisible && this.stickyStreamingSrc !== 'IMAGE'\n    },\n    showMJpeg() {\n      return this.mjpgSrc && this.stickyStreamingSrc !== 'IMAGE'\n    },\n    videoRotationDeg() {\n      const rotation = +(this.webcam?.rotation || 0) + this.customRotationDeg\n      return rotation % 360\n    },\n    webcamVideoHeight() {\n      switch (this.printer.settings.ratio169) {\n        case true:\n          return 540\n        case false:\n          return 720\n        default:\n          return 720\n      }\n    },\n    taggedSrc() {\n      if (!this.webcam || this.webcam?.is_primary_camera) {\n        return  get(this.printer, 'pic.img_url', null)\n      }\n      return null\n    },\n\n    // streaming timeline\n    isBasicStreamingInProgress() {\n      return (\n        this.remainingSecondsCurrentVideoCycle > 0 && this.remainingSecondsCurrentVideoCycle < 30\n      )\n    },\n    isBasicStreamingReadyToPlay() {\n      return (\n        !this.isVideoVisible &&\n        !this.trackMuted &&\n        !this.videoLoading &&\n        (this.remainingSecondsCurrentVideoCycle == 30 || this.remainingSecondsUntilNextCycle == 0)\n      )\n    },\n    isBasicStreamingFrozen() {\n      return this.remainingSecondsUntilNextCycle > 0 && !this.isVideoVisible\n    },\n    basicStreamingInWebrtc() {\n      return this.printer.isAgentVersionGte('2.1.0', '0.3.0')\n    },\n    webcamStyle() {\n      const maxHeight = window.innerHeight / (this.halfHeight ? 2 : 1) - 75\n      const output = {\n          transform: this.generateTransform(\n              this.webcam?.flipH ?? false,\n              this.webcam?.flipV ?? false,\n              this.videoRotationDeg ?? 0\n          ),\n          aspectRatio: 16 / 9,\n          maxHeight: maxHeight + 'px',\n          maxWidth: 'auto',\n      }\n\n      if (this.webcam?.streamRatio) {\n          const [width, height] = this.webcam.streamRatio.split(':').map(Number)\n          output.aspectRatio = width / height\n          output.maxWidth = (window.innerHeight - 155) * output.aspectRatio + 'px'\n      }\n\n      if (this.webcam?.streamRatio && [90, 270].includes(this.videoRotationDeg)) {\n          if (output.transform === 'none') output.transform = ''\n          const scale = 1 / output.aspectRatio\n          output.transform += ' rotate(' + this.videoRotationDeg + 'deg) scale(' + scale + ')'\n      }\n\n      return output\n    },\n  },\n  watch: {\n    webrtc: {\n      handler: 'initWebRTC',\n    },\n  },\n  created() {\n    this.customRotationDeg = getLocalPref('webcamRotationDeg', 0, this.localStorageRotationKey)\n    this.mjpegStreamDecoder = new MJpegStreamDecoder((jpg, l) => {\n      this.mjpgSrc = `data:image/jpg;base64,${jpg}`\n      this.onCanPlay()\n    })\n    if (!this.autoplay) {\n      this.videoLimit = ViewingThrottle(this.printer.id, this.countDownCallback)\n    }\n    this.initWebRTC()\n    ifvisible.on('blur', () => {\n      if (this.webrtc) {\n        this.webrtc.stopStream()\n      }\n    })\n    ifvisible.on('focus', () => {\n      if (this.webrtc && this.autoplay) {\n        this.webrtc.startStream()\n      }\n    })\n  },\n\n  methods: {\n    initWebRTC() {\n      if (this.webrtc) {\n        this.webrtc.setCallbacks({\n          onStreamAvailable: this.onStreamAvailable,\n          onRemoteStream: this.onWebRTCRemoteStream,\n          onDefaultStreamCleanup: () => (this.isVideoVisible = false),\n          onSlowLink: this.onSlowLink,\n          onTrackMuted: () => (this.trackMuted = true),\n          onTrackUnmuted: () => (this.trackMuted = false),\n          onBitrateUpdated: (bitrate) => {\n            this.currentBitrate = bitrate.value\n          },\n          onMJpegData: this.mjpegStreamDecoder.onMJpegChunk,\n        })\n      }\n    },\n    onRotateRightClicked() {\n      this.customRotationDeg = this.customRotationDeg + 90;\n      setLocalPref('webcamRotationDeg', this.customRotationDeg % 360, this.localStorageRotationKey)\n      this.$emit('onRotateRightClicked', this.customRotationDeg);\n    },\n    onCanPlay() {\n      this.videoLoading = false\n      if (!this.autoplay) {\n        this.videoLimit.startOrResumeVideoCycle()\n      }\n    },\n    onLoadStart() {\n      this.videoLoading = true\n    },\n    onStreamAvailable(webrtcConn) {\n      if (this.autoplay) {\n        webrtcConn.startStream()\n      } else {\n        if (!this.basicStreamingInWebrtc) {\n          return\n        }\n        if (!this.autoplay && this.isBasicStreamingInProgress) {\n          webrtcConn.startStream()\n        }\n        this.videoLimit.resumeVideoCycle()\n      }\n      this.isVideoAvailable = true\n    },\n    onWebRTCRemoteStream(stream) {\n      Janus.attachMediaStream(this.$refs.video, stream)\n\n      const videoTracks = stream.getVideoTracks()\n      if (videoTracks === null || videoTracks === undefined || videoTracks.length === 0) {\n        // No remote video\n        this.isVideoVisible = false\n      } else {\n        this.isVideoVisible = true\n      }\n    },\n\n    /** Free user streaming **/\n\n    countDownCallback(remainingSecondsCurrentVideoCycle, remainingSecondsUntilNextCycle) {\n      if (this.remainingSecondsCurrentVideoCycle > 0 && remainingSecondsCurrentVideoCycle <= 0) {\n        this.webrtc.stopStream()\n      }\n      this.remainingSecondsCurrentVideoCycle = remainingSecondsCurrentVideoCycle\n      this.remainingSecondsUntilNextCycle = remainingSecondsUntilNextCycle\n    },\n\n    onInfoClicked() {\n  if (this.autoplay) {\n    return;\n  }\n  this.$swal.Prompt.fire({\n    title: `${this.$i18next.t(`Upgrade for Better Streaming`)}`,\n    html: `\n      <p>${this.$i18next.t(\"Because you are now on the\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/upgrade-to-pro/?source=basic_streaming')}\">${this.$i18next.t(\"{brandName} Cloud Free plan\",{brandName:this.$syndicateText.brandName})}</a>:</p>\n      <ul>\n        <li>${this.$i18next.t(\"Streaming is limited to 5 FPS (frames per second).\")}</li>\n        <li>${this.$i18next.t(\"After 30 seconds of streaming there is a 30-second cooldown before you can resume streaming.\")}</li>\n      </ul>\n      <p>${this.$i18next.t(\"Support the {brandName} project by\",{brandName:this.$syndicateText.brandName})} <a href=\"${this.getAppUrl('/ent_pub/pricing/?source=basic_streaming')}\">${this.$i18next.t(\"upgrading to the Pro plan for little more than 1 Starbucks a month.\")}</a></p> ${this.$i18next.t(\"The Pro plan offers many perks, including the\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-streaming-for-human-eyes/?source=basic_streaming')}\">${this.$i18next.t(\"Premium Streaming\")}</a>:</p>\n      <ul>\n        <li>${this.$i18next.t(\"Smooth 25 FPS.\")}</li>\n        <li>${this.$i18next.t(\"Unlimited streaming with no cooldowns.\")}</li>\n      </ul>\n    `,\n    showCloseButton: true,\n      });\n    },\n\n    /** End of free user streaming **/\n\n    /** Video warning handling */\n\n    onPlayBtnClicked() {\n      this.webrtc.startStream()\n    },\n\n    fixSlowLinkTextWidth() {\n      const width = window.getComputedStyle(this.$refs.slowLinkText).width\n      this.$refs.slowLinkText.style.width = width\n    },\n\n    onSlowLink(loss) {\n      this.slowLinkLoss += loss\n    },\n\n    slowLinkClicked() {\n      this.slowLinkShowing = false;\n      this.slowLinkHiding = false;\n      this.slowLinkLoss = 0;\n\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Video frames dropped')}`,\n        html: `\n          <p>${this.$i18next.t(\"The video frames are getting dropped because there is most likely a bandwidth bottleneck along the route they travel from your Raspberry Pi to your computer. The bottleneck can be anywhere, but in most cases,\")} <Text bold>${this.$i18next.t(\"it is either your computer's internet connection, or your Raspberry Pi's\")}</Text>.</p>\n          <p>${this.$i18next.t(\"Make sure your computer is connected to the same network as your Pi. If you still see this warning, you need to trouble-shoot your computer's Wi-Fi connection, probably by moving closer to the Wi-Fi router.\")}</p>\n          <p>${this.$i18next.t(\"If the webcam stream is smooth when your computer is on the same Wi-Fi network as your Pi, the bottleneck is likely with the upload speed of your internet connection. You need to run a speed test to make sure you have high-enough upload speed, as well as\")} <b>${this.$i18next.t(\"low latency (ping)\")}</b>.</p>\n          <p>${this.$i18next.t(\"Check out\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-feed-is-laggy/')}\">${this.$i18next.t(\"the step-by-step trouble-shooting guide.\")}</a></p>\n        `,\n        showCloseButton: true,\n      });\n    },\n\n    showMutedStatusDescription(event) {\n      event.preventDefault()\n\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Webcam stream buffering')}`,\n        html: `\n          <p>${this.$i18next.t(\"When you see the messaging about webcam stream is 'buffering' occasionally, you can just reload the page. If this message repeatedly appears, it may indicate one of the problems\")}:</p>\n          <p class=\"lead\">${this.$i18next.t(\"1. A constricted video stream on your Raspberry Pi. The most common reasons are\")}:</p>\n          <ul>\n            <li>${this.$i18next.t(\"Camera resolution is set too high.\")}</li>\n            <li>${this.$i18next.t(\"Camera framerate is set too high.\")}</li>\n            <li>${this.$i18next.t(\"The upload speed of your Raspberry Pi is too low.\")}</li>\n          </ul>\n          <p class=\"lead\">${this.$i18next.t(\"2. The internet connection of your computer or phone is not fast enough.\")}</p>\n          <p class=\"lead\">${this.$i18next.t(\"3. Your webcam is not properly connected to your Raspberry Pi.\")}</p>\n          <br>\n          <p>${this.$i18next.t(\"Check\")} <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/webcam-feed-is-laggy')}\">${this.$i18next.t(\"this step-by-step troubleshooting guide\")}</a>.</p>\n        `,\n        showCloseButton: true,\n      })\n    },\n    generateTransform(flip_horizontal, flip_vertical, rotation) {\n        let transforms = ''\n        if (flip_horizontal) transforms += ' scaleX(-1)'\n        if (flip_vertical) transforms += ' scaleY(-1)'\n        \n        // Apply rotation for all degrees, not just 180\n        if (rotation && rotation !== 0) {\n            transforms += ` rotate(${rotation}deg)`\n        }\n\n        // return transform when exist\n        if (transforms.trimStart().length) return transforms.trimStart()\n\n        // return none as fallback\n        return 'none'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.image-container\n  position: relative\n  width: 100%\n  height: 100%\n\n.webcamImage\n  width: 100%\n  height: 100%\n  object-fit: contain\n\n.stackedImage\n  position: absolute\n  top: 0\n  left: 0\n\n.centered-element\n  position: absolute\n  width: 3rem\n  height: 3rem\n  top: calc(50% - 1.5rem)\n  left: calc(50% - 1.5rem)\n  z-index: 99\n\n.overlay-info\n  position: absolute\n  right: 0\n  top: 0\n  z-index: 99\n  background-color: rgb(0 0 0 / .5)\n  padding: 4px 8px\n\n.streaming-info\n  text-align: right\n  &.clickable\n    cursor: pointer\n\n.streaming-guide\n  left: 0\n  display: flex\n  justify-content: space-between\n  cursor: pointer\n\n  @media (max-width: 576px)\n    font-size: .8rem\n\n  &:hover .learn-more\n    color: var(--color-primary-hover)\n\n.slow-link-wrapper\n  $height: 24px\n  position: absolute\n  height: $height\n  z-index: 10\n  background-color: rgb(0 0 0 / .2)\n  border-radius: $height\n  top: 10px\n  left: 10px\n  padding-left: $height\n  line-height: $height\n  font-size: 14px\n  width: auto\n\n  &:hover\n    cursor: pointer\n\n  .text\n    width: 0\n    height: $height\n    overflow: hidden\n    text-align: center\n    opacity: 0\n\n    &.show-and-hide\n      animation-name: showAndHideText\n      animation-duration: 3s\n\n    &.showing\n      animation-name: showText\n      animation-duration: .4s\n      animation-fill-mode: forwards\n\n    &.hiding\n      animation-name: hideText\n      animation-duration: .4s\n      animation-fill-mode: forwards\n\n    $widthFull: 160px\n    $paddingRightFull: 10px\n\n    @keyframes showText\n      from\n        opacity: 0\n      99%\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 0\n      to\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 1\n\n    @keyframes hideText\n      from\n        opacity: 1\n      1%\n        opacity: 0\n      to\n        width: 0\n        padding-right: 0\n        opacity: 0\n\n    @keyframes showAndHideText\n      0%\n        width: 0\n        opacity: 0\n      19%\n        width: $widthFull\n        padding-right: $paddingRightFull\n        opacity: 0\n      20%\n        opacity: 1\n      80%\n        opacity: 1\n        width: $widthFull\n        padding-right: $paddingRightFull\n      81%\n        opacity: 0\n      100%\n        width: 0\n        padding-right: 0\n        opacity: 0\n\n  .icon\n    width: 20px\n    height: 20px\n    border-radius: 10px\n    position: absolute\n    top: 2px\n    left: 2px\n    font-size: 12px\n    line-height: 20px\n    text-align: center\n    color: var(--color-on-warning)\n\n.muted-status-wrapper\n  position: absolute\n  width: 100%\n  z-index: 10\n  bottom: 0\n  left: 0\n  background-color: var(--color-overlay)\n  text-align: center\n  padding: 10px 0\n\n.poster-placeholder\n  $size: 100px\n  color: rgb(255 255 255 / .2)\n  width: $size\n  height: $size\n  position: absolute\n  left: calc(50% - $size / 2)\n  top: calc(50% - $size / 2)\n\n.extra-controls\n  position: absolute\n  display: flex\n  flex-direction: row\n  right: 0\n  bottom: 0\n  padding: .5rem\n  .video-control-btn\n    width: 2rem\n    height: 2rem\n    margin: 0.1rem\n    border-radius: 999px\n    background-color: var(--color-overlay)\n    color: var(--color-text-secondary)\n    display: flex\n    align-items: center\n    justify-content: center\n    &:hover\n      color: var(--color-text-primary)\n      cursor: pointer\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StreamingBox.vue?vue&type=template&id=0986fe8b&scoped=true&\"\nimport script from \"./StreamingBox.vue?vue&type=script&lang=js&\"\nexport * from \"./StreamingBox.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StreamingBox.vue?vue&type=style&index=0&id=0986fe8b&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0986fe8b\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.valid && !_vm.printing)?_c('span',[_vm._v(\"-\")]):_vm._e(),(!_vm.valid && _vm.printing)?_c('b-spinner',{attrs:{\"small\":\"\",\"type\":\"grow\",\"label\":\"Calculating...\"}}):_vm._e(),(_vm.valid && _vm.showHours)?_c('span',[_vm._v(\" \"+_vm._s(_vm.hours)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"h\")])]):_vm._e(),(_vm.valid && _vm.showMinutes)?_c('span',[_vm._v(\" \"+_vm._s(_vm.minutes)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"m\")])]):_vm._e(),(_vm.valid && _vm.showSeconds)?_c('span',[_vm._v(\" \"+_vm._s(_vm.seconds)),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"s\")])]):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <span v-if=\"!valid && !printing\">-</span>\n    <b-spinner v-if=\"!valid && printing\" small type=\"grow\" label=\"Calculating...\"></b-spinner>\n    <span v-if=\"valid && showHours\"\n      >&nbsp;{{ hours }}<span class=\"text-subscript text-muted\">h</span></span\n    >\n    <span v-if=\"valid && showMinutes\"\n      >&nbsp;{{ minutes }}<span class=\"text-subscript text-muted\">m</span></span\n    >\n    <span v-if=\"valid && showSeconds\"\n      >&nbsp;{{ seconds }}<span class=\"text-subscript text-muted\">s</span></span\n    >\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DurationBlock',\n  props: {\n    valid: {\n      type: Boolean,\n      required: true,\n    },\n    printing: {\n      type: Boolean,\n      required: true,\n    },\n    hours: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showHours: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n    minutes: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showMinutes: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n    seconds: {\n      type: Number,\n      default() {\n        return 0\n      },\n    },\n    showSeconds: {\n      type: Boolean,\n      default() {\n        return false\n      },\n    },\n  },\n}\n</script>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DurationBlock.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DurationBlock.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DurationBlock.vue?vue&type=template&id=c6842bbe&\"\nimport script from \"./DurationBlock.vue?vue&type=script&lang=js&\"\nexport * from \"./DurationBlock.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},_vm._l((_vm.temperatures),function(item,key){return _c('temperature-item',{key:key,attrs:{\"temp-key\":key,\"temp-item\":item,\"is-plugin-version-sufficient\":_vm.isPluginVersionSufficient},on:{\"TempEditClicked\":function($event){return _vm.onEditClicked(key, item)}}})}),1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"temp-item\",class:{ editable: _vm.editable },on:{\"click\":function($event){return _vm.onEditClicked(_vm.tempKey, _vm.tempItem)}}},[_c('div',{staticClass:\"icon\"},[(_vm.heaterIcon)?_c('svg',[_c('use',{attrs:{\"href\":_vm.heaterIcon}})]):_c('i',{staticClass:\"fas fa-thermometer-empty\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.temperatureDisplayName(_vm.tempKey)))]),_c('div',{staticClass:\"value-wrapper\"},[_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(parseFloat(_vm.tempItem.actual).toFixed(1))+\" °C\")]),(_vm.editable)?_c('div',{staticClass:\"target\"},[_vm._v(\"/ \"+_vm._s(Math.round(_vm.tempItem.target))+\" °C\")]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"temp-item\" :class=\"{ editable }\" @click=\"onEditClicked(tempKey, tempItem)\">\n    <div class=\"icon\">\n      <svg v-if=\"heaterIcon\">\n        <use :href=\"heaterIcon\" />\n      </svg>\n      <i v-else class=\"fas fa-thermometer-empty\"></i>\n    </div>\n    <div class=\"title\">{{ temperatureDisplayName(tempKey) }}</div>\n    <div class=\"value-wrapper\">\n      <div class=\"value\">{{ parseFloat(tempItem.actual).toFixed(1) }} °C</div>\n      <div v-if=\"editable\" class=\"target\">/ {{ Math.round(tempItem.target) }} °C</div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { temperatureDisplayName } from '@src/lib/utils'\n\nexport default {\n  name: 'TemperatureItem',\n\n  props: {\n    tempItem: {\n      type: Object,\n      required: true,\n    },\n    tempKey: {\n      type: String,\n      required: true,\n    },\n    isPluginVersionSufficient: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  computed: {\n    heaterIcon() {\n      const key = this.tempKey.toLowerCase()\n      if (key.includes('bed')) {\n        return '#bed-temp'\n      } else if (key.includes('tool') || key.includes('extruder')) {\n        return '#extruder'\n      }\n      return null\n    },\n    editable() {\n      return this.isPluginVersionSufficient && this.tempItem.target !== null\n    },\n  },\n\n  methods: {\n    onEditClicked(key, item) {\n      if (this.editable) {\n        this.$emit('TempEditClicked', key, item)\n      }\n    },\n    temperatureDisplayName,\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.temp-item\n  display: flex\n  width: 100%\n  background-color: var(--color-background)\n  padding: .8125rem\n  border-radius: var(--border-radius-md)\n  gap: 1rem\n  align-items: center\n  &.editable\n    cursor: pointer\n.icon\n  width: 36px\n  height: 36px\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-primary)\n  color: var(--color-on-primary)\n  border-radius: var(--border-radius-sm)\n  svg\n    width: 20px\n    height: 20px\n    color: var(--color-on-primary)\n\n.value-wrapper\n  margin-left: auto\n  display: flex\n  gap: .375rem\n.value\n  font-weight: bold\n.target\n  color: var(--color-text-secondary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TemperatureItem.vue?vue&type=template&id=22dafde6&scoped=true&\"\nimport script from \"./TemperatureItem.vue?vue&type=script&lang=js&\"\nexport * from \"./TemperatureItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemperatureItem.vue?vue&type=style&index=0&id=22dafde6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"22dafde6\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"wrapper\">\n    <temperature-item\n      v-for=\"(item, key) in temperatures\"\n      :key=\"key\"\n      :temp-key=\"key\"\n      :temp-item=\"item\"\n      :is-plugin-version-sufficient=\"isPluginVersionSufficient\"\n      @TempEditClicked=\"onEditClicked(key, item)\"\n    />\n  </div>\n</template>\n\n<script>\nimport TemperatureItem from '@src/components/printers/TemperatureItem.vue'\n\nexport default {\n  name: 'StatusTemp',\n  components: {\n    TemperatureItem,\n  },\n\n  props: {\n    temperatures: {\n      type: Object,\n      required: true,\n    },\n    isPluginVersionSufficient: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  methods: {\n    onEditClicked(key, item) {\n      if (this.isPluginVersionSufficient && item.target !== null) {\n        this.$emit('TempEditClicked', key, item)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding: 1rem 0 1rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusTemp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatusTemp.vue?vue&type=template&id=395dc948&scoped=true&\"\nimport script from \"./StatusTemp.vue?vue&type=script&lang=js&\"\nexport * from \"./StatusTemp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatusTemp.vue?vue&type=style&index=0&id=395dc948&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"395dc948\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"text-center\"},[(_vm.value > 0)?_c('h1',{staticClass:\"target-temp-degree\"},[_vm._v(\" \"+_vm._s(_vm.value)+\" \"),_c('span',{staticClass:\"text-subscript text-muted\"},[_vm._v(\"°C\")])]):_vm._e(),(_vm.value < 1)?_c('h1',{staticClass:\"target-temp-degree\"},[_vm._v(_vm._s(_vm.$t(\"OFF\")))]):_vm._e()]),_c('br'),_c('div',{staticClass:\"mb-5\"},[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Presets\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"id_preset\"},on:{\"change\":_vm.onPresetChanged},model:{value:(_vm.preset),callback:function ($$v) {_vm.preset=$$v},expression:\"preset\"}},_vm._l((_vm.allPresets),function(pre){return _c('b-form-select-option',{key:pre.name,attrs:{\"value\":parseInt(pre.value)}},[_vm._v(\" \"+_vm._s(pre.title)+\" \")])}),1)],1),_c('br'),_c('h5',[_vm._v(_vm._s(_vm.$t(\"Manual\"))+\":\")]),_c('div',[_c('slider-input',{attrs:{\"min\":0,\"max\":_vm.maxTemp,\"step\":1},on:{\"change\":_vm.onSliderChanged},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}}),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"id\":\"target-temp\",\"type\":\"hidden\"},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}})],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"slidecontainer\"},[_c('input',{staticClass:\"slider\",attrs:{\"type\":\"range\",\"min\":_vm.min,\"max\":_vm.max,\"step\":_vm.step},domProps:{\"value\":_vm.value},on:{\"change\":function($event){_vm.$emit('change', Number($event.target.value))},\"input\":function($event){_vm.$emit('input', Number($event.target.value))}}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"slidecontainer\">\n    <input\n      type=\"range\"\n      :min=\"min\"\n      :max=\"max\"\n      :step=\"step\"\n      :value=\"value\"\n      class=\"slider\"\n      @change=\"$emit('change', Number($event.target.value))\"\n      @input=\"$emit('input', Number($event.target.value))\"\n    />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SliderInput',\n\n  props: {\n    value: {\n      type: Number,\n      default: 0,\n    },\n    max: {\n      type: Number,\n      default: 100,\n    },\n    min: {\n      type: Number,\n      default: 0,\n    },\n    step: {\n      type: Number,\n      default: 1,\n    },\n  },\n\n  computed: {},\n  methods: {},\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.slidecontainer\n  width: 100%\n\n.slider\n  -webkit-appearance: none\n  appearance: none\n  width: 100%\n  height: 5px\n  background: var(--color-input-background)\n  outline: none\n  border: none\n\n// The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */\n.slider::-webkit-slider-thumb\n  -webkit-appearance: none\n  appearance: none\n  width: 25px\n  height: 25px\n  border-radius: 50%\n  background: var(--color-text-primary)\n  cursor: pointer\n  border: none\n\n.slider::-moz-range-thumb\n  width: 25px\n  height: 25px\n  border-radius: 50%\n  background: var(--color-text-primary)\n  cursor: pointer\n  border: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SliderInput.vue?vue&type=template&id=abb68ee6&scoped=true&\"\nimport script from \"./SliderInput.vue?vue&type=script&lang=js&\"\nexport * from \"./SliderInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SliderInput.vue?vue&type=style&index=0&id=abb68ee6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"abb68ee6\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <div class=\"text-center\">\n      <h1 v-if=\"value > 0\" class=\"target-temp-degree\">\n        {{ value }} <span class=\"text-subscript text-muted\">°C</span>\n      </h1>\n      <h1 v-if=\"value < 1\" class=\"target-temp-degree\">{{ $t(\"OFF\") }}</h1>\n    </div>\n    <br />\n    <div class=\"mb-5\">\n      <div>\n        <h5>{{ $t(\"Presets\") }}:</h5>\n      </div>\n      <div>\n        <b-form-select\n          id=\"id_preset\"\n          v-model=\"preset\"\n          class=\"form-control\"\n          @change=\"onPresetChanged\"\n        >\n          <b-form-select-option\n            v-for=\"pre in allPresets\"\n            :key=\"pre.name\"\n            :value=\"parseInt(pre.value)\"\n          >\n            {{ pre.title }}\n          </b-form-select-option>\n        </b-form-select>\n      </div>\n      <br />\n      <h5>{{ $t(\"Manual\") }}:</h5>\n      <div>\n        <slider-input\n          v-model=\"value\"\n          :min=\"0\"\n          :max=\"maxTemp\"\n          :step=\"1\"\n          @change=\"onSliderChanged\"\n        ></slider-input>\n        <input id=\"target-temp\" v-model=\"value\" type=\"hidden\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport SliderInput from '@src/components/SliderInput.vue'\n\nexport default {\n  name: 'TempTargetEditor',\n  components: {\n    SliderInput,\n  },\n  props: {\n    presets: {\n      type: Array,\n      required: true,\n    },\n    maxTemp: {\n      type: Number,\n      required: true,\n    },\n    curTarget: {\n      type: Number,\n      required: true,\n    },\n  },\n  data() {\n    let curPreset = this.presets.find((pre) => pre.target == this.curTarget) || {\n      target: this.curTarget != 0 ? -1 : 0,\n    }\n    return { value: this.curTarget, preset: curPreset.target }\n  },\n  computed: {\n    allPresets() {\n      let presets = []\n      presets.push({ value: -1, title: 'Manual', name: 'manual' })\n      presets.push({ value: 0, title: 'OFF', name: 'off' })\n      this.presets.forEach((pre) => {\n        if (pre.target) {\n          presets.push({\n            value: pre.target,\n            name: pre.name,\n            title: `${pre.name} (${pre.target}°C)`,\n          })\n        }\n      })\n      return presets\n    },\n  },\n  methods: {\n    onPresetChanged() {\n      if (this.preset > -1) {\n        this.value = this.preset\n      }\n    },\n    onSliderChanged() {\n      if (this.value == 0) {\n        this.preset = 0\n      } else {\n        this.preset = -1\n      }\n    },\n  },\n}\n</script>\n<style></style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempTargetEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempTargetEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TempTargetEditor.vue?vue&type=template&id=b65b4a0c&\"\nimport script from \"./TempTargetEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./TempTargetEditor.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('h2',{staticClass:\"text-center\"},[_vm._v(_vm._s(_vm.$t(\"Printer Feed Sharing\")))]),_c('hr'),(!_vm.isProAccount)?_c('div',[_c('h5',{staticClass:\"mb-5\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Wait! You need to {localizedDom} to enable Printer feed.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"upgrade to the Pro plan\")))])]},proxy:true}],null,false,3414343479)})],1),_c('p',[_vm._v(_vm._s(_vm.$t(\"Printer feed sharing is a Pro feature.\")))]),_c('p',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro#why-cant-the-detective-just-work-for-free-people-love-free-you-know')}},[_vm._v(\" \"+_vm._s(_vm.$t('Running the {brandName} app incurs non-trivial amount of costs',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_vm._v(\". \"+_vm._s(_vm.$t('With little more than 1 Starbucks per month, you can upgrade to a Pro account and help us run the {brandName} app smoothly.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',[_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Check out Pro pricing >>>\")))])])]):_c('div',[_c('div',{staticClass:\"py-3\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'sharing_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\"},domProps:{\"checked\":_vm.sharedResource},on:{\"click\":_vm.onSharingToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'sharing_enabled-toggle-' + _vm.printer.id}},[_vm._v(_vm._s(_vm.$t(\"Share live feed for printer \"))+\"\\\"\"),_c('b',[_vm._v(_vm._s(_vm.printer.name))]),_vm._v(\"\\\"\")])]),_c('div',{staticClass:\"form-group\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.sharedLink),expression:\"sharedLink\"}]},[_c('div',{staticClass:\"input-group mt-4 mb-2\"},[_c('input',{ref:\"sharedLink\",staticClass:\"form-control shared-link-text\",attrs:{\"id\":\"secret-token-input\",\"type\":\"text\",\"aria-label\":\"Secret token\",\"readonly\":\"\"},domProps:{\"value\":_vm.sharedLink}}),_c('div',{staticClass:\"input-group-append\"},[_c('div',{staticClass:\"copy-button\",attrs:{\"id\":\"copy-link\",\"data-clipboard-target\":\"#secret-token-input\",\"aria-label\":\"Copy secure link to clipboard\"},on:{\"click\":_vm.copyToClipboard}},[_c('i',{staticClass:\"fas fa-clipboard\"})]),_c('b-tooltip',{attrs:{\"show\":_vm.copyStatus,\"target\":\"copy-link\",\"triggers\":\"click\",\"placement\":\"bottom\"},on:{\"update:show\":function($event){_vm.copyStatus=$event}}},[_vm._v(_vm._s(_vm.copyMessage))])],1)]),_c('div',{staticClass:\"my-1\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Click the clipboard icon above to copy the secure shareable link to your clipboard.\"))+\" \")]),_c('div',{staticClass:\"my-1\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`You can test the shareable link by right-clicking {localizedDom} and select 'Open Link in Incognito Window'.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.sharedLink}},[_vm._v(_vm._s(_vm.$t(\"here\")))])]},proxy:true}])})],1),_c('br'),_c('em',{staticClass:\"text-muted\"},[_c('small',[_c('div',[_vm._v(_vm._s(_vm.$t(\"Notes\"))+\":\")]),_c('ul',[_c('li',[_vm._v(\" \"+_vm._s(_vm.$t('Send the secure link to anyone you want to share your printer feed with. They do NOT need the {brandName} account to see your printer feed.',{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Anyone with this shareable link will be able to see your printer feed.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/printer-feed-sharing/')}},[_vm._v(_vm._s(_vm.$t(\"Learn more about what they can see.\")))])])])])])])]),_c('br')])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <h2 class=\"text-center\">{{ $t(\"Printer Feed Sharing\") }}</h2>\n    <hr />\n    <div v-if=\"!isProAccount\">\n      <h5 class=\"mb-5\">\n        <i18next :translation=\"$t('Wait! You need to {localizedDom} to enable Printer feed.')\">\n          <template #localizedDom>\n            <a href=\"/ent_pub/pricing/\">{{$t(\"upgrade to the Pro plan\")}}</a>\n          </template>\n        </i18next>\n\n      </h5>\n      <p>{{ $t(\"Printer feed sharing is a Pro feature.\") }}</p>\n      <p>\n        <a  :href=\"getDocUrl('/user-guides/upgrade-to-pro#why-cant-the-detective-just-work-for-free-people-love-free-you-know')\">\n          {{ $t('Running the {brandName} app incurs non-trivial amount of costs',{brandName:$syndicateText.brandName}) }}\n          </a>.\n          {{ $t('With little more than 1 Starbucks per month, you can upgrade to a Pro account and help us run the {brandName} app smoothly.',{brandName:$syndicateText.brandName}) }}\n\n      </p>\n      <p><a href=\"/ent_pub/pricing/\">{{ $t(\"Check out Pro pricing >>>\") }}</a></p>\n    </div>\n    <div v-else>\n      <div class=\"py-3\">\n        <div class=\"custom-control custom-switch\">\n          <input\n            :id=\"'sharing_enabled-toggle-' + printer.id\"\n            type=\"checkbox\"\n            class=\"custom-control-input update-printer\"\n            :checked=\"sharedResource\"\n            @click=\"onSharingToggled\"\n          />\n          <label\n            class=\"custom-control-label\"\n            :for=\"'sharing_enabled-toggle-' + printer.id\"\n            style=\"font-size: 1rem\"\n            >{{ $t(\"Share live feed for printer \") }}\"<b>{{ printer.name }}</b\n            >\"</label\n          >\n        </div>\n        <div class=\"form-group\">\n          <div v-show=\"sharedLink\">\n            <div class=\"input-group mt-4 mb-2\">\n              <input\n                id=\"secret-token-input\"\n                ref=\"sharedLink\"\n                type=\"text\"\n                class=\"form-control shared-link-text\"\n                aria-label=\"Secret token\"\n                readonly\n                :value=\"sharedLink\"\n              />\n              <div class=\"input-group-append\">\n                <div\n                  id=\"copy-link\"\n                  class=\"copy-button\"\n                  data-clipboard-target=\"#secret-token-input\"\n                  aria-label=\"Copy secure link to clipboard\"\n                  @click=\"copyToClipboard\"\n                >\n                  <i class=\"fas fa-clipboard\"></i>\n                </div>\n                <b-tooltip\n                  :show.sync=\"copyStatus\"\n                  target=\"copy-link\"\n                  triggers=\"click\"\n                  placement=\"bottom\"\n                  >{{ copyMessage }}</b-tooltip\n                >\n              </div>\n            </div>\n            <div class=\"my-1\">\n              {{$t(\"Click the clipboard icon above to copy the secure shareable link to your clipboard.\")}}\n            </div>\n            <div class=\"my-1\">\n              <i18next :translation=\"$t(`You can test the shareable link by right-clicking {localizedDom} and select 'Open Link in Incognito Window'.`)\">\n                <template #localizedDom>\n                  <a :href=\"sharedLink\">{{$t(\"here\")}}</a>\n                </template>\n              </i18next>\n\n            </div>\n            <br />\n            <em class=\"text-muted\">\n              <small>\n                <div>{{ $t(\"Notes\") }}:</div>\n                <ul>\n                  <li>\n                    {{ $t('Send the secure link to anyone you want to share your printer feed with. They do NOT need the {brandName} account to see your printer feed.',{brandName:$syndicateText.brandName}) }}\n\n                  </li>\n                  <li>\n                    {{$t(\"Anyone with this shareable link will be able to see your printer feed.\")}}\n                    <a :href=\"getDocUrl('/user-guides/printer-feed-sharing/')\"\n                      >{{ $t(\"Learn more about what they can see.\") }}</a\n                    >\n                  </li>\n                </ul>\n              </small>\n            </em>\n          </div>\n        </div>\n        <br />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\n\nexport default {\n  props: {\n    isProAccount: {\n      type: Boolean,\n      default: false,\n    },\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      share: false,\n      sharedResource: null,\n      copyStatus: false,\n      copyMessage: '',\n    }\n  },\n\n  computed: {\n    sharedLink() {\n      if (this.sharedResource) {\n        const url = window.location\n        return `${url.protocol}//${url.host}/printers/share_token/${this.sharedResource.share_token}/`\n      }\n\n      return ''\n    },\n  },\n\n  created() {\n    this.fetchSharedResources()\n  },\n\n  methods: {\n    fetchSharedResources() {\n      return axios.get(urls.sharedResources({ printer_id: this.printer.id })).then((response) => {\n        if (response.data.length > 0) {\n          this.sharedResource = response.data[0]\n        }\n      })\n    },\n    postSharedResources() {\n      return axios.post(urls.sharedResources({ printer_id: this.printer.id })).then((response) => {\n        if (response.data.length > 0) {\n          this.sharedResource = response.data[0]\n        }\n      })\n    },\n    deleteSharedResources() {\n      return axios.delete(urls.sharedResource(this.sharedResource.id)).then(() => {\n        this.sharedResource = null\n      })\n    },\n    onSharingToggled() {\n      if (this.sharedResource) {\n        this.deleteSharedResources()\n      } else {\n        this.postSharedResources()\n      }\n    },\n    // Copy share link to clipboard\n    copyToClipboard() {\n      this.copyStatus = true\n\n      this.$refs.sharedLink.focus()\n      this.$refs.sharedLink.select()\n      try {\n        document.execCommand('copy')\n        this.copyMessage = 'Copied!'\n      } catch (err) {\n        console.error('Fallback: Oops, unable to copy', err)\n        this.copyMessage = 'Failed!'\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\nhr\n  background-color: var(--color-divider)\n\n.shared-link-text\n  color: var(--text-primary) !important\n  height: 40px\n  border-color: var(--color-divider)\n  background-color: var(--color-input-background) !important\n\n.copy-button\n  color: var(--color-primary)\n  border: 2px solid var(--color-primary)\n  border-radius: 0 var(--border-radius-sm) var(--border-radius-sm) 0\n  background-color: transparent\n  display: inline-flex\n  align-items: center\n  justify-content: center\n  padding: 0 .75rem\n  font-size: 1rem\n  line-height: 1.5\n\n  &:hover\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n    cursor: pointer\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharePrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SharePrinter.vue?vue&type=template&id=29e8b0b6&scoped=true&\"\nimport script from \"./SharePrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./SharePrinter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SharePrinter.vue?vue&type=style&index=0&id=29e8b0b6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29e8b0b6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{attrs:{\"inside-card\":_vm.insideCard},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Print Job Control\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(!_vm.printer.isOffline() && _vm.printer.hasError())?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.printer.agentDisplayName())+\" \"+_vm._s(_vm.$t('Error')))]),_c('p',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(_vm.printer.status.state.error)+\" \")])]):_vm._e(),(_vm.printer.inUserInteractionRequired())?_c('div',{staticClass:\"warning-container\"},[_c('p',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Filament Change or User Interaction Required\")))])]):_vm._e(),(_vm.printer.inTransientState())?[_c('b-spinner',{attrs:{\"label\":\"Processing...\"}}),_c('p',[_vm._v(_vm._s(_vm.printer.calculatedState())+\"...\")])]:[(!_vm.printer.isOffline() && !_vm.printer.isDisconnected() && _vm.printer.isActive())?[_c('p',[(!_vm.printer.isPaused())?_c('span',[_vm._v(_vm._s(_vm.$t(\"Printer is Currently Printing\")))]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Print is Paused\")))])]),_c('div',{staticClass:\"buttons\"},[(!_vm.printer.isPaused())?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"warning\"},on:{\"click\":function($event){return _vm.onPauseToggled($event)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-pause\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Pause\"))+\" \")],1):_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"success\"},on:{\"click\":function($event){return _vm.onPauseToggled($event)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-play\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Resume\"))+\" \")],1),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"danger\"},on:{\"click\":_vm.onCancelClicked}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-solid fa-circle-xmark\"}}),_vm._v(\" \"+_vm._s(_vm.$t(\"Cancel\"))+\" \")],1)],1)]:_vm._e(),(!_vm.printer.isOffline() && !_vm.printer.isDisconnected() && !_vm.printer.isActive())?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Open G-Code File to Start Printing\")))]),_c('div',{staticClass:\"buttons\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.openObicoFiles}},[_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})]),_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Files\"))+\" \")]),(_vm.printer.isAgentMoonraker())?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.openPrinterFiles}},[_vm._v(\"   \"),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-klipper-logo\"}})]),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-fluidd-logo\"}})]),_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-mainsail-logo\"}})]),_vm._v(\"   \")]):_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.openPrinterFiles}},[_c('svg',{staticClass:\"logo-small custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-octoprint-logo\"}})]),_vm._v(\" OctoPrint \")])],1)]:_vm._e()],(!_vm.printer.isOffline() && _vm.printer.isDisconnected())?[_c('p',[_vm._v(_vm._s(_vm.$t(\"Printer Not Connected at the Serial Port\")))]),_c('div',{staticClass:\"buttons\"},[(!_vm.printer.isAgentMoonraker())?_c('b-button',{attrs:{\"variant\":\"outline-primary\",\"disabled\":_vm.connecting},on:{\"click\":_vm.onConnectClicked}},[(_vm.connecting)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{staticClass:\"fab fa-usb\"}),_vm._v(\" \"+_vm._s(_vm.connecting ? _vm.$t('Contacting OctoPrint') : _vm.$t('Connect'))+\" \")],1):_vm._e()],1)]:(_vm.printer.isOffline())?[_c('i',{staticClass:\"fas fa-exclamation-triangle big-icon warning\"}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"{brandName} Plugin is Offline.\",{brandName:_vm.$syndicateText.brandName}))+\" \"),_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/troubleshoot-server-connection-issues/')}},[_vm._v(_vm._s(_vm.$t(\"Why?\")))])])]:_vm._e(),(_vm.printer)?_c('b-modal',{attrs:{\"id\":_vm.modalId,\"size\":\"lg\"},on:{\"hidden\":_vm.resetGcodesModal}},[(_vm.selectedGcodeId)?_c('g-code-file-page',{attrs:{\"is-popup\":true,\"target-printer-id\":_vm.printer.id,\"route-params\":{\n            fileId: _vm.selectedGcodeId,\n            printerId: _vm.printerFiles ? _vm.printer.id : null,\n          },\"on-close\":() => _vm.$bvModal.hide(_vm.modalId)},on:{\"goBack\":() => {\n              _vm.selectedGcodeId = null\n              _vm.scrollToTop()\n            }}}):_c('g-code-folders-page',{attrs:{\"is-popup\":true,\"target-printer\":_vm.printer,\"route-params\":{\n            printerId: _vm.printerFiles ? _vm.printer.id : null,\n            parentFolder: null,\n          },\"on-close\":() => _vm.$bvModal.hide(_vm.modalId),\"saved-path\":_vm.savedPath,\"scroll-container-id\":_vm.modalId},on:{\"openFile\":(fileId, printerId, path) => {\n              _vm.selectedGcodeId = fileId\n              _vm.savedPath = path\n              _vm.scrollToTop()\n            }}})],1):_vm._e()],2)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"widget\",class:{ insideCard: _vm.insideCard }},[_c('div',{staticClass:\"widget-title\"},[_vm._t(\"title\")],2),_c('div',{staticClass:\"widget-content\"},[_vm._t(\"content\")],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"widget\" :class=\"{ insideCard }\">\n    <div class=\"widget-title\">\n      <slot name=\"title\"></slot>\n    </div>\n    <div class=\"widget-content\">\n      <slot name=\"content\"></slot>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'WidgetTemplate',\n\n  props: {\n    insideCard: {\n      type: Boolean,\n      default: false,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.widget\n  position: relative\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  margin-bottom: 15px\n  &:last-of-type\n    margin-bottom: 0\n  .widget-title\n    padding: 6px 12px\n    font-size: 14px\n    color: var(--color-text-secondary)\n  .widget-content\n    padding: 1.5rem 2rem 1rem\n    @media (max-width: 510px)\n      padding: 1rem 1rem 0.5rem\n\n  &.insideCard\n    margin-bottom: 0\n    border-radius: 0\n    border-bottom: 1px solid var(--color-divider)\n    .widget-title\n      display: none\n    .widget-content\n      padding-bottom: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./WidgetTemplate.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WidgetTemplate.vue?vue&type=template&id=00f2b5bc&scoped=true&\"\nimport script from \"./WidgetTemplate.vue?vue&type=script&lang=js&\"\nexport * from \"./WidgetTemplate.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WidgetTemplate.vue?vue&type=style&index=0&id=00f2b5bc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"00f2b5bc\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{attrs:{\"is-popup\":_vm.isPopup},scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [(_vm.isPopup && _vm.parentFolder !== null)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Go Back\"},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e(),(!_vm.isPopup && _vm.isCloud)?_c('div',{staticClass:\"actions-with-selected-desktop\"},[_c('b-form-group',{staticClass:\"m-0\"},[_c('b-form-checkbox',{attrs:{\"checked\":_vm.allSelected,\"size\":\"md\"},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleSelectAll.apply(null, arguments)}}})],1),_c('div',[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.selectedItemsCount),expression:\"!selectedItemsCount\"}],staticClass:\"label\",on:{\"click\":_vm.toggleSelectAll}},[_vm._v(_vm._s(_vm.$t(\"Select all\")))]),_c('b-dropdown',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.selectedItemsCount),expression:\"selectedItemsCount\"}],attrs:{\"toggle-class\":\"btn btn-sm actions-with-selected-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.selectedItemsCount)+\" item\"+_vm._s(_vm.selectedItemsCount === 1 ? '' : 's')+\" \"+_vm._s(_vm.$t(\"selected\"))+\" \")]},proxy:true}],null,false,4258773973)},[_c('b-dropdown-item',[_c('div',{on:{\"click\":_vm.moveSelectedItems}},[_c('i',{staticClass:\"fas fa-arrows-alt\"}),_vm._v(_vm._s(_vm.$t(\"Move\")))])]),_c('b-dropdown-item',[_c('div',{staticClass:\"text-danger\",on:{\"click\":_vm.deleteSelectedItems}},[_c('i',{staticClass:\"far fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1)],1):_vm._e(),_c('search-input',{staticClass:\"search-input mr-3\",on:{\"input\":_vm.updateSearch}})]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.isCloud)?_c('a',{staticClass:\"btn shadow-none icon-btn d-none d-md-inline\",attrs:{\"href\":\"#\",\"title\":\"Create folder\"},on:{\"click\":function($event){$event.preventDefault();return _vm.createFolder.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-folder-plus\"})]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-server\"})]},proxy:true}])},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"STORAGE\")))]),_c('b-dropdown-item',{on:{\"click\":_vm.switchToCloudStorage}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.isCloud ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Cloud\")))])])])]),_vm._l((_vm.printers),function(printer){return _c('b-dropdown-item',{key:printer.id,on:{\"click\":() => _vm.switchToPrinterStorage(printer)}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.selectedPrinterId === printer.id ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"subtitle\",class:[_vm.isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(_vm.printerBrowsabilityText(printer))+\" \")])])])])})],2),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"title\":\"Sort By\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-sort-amount-down\"})]},proxy:true}])},[_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.mobileMenuOptions},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked},scopedSlots:_vm._u([{key:\"sorting\",fn:function(){return [_c('sorting-dropdown',{attrs:{\"local-storage-prefix\":_vm.sortingLocalStoragePrefix,\"sorting-options\":_vm.sortingOptions,\"sorting-value\":_vm.sortingValue},on:{\"onSortingUpdated\":_vm.onSortingUpdated}})]},proxy:true},{key:\"storage\",fn:function(){return [_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"STORAGE\")))]),_c('b-dropdown-item',{on:{\"click\":() => {\n                  _vm.switchToCloudStorage()\n                  _vm.$refs.cascadedDropdown.resetMenuExpanded()\n                }}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.isCloud ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"Cloud\")))])])])]),_vm._l((_vm.printers),function(printer){return _c('b-dropdown-item',{key:printer.id,on:{\"click\":() => {\n                  _vm.switchToPrinterStorage(printer)\n                  _vm.$refs.cascadedDropdown.resetMenuExpanded()\n                }}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.selectedPrinterId === printer.id ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"text\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"subtitle\",class:[_vm.isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(_vm.printerBrowsabilityText(printer))+\" \")])])])])})]},proxy:true}])})],1),(_vm.onClose)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Close\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onClose.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-times text-danger\"})]):_vm._e()],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[(_vm.isCloud)?_c('vue-dropzone',{ref:\"gcodesDropzone\",staticClass:\"upload-box\",attrs:{\"id\":\"dropzone\",\"options\":_vm.dropzoneOptions,\"use-custom-slot\":true},on:{\"vdropzone-queue-complete\":_vm.gcodeUploadSuccess,\"vdropzone-error\":_vm.gcodeUploadError,\"vdropzone-sending\":_vm.addParentFolderParam}},[_c('div',{staticClass:\"dz-message needsclick\"},[_c('i',{staticClass:\"fas fa-upload fa-2x\"}),_vm._v(\" \"),_c('br'),_c('div',[_vm._v(_vm._s(_vm.$t(\"G-Code file (*.gcode, *.gco, or *.g) only.\")))]),_c('div',[_vm._v(_vm._s(_vm.$t('Up to {maxFilesize} MB each file, {maxTotalFilesize} GB total.',{maxFilesize: _vm.maxFilesize,maxTotalFilesize: _vm.maxTotalFilesize})))])])]):_vm._e(),(!_vm.isCloud && _vm.isAgentMoonraker && _vm.searchStateIsActive)?_c('div',{staticClass:\"notice-block\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('p',{staticClass:\"message\"},[_vm._v(_vm._s(_vm.$t(\"Search in Klipper printers works only for current directory\")))])]):_vm._e(),_c('g-code-file-structure',{ref:\"gCodeFileStructure\",attrs:{\"is-cloud\":_vm.isCloud,\"is-popup\":_vm.isPopup,\"search-state-is-active\":_vm.searchStateIsActive,\"search-in-progress\":_vm.searchInProgress,\"folders\":_vm.folders,\"files\":_vm.files,\"target-printer\":_vm.targetPrinter,\"nothing-found\":_vm.nothingFound,\"loading\":_vm.loading,\"scroll-container-id\":_vm.scrollContainerId,\"no-more-folders\":_vm.noMoreFolders,\"no-more-files\":_vm.noMoreFiles,\"local-files-loading\":_vm.localFilesLoading},on:{\"openFolder\":_vm.openFolder,\"openFile\":_vm.openFile,\"renameItem\":_vm.renameItem,\"moveItem\":_vm.moveItem,\"deleteItem\":_vm.deleteItem,\"print\":_vm.onPrintClicked,\"fetchMore\":_vm.fetchFilesAndFolders,\"selectFiles\":_vm.onSelectFiles,\"selectFolders\":_vm.onSelectFolders}})],1)],1)],1),_c('rename-modal',{ref:\"renameModal\",attrs:{\"item\":_vm.activeItem,\"pre-confirm\":_vm.verifyItemRename},on:{\"renamed\":_vm.onItemRenamed}}),_c('move-modal',{ref:\"moveModal\",attrs:{\"item\":_vm.activeItem,\"items\":_vm.activeItems,\"item-parent-folder-id\":_vm.parentFolder,\"target-printer\":_vm.targetPrinter,\"scroll-container-id\":_vm.scrollContainerId,\"sorting-value\":_vm.sortingValue},on:{\"moved\":_vm.onItemMoved}}),_c('delete-confirmation-modal',{ref:\"deleteConfirmationModal\",attrs:{\"item\":_vm.activeItem},on:{\"deleted\":_vm.onItemDeleted}}),_c('new-folder-modal',{ref:\"newFolderModal\",attrs:{\"pre-confirm\":_vm.verifyNewFolder,\"parent-folder-id\":_vm.parentFolder},on:{\"created\":_vm.onFolderCreated}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"search-wrapper\"},[_vm._m(0),_c('input',{staticClass:\"dark\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('Search')},domProps:{\"value\":_vm.value},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)},\"focus\":function($event){return _vm.$emit('focus')},\"blur\":function($event){return _vm.$emit('blur')}}})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"search-icon\"},[_c('i',{staticClass:\"fas fa-search\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"search-wrapper\">\n    <div class=\"search-icon\">\n      <i class=\"fas fa-search\"></i>\n    </div>\n    <input\n      type=\"text\"\n      class=\"dark\"\n      :placeholder=\"$t('Search')\"\n      :value=\"value\"\n      @input=\"$emit('input', $event.target.value)\"\n      @focus=\"$emit('focus')\"\n      @blur=\"$emit('blur')\"\n    />\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SearchInput',\n\n  props: {\n    value: {\n      type: String,\n      default: '',\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.search-wrapper\n  position: relative\n\n  .search-icon\n    height: 100%\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: absolute\n    top: 0\n    left: .5em\n    opacity: .8\n\n  input\n    padding: .2em .5em .2em 2em\n    width: 100%\n    height: 100%\n    font-size: 16px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SearchInput.vue?vue&type=template&id=76904468&scoped=true&\"\nimport script from \"./SearchInput.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchInput.vue?vue&type=style&index=0&id=76904468&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"76904468\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-new-folder\",\"title\":_vm.$t('Enter new folder name'),\"ok-title\":_vm.$t('Create'),\"cancel-title\":_vm.$t('Cancel'),\"ok-disabled\":!_vm.newFolderName.length,\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newFolderName),expression:\"newFolderName\"}],ref:\"input\",staticClass:\"input-lg\",attrs:{\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.$t('Folder name'),\"required\":\"required\"},domProps:{\"value\":(_vm.newFolderName)},on:{\"input\":function($event){if($event.target.composing)return;_vm.newFolderName=$event.target.value}}}),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-new-folder\"\n    :title=\"$t('Enter new folder name')\"\n    :ok-title=\"$t('Create')\"\n    :cancel-title=\"$t('Cancel')\"\n    :ok-disabled=\"!newFolderName.length\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <input\n          ref=\"input\"\n          v-model=\"newFolderName\"\n          type=\"text\"\n          name=\"name\"\n          :placeholder=\"$t('Folder name')\"\n          class=\"input-lg\"\n          required=\"required\"\n        />\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'NewFolderModal',\n\n  props: {\n    preConfirm: {\n      type: Function,\n      default: null,\n    },\n    parentFolderId: {\n      type: String,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      newFolderName: '',\n      errorMessage: '',\n      isOpen: false,\n    }\n  },\n\n  methods: {\n    show() {\n      this.isOpen = true\n      this.$bvModal.show('b-modal-new-folder')\n    },\n    focusInput() {\n      this.$refs.input.select()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.newFolderName = ''\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      if (!this.newFolderName) {\n        return\n      }\n\n      if (this.preConfirm) {\n        const result = this.preConfirm(this.newFolderName)\n        if (result !== true) {\n          this.errorMessage = result\n          return\n        }\n      }\n\n      try {\n        const newFolder = await axios.post(urls.gcodeFolders(), {\n          name: this.newFolderName,\n          parent_folder: this.parentFolderId,\n        })\n\n        this.$emit('created', newFolder.data.id)\n        this.$bvModal.hide('b-modal-new-folder')\n      } catch (e) {\n        console.log(e)\n        return\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NewFolderModal.vue?vue&type=template&id=6d629910&scoped=true&\"\nimport script from \"./NewFolderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./NewFolderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewFolderModal.vue?vue&type=style&index=0&id=6d629910&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6d629910\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-rename\",\"title\":_vm.$t('Enter new name'),\"ok-title\":_vm.$t('Rename'),\"cancel-title\":_vm.$t('Cancel'),\"centered\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal,\"shown\":_vm.focusInput}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('div',{staticClass:\"my-2\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newItemName),expression:\"newItemName\"}],ref:\"input\",staticClass:\"input-lg\",attrs:{\"type\":\"text\",\"name\":\"name\",\"placeholder\":_vm.$t('New name'),\"required\":\"required\"},domProps:{\"value\":(_vm.newItemName)},on:{\"input\":function($event){if($event.target.composing)return;_vm.newItemName=$event.target.value}}}),(_vm.errorMessage)?_c('b-alert',{staticClass:\"mt-3\",attrs:{\"variant\":\"danger\",\"show\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.errorMessage)+\" \")]):_vm._e()],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-modal\n    id=\"b-modal-rename\"\n    :title=\"$t('Enter new name')\"\n    :ok-title=\"$t('Rename')\"\n    :cancel-title=\"$t('Cancel')\"\n    centered\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n    @shown=\"focusInput\"\n  >\n    <form @submit.prevent=\"handleSubmit\">\n      <div class=\"my-2\">\n        <input\n          ref=\"input\"\n          v-model=\"newItemName\"\n          type=\"text\"\n          name=\"name\"\n          :placeholder=\"$t('New name')\"\n          class=\"input-lg\"\n          required=\"required\"\n        />\n        <b-alert v-if=\"errorMessage\" variant=\"danger\" class=\"mt-3\" show>\n          {{ errorMessage }}\n        </b-alert>\n      </div>\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'RenameModal',\n\n  components: {},\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n    preConfirm: {\n      type: Function,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      newItemName: '',\n      errorMessage: '',\n      isOpen: false,\n    }\n  },\n\n  computed: {\n    itemType() {\n      return this.item.filename ? 'file' : 'folder'\n    },\n    fullName() {\n      if (this.itemType === 'file') {\n        return `${this.newItemName}.${this.fileExt}`\n      } else {\n        return this.newItemName\n      }\n    },\n    fileExt() {\n      if (this.itemType === 'folder') return null\n      return this.item.filename.split('.').at(-1)\n    },\n    nameWithoutExt() {\n      if (this.itemType === 'folder') {\n        return this.item.name\n      } else {\n        const filename = this.item.filename\n        return filename.slice(0, filename.length - this.fileExt.length - 1)\n      }\n    },\n    newNameWithExt() {\n      if (this.itemType === 'folder') {\n        return this.newItemName\n      } else {\n        return `${this.newItemName}.${this.fileExt}`\n      }\n    },\n  },\n\n  methods: {\n    show() {\n      this.isOpen = true\n\n      this.$nextTick(() => {\n        if (!this.item) {\n          this.isOpen = false\n          return\n        }\n        this.newItemName = this.nameWithoutExt\n        this.$bvModal.show('b-modal-rename')\n      })\n    },\n    focusInput() {\n      this.$refs.input.select()\n    },\n    close() {\n      this.$bvModal.hide('b-modal-rename')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.newItemName = ''\n      this.errorMessage = ''\n    },\n    handleOk(bvModalEvent) {\n      if (this.newNameWithExt === (this.item.filename || this.item.name)) {\n        this.close()\n        return\n      }\n\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      const id = this.item.id\n\n      if (!this.newItemName) {\n        return\n      }\n\n      if (this.newNameWithExt === (this.item.filename || this.item.name)) {\n        this.close()\n        return\n      }\n\n      if (this.preConfirm) {\n        const result = this.preConfirm(this.newNameWithExt)\n        if (result !== true) {\n          this.errorMessage = result\n          return\n        }\n      }\n\n      try {\n        const url = this.itemType === 'file' ? urls.gcodeFile(id) : urls.gcodeFolder(id)\n        await axios.patch(\n          url,\n          `${this.itemType === 'file' ? 'filename' : 'name'}=${this.newNameWithExt}`\n        )\n      } catch (e) {\n        this.errorMessage = `${this.$i18next.t('Server error')}`\n        console.log(e)\n        return\n      }\n\n      this.$emit('renamed', this.newNameWithExt)\n      this.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-lg\n  height: 3rem\n  padding: .5rem 1rem\n  width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./RenameModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RenameModal.vue?vue&type=template&id=1c69e3a5&scoped=true&\"\nimport script from \"./RenameModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RenameModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RenameModal.vue?vue&type=style&index=0&id=1c69e3a5&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1c69e3a5\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-modal',{attrs:{\"id\":\"b-modal-move\",\"title\":_vm.$t('Move item'),\"ok-title\":_vm.$t('Place Here'),\"cancel-title\":_vm.$t('Cancel'),\"ok-disabled\":_vm.isSameDir || _vm.patchLoading,\"scrollable\":\"\"},on:{\"ok\":_vm.handleOk,\"hidden\":_vm.resetModal},scopedSlots:_vm._u([{key:\"modal-title\",fn:function(){return [_c('div',{staticClass:\"title\"},[(_vm.parentFolder !== null)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Go Back')},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e(),_c('h5',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Move item\")))])])]},proxy:true}])},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.handleSubmit.apply(null, arguments)}}},[_c('g-code-file-structure',{attrs:{\"folders\":_vm.folders,\"files\":_vm.files,\"target-printer\":_vm.targetPrinter,\"loading\":_vm.loading,\"scroll-container-id\":\"b-modal-move___BV_modal_body_\",\"no-more-folders\":_vm.noMoreFolders,\"no-more-files\":true,\"is-move-modal\":true,\"disabled-items\":_vm.disabledItems},on:{\"openFolder\":_vm.openFolder,\"fetchMore\":_vm.fetchFilesAndFolders}})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"gcodes-wrapper\",class:{ 'is-move-modal': _vm.isMoveModal }},[(!_vm.isMoveModal)?_c('div',{staticClass:\"header-panel\",class:{ 'without-action-buttons': !_vm.isCloud && !_vm.targetPrinter }},[_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Name\")))]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t('Size')))]),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Created\")))]),(_vm.isCloud)?_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Last Printed\")))]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"gcode-items-wrapper\"},[_c('div',_vm._l(([..._vm.folders, ..._vm.files]),function(item,key){return _c('file-structure-item',{directives:[{name:\"show\",rawName:\"v-show\",value:(\n          (_vm.isFolder(item) && !_vm.searchStateIsActive) || (!_vm.isFolder(item) && !_vm.searchInProgress)\n        ),expression:\"\\n          (isFolder(item) && !searchStateIsActive) || (!isFolder(item) && !searchInProgress)\\n        \"}],key:`${_vm.isFolder(item) ? 'folder' : 'file'}_${key}`,attrs:{\"item\":item,\"is-cloud\":_vm.isCloud,\"target-printer\":_vm.targetPrinter,\"is-move-modal\":_vm.isMoveModal,\"disabled\":_vm.isFolder(item)\n            ? _vm.disabledItems.folders.includes(item.id)\n            : _vm.disabledItems.files.includes(item.id),\"selectable\":!_vm.isMoveModal && _vm.isCloud && !_vm.isPopup,\"selected\":_vm.isFolder(item) ? _vm.selectedFolders.has(item.id) : _vm.selectedFiles.has(item.id)},on:{\"click\":function($event){_vm.isFolder(item) ? _vm.$emit('openFolder', item) : _vm.$emit('openFile', item)},\"renameItem\":function($event){return _vm.$emit('renameItem', item)},\"moveItem\":function($event){return _vm.$emit('moveItem', item)},\"deleteItem\":function($event){return _vm.$emit('deleteItem', item)},\"print\":function($event){return _vm.$emit('print', item)},\"selectedChanged\":_vm.onSelectedChanged}})}),1),(_vm.isCloud)?_c('mugen-scroll',{staticClass:\"text-center\",attrs:{\"v-show\":!_vm.isFolderEmpty,\"handler\":() => _vm.$emit('fetchMore'),\"should-handle\":!_vm.loading,\"scroll-container\":_vm.scrollContainerId}},[(!_vm.noMoreFolders || !_vm.noMoreFiles || _vm.searchInProgress)?_c('div',{staticClass:\"py-5\"},[_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}})],1):_vm._e()]):_vm._e(),(!_vm.isCloud && (_vm.localFilesLoading || _vm.searchInProgress))?_c('div',{staticClass:\"text-center py-5\"},[_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}})],1):_c('div',[(_vm.isFolderEmpty)?_c('div',{staticClass:\"placeholder text-secondary\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Nothing here yet\")))])]):(_vm.nothingFound)?_c('div',{staticClass:\"placeholder text-secondary\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Nothing found\")))])]):_vm._e()])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"item\",class:{ disabled: _vm.isDisabled, 'move-modal': _vm.isMoveModal },on:{\"click\":() => !_vm.isDisabled && _vm.$emit('click')}},[(_vm.selectable)?_c('div',{staticClass:\"checkbox-wrapper\",class:{ isSelected: _vm.isSelected }},[_c('b-form-checkbox',{attrs:{\"size\":\"md\",\"checked\":_vm.isSelected},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.isSelected = !_vm.isSelected}}})],1):_vm._e(),_c('div',{staticClass:\"item-info\"},[_c('div',{staticClass:\"filename\"},[_c('div',{staticClass:\"thumbnail-wrapper\",class:{ folder: _vm.isFolder }},[(!_vm.isFolder && _vm.item.getSmallThumbnailUrl())?_c('div',{staticClass:\"thumbnail\"},[_c('img',{attrs:{\"src\":_vm.item.getSmallThumbnailUrl()}})]):_c('div',{staticClass:\"placeholder\"},[(_vm.isFolder)?_c('i',{staticClass:\"fas fa-folder\"}):_c('i',{staticClass:\"fas fa-file-code\"})])]),_c('span',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.isFolder ? _vm.item.name : _vm.item.filename))])]),_c('div',{staticClass:\"size\"},[(!_vm.isFolder)?_c('span',[_vm._v(_vm._s(_vm.item.filesize))]):_vm._e(),(_vm.isFolder)?_c('span',[_vm._v(_vm._s(_vm.item.numItems)+\" item(s)\")]):_vm._e()]),(!_vm.isMoveModal)?_c('div',{staticClass:\"created\"},[_vm._v(\" \"+_vm._s(_vm.item.created_at ? _vm.item.created_at.fromNow() : '-')+\" \")]):_vm._e(),(!_vm.isMoveModal)?[(!_vm.isFolder && _vm.isCloud)?_c('div',{staticClass:\"last-printed\"},[(!_vm.item.print_set)?_c('span',[_vm._v(\"-\")]):(!_vm.item.print_set.length)?_c('span',[_vm._v(_vm._s(_vm.$t('No prints yet')))]):(_vm.item.last_print)?_c('span',[_vm._v(_vm._s(_vm.item.last_print.ended_at ? _vm.item.last_print.ended_at.fromNow() : _vm.$t('Printing...')))]):_vm._e(),(_vm.item.last_print && _vm.item.last_print.ended_at)?_c('div',{staticClass:\"circle-indicator\",class:{\n            cancelled: _vm.item.last_print.cancelled_at,\n            finished: _vm.item.last_print.finished_at,\n          }}):_vm._e()]):_vm._e(),(_vm.isFolder && _vm.isCloud)?_c('div',{staticClass:\"d-none d-md-block\"}):_vm._e()]:_vm._e()],2),(!_vm.isMoveModal && ((!_vm.isFolder && (_vm.isCloud || _vm.targetPrinter)) || (_vm.isFolder && _vm.isCloud)))?_c('div',[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn py-0\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[(!_vm.isFolder && _vm.targetPrinter)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('print', _vm.item)}}},[_c('span',{staticClass:\"text-primary\"},[_c('i',{staticClass:\"fas fa-play-circle\"}),_vm._v(_vm._s(_vm.$t(\"Print on\"))+\" \"+_vm._s(_vm.targetPrinter.name)+\" \")])]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('renameItem', _vm.item)}}},[_c('i',{staticClass:\"fas fa-edit\"}),_vm._v(_vm._s(_vm.$t('Rename'))+\" \")]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('moveItem', _vm.item)}}},[_c('i',{staticClass:\"fas fa-arrows-alt\"}),_vm._v(_vm._s(_vm.$t('Move'))+\" \")]):_vm._e(),(_vm.isCloud)?_c('b-dropdown-item',{on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('deleteItem', _vm.item)}}},[_c('span',{staticClass:\"text-danger\"},[_c('i',{staticClass:\"fas fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t('Delete'))+\" \")])]):_vm._e()],1)],1):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    class=\"item\"\n    :class=\"{ disabled: isDisabled, 'move-modal': isMoveModal }\"\n    @click=\"() => !isDisabled && $emit('click')\"\n  >\n    <div v-if=\"selectable\" class=\"checkbox-wrapper\" :class=\"{ isSelected }\">\n      <b-form-checkbox\n        size=\"md\"\n        :checked=\"isSelected\"\n        @click.native.capture.stop.prevent=\"isSelected = !isSelected\"\n      ></b-form-checkbox>\n    </div>\n    <div class=\"item-info\">\n      <div class=\"filename\">\n        <div class=\"thumbnail-wrapper\" :class=\"{ folder: isFolder }\">\n          <div v-if=\"!isFolder && item.getSmallThumbnailUrl()\" class=\"thumbnail\">\n            <img :src=\"item.getSmallThumbnailUrl()\" />\n          </div>\n          <div v-else class=\"placeholder\">\n            <i v-if=\"isFolder\" class=\"fas fa-folder\"></i>\n            <i v-else class=\"fas fa-file-code\"></i>\n          </div>\n        </div>\n        <span class=\"truncated\">{{ isFolder ? item.name : item.filename }}</span>\n      </div>\n\n      <div class=\"size\">\n        <span v-if=\"!isFolder\">{{ item.filesize }}</span>\n        <span v-if=\"isFolder\">{{ item.numItems }} item(s)</span>\n      </div>\n      <div v-if=\"!isMoveModal\" class=\"created\">\n        {{ item.created_at ? item.created_at.fromNow() : '-' }}\n      </div>\n      <template v-if=\"!isMoveModal\">\n        <div v-if=\"!isFolder && isCloud\" class=\"last-printed\">\n          <span v-if=\"!item.print_set\">-</span>\n          <span v-else-if=\"!item.print_set.length\">{{$t('No prints yet')}}</span>\n          <span v-else-if=\"item.last_print\">{{\n            item.last_print.ended_at ? item.last_print.ended_at.fromNow() : $t('Printing...')\n          }}</span>\n          <div\n            v-if=\"item.last_print && item.last_print.ended_at\"\n            class=\"circle-indicator\"\n            :class=\"{\n              cancelled: item.last_print.cancelled_at,\n              finished: item.last_print.finished_at,\n            }\"\n          ></div>\n        </div>\n        <div v-if=\"isFolder && isCloud\" class=\"d-none d-md-block\"></div>\n      </template>\n    </div>\n    <div\n      v-if=\"!isMoveModal && ((!isFolder && (isCloud || targetPrinter)) || (isFolder && isCloud))\"\n    >\n      <b-dropdown right no-caret toggle-class=\"icon-btn py-0\">\n        <template #button-content>\n          <i class=\"fas fa-ellipsis-v\"></i>\n        </template>\n        <b-dropdown-item v-if=\"!isFolder && targetPrinter\" @click.stop=\"$emit('print', item)\">\n          <span class=\"text-primary\">\n            <i class=\"fas fa-play-circle\"></i>{{$t(\"Print on\")}} {{ targetPrinter.name }}\n          </span>\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('renameItem', item)\">\n          <i class=\"fas fa-edit\"></i>{{$t('Rename')}}\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('moveItem', item)\">\n          <i class=\"fas fa-arrows-alt\"></i>{{$t('Move')}}\n        </b-dropdown-item>\n        <b-dropdown-item v-if=\"isCloud\" @click.stop=\"$emit('deleteItem', item)\">\n          <span class=\"text-danger\"> <i class=\"fas fa-trash-alt\"></i>{{$t('Delete')}} </span>\n        </b-dropdown-item>\n      </b-dropdown>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'FileStructureItem',\n\n  props: {\n    item: {\n      type: Object,\n      required: true,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    isMoveModal: {\n      type: Boolean,\n      default: false,\n    },\n    disabled: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n    selectable: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    isFolder() {\n      return !this.item.filename\n    },\n    isDisabled() {\n      return (this.isMoveModal && !this.isFolder) || this.disabled\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.item, newValue)\n    },\n    selected(newValue) {\n      this.isSelected = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.item\n  display: flex\n  align-items: center\n  padding: .6em 1em\n  border-bottom: 1px solid var(--color-divider-muted)\n  &:last-child\n    border-bottom: none\n  &:hover\n    cursor: pointer\n    background-color: var(--color-hover)\n  &.disabled\n    opacity: .5\n    &:hover\n      cursor: default\n      background-color: transparent\n  &.move-modal\n    .item-info\n      .size\n        text-align: right\n\n  .item-info\n    display: flex\n    width: 100%\n    overflow: hidden\n    flex: 1\n    font-size: 0.875rem\n    color: var(--color-text-secondary)\n    & > div\n      flex: 1\n      margin-left: 30px\n      &:first-child\n        font-size: 1rem\n        color: var(--color-text-primary)\n        margin-left: 0\n\n    .thumbnail-wrapper\n      flex: 0 0 32px\n      display: inline-flex\n      height: 32px\n      border-radius: var(--border-radius-xs)\n      background-color: var(--color-surface-primary)\n      overflow: hidden\n      align-items: center\n      justify-content: center\n      .thumbnail\n        width: 100%\n        height: 100%\n        img\n          height: 100%\n          width: auto\n      &.folder\n        background: none\n        font-size: 1.25em\n\n    .filename\n      display: flex\n      align-items: center\n      gap: .5rem\n      text-overflow: ellipsis\n      overflow: hidden\n      white-space: nowrap\n      width: 100%\n      flex: 3\n\n  .remove-button\n    width: 30px\n    height: 30px\n    text-align: center\n    line-height: 30px\n    border-radius: 50%\n    transition: background-color .2s ease-out\n    &:hover\n      background-color: var(--color-danger)\n      color: var(--color-on-primary)\n      cursor: pointer\n\n  @media (max-width: 768px)\n    &\n      margin: 0 -16px\n\n    .item-info\n      flex-direction: column\n      align-items: flex-start\n      & > div\n        margin-left: 0\n\n      .size::before\n        content: \"Size: \"\n      .uploaded::before\n        content: \"Uploaded: \"\n      .created::before\n        content: \"Created: \"\n      .last-printed::before\n        content: \"Last print: \"\n\n.circle-indicator\n  --size: 6px\n  width: var(--size)\n  height: var(--size)\n  border-radius: var(--size)\n  display: inline-block\n  margin-left: 5px\n  position: relative\n  bottom: 1px\n  background: var(--color-text-secondary)\n  &.cancelled\n    background: var(--color-danger)\n  &.finished\n    background: var(--color-success)\n\n.checkbox-wrapper\n  display: flex\n  align-items: flex-start\n  justify-content: flex-end\n  margin-left: -.5rem\n  margin-right: .5rem\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n    border-color: var(--color-divider)\n  &.isSelected\n    ::v-deep .custom-checkbox .custom-control-label::before\n      border-color: #00C4B4\n  @media (max-width: 576px)\n    display: none\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FileStructureItem.vue?vue&type=template&id=56a42b8e&scoped=true&\"\nimport script from \"./FileStructureItem.vue?vue&type=script&lang=js&\"\nexport * from \"./FileStructureItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FileStructureItem.vue?vue&type=style&index=0&id=56a42b8e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"56a42b8e\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"gcodes-wrapper\" :class=\"{ 'is-move-modal': isMoveModal }\">\n    <div\n      v-if=\"!isMoveModal\"\n      class=\"header-panel\"\n      :class=\"{ 'without-action-buttons': !isCloud && !targetPrinter }\"\n    >\n      <div class=\"text\">{{$t(\"Name\")}}</div>\n      <div class=\"text\">{{$t('Size')}}</div>\n      <div class=\"text\">{{$t(\"Created\")}}</div>\n      <div v-if=\"isCloud\" class=\"text\">{{$t(\"Last Printed\")}}</div>\n    </div>\n\n    <div class=\"gcode-items-wrapper\">\n      <div>\n        <file-structure-item\n          v-for=\"(item, key) in [...folders, ...files]\"\n          v-show=\"\n            (isFolder(item) && !searchStateIsActive) || (!isFolder(item) && !searchInProgress)\n          \"\n          :key=\"`${isFolder(item) ? 'folder' : 'file'}_${key}`\"\n          :item=\"item\"\n          :is-cloud=\"isCloud\"\n          :target-printer=\"targetPrinter\"\n          :is-move-modal=\"isMoveModal\"\n          :disabled=\"\n            isFolder(item)\n              ? disabledItems.folders.includes(item.id)\n              : disabledItems.files.includes(item.id)\n          \"\n          :selectable=\"!isMoveModal && isCloud && !isPopup\"\n          :selected=\"isFolder(item) ? selectedFolders.has(item.id) : selectedFiles.has(item.id)\"\n          @click=\"isFolder(item) ? $emit('openFolder', item) : $emit('openFile', item)\"\n          @renameItem=\"$emit('renameItem', item)\"\n          @moveItem=\"$emit('moveItem', item)\"\n          @deleteItem=\"$emit('deleteItem', item)\"\n          @print=\"$emit('print', item)\"\n          @selectedChanged=\"onSelectedChanged\"\n        />\n      </div>\n\n      <mugen-scroll\n        v-if=\"isCloud\"\n        :v-show=\"!isFolderEmpty\"\n        :handler=\"() => $emit('fetchMore')\"\n        :should-handle=\"!loading\"\n        class=\"text-center\"\n        :scroll-container=\"scrollContainerId\"\n      >\n        <div v-if=\"!noMoreFolders || !noMoreFiles || searchInProgress\" class=\"py-5\">\n          <b-spinner :label=\"$t('Loading...')\" />\n        </div>\n      </mugen-scroll>\n\n      <div v-if=\"!isCloud && (localFilesLoading || searchInProgress)\" class=\"text-center py-5\">\n        <b-spinner :label=\"$t('Loading...')\" />\n      </div>\n      <div v-else>\n        <!-- Placeholders -->\n        <div v-if=\"isFolderEmpty\" class=\"placeholder text-secondary\">\n          <span>{{ $t(\"Nothing here yet\") }}</span>\n        </div>\n        <div v-else-if=\"nothingFound\" class=\"placeholder text-secondary\">\n          <span>{{ $t(\"Nothing found\") }}</span>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MugenScroll from 'vue-mugen-scroll'\nimport FileStructureItem from '@src/components/g-codes/FileStructureItem.vue'\n\nexport default {\n  name: 'GCodeFileStructure',\n\n  components: {\n    MugenScroll,\n    FileStructureItem,\n  },\n\n  props: {\n    folders: {\n      type: Array,\n      default: () => [],\n    },\n    files: {\n      type: Array,\n      default: () => [],\n    },\n    noMoreFolders: {\n      type: Boolean,\n      default: false,\n    },\n    noMoreFiles: {\n      type: Boolean,\n      default: false,\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n    localFilesLoading: {\n      type: Boolean,\n      default: false,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    searchStateIsActive: {\n      type: Boolean,\n      default: false,\n    },\n    searchInProgress: {\n      type: Boolean,\n      default: false,\n    },\n    nothingFound: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    isMoveModal: {\n      type: Boolean,\n      default: false,\n    },\n    disabledItems: {\n      type: Object,\n      default: () => ({\n        folders: [],\n        files: [],\n      }),\n    },\n  },\n\n  data: function () {\n    return {\n      selectedFiles: new Set(),\n      selectedFolders: new Set(),\n    }\n  },\n\n  computed: {\n    isFolderEmpty() {\n      return (\n        !this.searchStateIsActive && !this.loading && !this.files.length && !this.folders.length\n      )\n    },\n  },\n\n  methods: {\n    onSelectedChanged(item, selected) {\n      const selectedItemsCopy = this.isFolder(item)\n        ? new Set(this.selectedFolders)\n        : new Set(this.selectedFiles)\n\n      if (selected) {\n        selectedItemsCopy.add(item.id)\n      } else {\n        selectedItemsCopy.delete(item.id)\n      }\n\n      if (this.isFolder(item)) {\n        this.selectedFolders = selectedItemsCopy\n        this.$emit('selectFolders', this.selectedFolders)\n      } else {\n        this.selectedFiles = selectedItemsCopy\n        this.$emit('selectFiles', this.selectedFiles)\n      }\n    },\n    isFolder(item) {\n      return !item.filename\n    },\n    selectAll() {\n      this.selectedFolders = new Set(this.folders.map((f) => f.id))\n      this.selectedFiles = new Set(this.files.map((f) => f.id))\n      this.$emit('selectFolders', this.selectedFolders)\n      this.$emit('selectFiles', this.selectedFiles)\n    },\n    unselectAll() {\n      this.selectedFolders = new Set()\n      this.selectedFiles = new Set()\n      this.$emit('selectFolders', this.selectedFolders)\n      this.$emit('selectFiles', this.selectedFiles)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gcodes-wrapper\n  background-color: var(--color-surface-secondary)\n  padding: 1em 2em\n  border-radius: var(--border-radius-lg)\n  &.is-move-modal\n    padding: 0\n    border-radius: 0\n\n.header-panel\n  display: flex\n  padding: 1em calc(1em + 30px) 1em 1em\n  border-bottom: 1px solid var(--color-divider)\n  font-weight: bold\n  &.without-action-buttons\n    padding-right: 1em\n\n  & > div\n    flex: 1\n    display: flex\n    justify-content: space-between\n    margin-left: 30px\n    align-items: center\n    font-size: 1rem\n\n    &:first-child\n      margin-left: 0\n      flex: 3\n\n  @media (max-width: 768px)\n    &\n      display: none\n\n.placeholder\n  margin: 5rem 0\n  text-align: center\n  &.text-secondary *\n    color: var(--color-text-secondary)\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFileStructure.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFileStructure.vue?vue&type=template&id=f3289a68&scoped=true&\"\nimport script from \"./GCodeFileStructure.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFileStructure.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFileStructure.vue?vue&type=style&index=0&id=f3289a68&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"f3289a68\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <b-modal\n    id=\"b-modal-move\"\n    :title=\"$t('Move item')\"\n    :ok-title=\"$t('Place Here')\"\n    :cancel-title=\"$t('Cancel')\"\n    :ok-disabled=\"isSameDir || patchLoading\"\n    scrollable\n    @ok=\"handleOk\"\n    @hidden=\"resetModal\"\n  >\n    <template #modal-title>\n      <div class=\"title\">\n        <a\n          v-if=\"parentFolder !== null\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          :title=\"$t('Go Back')\"\n          @click.prevent=\"goBack\"\n        >\n          <i class=\"fas fa-chevron-left\"></i>\n        </a>\n        <h5 class=\"modal-title\">{{ $t(\"Move item\") }}</h5>\n      </div>\n    </template>\n    <form @submit.prevent=\"handleSubmit\">\n      <g-code-file-structure\n        :folders=\"folders\"\n        :files=\"files\"\n        :target-printer=\"targetPrinter\"\n        :loading=\"loading\"\n        scroll-container-id=\"b-modal-move___BV_modal_body_\"\n        :no-more-folders=\"noMoreFolders\"\n        :no-more-files=\"true\"\n        :is-move-modal=\"true\"\n        :disabled-items=\"disabledItems\"\n        @openFolder=\"openFolder\"\n        @fetchMore=\"fetchFilesAndFolders\"\n      />\n    </form>\n  </b-modal>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport GCodeFileStructure from '@src/components/g-codes/GCodeFileStructure.vue'\nimport { normalizedGcodeFolder } from '@src/lib/normalizers'\n\nconst PAGE_SIZE = 24\n\nexport default {\n  name: 'MoveModal',\n\n  components: {\n    GCodeFileStructure,\n  },\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n    items: {\n      type: Object,\n      default: null,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    sortingValue: {\n      type: Object,\n      required: true,\n    },\n    itemParentFolderId: {\n      type: String,\n      default: '',\n    },\n  },\n\n  data() {\n    return {\n      path: [],\n      isOpen: false,\n      loading: false,\n      patchLoading: false,\n      folders: [],\n      files: [],\n      noMoreFolders: false,\n      currentFoldersPage: 1,\n      currentFilesPage: 1,\n    }\n  },\n\n  computed: {\n    disabledItems() {\n      const items = {\n        files: [],\n        folders: [],\n      }\n\n      if (this.item && this.itemType === 'file') {\n        items.files = [this.item.id]\n      } else if (this.item && this.itemType === 'folder') {\n        items.folders = [this.item.id]\n      } else if (this.items) {\n        items.files = this.items.files\n        items.folders = this.items.folders\n      }\n\n      return items\n    },\n    itemType() {\n      return this.item ? (this.item.filename ? 'file' : 'folder') : null\n    },\n    parentFolder() {\n      return this.path && this.path.length > 0 ? this.path.at(-1) : null\n    },\n    isSameDir() {\n      if (this.parentFolder === null && !this.itemParentFolderId) {\n        return true\n      } else if (parseInt(this.itemParentFolderId) === this.parentFolder) {\n        return true\n      }\n      return false\n    },\n  },\n\n  methods: {\n    goBack() {\n      this.path.pop()\n      this.fetchFilesAndFolders(true)\n    },\n    openFolder(folder) {\n      this.path.push(folder.id)\n      this.fetchFilesAndFolders(true)\n    },\n    resetFiles() {\n      this.folders = []\n      this.files = []\n      this.noMoreFolders = false\n      this.currentFoldersPage = 1\n      this.currentFilesPage = 1\n    },\n    async fetchFilesAndFolders(reset = false) {\n      if (this.loading) {\n        return\n      }\n\n      if (reset) {\n        this.resetFiles()\n      }\n\n      if (this.noMoreFolders) {\n        return\n      }\n\n      this.loading = true\n      let folders = []\n\n      if (!this.noMoreFolders) {\n        try {\n          const params = {\n            parent_folder: this.parentFolder || 'null',\n            page: this.currentFoldersPage,\n            page_size: PAGE_SIZE,\n          }\n          if (this.sortingValue.sorting.folderKey) {\n            params.sorting = `${this.sortingValue.sorting.folderKey}_${this.sortingValue.direction.key}`\n          }\n          let response = await axios.get(urls.gcodeFolders(), { params })\n          response = response.data\n          this.noMoreFolders = response?.next === null\n          folders = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.folders.push(...folders.map((data) => normalizedGcodeFolder(data)))\n        this.currentFoldersPage += 1\n      }\n\n      this.loading = false\n    },\n\n    show() {\n      this.isOpen = true\n      this.fetchFilesAndFolders()\n\n      this.$nextTick(() => {\n        if (!this.item && !this.items) {\n          this.isOpen = false\n          return\n        }\n        this.$bvModal.show('b-modal-move')\n      })\n    },\n    close() {\n      this.$bvModal.hide('b-modal-move')\n      this.resetModal()\n    },\n    resetModal() {\n      this.isOpen = false\n      this.path = []\n      this.resetFiles()\n    },\n    handleOk(bvModalEvent) {\n      bvModalEvent.preventDefault()\n      this.handleSubmit()\n    },\n    async handleSubmit() {\n      this.patchLoading = true\n      const parentFolder = this.parentFolder || ''\n\n      try {\n        if (this.item) {\n          const id = this.item.id\n          const url = this.itemType === 'file' ? urls.gcodeFile(id) : urls.gcodeFolder(id)\n          await axios.patch(url, `parent_folder=${parentFolder}`)\n        } else if (this.items) {\n          if (this.items.folders.length)\n            await axios.post(urls.gcodeFolderBulkMove(), {\n              folder_ids: this.items.folders,\n              parent_folder: parentFolder,\n            })\n          if (this.items.files.length)\n            await axios.post(urls.gcodeFileBulkMove(), {\n              file_ids: this.items.files,\n              parent_folder: parentFolder,\n            })\n        }\n      } catch (error) {\n        this.errorDialog(error, `${this.$i18next.t('Failed to move item(s)')}`)\n      }\n\n      this.patchLoading = false\n      this.$emit('moved')\n      this.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.title\n  display: flex\n  align-items: center\n  .icon-btn\n    padding-top: 0\n    padding-bottom: 0\n    padding-left: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MoveModal.vue?vue&type=template&id=ef0f185e&scoped=true&\"\nimport script from \"./MoveModal.vue?vue&type=script&lang=js&\"\nexport * from \"./MoveModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MoveModal.vue?vue&type=style&index=0&id=ef0f185e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"ef0f185e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div')\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div></div>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\n\nexport default {\n  name: 'RenameModal',\n\n  props: {\n    item: {\n      type: Object,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      isOpen: false,\n    }\n  },\n\n  created() {},\n\n  mounted() {},\n\n  methods: {\n    show() {\n      this.isOpen = true\n      this.$bvModal\n        .msgBoxConfirm(`${this.$i18next.t('Are you sure?')}`, {\n          id: 'b-modal-confirm-delete',\n          centered: true,\n          okTitle: `${this.$i18next.t('Delete')}`,\n          okVariant: 'danger',\n          size: 'sm',\n          autoFocusButton: 'ok',\n        })\n        .then(async (value) => {\n          this.isOpen = false\n          if (!value) return\n\n          try {\n            const url = this.item.filename\n              ? urls.gcodeFile(this.item.id)\n              : urls.gcodeFolder(this.item.id)\n            await axios.delete(url)\n          } catch (e) {\n            console.log(e)\n            return\n          }\n\n          this.$emit('deleted')\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Failed to delete item')}`)\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\">\n#b-modal-confirm-delete\n  .modal-body\n    font-size: 1.125rem\n    text-align: center\n  .modal-footer\n    justify-content: center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DeleteConfirmationModal.vue?vue&type=template&id=1c764133&\"\nimport script from \"./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"\nexport * from \"./DeleteConfirmationModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DeleteConfirmationModal.vue?vue&type=style&index=0&id=1c764133&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import i18n from '@src/i18n/i18n.js'\n\nconst MAX_USER_MESSAGE_LENGTH = 500\nconst MAX_SENTRY_MESSAGE_LENGTH = 1000\n\nconst isObject = (value) => value && typeof value === 'object' && !Array.isArray(value)\n\nconst truncate = (value, maxLength = MAX_USER_MESSAGE_LENGTH) => {\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  return value.length > maxLength ? `${value.slice(0, maxLength)}...` : value\n}\n\nconst normalizeWhitespace = (value) => value.replace(/\\s+/g, ' ').trim()\n\nconst looksLikeHtml = (value) =>\n  typeof value === 'string' &&\n  /<!doctype html|<html[\\s>]|<head[\\s>]|<body[\\s>]|<title[\\s>]|<\\/[a-z][^>]*>/i.test(value)\n\nconst decodeHtmlEntities = (value) => {\n  if (typeof document !== 'undefined') {\n    const textarea = document.createElement('textarea')\n    textarea.innerHTML = value\n    return textarea.value\n  }\n\n  return value\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n}\n\nconst stripHtml = (value) => {\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  return normalizeWhitespace(decodeHtmlEntities(value.replace(/<[^>]*>/g, ' ')))\n}\n\nconst extractHtmlTitle = (value) => {\n  if (typeof value !== 'string') {\n    return null\n  }\n\n  const title = value.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)?.[1]\n  return title ? stripHtml(title) : null\n}\n\nconst getHeader = (xhr, name) => {\n  if (!xhr || typeof xhr.getResponseHeader !== 'function') {\n    return null\n  }\n\n  try {\n    return xhr.getResponseHeader(name)\n  } catch (_error) {\n    return null\n  }\n}\n\nconst getResponseText = (xhr) => {\n  if (!xhr) {\n    return null\n  }\n\n  if (typeof xhr.responseText === 'string') {\n    return xhr.responseText\n  }\n\n  if (typeof xhr.response === 'string') {\n    return xhr.response\n  }\n\n  return null\n}\n\nconst getStatus = (xhr) => {\n  if (!xhr || typeof xhr.status !== 'number') {\n    return null\n  }\n\n  return xhr.status\n}\n\nconst parseJson = (value) => {\n  if (typeof value !== 'string' || !value.trim()) {\n    return null\n  }\n\n  try {\n    return JSON.parse(value)\n  } catch (_error) {\n    return null\n  }\n}\n\nconst safeString = (value) => {\n  if (typeof value === 'string') {\n    return value\n  }\n\n  if (typeof value === 'number' || typeof value === 'boolean') {\n    return String(value)\n  }\n\n  return null\n}\n\nconst flattenApiErrors = (value) => {\n  const directValue = safeString(value)\n  if (directValue) {\n    return [directValue]\n  }\n\n  if (Array.isArray(value)) {\n    return value.flatMap((item) => flattenApiErrors(item))\n  }\n\n  if (isObject(value)) {\n    if (value.error) {\n      return flattenApiErrors(value.error)\n    }\n    if (value.detail) {\n      return flattenApiErrors(value.detail)\n    }\n\n    return Object.values(value).flatMap((item) => flattenApiErrors(item))\n  }\n\n  return []\n}\n\nconst sanitizeUserMessage = (value) => {\n  if (!value || typeof value !== 'string') {\n    return null\n  }\n\n  const message = looksLikeHtml(value) ? stripHtml(value) : normalizeWhitespace(value)\n  return message ? truncate(message) : null\n}\n\nconst userMessageFromApiBody = (body) => {\n  const errors = flattenApiErrors(body)\n    .map((error) => sanitizeUserMessage(error))\n    .filter(Boolean)\n\n  return errors.length ? errors.join(' ') : null\n}\n\nconst defaultUploadErrorMessage = () => i18n.t('Upload failed. Please try again.')\n\nconst fallbackMessageForStatus = (status, defaultMessage) => {\n  if (status === 0) {\n    return i18n.t(\n      'Upload failed because the connection was interrupted. Please check your network and try again.'\n    )\n  }\n\n  if (status === 413) {\n    return i18n.t('Upload failed because the file is larger than the upload limit.')\n  }\n\n  if (status >= 500) {\n    return i18n.t(\n      'Upload failed because the server temporarily could not complete the request. Please try again later.'\n    )\n  }\n\n  return defaultMessage || defaultUploadErrorMessage()\n}\n\nexport const normalizeDropzoneUploadError = (file, message, xhr, options = {}) => {\n  const defaultMessage = options.defaultMessage || defaultUploadErrorMessage()\n  const status = getStatus(xhr)\n  const responseText = getResponseText(xhr)\n  const contentType = getHeader(xhr, 'content-type') || getHeader(xhr, 'Content-Type')\n  const jsonBody = parseJson(responseText)\n  const htmlResponse =\n    looksLikeHtml(responseText) || (contentType && /html/i.test(contentType))\n\n  let userMessage = null\n  if (jsonBody) {\n    userMessage = userMessageFromApiBody(jsonBody)\n  } else if (isObject(message)) {\n    userMessage = userMessageFromApiBody(message)\n  } else if (!htmlResponse) {\n    userMessage = sanitizeUserMessage(safeString(message) || responseText)\n  }\n\n  if (!userMessage) {\n    userMessage = fallbackMessageForStatus(status, defaultMessage)\n  }\n\n  if (!jsonBody && (status === 0 || status === 413 || status >= 500)) {\n    userMessage = fallbackMessageForStatus(status, defaultMessage)\n  }\n\n  return {\n    userMessage,\n    status,\n    contentType,\n    isHtmlResponse: !!htmlResponse,\n    responseTitle: extractHtmlTitle(responseText),\n    responseSnippet: truncate(stripHtml(responseText || ''), MAX_SENTRY_MESSAGE_LENGTH),\n    dropzoneMessage: truncate(\n      sanitizeUserMessage(safeString(message)) || '',\n      MAX_SENTRY_MESSAGE_LENGTH\n    ),\n    fileName: file?.name || null,\n    fileSize: typeof file?.size === 'number' ? file.size : null,\n  }\n}\n\nexport const getDropzoneUploadErrorMessage = (file, message, xhr, options = {}) =>\n  normalizeDropzoneUploadError(file, message, xhr, options).userMessage\n","<template>\n  <page-layout :is-popup=\"isPopup\">\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <a\n        v-if=\"isPopup && parentFolder !== null\"\n        href=\"#\"\n        class=\"btn shadow-none icon-btn d-inline\"\n        title=\"Go Back\"\n        @click.prevent=\"goBack\"\n      >\n        <i class=\"fas fa-chevron-left\"></i>\n      </a>\n      <div v-if=\"!isPopup && isCloud\" class=\"actions-with-selected-desktop\">\n        <b-form-group class=\"m-0\">\n          <b-form-checkbox\n            :checked=\"allSelected\"\n            size=\"md\"\n            @click.native.capture.stop.prevent=\"toggleSelectAll\"\n          ></b-form-checkbox>\n        </b-form-group>\n        <div>\n          <span v-show=\"!selectedItemsCount\" class=\"label\" @click=\"toggleSelectAll\"\n            >{{ $t(\"Select all\") }}</span\n          >\n          <b-dropdown\n            v-show=\"selectedItemsCount\"\n            toggle-class=\"btn btn-sm actions-with-selected-btn\"\n          >\n            <template #button-content>\n              {{ selectedItemsCount }} item{{ selectedItemsCount === 1 ? '' : 's' }}\n              {{$t(\"selected\")}}\n            </template>\n            <b-dropdown-item>\n              <div @click=\"moveSelectedItems\"><i class=\"fas fa-arrows-alt\"></i>{{ $t(\"Move\") }}</div>\n            </b-dropdown-item>\n            <b-dropdown-item>\n              <div class=\"text-danger\" @click=\"deleteSelectedItems\">\n                <i class=\"far fa-trash-alt\"></i>{{$t(\"Delete\")}}\n              </div>\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n\n      <search-input class=\"search-input mr-3\" @input=\"updateSearch\"></search-input>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Create folder -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-none d-md-inline\"\n          title=\"Create folder\"\n          @click.prevent=\"createFolder\"\n        >\n          <i class=\"fas fa-folder-plus\"></i>\n        </a>\n        <!-- Select storage -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-server\"></i>\n          </template>\n          <b-dropdown-text class=\"small text-secondary\">{{ $t(\"STORAGE\") }}</b-dropdown-text>\n          <b-dropdown-item @click=\"switchToCloudStorage\">\n            <div class=\"dropdown-text-group\">\n              <i\n                class=\"fas fa-check text-primary\"\n                :style=\"{ visibility: isCloud ? 'visible' : 'hidden' }\"\n              ></i>\n              <div class=\"text\">\n                <div class=\"title\">{{ $syndicateText.brandName }} {{$t(\"Cloud\")}}</div>\n              </div>\n            </div>\n          </b-dropdown-item>\n          <b-dropdown-item\n            v-for=\"printer in printers\"\n            :key=\"printer.id\"\n            @click=\"() => switchToPrinterStorage(printer)\"\n          >\n            <div class=\"dropdown-text-group\">\n              <i\n                class=\"fas fa-check text-primary\"\n                :style=\"{ visibility: selectedPrinterId === printer.id ? 'visible' : 'hidden' }\"\n              ></i>\n              <div class=\"text\">\n                <div class=\"title\">{{ printer.name }}</div>\n                <div\n                  class=\"subtitle\"\n                  :class=\"[isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']\"\n                >\n                  {{ printerBrowsabilityText(printer) }}\n                </div>\n              </div>\n            </div>\n          </b-dropdown-item>\n        </b-dropdown>\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" title=\"Sort By\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"mobileMenuOptions\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          >\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #storage>\n              <b-dropdown-text class=\"small text-secondary\">{{ $t(\"STORAGE\") }}</b-dropdown-text>\n              <b-dropdown-item\n                @click=\"\n                  () => {\n                    switchToCloudStorage()\n                    $refs.cascadedDropdown.resetMenuExpanded()\n                  }\n                \"\n              >\n                <div class=\"dropdown-text-group\">\n                  <i\n                    class=\"fas fa-check text-primary\"\n                    :style=\"{ visibility: isCloud ? 'visible' : 'hidden' }\"\n                  ></i>\n                  <div class=\"text\">\n                    <div class=\"title\">{{ $syndicateText.brandName }} {{$t(\"Cloud\")}}</div>\n                  </div>\n                </div>\n              </b-dropdown-item>\n              <b-dropdown-item\n                v-for=\"printer in printers\"\n                :key=\"printer.id\"\n                @click=\"\n                  () => {\n                    switchToPrinterStorage(printer)\n                    $refs.cascadedDropdown.resetMenuExpanded()\n                  }\n                \"\n              >\n                <div class=\"dropdown-text-group\">\n                  <i\n                    class=\"fas fa-check text-primary\"\n                    :style=\"{ visibility: selectedPrinterId === printer.id ? 'visible' : 'hidden' }\"\n                  ></i>\n                  <div class=\"text\">\n                    <div class=\"title\">{{ printer.name }}</div>\n                    <div\n                      class=\"subtitle\"\n                      :class=\"[isPrinterBrowsable(printer) ? 'text-success' : 'text-warning']\"\n                    >\n                      {{ printerBrowsabilityText(printer) }}\n                    </div>\n                  </div>\n                </div>\n              </b-dropdown-item>\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n\n        <a\n          v-if=\"onClose\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          title=\"Close\"\n          @click.prevent=\"onClose\"\n        >\n          <i class=\"fas fa-times text-danger\"></i>\n        </a>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <vue-dropzone\n              v-if=\"isCloud\"\n              id=\"dropzone\"\n              ref=\"gcodesDropzone\"\n              class=\"upload-box\"\n              :options=\"dropzoneOptions\"\n              :use-custom-slot=\"true\"\n              @vdropzone-queue-complete=\"gcodeUploadSuccess\"\n              @vdropzone-error=\"gcodeUploadError\"\n              @vdropzone-sending=\"addParentFolderParam\"\n            >\n              <div class=\"dz-message needsclick\">\n                <i class=\"fas fa-upload fa-2x\"></i> <br />\n                <div>{{ $t(\"G-Code file (*.gcode, *.gco, or *.g) only.\") }}</div>\n                <div>{{ $t('Up to {maxFilesize} MB each file, {maxTotalFilesize} GB total.',{maxFilesize,maxTotalFilesize}) }}</div>\n              </div>\n            </vue-dropzone>\n\n            <div v-if=\"!isCloud && isAgentMoonraker && searchStateIsActive\" class=\"notice-block\">\n              <div class=\"icon\">\n                <i class=\"fas fa-info\"></i>\n              </div>\n              <p class=\"message\">{{ $t(\"Search in Klipper printers works only for current directory\") }}</p>\n            </div>\n\n            <g-code-file-structure\n              ref=\"gCodeFileStructure\"\n              :is-cloud=\"isCloud\"\n              :is-popup=\"isPopup\"\n              :search-state-is-active=\"searchStateIsActive\"\n              :search-in-progress=\"searchInProgress\"\n              :folders=\"folders\"\n              :files=\"files\"\n              :target-printer=\"targetPrinter\"\n              :nothing-found=\"nothingFound\"\n              :loading=\"loading\"\n              :scroll-container-id=\"scrollContainerId\"\n              :no-more-folders=\"noMoreFolders\"\n              :no-more-files=\"noMoreFiles\"\n              :local-files-loading=\"localFilesLoading\"\n              @openFolder=\"openFolder\"\n              @openFile=\"openFile\"\n              @renameItem=\"renameItem\"\n              @moveItem=\"moveItem\"\n              @deleteItem=\"deleteItem\"\n              @print=\"onPrintClicked\"\n              @fetchMore=\"fetchFilesAndFolders\"\n              @selectFiles=\"onSelectFiles\"\n              @selectFolders=\"onSelectFolders\"\n            />\n          </b-col>\n        </b-row>\n      </b-container>\n      <rename-modal\n        ref=\"renameModal\"\n        :item=\"activeItem\"\n        :pre-confirm=\"verifyItemRename\"\n        @renamed=\"onItemRenamed\"\n      />\n      <move-modal\n        ref=\"moveModal\"\n        :item=\"activeItem\"\n        :items=\"activeItems\"\n        :item-parent-folder-id=\"parentFolder\"\n        :target-printer=\"targetPrinter\"\n        :scroll-container-id=\"scrollContainerId\"\n        :sorting-value=\"sortingValue\"\n        @moved=\"onItemMoved\"\n      />\n      <delete-confirmation-modal\n        ref=\"deleteConfirmationModal\"\n        :item=\"activeItem\"\n        @deleted=\"onItemDeleted\"\n      />\n      <new-folder-modal\n        ref=\"newFolderModal\"\n        :pre-confirm=\"verifyNewFolder\"\n        :parent-folder-id=\"parentFolder\"\n        @created=\"onFolderCreated\"\n      />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport vue2Dropzone from 'vue2-dropzone'\nimport 'vue2-dropzone/dist/vue2Dropzone.min.css'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport escape from 'lodash/escape'\nimport {\n  normalizedGcode,\n  normalizedGcodeFolder,\n  normalizedPrinter,\n  PrintStatus,\n} from '@src/lib/normalizers'\nimport { user } from '@src/lib/page-context'\nimport SearchInput from '@src/components/SearchInput.vue'\nimport { getCsrfFromDocument } from '@src/lib/utils'\nimport NewFolderModal from '@src/components/g-codes/NewFolderModal.vue'\nimport RenameModal from '@src/components/g-codes/RenameModal.vue'\nimport MoveModal from '@src/components/g-codes/MoveModal.vue'\nimport DeleteConfirmationModal from '@src/components/g-codes/DeleteConfirmationModal.vue'\nimport { sendToPrint, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  listPrinterLocalGCodesOctoPrint,\n  listPrinterLocalGCodesMoonraker,\n} from '@src/lib/printer-local-comm'\nimport GCodeFileStructure from '@src/components/g-codes/GCodeFileStructure.vue'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport i18n from '@src/i18n/i18n.js'\nimport { getDropzoneUploadErrorMessage } from '@src/lib/dropzone-upload-error'\n\n// Waiting time (ms) before asking server for search results\nconst SEARCH_API_CALL_DELAY = 1000\n\nconst PAGE_SIZE = 24\n\nconst SortingLocalStoragePrefix = 'gcodesSorting'\nconst SortingOptions = {\n  options: [\n    { title: `${i18n.t('Name')}`, key: 'filename', folderKey: 'name' },\n    { title: `${i18n.t('Size')}`, key: 'num_bytes' },\n    { title: `${i18n.t('Created')}`, key: 'created_at', folderKey: 'created_at' },\n  ],\n  default: { sorting: 'created_at', direction: 'desc' },\n}\n\nexport default {\n  name: 'GCodeFoldersPage',\n\n  components: {\n    PageLayout,\n    SearchInput,\n    vueDropzone: vue2Dropzone,\n    GCodeFileStructure,\n    RenameModal,\n    MoveModal,\n    DeleteConfirmationModal,\n    NewFolderModal,\n    SortingDropdown,\n    CascadedDropdown,\n  },\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    onClose: {\n      type: Function,\n      default: null,\n    },\n    scrollContainerId: {\n      type: String,\n      default: null,\n    },\n    targetPrinter: {\n      type: Object,\n      default: null,\n    },\n    savedPath: {\n      type: Array,\n      default: () => [],\n    },\n    routeParams: {\n      type: Object,\n      default: () => {\n        return {\n          printerId: null,\n          parentFolder: null,\n        }\n      },\n    },\n  },\n\n  data() {\n    return {\n      PrintStatus,\n      csrf: null,\n      user: null,\n      loading: false,\n      parentFolder: null,\n      path: [],\n      files: [],\n      folders: [],\n      noMoreFolders: false,\n      noMoreFiles: false,\n      currentFoldersPage: 1,\n      currentFilesPage: 1,\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      searchQuery: null,\n      searchStateIsActive: false,\n      searchTimeoutId: null,\n\n      activeItem: null,\n      activeItems: null,\n\n      // local storage:\n      printers: [],\n      selectedPrinterId: undefined,\n      selectedPrinterComm: undefined,\n      localFilesLoading: false,\n\n      selectedFolders: new Set(),\n      selectedFiles: new Set(),\n    }\n  },\n\n  computed: {\n    selectedItemsCount() {\n      return this.selectedFiles.size + this.selectedFolders.size\n    },\n    allSelected() {\n      const itemsCount = this.files.length + this.folders.length\n      return this.selectedItemsCount === itemsCount && itemsCount !== 0\n    },\n    mobileMenuOptions() {\n      const options = [\n        {\n          key: 'storage',\n          icon: 'fas fa-server',\n          title: `${this.$i18next.t(`File storage`)}`,\n          expandable: true,\n        },\n        {\n          key: 'sorting',\n          icon: 'fas fa-sort-amount-down',\n          title: `${this.$i18next.t(`Sort`)}`,\n          expandable: true,\n        },\n      ]\n\n      if (this.isCloud) {\n        options.unshift({\n          key: 'createFolder',\n          icon: 'fas fa-folder-plus',\n          title: `${this.$i18next.t('Create folder')}`,\n          callback: true,\n        })\n      }\n\n      return options\n    },\n    isAgentMoonraker() {\n      const selectedPrinter = this.printers.find((p) => p.id === this.selectedPrinterId)\n      return !selectedPrinter || selectedPrinter.isAgentMoonraker()\n    },\n    isCloud() {\n      return !this.selectedPrinterId\n    },\n    nothingFound() {\n      return this.searchStateIsActive && !this.searchTimeoutId && !this.files.length\n    },\n    searchInProgress() {\n      return this.searchStateIsActive && !!this.searchTimeoutId\n    },\n    maxFilesize() {\n      return this.user.is_pro ? 500 : 50 // MB\n    },\n    maxTotalFilesize() {\n      return this.user.is_pro ? 50 : 1 // GB\n    },\n    dropzoneOptions() {\n      return {\n        withCredentials: true,\n        maxFilesize: this.maxFilesize,\n        timeout: 60 * 60 * 1000, // For large files\n        acceptedFiles: '.g,.gcode,.gco',\n        url: urls.gcodeFiles(),\n        headers: { 'X-CSRFToken': this.csrf },\n      }\n    },\n  },\n\n  async created() {\n    this.csrf = getCsrfFromDocument()\n    this.user = user()\n\n    if (this.savedPath && this.savedPath.length >= 1) {\n      this.parentFolder = this.savedPath.at(-1)\n      this.path = this.savedPath.slice(0, this.savedPath.length - 1)\n    } else {\n      this.parentFolder = this.getRouteParam('parentFolder') || null\n    }\n\n    this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n\n    if (!this.isPopup) {\n      this.$watch(\n        () => this.$route.params,\n        (toParams, previousParams) => {\n          this.parentFolder = toParams.parentFolder || null\n          this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n          this.fetchFilesAndFolders(true)\n        }\n      )\n    }\n\n    await this.fetchPrinters()\n    this.fetchFilesAndFolders(true)\n  },\n\n  methods: {\n    isPrinterBrowsable(printer) {\n      return !(printer.isOffline() || !printer.isAgentVersionGte('2.3.0', '1.2.0'))\n    },\n    printerBrowsabilityText(printer) {\n      return this.isPrinterBrowsable(printer)\n        ? `${this.$i18next.t('Available to browse files')}`\n        : `${this.$i18next.t('Unable to browse files')}`\n    },\n    toggleSelectAll() {\n      if (this.allSelected) {\n        this.$refs.gCodeFileStructure.unselectAll()\n      } else {\n        this.$refs.gCodeFileStructure.selectAll()\n      }\n    },\n    onSelectFiles(items) {\n      this.selectedFiles = items\n    },\n    onSelectFolders(items) {\n      this.selectedFolders = items\n    },\n    moveSelectedItems() {\n      this.activeItems = {\n        files: Array.from(this.selectedFiles),\n        folders: Array.from(this.selectedFolders),\n      }\n      this.$refs.moveModal.show()\n    },\n    deleteSelectedItems() {\n      const selectedFolderIds = Array.from(this.selectedFolders)\n      const selectedFileIds = Array.from(this.selectedFiles)\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t('Delete {name} item(s)? This action can not be undone.',{name:selectedFolderIds.length + selectedFileIds.length})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then(async (userAction) => {\n        if (userAction.isConfirmed) {\n          try {\n            if (selectedFolderIds.length)\n              await axios.post(urls.gcodeFolderBulkDelete(), { folder_ids: selectedFolderIds })\n            if (selectedFileIds.length)\n              await axios.post(urls.gcodeFileBulkDelete(), { file_ids: selectedFileIds })\n          } catch (err) {\n            this.errorDialog(err, `${this.$i18next.t('Failed to delete files and folders')}`)\n          } finally {\n            this.fetchFilesAndFolders(true)\n          }\n        }\n      })\n    },\n    switchToCloudStorage() {\n      this.parentFolder = null\n      this.path = []\n      this.selectedPrinterId = null\n      this.selectedPrinterComm = null\n      if (this.isPopup) {\n        this.fetchFilesAndFolders(true)\n      } else {\n        if (this.$route.path !== '/g_code_folders/cloud/') {\n          this.$router.replace(`/g_code_folders/cloud/`)\n        }\n      }\n    },\n    switchToPrinterStorage(printer) {\n      if (!this.isPrinterBrowsable(printer)) {\n        this.$swal.Reject.fire({\n          title: `${this.$i18next.t(`{name} isn't available for browsing files for one of the following reasons`,{name:escape(printer.name)})}:`,\n          html: `<ul style=\"text-align: left\">\n            <li>${this.$i18next.t('{name} is powered off or not connected to the Internet',{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t('Printer is not connected to {name}',{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"{brandName} for {name} plugin is outdated (you need version {version} or later)\",{brandName:this.$syndicateText.brandName,name:printer.agentDisplayName(),version:printer.browsabilityMinPluginVersion()})}</li>\n          </ul>`,\n        })\n        return\n      }\n\n      this.parentFolder = null\n      this.path = []\n      this.selectedPrinterId = printer.id\n      this.selectedPrinterComm = null\n      if (this.isPopup) {\n        this.fetchFilesAndFolders(true)\n      } else {\n        if (Number(this.getRouteParam('printerId')) !== printer.id) {\n          this.$router.replace(`/g_code_folders/local/${printer.id}/`)\n        }\n      }\n    },\n    getRouteParam(name) {\n      return this.isPopup ? this.routeParams[name] : this.$route.params[name]\n    },\n    goBack() {\n      if (!this.path.length) {\n        return\n      }\n      this.parentFolder = this.path.pop()\n      this.fetchFilesAndFolders(true)\n    },\n    resetFiles() {\n      this.folders = []\n      this.files = []\n      this.$refs.gCodeFileStructure.unselectAll()\n      this.noMoreFolders = false\n      this.noMoreFiles = false\n      this.currentFoldersPage = 1\n      this.currentFilesPage = 1\n    },\n    async fetchPrinters() {\n      let printers\n      try {\n        printers = await axios.get(urls.printers())\n        printers = printers.data\n      } catch (e) {\n        console.error(e)\n      }\n      if (!printers) {\n        return\n      }\n      printers = printers.map((p) => normalizedPrinter(p))\n      // bring browsable printers at the top of the list\n      printers = printers.sort(\n        (a, b) => Number(this.isPrinterBrowsable(b)) - Number(this.isPrinterBrowsable(a))\n      )\n      this.printers = this.targetPrinter\n        ? printers.filter((p) => p.id === this.targetPrinter.id)\n        : printers\n    },\n    async fetchLocalFiles() {\n      if (!this.selectedPrinterComm) {\n        return\n      }\n      this.localFilesLoading = true\n      const listPrinterLocalGCodes = this.isAgentMoonraker\n        ? listPrinterLocalGCodesMoonraker\n        : listPrinterLocalGCodesOctoPrint\n\n      listPrinterLocalGCodes(\n        this.selectedPrinterComm,\n        this.parentFolder ? decodeURIComponent(this.parentFolder) : null,\n        this.searchQuery\n      ).then((result) => {\n        this.localFilesLoading = false\n        if (result) {\n          const { folders, files } = result\n          this.folders = this.sortLocalItems(folders)\n          this.files = this.sortLocalItems(files)\n        }\n      })\n    },\n    async fetchFilesAndFolders(reset = false, printLastUploadedFile = false) {\n      if (this.loading) {\n        return\n      }\n\n      if (reset) {\n        this.resetFiles()\n      }\n\n      // need to fetch local printer files\n      if (this.selectedPrinterId) {\n        if (!this.printers.find((p) => p.id === this.selectedPrinterId)) {\n          this.$swal.Reject.fire({\n            title: `${this.$i18next.t('Error')}`,\n            text: `${this.$i18next.t(`Printer not found or unavailable`)}`,\n          }).then(() => {\n            if (this.isPopup && this.onClose) {\n              this.onClose()\n            } else {\n              window.location.assign(`/g_code_folders/cloud/`)\n            }\n          })\n        }\n\n        this.localFilesLoading = true\n\n        if (!this.selectedPrinterComm) {\n          this.selectedPrinterComm = printerCommManager.getOrCreatePrinterComm(\n            this.selectedPrinterId,\n            urls.printerWebSocket(this.selectedPrinterId)\n          )\n          this.selectedPrinterComm.connect(this.fetchLocalFiles)\n        } else {\n          this.fetchLocalFiles()\n        }\n        return\n      }\n\n      if (this.searchQuery) {\n        this.noMoreFolders = true\n      }\n\n      if (this.noMoreFolders && this.noMoreFiles) {\n        return\n      }\n\n      this.loading = true\n      let folders = []\n      let files = []\n\n      if (!this.noMoreFolders) {\n        try {\n          const params = {\n            parent_folder: this.parentFolder || 'null',\n            page: this.currentFoldersPage,\n            page_size: PAGE_SIZE,\n          }\n          if (this.sortingValue.sorting.folderKey) {\n            params.sorting = `${this.sortingValue.sorting.folderKey}_${this.sortingValue.direction.key}`\n          }\n          let response = await axios.get(urls.gcodeFolders(), { params })\n          response = response.data\n          this.noMoreFolders = response?.next === null\n          folders = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.currentFoldersPage += 1\n      }\n\n      if (!this.noMoreFiles && folders.length < PAGE_SIZE) {\n        try {\n          let response = await axios.get(urls.gcodeFiles(), {\n            // If cache is enabled, after renaming item on gcode page\n            // and going back to files - gcode will have old name\n            headers: {\n              'Cache-Control': 'no-cache',\n            },\n            params: {\n              // search is always global and we don't send parent_folder param at all in this case\n              // if `parentFolder` is null, it means we are in root folder (server needs '' or 'null')\n              parent_folder: this.searchQuery ? undefined : this.parentFolder || 'null',\n              page: this.currentFilesPage,\n              page_size: PAGE_SIZE,\n              sorting: `${this.sortingValue.sorting.key}_${this.sortingValue.direction.key}`,\n              q: this.searchQuery,\n            },\n          })\n          response = response.data\n          this.noMoreFiles = response?.next === null\n          files = response?.results || []\n        } catch (error) {\n          this.loading = false\n          this.errorDialog(error)\n        }\n\n        this.currentFilesPage += 1\n\n        if (printLastUploadedFile) {\n          try {\n            let response = await axios.get(urls.gcodeFiles(), {\n              params: {\n                parent_folder: this.parentFolder || 'null',\n                page_size: 1,\n                sorting: `created_at_desc`,\n              },\n            })\n            response = response.data\n            if (response?.results && response.results[0]) {\n              this.onPrintClicked(response.results[0])\n            }\n          } catch (error) {\n            this.loading = false\n            this.errorDialog(error)\n          }\n        }\n      }\n\n      this.folders.push(...folders.map((data) => normalizedGcodeFolder(data)))\n      this.files.push(...files.map((data) => normalizedGcode(data)))\n      this.loading = false\n    },\n    updateSearch(search) {\n      clearTimeout(this.searchTimeoutId)\n      this.searchTimeoutId = null\n\n      this.searchStateIsActive = !!search\n      if (!this.searchStateIsActive) {\n        this.searchQuery = null\n        this.fetchFilesAndFolders(true)\n        return\n      }\n\n      this.searchTimeoutId = setTimeout(async () => {\n        this.searchQuery = search\n        this.fetchFilesAndFolders(true)\n        this.searchTimeoutId = null\n      }, SEARCH_API_CALL_DELAY)\n    },\n    addParentFolderParam(file, xhr, formData) {\n      formData.append('filename', file.name)\n      if (this.parentFolder !== null) {\n        formData.append('parent_folder', this.parentFolder)\n      }\n    },\n    gcodeUploadSuccess() {\n      const printAfterUpload =\n        this.targetPrinter &&\n        this.$refs.gcodesDropzone.getAcceptedFiles().length === 1 &&\n        this.$refs.gcodesDropzone.getRejectedFiles().length === 0\n\n      this.$refs.gcodesDropzone.removeAllFiles()\n      this.files = []\n      this.fetchFilesAndFolders(true, printAfterUpload)\n    },\n    gcodeUploadError(file, message, xhr) {\n      this.$swal.Reject.fire({\n        text: getDropzoneUploadErrorMessage(file, message, xhr),\n      })\n    },\n    renameItem(item) {\n      this.activeItem = item\n      this.$refs.renameModal.show()\n    },\n    verifyItemRename(newName) {\n      if (!this.activeItem.filename && this.folders.find((item) => item.name === newName)) {\n        return `${this.$i18next.t('Folder with this name already exists')}`\n      }\n      return true\n    },\n    onItemRenamed(newName) {\n      if (!this.activeItem) {\n        return\n      }\n      const targetArr = this.activeItem.filename ? this.files : this.folders\n      for (let i in targetArr) {\n        if (targetArr[i].id !== this.activeItem.id) {\n          continue\n        } else if (this.activeItem.filename) {\n          this.files[i].filename = newName\n          break\n        } else {\n          this.folders[i].name = newName\n          break\n        }\n      }\n      this.activeItem = null\n    },\n    moveItem(item) {\n      this.activeItem = item\n      this.$refs.moveModal.show()\n    },\n    onItemMoved() {\n      if (!this.activeItem && !this.activeItems) {\n        return\n      }\n      this.activeItem = null\n      this.activeItems = null\n      this.fetchFilesAndFolders(true)\n    },\n    deleteItem(item) {\n      this.activeItem = item\n      this.$refs.deleteConfirmationModal.show()\n    },\n    onItemDeleted() {\n      if (!this.activeItem) {\n        return\n      }\n      const targetArr = this.activeItem.filename ? this.files : this.folders\n      for (let i in targetArr) {\n        if (targetArr[i].id !== this.activeItem.id) {\n          continue\n        } else if (this.activeItem.filename) {\n          this.files.splice(i, 1)\n          break\n        } else {\n          this.folders.splice(i, 1)\n          break\n        }\n      }\n      this.activeItem = null\n    },\n    createFolder() {\n      this.$refs.newFolderModal.show()\n    },\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'createFolder') {\n        this.createFolder()\n      }\n    },\n    verifyNewFolder(newFolderName) {\n      if (this.folders.find((item) => item.name === newFolderName)) {\n        return `${this.$i18next.t('Folder with this name already exists')}`\n      }\n      return true\n    },\n    onFolderCreated(newFolderId) {\n      // this.openFolder({id: newFolderId})\n      this.fetchFilesAndFolders(true)\n    },\n    openFolder(folder) {\n      if (!this.isPopup) {\n        if (this.selectedPrinterId) {\n          this.$router.push(\n            `/g_code_folders/local/${this.selectedPrinterId}/${encodeURIComponent(folder.path)}/`\n          )\n        } else {\n          this.$router.push(`/g_code_folders/cloud/${folder.id}/`)\n        }\n      } else {\n        this.path.push(this.parentFolder)\n        this.parentFolder = String(folder.id)\n        this.fetchFilesAndFolders(true)\n      }\n    },\n    openFile(file) {\n      if (!this.isPopup) {\n        if (this.selectedPrinterId) {\n          window.location.assign(\n            `/g_code_files/local/${this.selectedPrinterId}/${encodeURIComponent(file.path)}/`\n          )\n        } else {\n          window.location.assign(`/g_code_files/cloud/${file.id}/`)\n        }\n      } else {\n        this.$emit(\n          'openFile',\n          this.selectedPrinterId ? encodeURIComponent(file.path) : file.id,\n          this.selectedPrinterId,\n          [...this.path, this.parentFolder]\n        )\n      }\n    },\n    onPrintClicked(gcode) {\n      confirmPrint(gcode, this.targetPrinter).then(() => {\n        sendToPrint({\n          printer: this.targetPrinter,\n          gcode: gcode,\n          isCloud: this.isCloud,\n          Swal: this.$swal,\n          onCommandSent: () => {\n            if (this.isPopup) {\n              this.$bvModal.hide('b-modal-gcodes' + this.targetPrinter.id)\n            }\n          },\n        })\n      })\n    },\n\n    // Sorting\n    // Printer-local (moonraker/octoprint) listings arrive unsorted from the\n    // printer, unlike the cloud listing which sorts server-side via API\n    // params. Apply the selected sorting client-side so the dropdown works\n    // for printer-side file lists too.\n    sortLocalItems(items) {\n      const sorting = this.sortingValue.sorting\n      const direction =\n        this.sortingValue.direction && this.sortingValue.direction.key === 'asc' ? 1 : -1\n      const keys = [sorting.key, sorting.folderKey].filter(Boolean)\n      const compareValues = (av, bv) => {\n        if (typeof av === 'string' && typeof bv === 'string') {\n          // sort names case-insensitively; plain string comparison would group\n          // all upper-case names before all lower-case ones\n          return av.localeCompare(bv, undefined, { sensitivity: 'base' })\n        }\n        if (av === bv) {\n          return 0\n        }\n        return av > bv ? 1 : -1\n      }\n      return [...items].sort((a, b) => {\n        for (const key of keys) {\n          const av = a[key]\n          const bv = b[key]\n          if (av === undefined || bv === undefined) {\n            continue\n          }\n          const cmp = compareValues(av, bv)\n          if (cmp !== 0) {\n            return cmp * direction\n          }\n        }\n        const an = a.filename || a.name || ''\n        const bn = b.filename || b.name || ''\n        return compareValues(an, bn)\n      })\n    },\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n      this.fetchFilesAndFolders(true)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.upload-box\n  margin-bottom: var(--gap-between-blocks) !important\n\n.search-input\n  height: 30px\n  input\n    background-color: var(--color-surface-secondary)\n    border: var(--color-surface-secondary)\n\n.notice-block\n  border: 1px solid var(--color-divider)\n  border-radius: var(--border-radius-md)\n  display: flex\n  align-items: center\n  padding: 1rem 1.5rem\n  margin-bottom: var(--gap-between-blocks)\n\n  .message\n    margin: 0\n    margin-left: 1rem\n\n.actions-with-selected-desktop\n  display: flex\n  align-items: center\n  margin-right: 1rem\n  .label\n    cursor: pointer\n  ::v-deep .custom-checkbox .custom-control-label::before\n    border-radius: var(--border-radius-xs)\n  @media (max-width: 576px)\n    display: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFoldersPage.vue?vue&type=template&id=fe48d7b6&scoped=true&\"\nimport script from \"./GCodeFoldersPage.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFoldersPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFoldersPage.vue?vue&type=style&index=0&id=fe48d7b6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"fe48d7b6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{attrs:{\"is-popup\":_vm.isPopup},scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [(_vm.isPopup)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Go Back')},on:{\"click\":function($event){$event.preventDefault();return _vm.goBack.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-chevron-left\"})]):_vm._e()]},proxy:true},{key:\"topBarRight\",fn:function(){return [_c('div',{staticClass:\"action-panel\"},[(_vm.canDownloadGcode)?_c('a',{staticClass:\"btn shadow-none icon-btn action-btn\",attrs:{\"title\":_vm.$t('Download file')},on:{\"click\":function($event){$event.preventDefault();return _vm.downloadGcode.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-download\"})]):_vm._e(),(_vm.isCloud)?_c('a',{staticClass:\"btn shadow-none icon-btn action-btn\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Rename file')},on:{\"click\":function($event){$event.preventDefault();return _vm.renameFile.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-edit\"})]):_vm._e(),(_vm.isCloud)?_c('a',{staticClass:\"text-danger btn shadow-none icon-btn action-btn\",attrs:{\"href\":\"#\",\"title\":_vm.$t('Delete file')},on:{\"click\":function($event){$event.preventDefault();return _vm.deleteFile.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-trash-alt\"})]):_vm._e(),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":_vm.dropdownMenuOptions},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1),(_vm.onClose)?_c('a',{staticClass:\"btn shadow-none icon-btn d-inline\",attrs:{\"href\":\"#\",\"title\":\"Close\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onClose.apply(null, arguments)}}},[_c('i',{staticClass:\"fas fa-times text-danger\"})]):_vm._e()],1)]},proxy:true},{key:\"content\",fn:function(){return [(_vm.loading || _vm.gcodeNotFound)?_c('b-container',[_c('b-row',[_c('b-col',{staticClass:\"text-center mt-5\"},[(_vm.gcodeNotFound)?_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"This G-Code file doesn't exists\")))])]):_c('div',[_c('b-spinner')],1)])],1)],1):_c('b-container',{attrs:{\"fluid\":\"\"}},[_c('b-row',[_c('b-col',{attrs:{\"lg\":_vm.isPopup ? 12 : 5}},[_c('b-alert',{attrs:{\"show\":_vm.isDeleted,\"variant\":\"warning warning-block\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"This file is deleted and unavailable for print\"))+\" \")]),_c('g-code-details',{attrs:{\"file\":_vm.gcode,\"show-print-stats\":true,\"compact-view\":false}}),(_vm.isCloud)?_c('jusprin-feedback',{staticClass:\"card-container jusprin-feedback\",attrs:{\"g-code-file-id\":_vm.gcode.id}}):_vm._e(),(!_vm.isDeleted)?_c('available-printers',{staticClass:\"card-container available-printers\",class:{ 'full-width': _vm.isPopup },attrs:{\"is-popup\":_vm.isPopup,\"target-printer-id\":_vm.targetPrinterId || _vm.selectedPrinterId,\"gcode\":_vm.gcode,\"is-cloud\":_vm.isCloud},on:{\"refresh\":_vm.onRefresh}}):_vm._e()],1),_c('b-col',{attrs:{\"lg\":_vm.isPopup ? 12 : 7}},[_c('div',{staticClass:\"print-history\",class:{ 'full-width': _vm.isPopup || _vm.isDeleted }},[_c('h2',{staticClass:\"section-title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]),(_vm.gcode.print_set.length)?_c('div',_vm._l((_vm.gcode.print_set),function(print){return _c('print-history-item',{key:`print_${print.id}`,staticClass:\"print-item\",attrs:{\"print\":print}})}),1):_c('div',[_c('div',{staticClass:\"card-container p-4 justify-content-center text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"This file doesn't have any prints yet\"))+\" \")])])])])],1)],1),_c('rename-modal',{ref:\"renameModal\",attrs:{\"item\":_vm.gcode},on:{\"renamed\":_vm.onItemRenamed}}),_c('delete-confirmation-modal',{ref:\"deleteConfirmationModal\",attrs:{\"item\":_vm.gcode},on:{\"deleted\":_vm.onItemDeleted}})]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.printersLoading || !_vm.gcode)?_c('div',{staticClass:\"my-5 text-center\"},[_c('b-spinner')],1):_c('div',{staticClass:\"text-center\"},[(!_vm.targetPrinterId)?_c('div',{staticClass:\"mb-3\"},[_vm._l((_vm.printers),function(printer){return _c('div',{key:`printer_${printer.id}`,staticClass:\"printer-item\",class:{ active: _vm.selectedPrinter && printer.id === _vm.selectedPrinter.id },on:{\"click\":function($event){return _vm.selectPrinter(printer)}}},[_c('div',{staticClass:\"selected-indicator\"}),_c('div',{staticClass:\"printer-name truncated\",attrs:{\"title\":printer.name}},[_vm._v(_vm._s(printer.name))]),_c('div',{staticClass:\"printer-status\",class:[printer.isPrintable() ? 'text-success' : 'text-warning']},[_vm._v(\" \"+_vm._s(printer.printabilityText())+\" \")])])}),(!_vm.printersLoading && !_vm.printers.length)?_c('p',{staticClass:\"text-center text-secondary mt-3 mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"No available printers\"))+\" \")]):_vm._e()],2):_vm._e(),_c('button',{staticClass:\"btn btn-primary d-inline-flex align-items-center justify-content-center\",attrs:{\"disabled\":!_vm.selectedPrinter || _vm.isSending || !_vm.selectedPrinter.isPrintable()},on:{\"click\":_vm.onPrintClicked}},[(_vm.isSending)?_c('b-spinner',{staticClass:\"mr-1\",attrs:{\"small\":\"\"}}):_vm._e(),(_vm.selectedPrinter)?_c('div',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.$t('Print on'))+\" \"+_vm._s(_vm.selectedPrinter.name))]):_c('div',{staticClass:\"truncated\"},[_vm._v(_vm._s(_vm.$t(\"Print\")))])],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div v-if=\"printersLoading || !gcode\" class=\"my-5 text-center\">\n      <b-spinner />\n    </div>\n    <div v-else class=\"text-center\">\n      <div v-if=\"!targetPrinterId\" class=\"mb-3\">\n        <div\n          v-for=\"printer in printers\"\n          :key=\"`printer_${printer.id}`\"\n          class=\"printer-item\"\n          :class=\"{ active: selectedPrinter && printer.id === selectedPrinter.id }\"\n          @click=\"selectPrinter(printer)\"\n        >\n          <div class=\"selected-indicator\"></div>\n          <div class=\"printer-name truncated\" :title=\"printer.name\">{{ printer.name }}</div>\n          <div\n            class=\"printer-status\"\n            :class=\"[printer.isPrintable() ? 'text-success' : 'text-warning']\"\n          >\n            {{ printer.printabilityText() }}\n          </div>\n        </div>\n\n        <p v-if=\"!printersLoading && !printers.length\" class=\"text-center text-secondary mt-3 mb-3\">\n          {{$t(\"No available printers\")}}\n        </p>\n      </div>\n\n      <button\n        class=\"btn btn-primary d-inline-flex align-items-center justify-content-center\"\n        :disabled=\"!selectedPrinter || isSending || !selectedPrinter.isPrintable()\"\n        @click=\"onPrintClicked\"\n      >\n        <b-spinner v-if=\"isSending\" small class=\"mr-1\" />\n        <div v-if=\"selectedPrinter\" class=\"truncated\">{{$t('Print on')}} {{ selectedPrinter.name }}</div>\n        <div v-else class=\"truncated\">{{ $t(\"Print\") }}</div>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport escape from 'lodash/escape'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { sendToPrint, showRedirectModal, confirmPrint } from './sendToPrint'\nimport { printerCommManager } from '@src/lib/printer-comm'\n\nexport default {\n  name: 'AvailablePrinters',\n\n  components: {},\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinterId: {\n      type: Number,\n      required: false,\n      default: null,\n    },\n    gcode: {\n      type: Object,\n      default: null,\n    },\n    isCloud: {\n      type: Boolean,\n      default: true,\n    },\n  },\n\n  data() {\n    return {\n      printers: [],\n      selectedPrinter: null,\n      printersLoading: true,\n      printerStateCheckInterval: null,\n      printerComms: {},\n    }\n  },\n\n  computed: {\n    isSending() {\n      return this.printers.some(\n        (p) => p.calculatedState() === 'Starting' || p.calculatedState() === 'G-Code Downloading'\n      )\n    },\n  },\n\n  created() {\n    this.fetchPrinters()\n  },\n\n  methods: {\n    async fetchPrinters() {\n      this.printersLoading = true\n\n      const resp = await axios.get(urls.printers())\n      if (!resp?.data) {\n        this.printersLoading = false\n        return\n      }\n\n      const printers = resp?.data.map((p) => normalizedPrinter(p))\n      if (this.targetPrinterId) {\n        const selectedPrinter = printers.find((p) => p.id === this.targetPrinterId)\n        this.printers = [selectedPrinter]\n        if (selectedPrinter.isPrintable()) {\n          this.selectedPrinter = selectedPrinter\n        }\n      } else {\n        this.printers = printers\n        this.selectedPrinter = printers.find((p) => p.isPrintable()) || null\n      }\n\n      for (const printer of this.printers) {\n        this.printerComms[printer.id] = printerCommManager.getOrCreatePrinterComm(\n          printer.id,\n          urls.printerWebSocket(printer.id),\n          {\n            onPrinterUpdateReceived: (data) => {\n              const index = this.printers.findIndex((p) => p.id === printer.id)\n              this.$set(this.printers, index, normalizedPrinter(data, this.printers[index]))\n            },\n          }\n        )\n        this.printerComms[printer.id].connect()\n      }\n\n      this.printersLoading = false\n    },\n    selectPrinter(printer) {\n      if (!printer.isPrintable()) {\n        this.$swal.Reject.fire({\n          title: `${this.$i18next.t(`{name} isn't ready for print for one of the following reasons`,{name:escape(printer.name)})}:`,\n          html: `<ul style=\"text-align: left\">\n            <li>${this.$i18next.t(`{name} is powered off or not connected to the Internet`,{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"Printer is not connected to {name}\",{name:printer.agentDisplayName()})}</li>\n            <li>${this.$i18next.t(\"Printer is currently busy\")}</li>\n          </ul>`,\n        })\n        return\n      }\n\n      this.selectedPrinter = printer\n    },\n    onPrintClicked() {\n      if (!this.selectedPrinter?.id) return\n\n      confirmPrint(this.gcode, this.selectedPrinter).then(() => {\n        sendToPrint({\n          printer: this.selectedPrinter,\n          gcode: this.gcode,\n          isCloud: this.isCloud,\n          Swal: this.$swal,\n          onCommandSent: () => {\n            if (this.isPopup) {\n              this.$bvModal.hide('b-modal-gcodes' + this.selectedPrinter.id)\n            }\n          },\n          onPrinterStatusChanged: () => {\n            if (!this.isPopup) {\n              showRedirectModal(this.$swal, () => this.$emit('refresh'), this.selectedPrinter.id)\n            }\n\n            this.fetchPrinters()\n          },\n        })\n      })\n      return\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-item\n  display: flex\n  align-items: center\n  text-align: left\n  border-radius: var(--border-radius-sm)\n  border: 1px solid var(--color-divider)\n  margin-bottom: 0.5rem\n  padding: 0.75rem\n  &:hover\n    background-color: var(--color-hover)\n    cursor: pointer\n\n.selected-indicator\n  --size: 0.875rem\n  width: var(--size)\n  height: var(--size)\n  border-radius: var(--size)\n  border: 1px solid var(--color-text-secondary)\n  margin-right: 0.5rem\n\n.printer-item.active\n  background-color: var(--color-hover)\n  .selected-indicator\n    border-color: var(--color-text-primary)\n    border-width: 3px\n\n.printer-name\n  flex: 1\n\n.printer-status\n  font-size: 0.875rem\n  margin-left: 0.5rem\n\n.btn\n  max-width: 100%\n</style>\n\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AvailablePrinters.vue?vue&type=template&id=71e3dd42&scoped=true&\"\nimport script from \"./AvailablePrinters.vue?vue&type=script&lang=js&\"\nexport * from \"./AvailablePrinters.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AvailablePrinters.vue?vue&type=style&index=0&id=71e3dd42&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"71e3dd42\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.chat)?_c('div',{staticClass:\"jusprin-feedback\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('div',[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'wand-magic-sparkles']}})],1),_c('div',{staticClass:\"ml-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sliced with Obico AI Assistant.'))+\" \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":_vm.showChatHistory}},[_vm._v(\" \"+_vm._s(_vm.$t('View the chat history.'))+\" \")])])]),_c('div',{staticClass:\"feedback-question py-4\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-between\"},[_c('div',{staticClass:\"question-text d-flex align-items-center\"},[_vm._v(_vm._s(_vm.$t('Was AI Assistant helpful?')))]),_c('div',{staticClass:\"icon-buttons d-flex align-items-center\"},[_c('i',{staticClass:\"fas fa-thumbs-up feedback-icon\",class:{ 'selected': _vm.userFeedback === 'positive' },on:{\"click\":function($event){return _vm.submitFeedback('positive')}}}),_c('i',{staticClass:\"fas fa-thumbs-down feedback-icon\",class:{ 'selected':  _vm.userFeedback === 'negative' },on:{\"click\":function($event){return _vm.submitFeedback('negative')}}})])])]),_c('transition',{attrs:{\"name\":\"fade\"}},[(_vm.showTextFeedback)?_c('div',{staticClass:\"text-feedback mt-3\"},[_c('div',{staticClass:\"form-group\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.textFeedback),expression:\"textFeedback\"}],staticClass:\"form-control\",attrs:{\"rows\":\"3\",\"maxlength\":\"1000\",\"placeholder\":_vm.$t('Tell us more')},domProps:{\"value\":(_vm.textFeedback)},on:{\"input\":function($event){if($event.target.composing)return;_vm.textFeedback=$event.target.value}}})]),_c('div',{staticClass:\"text-right\"},[_c('button',{staticClass:\"btn btn-primary\",on:{\"click\":_vm.submitFeedbackText}},[_vm._v(\" \"+_vm._s(_vm.$t('Send'))+\" \")])])]):_vm._e()])],1):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-container\"},[_c('div',{staticClass:\"chat-messages\"},_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.role === 'assistant')?_c('div',{staticClass:\"assistant-avatar\"},[_c('i',{staticClass:\"fas fa-robot\"})]):_vm._e(),_c('div',{staticClass:\"message-content\"},[_c('VueMarkdown',{key:message.content},[_vm._v(_vm._s(message.content))]),(Object.keys(_vm.changedParams(message)).length > 0)?_c('div',{staticClass:\"pt-2\"},[_c('div',[_vm._v(_vm._s(_vm.$t('I have changed the following parameters:')))]),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\" - \"+_vm._s(key)+\": \"+_vm._s(value)+\" \")])})],2):_vm._e()],1)])}),0)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"chat-container\">\n    <div class=\"chat-messages\">\n      <div v-for=\"(message, index) in messages\" :key=\"index\" class=\"message\" :class=\"message.role\">\n        <div v-if=\"message.role === 'assistant'\" class=\"assistant-avatar\">\n          <i class=\"fas fa-robot\"></i>\n        </div>\n        <div class=\"message-content\">\n          <VueMarkdown :key=\"message.content\">{{ message.content }}</VueMarkdown>\n          <div v-if=\"Object.keys(changedParams(message)).length > 0\" class=\"pt-2\">\n            <div>{{ $t('I have changed the following parameters:') }}</div>\n            <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n              - {{ key }}: {{ value }}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\n\nexport default {\n  name: 'JusPrinChatHistory',\n  components: {\n    VueMarkdown,\n  },\n  props: {\n    messages: {\n      type: Array,\n      required: true\n    }\n  },\n  methods: {\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides?.[0] ?? {}),\n        ...message.slicing_profiles?.print_process_overrides ?? {},\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.chat-container\n  display: flex\n  flex-direction: column\n  height: 100%\n  overflow-y: auto\n\n.chat-messages\n  flex-grow: 1\n  overflow-y: auto\n  padding: 1rem 0.5rem\n  display: flex\n  flex-direction: column\n\n.message\n  max-width: 80%\n  margin-bottom: 1.5rem\n  padding: 0.5rem\n  border-radius: 18px\n  line-height: 1.4\n  position: relative\n  color: black\n\n  &.user\n    align-self: flex-end\n    background-color: #dcf8c6\n\n  &.assistant\n    align-self: flex-start\n    background-color: #fff\n    display: flex\n    align-items: flex-start\n\n.assistant-avatar\n  width: 30px\n  height: 30px\n  background-color: #8e44ad\n  border-radius: 50%\n  display: flex\n  align-items: center\n  justify-content: center\n  margin-right: 8px\n  flex-shrink: 0\n\n  i\n    color: white\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusprinChatHistory.vue?vue&type=template&id=108f673a&scoped=true&\"\nimport script from \"./JusprinChatHistory.vue?vue&type=script&lang=js&\"\nexport * from \"./JusprinChatHistory.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusprinChatHistory.vue?vue&type=style&index=0&id=108f673a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"108f673a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"chat\" class=\"jusprin-feedback\">\n    <div class=\"d-flex align-items-center\">\n      <div>\n        <font-awesome-icon :icon=\"['fas', 'wand-magic-sparkles']\" />\n      </div>\n      <div class=\"ml-2\">\n        {{ $t('Sliced with Obico AI Assistant.') }}\n        <a href=\"#\" @click=\"showChatHistory\"> {{ $t('View the chat history.') }} </a>\n      </div>\n    </div>\n    <div class=\"feedback-question py-4\">\n      <div class=\"d-flex align-items-center justify-content-between\">\n        <div class=\"question-text d-flex align-items-center\">{{ $t('Was AI Assistant helpful?') }}</div>\n        <div class=\"icon-buttons d-flex align-items-center\">\n          <i\n            class=\"fas fa-thumbs-up feedback-icon\"\n            :class=\"{ 'selected': userFeedback === 'positive' }\"\n            @click=\"submitFeedback('positive')\"\n          ></i>\n          <i\n            class=\"fas fa-thumbs-down feedback-icon\"\n            :class=\"{ 'selected':  userFeedback === 'negative' }\"\n            @click=\"submitFeedback('negative')\"\n          ></i>\n        </div>\n      </div>\n    </div>\n    <transition name=\"fade\">\n      <div v-if=\"showTextFeedback\" class=\"text-feedback mt-3\">\n        <div class=\"form-group\">\n            <textarea\n              v-model=\"textFeedback\"\n              class=\"form-control\"\n              rows=\"3\"\n              maxlength=\"1000\"\n              :placeholder=\"$t('Tell us more')\"\n            ></textarea>\n        </div>\n        <div class=\"text-right\">\n          <button @click=\"submitFeedbackText\" class=\"btn btn-primary\">\n            {{ $t('Send') }}\n          </button>\n        </div>\n      </div>\n    </transition>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport JusPrinChatHistory from './JusprinChatHistory.vue'\n\nexport default {\n  name: 'JusPrintFeedback',\n\n  props: {\n    gCodeFileId: {\n      type: Number,\n      required: true\n    }\n  },\n\n  data() {\n    return {\n      showTextFeedback: false,\n      textFeedback: '',\n      userFeedback: null,\n      chat: null,\n    }\n  },\n\n  created() {\n    this.fetchChat()\n  },\n\n  computed: {\n    thumbsUp() {\n      return this.chat?.user_feedback === 'positive'\n    },\n    thumbsDown() {\n      return this.chat?.user_feedback === 'negative'\n    },\n  },\n  methods: {\n    async fetchChat() {\n      if (!urls.jusprinChats) {\n        return  // No JusPrin chat API endpoint on the server\n      }\n      try {\n        const response = await axios.get(urls.jusprinChats(), {\n          params: { g_code_file_id: this.gCodeFileId }\n        })\n        this.chat = response.data[0]\n        this.userFeedback = this.chat?.user_feedback\n      } catch (error) {\n        this.chat = null\n        console.log('fetchChat error', error)\n      }\n    },\n\n    async submitFeedback(feedback) {\n      this.userFeedback = feedback\n      // Show text feedback input after submitting initial feedback\n      this.showTextFeedback = true\n\n      axios.patch(urls.jusprinChats(this.chat.id), {\n        user_feedback: feedback\n      })\n    },\n\n    submitFeedbackText() {\n      this.showTextFeedback = false\n      axios.patch(urls.jusprinChats(this.chat.id), {\n        user_feedback_text: this.textFeedback\n      })\n    },\n    showChatHistory() {\n      this.$swal\n        .openModalWithComponent(\n          JusPrinChatHistory,\n          {\n            messages: JSON.parse(this.chat?.messages)\n          },\n          {\n            title: this.$t('Chat History'),  // Use this.$t instead of just $t\n            showConfirmButton: false,\n          }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.jusprin-feedback\n  svg\n    width: 1.5em\n    height: 1.5em\n    color: gold\n\n.feedback-question\n  display: flex\n  flex-direction: column\n  align-items: center\n\n  .question-text\n    font-size: 1.2rem\n    margin-right: 20px\n\n  .icon-buttons\n    display: flex\n    justify-content: center\n    gap: 30px\n\n    .feedback-icon\n      font-size: 1.3rem\n      cursor: pointer\n      transition: color 0.3s ease\n\n      &:hover\n        opacity: .8\n\n      &.selected\n        color: var(--color-primary)\n\n.text-feedback\n  margin: 0 auto\n\n  .form-group\n    text-align: left\n\n  textarea\n    resize: vertical\n\n  .text-right\n    text-align: right\n\n\n.fade-enter-active, .fade-leave-active\n  transition: opacity 0.5s\n\n.fade-enter, .fade-leave-to\n  opacity: 0\n</style>\n\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusprinFeedback.vue?vue&type=template&id=e9689bf8&scoped=true&\"\nimport script from \"./JusprinFeedback.vue?vue&type=script&lang=js&\"\nexport * from \"./JusprinFeedback.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusprinFeedback.vue?vue&type=style&index=0&id=e9689bf8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e9689bf8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout :is-popup=\"isPopup\">\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <a\n        v-if=\"isPopup\"\n        href=\"#\"\n        class=\"btn shadow-none icon-btn d-inline\"\n        :title=\"$t('Go Back')\"\n        @click.prevent=\"goBack\"\n      >\n        <i class=\"fas fa-chevron-left\"></i>\n      </a>\n    </template>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <a\n          v-if=\"canDownloadGcode\"\n          @click.prevent=\"downloadGcode\"\n          class=\"btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Download file')\"\n        >\n          <i class=\"fas fa-download\"></i>\n        </a>\n        <!-- Rename -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Rename file')\"\n          @click.prevent=\"renameFile\"\n        >\n          <i class=\"fas fa-edit\"></i>\n        </a>\n        <!-- Delete -->\n        <a\n          v-if=\"isCloud\"\n          href=\"#\"\n          class=\"text-danger btn shadow-none icon-btn action-btn\"\n          :title=\"$t('Delete file')\"\n          @click.prevent=\"deleteFile\"\n        >\n          <i class=\"fas fa-trash-alt\"></i>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"dropdownMenuOptions\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n\n        <a\n          v-if=\"onClose\"\n          href=\"#\"\n          class=\"btn shadow-none icon-btn d-inline\"\n          title=\"Close\"\n          @click.prevent=\"onClose\"\n        >\n          <i class=\"fas fa-times text-danger\"></i>\n        </a>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <b-container v-if=\"loading || gcodeNotFound\">\n        <b-row>\n          <b-col class=\"text-center mt-5\">\n            <div v-if=\"gcodeNotFound\">\n              <p>{{ $t(\"This G-Code file doesn't exists\") }}</p>\n            </div>\n            <div v-else>\n              <b-spinner />\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n      <b-container v-else fluid>\n        <b-row>\n          <b-col :lg=\"isPopup ? 12 : 5\">\n            <b-alert :show=\"isDeleted\" variant=\"warning warning-block\">\n              {{$t(\"This file is deleted and unavailable for print\")}}\n            </b-alert>\n\n            <!-- File details -->\n            <g-code-details :file=\"gcode\" :show-print-stats=\"true\" :compact-view=\"false\" />\n            <jusprin-feedback v-if=\"isCloud\" class=\"card-container jusprin-feedback\" :g-code-file-id=\"gcode.id\" />\n            <!-- Available printers -->\n            <available-printers\n              v-if=\"!isDeleted\"\n              class=\"card-container available-printers\"\n              :class=\"{ 'full-width': isPopup }\"\n              :is-popup=\"isPopup\"\n              :target-printer-id=\"targetPrinterId || selectedPrinterId\"\n              :gcode=\"gcode\"\n              :is-cloud=\"isCloud\"\n              @refresh=\"onRefresh\"\n            />\n          </b-col>\n          <b-col :lg=\"isPopup ? 12 : 7\">\n            <!-- Print history -->\n            <div class=\"print-history\" :class=\"{ 'full-width': isPopup || isDeleted }\">\n              <h2 class=\"section-title mb-3\">{{ $t(\"Print History\") }}</h2>\n              <div v-if=\"gcode.print_set.length\">\n                <print-history-item\n                  v-for=\"print of gcode.print_set\"\n                  :key=\"`print_${print.id}`\"\n                  :print=\"print\"\n                  class=\"print-item\"\n                ></print-history-item>\n              </div>\n              <div v-else>\n                <div class=\"card-container p-4 justify-content-center text-secondary\">\n                  {{$t(\"This file doesn't have any prints yet\")}}\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n      <rename-modal ref=\"renameModal\" :item=\"gcode\" @renamed=\"onItemRenamed\" />\n      <delete-confirmation-modal\n        ref=\"deleteConfirmationModal\"\n        :item=\"gcode\"\n        @deleted=\"onItemDeleted\"\n      />\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport filter from 'lodash/filter'\nimport get from 'lodash/get'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { normalizedGcode, normalizedPrinter } from '@src/lib/normalizers'\nimport RenameModal from '@src/components/g-codes/RenameModal.vue'\nimport DeleteConfirmationModal from '@src/components/g-codes/DeleteConfirmationModal.vue'\nimport availablePrinters from '@src/components/g-codes/AvailablePrinters.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport {\n  listPrinterLocalGCodesMoonraker,\n  listPrinterLocalGCodesOctoPrint,\n} from '@src/lib/printer-local-comm'\nimport PrintHistoryItem from '@src/components/prints/PrintHistoryItem.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport JusprinFeedback from '@src/components/g-codes/JusprinFeedback.vue'\n\nexport default {\n  name: 'GCodeFilePage',\n\n  components: {\n    PageLayout,\n    RenameModal,\n    DeleteConfirmationModal,\n    availablePrinters,\n    PrintHistoryItem,\n    CascadedDropdown,\n    GCodeDetails,\n    JusprinFeedback,\n  },\n\n  props: {\n    isPopup: {\n      type: Boolean,\n      default: false,\n    },\n    targetPrinterId: {\n      type: Number,\n      default: null,\n    },\n    onClose: {\n      type: Function,\n      default: null,\n    },\n    routeParams: {\n      type: Object,\n      default: () => {\n        return {\n          fileId: null,\n          printerId: null,\n        }\n      },\n    },\n  },\n\n  data() {\n    return {\n      gcode: null,\n      printer: null,\n      loading: true,\n      gcodeNotFound: false,\n    }\n  },\n\n  computed: {\n    isCloud() {\n      return !this.selectedPrinterId\n    },\n    isDeleted() {\n      return !!this.gcode?.deleted\n    },\n    dropdownMenuOptions() {\n      const menuOptions = [\n        {\n          key: 'renameFile',\n          icon: 'fas fa-edit',\n          title: this.$i18next.t(`Rename file`),\n          callback: true,\n        },\n        {\n          key: 'deleteFile',\n          icon: 'fas fa-trash-alt',\n          customMenuOptionClass: 'text-danger',\n          title: this.$i18next.t(`Delete file`),\n          callback: true,\n        },\n      ]\n\n      if (this.canDownloadGcode) {\n        menuOptions.unshift({\n          key: 'downloadGcode',\n          icon: 'fas fa-download',\n          title: this.$i18next.t(`Download file`),\n          callback: true,\n        })\n      }\n\n      return menuOptions\n    },\n    canDownloadGcode() {\n      return this.gcode?.url && this.gcode?.safe_filename\n    },\n  },\n\n  async created() {\n    this.selectedPrinterId = Number(this.getRouteParam('printerId')) || null\n    if (this.selectedPrinterId) {\n      await this.fetchPrinter()\n    }\n    this.gcodeId = this.getRouteParam('fileId')\n    this.fetchGcode()\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'renameFile') {\n        this.renameFile()\n      } else if (menuOptionKey === 'deleteFile') {\n        this.deleteFile()\n      } else if (menuOptionKey === 'downloadGcode') {\n        this.downloadGcode()\n      }\n    },\n    getRouteParam(name) {\n      return this.isPopup ? this.routeParams[name] : this.$route.params[name]\n    },\n    goBack() {\n      this.$emit('goBack')\n    },\n    async fetchPrinter() {\n      return axios\n        .get(urls.printer(this.selectedPrinterId))\n        .then((response) => {\n          this.printer = normalizedPrinter(response.data)\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Host printer for this gcode not found')}`)\n        })\n    },\n    async fetchLocalFile() {\n      if (!this.printerComm) {\n        return\n      }\n      this.loading = true\n\n      const decodedPath = decodeURIComponent(this.gcodeId)\n      const filename = decodedPath.split('/').at(-1)\n      const dir_path =\n        filename === decodedPath\n          ? ''\n          : decodedPath.slice(0, decodedPath.length - filename.length - 1)\n\n      const getPrinterLocalGCode = this.printer.isAgentMoonraker()\n        ? listPrinterLocalGCodesMoonraker\n        : listPrinterLocalGCodesOctoPrint\n\n      getPrinterLocalGCode(this.printerComm, dir_path, null)\n        .then((result) => {\n          return { files: filter(get(result, 'files', []), (f) => f.filename == filename) }\n        })\n        .then(async (result) => {\n          this.loading = false\n          if (result?.files?.length === 0) {\n            this.gcodeNotFound = true\n            return\n          }\n\n          const file = result?.files[0]\n          this.gcode = {\n            ...normalizedGcode(file),\n            print_set: [],\n          }\n          if (file.path && file.hash && this.getRouteParam('printerId')) {\n            const safeFilename = file.path.replace(/^.*[\\\\/]/, '')\n            try {\n              let response = await axios.get(urls.gcodeFiles(), {\n                params: {\n                  resident_printer: this.getRouteParam('printerId'),\n                  safe_filename: safeFilename,\n                  agent_signature: `md5:${file.hash}`,\n                },\n              })\n              const gcodeFileOnServer = get(response, 'data.results[0]')\n              if (gcodeFileOnServer) {\n                const cloudCopy = normalizedGcode(gcodeFileOnServer)\n                this.gcode.print_set = cloudCopy.print_set\n              }\n            } catch (e) {\n              console.error(e)\n            }\n          }\n        })\n        .catch((err) => {\n          this.gcodeNotFound = true\n        })\n    },\n    async fetchGcode() {\n      if (this.selectedPrinterId) {\n        this.printerComm = printerCommManager.getOrCreatePrinterComm(\n          this.selectedPrinterId,\n          urls.printerWebSocket(this.selectedPrinterId)\n        )\n        this.printerComm.connect(this.fetchLocalFile)\n        return\n      }\n\n      this.loading = true\n      const fileId = this.getRouteParam('fileId')\n      let file\n\n      try {\n        file = await axios.get(urls.gcodeFile(fileId))\n      } catch (e) {\n        this.loading = false\n        console.error(e)\n      }\n\n      if (!file?.data) {\n        this.loading = false\n        this.gcodeNotFound = true\n        return\n      }\n\n      file = file?.data\n      this.gcode = normalizedGcode(file)\n      this.loading = false\n    },\n    renameFile() {\n      this.$refs.renameModal.show()\n    },\n    onItemRenamed(newName) {\n      this.gcode.filename = newName\n    },\n    deleteFile() {\n      this.$refs.deleteConfirmationModal.show()\n    },\n    onItemDeleted() {\n      if (!this.isPopup) {\n        window.location.replace('/g_code_folders/cloud/')\n      } else {\n        this.$emit('goBack')\n      }\n    },\n    onRefresh() {\n      this.$router.go()\n    },\n    async downloadGcode() {\n      const fileUrl = this.gcode.url\n\n      const response = await fetch(fileUrl);\n      const blob = await response.blob();\n\n      const link = document.createElement('a');\n      link.href = URL.createObjectURL(blob);\n      link.download = this.gcode.safe_filename\n\n      document.body.appendChild(link);\n\n      link.click();\n\n      URL.revokeObjectURL(link.href);\n      document.body.removeChild(link);\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.warning-block\n  margin-bottom: var(--gap-between-blocks)\n\n.available-printers,\n.jusprin-feedback\n  margin-top: var(--gap-between-blocks)\n  &.full-width\n    margin-top: 15px\n\n.print-history\n  &.full-width\n    margin-top: 30px\n  @media (max-width: 991px)\n    margin-top: 30px\n\n.file-name\n  font-size: 1.25rem\n  margin-bottom: 1rem\n  border-bottom: 1px solid var(--color-divider)\n  padding-bottom: 1rem\n\n.file-info-line\n  display: flex\n  justify-content: space-between\n  margin-bottom: 0.5rem\n\n  i\n    margin-right: 0.375rem\n\n  .value\n    font-weight: 700\n\n.section-title\n  font-size: 1.25rem\n  margin-bottom: 0.5rem\n\n.print-item\n  margin-bottom: 10px\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GCodeFilePage.vue?vue&type=template&id=5e958c35&scoped=true&\"\nimport script from \"./GCodeFilePage.vue?vue&type=script&lang=js&\"\nexport * from \"./GCodeFilePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GCodeFilePage.vue?vue&type=style&index=0&id=5e958c35&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5e958c35\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Serial Port\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"connect-port\"},model:{value:(_vm.selectedPort),callback:function ($$v) {_vm.selectedPort=$$v},expression:\"selectedPort\"}},_vm._l((_vm.connectionOptions.ports),function(port){return _c('b-form-select-option',{key:port,attrs:{\"value\":port}},[_vm._v(\" \"+_vm._s(port)+\" \")])}),1)],1),_c('br'),_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Baudrate\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"connect-baudrate\"},model:{value:(_vm.selectedBaudrate),callback:function ($$v) {_vm.selectedBaudrate=$$v},expression:\"selectedBaudrate\"}},[_c('b-form-select-option',{attrs:{\"value\":\"\"}},[_vm._v(_vm._s(_vm.$t(\"Auto\")))]),_vm._l((_vm.connectionOptions.baudrates),function(baudrate){return _c('b-form-select-option',{key:baudrate,attrs:{\"value\":baudrate}},[_vm._v(\" \"+_vm._s(baudrate)+\" \")])})],2)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div>\n      <h5>{{ $t(\"Serial Port\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"connect-port\" v-model=\"selectedPort\" class=\"form-control\">\n        <b-form-select-option v-for=\"port in connectionOptions.ports\" :key=\"port\" :value=\"port\">\n          {{ port }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n    <br />\n    <div>\n      <h5>{{ $t(\"Baudrate\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"connect-baudrate\" v-model=\"selectedBaudrate\" class=\"form-control\">\n        <b-form-select-option value=\"\">{{ $t(\"Auto\") }}</b-form-select-option>\n        <b-form-select-option\n          v-for=\"baudrate in connectionOptions.baudrates\"\n          :key=\"baudrate\"\n          :value=\"baudrate\"\n        >\n          {{ baudrate }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'ConnectPrinter',\n  props: {\n    connectionOptions: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      selectedPort: this.connectionOptions.ports[0],\n      selectedBaudrate: '',\n    }\n  },\n}\n</script>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectPrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ConnectPrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConnectPrinter.vue?vue&type=template&id=babeaa02&\"\nimport script from \"./ConnectPrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./ConnectPrinter.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template :inside-card=\"insideCard\">\n    <template #title>{{ $t(\"Print Job Control\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-if=\"!printer.isOffline() && printer.hasError()\" class=\"error-container\">\n          <div class=\"title\">{{ printer.agentDisplayName() }} {{$t('Error')}}</div>\n          <p class=\"text\">\n            {{ printer.status.state.error }}\n          </p>\n        </div>\n\n        <div v-if=\"printer.inUserInteractionRequired()\" class=\"warning-container\">\n          <p class=\"text\">{{ $t(\"Filament Change or User Interaction Required\") }}</p>\n        </div>\n\n        <template v-if=\"printer.inTransientState()\">\n          <b-spinner label=\"Processing...\"></b-spinner>\n          <p>{{ printer.calculatedState() }}...</p>\n        </template>\n\n        <template v-else>\n          <template v-if=\"!printer.isOffline() && !printer.isDisconnected() && printer.isActive()\">\n            <p>\n              <span v-if=\"!printer.isPaused()\">{{ $t(\"Printer is Currently Printing\") }}</span>\n              <span v-else>{{ $t(\"Print is Paused\") }}</span>\n            </p>\n            <div class=\"buttons\">\n              <b-button\n                v-if=\"!printer.isPaused()\"\n                variant=\"warning\"\n                class=\"custom-button\"\n                @click=\"onPauseToggled($event)\"\n              >\n                <font-awesome-icon icon=\"fa-solid fa-circle-pause\" />\n                {{$t(\"Pause\")}}\n              </b-button>\n              <b-button\n                v-else\n                variant=\"success\"\n                class=\"custom-button\"\n                @click=\"onPauseToggled($event)\"\n              >\n                <font-awesome-icon icon=\"fa-solid fa-circle-play\" />\n                {{$t(\"Resume\")}}\n              </b-button>\n              <b-button variant=\"danger\" class=\"custom-button\" @click=\"onCancelClicked\">\n                <font-awesome-icon icon=\"fa-solid fa-circle-xmark\" />\n                {{$t(\"Cancel\")}}\n              </b-button>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isOffline() && !printer.isDisconnected() && !printer.isActive()\">\n            <p>{{ $t(\"Open G-Code File to Start Printing\") }}</p>\n            <div class=\"buttons\">\n              <b-button variant=\"outline-primary\" class=\"custom-button\" @click=\"openObicoFiles\">\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n                {{ $syndicateText.brandName }} {{$t(\"Files\")}}\n              </b-button>\n              <b-button\n                v-if=\"printer.isAgentMoonraker()\"\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                @click=\"openPrinterFiles\"\n              >\n                &nbsp;\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-klipper-logo\" />\n                </svg>\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-fluidd-logo\" />\n                </svg>\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-mainsail-logo\" />\n                </svg>\n                &nbsp;\n              </b-button>\n              <b-button\n                v-else\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                @click=\"openPrinterFiles\"\n              >\n                <svg class=\"logo-small custom-svg-icon\">\n                  <use href=\"#svg-octoprint-logo\" />\n                </svg>\n                OctoPrint\n              </b-button>\n            </div>\n          </template>\n        </template>\n\n        <template v-if=\"!printer.isOffline() && printer.isDisconnected()\">\n          <p>{{ $t(\"Printer Not Connected at the Serial Port\") }}</p>\n          <div class=\"buttons\">\n            <b-button\n              v-if=\"!printer.isAgentMoonraker()\"\n              variant=\"outline-primary\"\n              :disabled=\"connecting\"\n              @click=\"onConnectClicked\"\n            >\n              <b-spinner v-if=\"connecting\" small></b-spinner>\n              <i v-else class=\"fab fa-usb\"></i>\n              {{ connecting ? $t('Contacting OctoPrint') : $t('Connect') }}\n            </b-button>\n          </div>\n        </template>\n\n        <template v-else-if=\"printer.isOffline()\">\n          <i class=\"fas fa-exclamation-triangle big-icon warning\"></i>\n          <p>\n            {{$t(\"{brandName} Plugin is Offline.\",{brandName:$syndicateText.brandName})}}\n            <a\n              target=\"_blank\"\n              :href=\"getDocUrl('/user-guides/troubleshoot-server-connection-issues/')\"\n              >{{ $t(\"Why?\") }}</a\n            >\n          </p>\n        </template>\n\n        <b-modal v-if=\"printer\" :id=\"modalId\" size=\"lg\" @hidden=\"resetGcodesModal\">\n          <g-code-file-page\n            v-if=\"selectedGcodeId\"\n            :is-popup=\"true\"\n            :target-printer-id=\"printer.id\"\n            :route-params=\"{\n              fileId: selectedGcodeId,\n              printerId: printerFiles ? printer.id : null,\n            }\"\n            :on-close=\"() => $bvModal.hide(modalId)\"\n            @goBack=\"\n              () => {\n                selectedGcodeId = null\n                scrollToTop()\n              }\n            \"\n          />\n          <g-code-folders-page\n            v-else\n            :is-popup=\"true\"\n            :target-printer=\"printer\"\n            :route-params=\"{\n              printerId: printerFiles ? printer.id : null,\n              parentFolder: null,\n            }\"\n            :on-close=\"() => $bvModal.hide(modalId)\"\n            :saved-path=\"savedPath\"\n            :scroll-container-id=\"modalId\"\n            @openFile=\"\n              (fileId, printerId, path) => {\n                selectedGcodeId = fileId\n                savedPath = path\n                scrollToTop()\n              }\n            \"\n          />\n        </b-modal>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport GCodeFoldersPage from '@src/views/GCodeFoldersPage.vue'\nimport GCodeFilePage from '@src/views/GCodeFilePage.vue'\nimport ConnectPrinter from '@src/components/printers/ConnectPrinter.vue'\n\nconst PAUSE_PRINT = '/pause_print/'\nconst RESUME_PRINT = '/resume_print/'\nconst CANCEL_PRINT = '/cancel_print/'\n\nexport default {\n  name: 'PrintJobControlWidget',\n\n  components: {\n    WidgetTemplate,\n    GCodeFoldersPage,\n    GCodeFilePage,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n    insideCard: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      connectBtnClicked: false,\n      selectedGcodeId: null,\n      savedPath: [null],\n      printerFiles: false,\n    }\n  },\n\n  computed: {\n    connecting() {\n      return this.connectBtnClicked && this.printer.isDisconnected()\n    },\n    modalId() {\n      return 'b-modal-gcodes' + this.printer.id\n    },\n  },\n\n  methods: {\n    openObicoFiles() {\n      this.openFiles(false)\n    },\n    openPrinterFiles() {\n      this.openFiles(true)\n    },\n    openFiles(printerFiles) {\n      // savedPath holds folder ids for Obico files but printer-local paths for printer files,\n      // so a path saved in one mode must never be restored in the other.\n      if (printerFiles !== this.printerFiles) {\n        this.savedPath = [null]\n      }\n      this.printerFiles = printerFiles\n      this.$bvModal.show(this.modalId)\n    },\n    scrollToTop() {\n      document.querySelector('#' + this.modalId).scrollTo(0, 0)\n    },\n    resetGcodesModal() {\n      this.selectedGcodeId = null\n    },\n    onConnectClicked() {\n      this.printerComm.passThruToPrinter(\n        { func: 'get_connection_options', target: '_printer' },\n        (err, connectionOptions) => {\n          if (err) {\n            this.$swal.Toast.fire({\n              icon: 'error',\n              title: err,\n            })\n          } else {\n            if (connectionOptions.ports.length < 1) {\n              this.$swal.Toast.fire({\n                icon: 'error',\n                title: `${this.$i18next.t('Uh-Oh. No printer is found on the serial port.')}`,\n              })\n            } else {\n              this.$swal\n                .openModalWithComponent(\n                  ConnectPrinter,\n                  {\n                    connectionOptions: connectionOptions,\n                  },\n                  {\n                    confirmButtonText: 'Connect',\n                    showCancelButton: true,\n                    preConfirm: () => {\n                      return {\n                        port: document.getElementById('connect-port').value,\n                        baudrate: document.getElementById('connect-baudrate').value,\n                      }\n                    },\n                  }\n                )\n                .then((result) => {\n                  if (result.value) {\n                    let args = [result.value.port, result.value.baudrate]\n                    this.printerComm.passThruToPrinter({\n                      func: 'connect',\n                      target: '_printer',\n                      args: args,\n                    })\n                  }\n                })\n            }\n          }\n        }\n      )\n\n      this.connectBtnClicked = true\n      setTimeout(() => {\n        this.connectBtnClicked = false\n      }, 10 * 1000)\n    },\n    onPauseToggled(ev) {\n      if (this.printer.isPaused()) {\n        if (this.printer.alertUnacknowledged()) {\n          this.$emit('notAFailureClicked', ev, true)\n        } else {\n          this.$emit('sendPrinterAction', this.printer.id, RESUME_PRINT)\n          this.printer.setTransientState('Resuming')\n        }\n      } else {\n        this.$swal.Confirm.fire({\n          html: `If you haven't changed the default configuration, the heaters will be turned off, and the print head will be z-lifted. The reversed will be performed before the print is resumed. <a target=\"_blank\" href=\"${this.getDocUrl('/user-guides/detection-print-job-settings#when-print-is-paused')}\">Learn more. <small><i class=\"fas fa-external-link-alt\"></i></small></a>`,\n        }).then((result) => {\n          if (result.value) {\n            this.$emit('sendPrinterAction', this.printer.id, PAUSE_PRINT)\n            this.printer.setTransientState('Pausing')\n          }\n        })\n      }\n    },\n    onCancelClicked() {\n      this.$swal.Confirm.fire({\n        text: `${this.$i18next.t('Once cancelled, the print can no longer be resumed.')}`,\n      }).then((result) => {\n        if (result.value) {\n          this.$emit('sendPrinterAction', this.printer.id, CANCEL_PRINT)\n          this.printer.setTransientState('Cancelling')\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  justify-content: center\n  padding-bottom: 2rem\n  gap: 1rem\n  @media (max-width: 480px)\n    height: auto\n\n.error-container, .warning-container\n  width: 100%\n  background-color: var(--color-danger)\n  color: var(--color-on-danger)\n  padding: 1rem\n  border-radius: var(--border-radius-sm)\n  text-align: center\n  font-weight: normal\n  margin-bottom: 1rem\n  .title\n    font-size: 1rem\n    font-weight: bold\n    margin-bottom: .5rem\n  p\n    font-size: 1rem\n    font-weight: normal\n  &.warning-container\n    background-color: var(--color-warning)\n    color: var(--color-on-warning)\n\np\n  margin: 0\n  font-size: 1.125rem\n  text-align: center\n\n.buttons\n  display: flex\n  align-items: center\n  justify-content: center\n  gap: 1rem\n  margin-top: .5rem\n  flex-wrap: wrap\n\n.big-icon\n  font-size: 2rem\n  &.warning\n    color: var(--color-warning)\n  &.danger\n    color: var(--color-danger)\n\n.custom-svg-icon\n  height: 1.125rem\n  width: 1.125rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintJobControlWidget.vue?vue&type=template&id=6af168b5&scoped=true&\"\nimport script from \"./PrintJobControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintJobControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintJobControlWidget.vue?vue&type=style&index=0&id=6af168b5&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6af168b5\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div :id=\"printer.id\" class=\"col-sm-12 col-lg-6 printer-card\">\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"title-box\">\n          <div class=\"printer-name\">\n            {{ printer.name }}\n          </div>\n          <div v-if=\"hasCurrentPrintFilename\" class=\"secondary-title print-filename\">\n            {{ printer.current_print.filename }}\n          </div>\n          <div v-else class=\"secondary-title\" :class=\"statusClass\">{{ statusText }}</div>\n        </div>\n        <div class=\"d-flex ml-2\">\n          <b-button\n            variant=\"outline-secondary\"\n            :href=\"`/printers/${printer.id}/control/`\"\n            class=\"px-4 mr-2\"\n            >{{$t(\"Open\")}}&nbsp;{{$t(\"Details\")}}\n          </b-button>\n          <b-dropdown right no-caret toggle-class=\"icon-btn\">\n            <template #button-content>\n              <i class=\"fas fa-ellipsis-v\"></i>\n            </template>\n            <b-dropdown-item href=\"#\" @click.prevent=\"onSharePrinter()\">\n              <i class=\"fas fa-share-alt fa-lg\"></i>{{$t(\"Share\")}}\n            </b-dropdown-item>\n            <b-dropdown-item :href=\"octoPrintTunnelUrl()\">\n              <svg class=\"menu-icon\">\n                <use href=\"#svg-tunnel\" />\n              </svg>\n              {{ printer.agentDisplayName() }} {{$t(\"Tunnel\")}}\n            </b-dropdown-item>\n            <div class=\"dropdown-divider\"></div>\n            <b-dropdown-item :href=\"settingsUrl()\">\n              <i class=\"fas fa-wrench fa-lg\"></i>{{$t(\"Configure\")}}\n            </b-dropdown-item>\n          </b-dropdown>\n        </div>\n      </div>\n      <div class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n        <div class=\"d-flex justify-content-center webcamBackground\">\n        <streaming-box :printer=\"printer\" :webrtc=\"webrtc\" :autoplay=\"isProAccount\" :webcam=\"webcam\" />\n        </div>\n      </div>\n      <div\n        v-if=\"printer.alertUnacknowledged()\"\n        class=\"failure-alert card-body bg-warning px-2 py-1\"\n      >\n        <i class=\"fas fa-exclamation-triangle align-middle\"></i>\n        <span class=\"align-middle\">{{ $t(\"Failure Detected!\") }}</span>\n        <button\n          id=\"not-a-failure\"\n          type=\"button\"\n          class=\"btn btn-outline-primary btn-sm float-right\"\n          @click=\"onNotAFailureClicked($event, false)\"\n        >\n          {{$t(\"Not a failure?\")}}\n        </button>\n      </div>\n\n      <div class=\"card-body gauge-container\" :class=\"{ overlay: !isWatching }\">\n        <div\n          v-if=\"!isWatching\"\n          class=\"overlay-top text-center\"\n          style=\"left: 0; width: 100%; top: 50%; margin-top: -55px\"\n        >\n          <H1><i class=\"far fa-eye-slash\"></i></H1>\n          <h5 class=\"text-warning\">{{ $t(\"Failure Detection is Off\") }}</h5>\n          <small v-if=\"printer.not_watching_reason\"\n            >{{ printer.not_watching_reason }}.\n            <a :href=\"getDocUrl('/user-guides/detective-not-watching/')\" target=\"_blank\"\n              >{{ $t(\"Learn more. \") }}<small><i class=\"fas fa-external-link-alt\"></i></small></a\n          ></small>\n          <div></div>\n        </div>\n        <failure-detection-gauge :normalized-p=\"printer.normalized_p\" :is-watching=\"isWatching\" />\n        <hr />\n      </div>\n      <print-job-control-widget\n        :inside-card=\"true\"\n        :printer=\"printer\"\n        :printer-comm=\"printerComm\"\n        @notAFailureClicked=\"onNotAFailureClicked\"\n        @sendPrinterAction=\"sendPrinterAction\"\n      />\n      <div class=\"info-section settings\">\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.settings }\"\n          @click=\"onSettingsToggleClicked()\"\n        >\n          <i class=\"fas fa-cog fa-lg\"></i>\n        </button>\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.time }\"\n          @click=\"onTimeToggleClicked()\"\n        >\n          <i class=\"fas fa-clock fa-lg\"></i>\n        </button>\n        <button\n          type=\"button\"\n          class=\"info-section-toggle btn btn-sm no-corner mx-2\"\n          :class=\"{ pressed: section_toggles.statusTemp }\"\n          @click=\"onStatusTempToggleClicked()\"\n        >\n          <i class=\"fas fa-thermometer-half fa-lg\"></i>\n        </button>\n      </div>\n      <div class=\"info-section\" style=\"height: 0.3rem\"></div>\n      <div>\n        <div class=\"info-section container\">\n          <div v-if=\"section_toggles.settings\" id=\"panel-settings\">\n            <div class=\"pt-2 pb-3\">\n              <div class=\"row justify-content-center px-3\">\n                <div class=\"col-12 setting-item\">\n                  <label class=\"toggle-label\" :for=\"'watching_enabled-toggle-' + printer.id\"\n                    >\n                    <i18next :translation=\"$t('Enable AI failure detection {localizedDom}')\">\n                      <template #localizedDom>\n                        <div v-if=\"!watchForFailures\" class=\"text-muted font-weight-light font-size-sm\"> {{$t(\"AI failure detection is disabled. You are on your own\")}}.</div>\n                      </template>\n                    </i18next>\n\n                  </label>\n                  <div class=\"custom-control custom-switch\">\n                    <input\n                      :id=\"'watching_enabled-toggle-' + printer.id\"\n                      type=\"checkbox\"\n                      name=\"watching_enabled\"\n                      class=\"custom-control-input update-printer\"\n                      :checked=\"watchForFailures\"\n                      @click=\"onWatchForFailuresToggled\"\n                    />\n                    <label\n                      class=\"custom-control-label\"\n                      :for=\"'watching_enabled-toggle-' + printer.id\"\n                      style=\"font-size: 1rem\"\n                    ></label>\n                  </div>\n                </div>\n              </div>\n              <div class=\"row justify-content-center px-3\">\n                <div class=\"col-12 setting-item\">\n                  <label class=\"toggle-label\" :for=\"'pause-toggle-' + printer.id\">\n                    <i18next :translation=\"$t('Pause on detected failures {localizedDom}')\">\n                      <template #localizedDom>\n                        <div v-if=\"!pauseOnFailure\" class=\"text-muted font-weight-light font-size-sm\"> {{$t(\"You will still be alerted via notifications\")}}</div>\n                      </template>\n                    </i18next>\n                  </label>\n                  <div class=\"custom-control custom-switch\">\n                    <input\n                      :id=\"'pause-toggle-' + printer.id\"\n                      type=\"checkbox\"\n                      name=\"pause_on_failure\"\n                      class=\"custom-control-input update-printer\"\n                      :checked=\"pauseOnFailure\"\n                      @click=\"onPauseOnFailureToggled\"\n                    />\n                    <label\n                      class=\"custom-control-label\"\n                      :for=\"'pause-toggle-' + printer.id\"\n                      style=\"font-size: 1rem\"\n                    >\n                    </label>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div v-if=\"section_toggles.time\" id=\"print-time\">\n            <div class=\"py-2\">\n              <div class=\"row text-muted\">\n                <small class=\"col-5 offset-2\">{{ $t(\" Remaining \") }}</small>\n                <small class=\"col-5\">{{ $t(\" Total \") }}</small>\n              </div>\n              <div class=\"row\">\n                <div class=\"col-2 text-muted\">\n                  <i class=\"fas fa-clock\"></i>\n                </div>\n                <duration-block\n                  id=\"print-time-remaining\"\n                  class=\"col-5 numbers\"\n                  v-bind=\"timeRemaining\"\n                ></duration-block>\n                <duration-block\n                  id=\"print-time-total\"\n                  class=\"col-5 numbers\"\n                  v-bind=\"timeTotal\"\n                ></duration-block>\n                <div class=\"col-12\">\n                  <div class=\"progress\" style=\"height: 2px\">\n                    <div\n                      id=\"print-progress\"\n                      class=\"progress-bar\"\n                      :class=\"{\n                        'progress-bar-striped': progressPct < 100,\n                        'progress-bar-animated': progressPct < 100,\n                      }\"\n                      role=\"progressbar\"\n                      aria-valuenow=\"0\"\n                      aria-valuemin=\"0\"\n                      aria-valuemax=\"100\"\n                      :style=\"`width: ${progressPct}%;`\"\n                    ></div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <status-temp\n            v-if=\"section_toggles.statusTemp && tempProps.show\"\n            id=\"status_temp_block\"\n            v-bind=\"tempProps\"\n            @TempEditClicked=\"onTempEditClicked\"\n          ></status-temp>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport get from 'lodash/get'\nimport moment from 'moment'\nimport axios from 'axios'\n\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport WebRTCConnection from '@src/lib/webrtc'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport StreamingBox from '@src/components/StreamingBox'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport DurationBlock from './DurationBlock.vue'\nimport StatusTemp from './StatusTemp.vue'\nimport TempTargetEditor from './TempTargetEditor.vue'\nimport SharePrinter from './SharePrinter.vue'\nimport PrintJobControlWidget from '@src/components/printer-control/PrintJobControlWidget.vue'\n\nconst RESUME_PRINT = '/resume_print/'\nconst MUTE_CURRENT_PRINT = '/mute_current_print/?mute_alert=true'\nconst ACK_ALERT_NOT_FAILED = '/acknowledge_alert/?alert_overwrite=NOT_FAILED'\n\nconst Show = true\nconst Hide = false\n\nconst LocalPrefNames = {\n  Settings: 'panel-settings',\n  Time: 'print-time',\n  StatusTemp: 'status_temp_block',\n}\n\nexport default {\n  name: 'PrinterCard',\n\n  components: {\n    StreamingBox,\n    FailureDetectionGauge,\n    DurationBlock,\n    StatusTemp,\n    PrintJobControlWidget,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    isProAccount: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      section_toggles: {\n        settings: getLocalPref(LocalPrefNames.Settings + String(this.printer.id), Show),\n        time: getLocalPref(LocalPrefNames.Time + String(this.printer.id), Hide),\n        statusTemp: getLocalPref(LocalPrefNames.StatusTemp + String(this.printer.id), Show),\n      },\n      webrtc: null,\n      webcam: null,\n    }\n  },\n  computed: {\n    isWatching() {\n      return !this.printer.not_watching_reason\n    },\n    timeRemaining() {\n      return this.toDuration(this.secondsLeft, this.printer.isActive())\n    },\n    timeTotal() {\n      let secs = null\n      if (this.secondsPrinted && this.secondsLeft) {\n        secs = this.secondsPrinted + this.secondsLeft\n      }\n      return this.toDuration(secs, this.printer.isActive())\n    },\n    secondsLeft() {\n      return get(this.printer, 'status.progress.printTimeLeft')\n    },\n    secondsPrinted() {\n      return get(this.printer, 'status.progress.printTime')\n    },\n    watchForFailures() {\n      return this.printer.watching_enabled\n    },\n    pauseOnFailure() {\n      return this.printer.action_on_failure == 'PAUSE'\n    },\n    hasCurrentPrintFilename() {\n      if (this.printer.current_print && this.printer.current_print.filename) {\n        return true\n      }\n      return false\n    },\n    actionsProps() {\n      return {\n        printer: this.printer,\n      }\n    },\n    progressPct() {\n      return get(this.printer, 'status.progress.completion') || 0 // get(this.printer, 'status.progress.completion') may return null\n    },\n    tempProps() {\n      // If temp_profiles is missing, it's a plugin version too old to change temps\n      let isPluginVersionSufficient = get(this.printer, 'settings.temp_profiles') != undefined\n      const temperatures = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (Boolean(value.actual) && !isNaN(value.actual)) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          temperatures[key] = value\n        }\n      }\n      return {\n        temperatures: temperatures,\n        show: Object.keys(temperatures).length > 0,\n        isPluginVersionSufficient,\n      }\n    },\n    statusText() {\n      return this.printer.calculatedState() || 'Offline'\n    },\n    statusClass() {\n      if (this.printer.hasError()) {\n        return 'text-danger'\n      }\n      if (\n        this.printer.isOffline() ||\n        this.printer.isDisconnected() ||\n        this.printer.inTransientState()\n      ) {\n        return 'text-warning'\n      }\n      return 'text-success'\n    },\n  },\n  created() {\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printer.id,\n      urls.printerWebSocket(this.printer.id),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.$emit('PrinterUpdated', this.updatedPrinter(data))\n\n          if (!this.webrtc && (data?.settings?.webcams || []).length > 0) {\n            const webcams = data.settings?.webcams\n            this.webcam = webcams?.find(webcam => webcam.is_primary_camera === true);\n            if (this.webcam) {\n              this.webrtc = WebRTCConnection(this.webcam.stream_mode, this.webcam.stream_id)\n              this.webrtc.openForPrinter(this.printer.id, this.printer.auth_token)\n              this.printerComm.setWebRTCConnection(this.webcam.name, this.webrtc)\n            }\n          }\n        },\n        onStatusReceived: (printerStatus) => {\n          // Backward compatibility: octoprint_data is for OctoPrint-Obico 2.1.2 or earlier, or moonraker-obico 0.5.1 or earlier\n          const status = printerStatus.status || printerStatus.octoprint_data\n          this.$emit('PrinterUpdated', this.updatedPrinter({ status }))\n        },\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  methods: {\n    updatedPrinter(newData) {\n      return normalizedPrinter(newData, this.printer)\n    },\n    settingsUrl() {\n      return `/printers/${this.printer.id}/`\n    },\n    octoPrintTunnelUrl() {\n      return `/tunnels/${this.printer.id}/`\n    },\n    onSettingsToggleClicked() {\n      this.section_toggles.settings = !this.section_toggles.settings\n      setLocalPref(LocalPrefNames.Settings + String(this.printer.id), this.section_toggles.settings)\n    },\n    onTimeToggleClicked() {\n      this.section_toggles.time = !this.section_toggles.time\n      setLocalPref(LocalPrefNames.Time + String(this.printer.id), this.section_toggles.time)\n    },\n    onStatusTempToggleClicked() {\n      this.section_toggles.statusTemp = !this.section_toggles.statusTemp\n      setLocalPref(\n        LocalPrefNames.StatusTemp + String(this.printer.id),\n        this.section_toggles.statusTemp\n      )\n    },\n    onNotAFailureClicked(ev, resumePrint) {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Noted!')}`,\n        html: `<p>${this.$i18next.t(\"Do you want to mute failure detection on for this print?\")}</p><small>${this.$i18next.t(\"If you select 'Mute', failure detection will be turned off for this print, but will be automatically turned on for your next print.\")}</small>`,\n        confirmButtonText: `${this.$i18next.t('Mute')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          // Hack: So that 2 APIs are not called at the same time\n          setTimeout(() => {\n            this.sendPrinterAction(this.printer.id, MUTE_CURRENT_PRINT)\n          }, 1000)\n        }\n        if (resumePrint) {\n          this.printer.setTransientState('Resuming')\n          this.sendPrinterAction(this.printer.id, RESUME_PRINT)\n        } else {\n          this.sendPrinterAction(this.printer.id, ACK_ALERT_NOT_FAILED)\n        }\n      })\n\n      ev.preventDefault()\n    },\n    onWatchForFailuresToggled() {\n      // FIXME: fix on printer page update (when better desktop experience will be introduced)\n      // eslint-disable-next-line vue/no-mutating-props\n      this.printer.watching_enabled = !this.printer.watching_enabled\n      this.updatePrinter(this.printer)\n    },\n    onPauseOnFailureToggled() {\n      // FIXME: fix on printer page update (when better desktop experience will be introduced)\n      // eslint-disable-next-line vue/no-mutating-props\n      this.printer.action_on_failure = this.printer.action_on_failure == 'PAUSE' ? 'NONE' : 'PAUSE'\n      this.updatePrinter(this.printer)\n    },\n\n    onTempEditClicked(key, item) {\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let presets\n      let maxTemp = 350\n\n      if (key.search(/bed|chamber/) > -1) {\n        maxTemp = 140\n      }\n      if (key.search(/tool/) > -1) {\n        // OctoPrint uses 'extruder' for toolx heaters\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v['extruder'] }\n        })\n      } else {\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v[key] }\n        })\n      }\n\n      this.$swal\n        .openModalWithComponent(\n          TempTargetEditor,\n          {\n            presets: presets,\n            maxTemp: maxTemp,\n            curTarget: item.target,\n          },\n          {\n            title: 'Set ' + temperatureDisplayName(key) + ' Temperature',\n            confirmButtonText: 'Confirm',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                target: parseInt(document.getElementById('target-temp').value),\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value) {\n            let targetTemp = result.value.target\n            this.printerComm.passThruToPrinter({\n              func: 'set_temperature',\n              target: '_printer',\n              args: [key, targetTemp],\n            })\n          }\n        })\n    },\n\n    updatePrinter(printer) {\n      return axios\n        .patch(urls.printer(printer.id), {\n          watching_enabled: printer.watching_enabled,\n          action_on_failure: printer.action_on_failure,\n        })\n        .then((response) => {\n          if (response.data.succeeded) {\n            this.$emit('PrinterUpdated', normalizedPrinter(response.data.printer, this.printer))\n          } else {\n            throw response\n          }\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Failed to update printer')}`)\n        })\n    },\n\n    sendPrinterAction(printerId, path) {\n      axios.post(urls.printerAction(printerId, path))\n    },\n\n    shouldVideoBeFull(printer) {\n      let hasImage = get(printer, 'pic.img_url')\n      let shouldBeThumb = printer.alertUnacknowledged() && hasImage\n      return !shouldBeThumb\n    },\n\n    toDuration(seconds, isActive) {\n      if (seconds == null || seconds == 0) {\n        return {\n          valid: false,\n          printing: Boolean(isActive),\n        }\n      } else {\n        var d = moment.duration(seconds, 'seconds')\n        var h = Math.floor(d.asHours())\n        var m = d.minutes()\n        var s = d.seconds()\n        return {\n          valid: true,\n          printing: Boolean(isActive),\n          hours: h,\n          showHours: h > 0,\n          minutes: m,\n          showMinutes: h > 0 || m > 0,\n          seconds: s,\n          showSeconds: h == 0 && m == 0,\n        }\n      }\n    },\n\n    onSharePrinter() {\n      this.$swal.openModalWithComponent(\n        SharePrinter,\n        {\n          isProAccount: this.isProAccount,\n          printer: this.printer,\n        },\n        {\n          confirmButtonText: 'Close',\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n    background: #000\n\n.card\n  border-radius: var(--border-radius-lg)\n  overflow: hidden\n\n  .setting-item\n    border-bottom: none !important\n\n.menu-icon\n  width: 20px\n  height: 20px\n  margin-right: 6px\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterCard.vue?vue&type=template&id=44dc68ea&scoped=true&\"\nimport script from \"./PrinterCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterCard.vue?vue&type=style&index=0&id=44dc68ea&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"44dc68ea\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarRight>\n      <div class=\"action-panel\">\n        <!-- Detection Hours -->\n        <a\n          v-if=\"isEnt\"\n          href=\"/user_preferences/dh/\"\n          class=\"btn shadow-none action-btn icon-btn hours-btn\"\n          :style=\"{ marginRight: `${String(dhBadgeNum).length * 0.25}rem` }\"\n          :title=\"dhBadgeNum + ' ' + $t('AI Detection Hours')\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-hour-glass\"></use>\n          </svg>\n          <span id=\"user-credits\" class=\"badge badge-light\">{{ dhBadgeNum }}</span>\n          <span class=\"sr-only\">{{ $t(\"AI Detection Hours\") }}</span>\n        </a>\n        <!-- Sorting -->\n        <b-dropdown right no-caret toggle-class=\"action-btn icon-btn\" title=\"Sort By\">\n          <template #button-content>\n            <i class=\"fas fa-sort-amount-down\"></i>\n          </template>\n          <sorting-dropdown\n            :local-storage-prefix=\"sortingLocalStoragePrefix\"\n            :sorting-options=\"sortingOptions\"\n            :sorting-value=\"sortingValue\"\n            @onSortingUpdated=\"onSortingUpdated\"\n          />\n        </b-dropdown>\n        <!-- Filtering -->\n        <b-dropdown\n          right\n          no-caret\n          toggle-class=\"action-btn icon-btn\"\n          menu-class=\"scrollable\"\n          title=\"Filter\"\n        >\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <filtering-dropdown\n            :local-storage-prefix=\"filterLocalStoragePrefix\"\n            :filter-options=\"filterOptions\"\n            :filter-values=\"filterValues\"\n            @onFilterUpdated=\"onFilterUpdated\"\n          />\n        </b-dropdown>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown ref=\"cascadedDropdown\" :menu-options=\"mobileMenuOptions\">\n            <template #sorting>\n              <sorting-dropdown\n                :local-storage-prefix=\"sortingLocalStoragePrefix\"\n                :sorting-options=\"sortingOptions\"\n                :sorting-value=\"sortingValue\"\n                @onSortingUpdated=\"onSortingUpdated\"\n              />\n            </template>\n            <template #filtering>\n              <filtering-dropdown\n                :local-storage-prefix=\"filterLocalStoragePrefix\"\n                :filter-options=\"filterOptions\"\n                :filter-values=\"filterValues\"\n                @onFilterUpdated=\"onFilterUpdated\"\n              />\n            </template>\n          </cascaded-dropdown>\n        </b-dropdown>\n      </div>\n    </template>\n\n    <!-- Page content -->\n    <template #content>\n      <active-filter-notice :filter-values=\"filterValues\" @onShowAllClicked=\"resetFilters\" />\n\n      <!-- Printers list -->\n      <b-container class=\"printer-list-page\">\n        <b-row v-if=\"loading\">\n          <b-col class=\"text-center\">\n            <b-spinner class=\"my-5\" label=\"Loading...\"></b-spinner>\n          </b-col>\n        </b-row>\n        <b-row v-if=\"visiblePrinters.length\" class=\"printer-cards justify-content-center\">\n          <printer-card\n            v-for=\"printer in visiblePrinters\"\n            :key=\"printer.id\"\n            :printer=\"printer\"\n            :is-pro-account=\"user.is_pro\"\n            class=\"printer-card-wrapper\"\n            @PrinterUpdated=\"onPrinterUpdated\"\n          ></printer-card>\n        </b-row>\n        <div v-if=\"!loading\" class=\"row justify-content-center\">\n          <div id=\"new-printer\" class=\"col-sm-12 col-lg-6\">\n            <div class=\"new-printer-container\">\n              <a href=\"/printers/wizard/\">\n                <svg class=\"icon\">\n                  <use href=\"#svg-add-printer\"></use>\n                </svg>\n                <div>{{ $t(\"Link New Printer\") }}</div>\n              </a>\n            </div>\n          </div>\n        </div>\n        <b-row v-if=\"!loading\" v-show=\"shouldShowArchiveWarning\" class=\"bottom-messages\">\n          <b-col>\n            <div class=\"alert alert-warning alert-dismissible fade show mb-3\" role=\"alert\">\n              <div class=\"warning\">\n                <div>\n                  {{ archivedPrinterNum }} {{ 'printer' | pluralize(archivedPrinterNum) }} {{ $t(\"have been archived.\") }}\n                </div>\n                <div>\n                  <a href=\"/ent/printers/archived/\" class=\"warning-action\"\n                    >{{ $t(\"Show Archived Printers\") }}</a\n                  >\n                  <a class=\"warning-action\" @click=\"handleNeverShowAgain\">{{ $t(\"Never Show Again\") }}</a>\n                </div>\n              </div>\n              <button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">\n                <span aria-hidden=\"true\">&times;</span>\n              </button>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport sortBy from 'lodash/sortBy'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport PrinterCard from '@src/components/printers/PrinterCard.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport SortingDropdown, { restoreSortingValue } from '@src/components/SortingDropdown'\nimport FilteringDropdown, { restoreFilterValues } from '@src/components/FilteringDropdown'\nimport { user, settings } from '@src/lib/page-context'\nimport ActiveFilterNotice from '@src/components/ActiveFilterNotice'\nimport i18n from '@src/i18n/i18n.js'\n\nconst SortingLocalStoragePrefix = 'printersSorting'\nconst SortingOptions = {\n  options: [\n    { title: `${i18n.t('Name')}`, key: 'name' },\n    { title: `${i18n.t('Created at')}`, key: 'created_at' },\n  ],\n  default: { sorting: 'created_at', direction: 'desc' },\n}\n\nconst FilterLocalStoragePrefix = 'printersFiltering'\nconst FilterOptions = {\n  status: {\n    title: `${i18n.t('Print Status')}`,\n    queryParam: 'status',\n    values: [\n      { key: 'none', title: `${i18n.t('All Printers')}` },\n      { key: 'online', title: `${i18n.t('Online Printers')}` },\n      { key: 'active', title: `${i18n.t('Active Printers')}` },\n    ],\n    default: 'none',\n  },\n}\n\nexport default {\n  name: 'PrinterListPage',\n\n  components: {\n    PrinterCard,\n    PageLayout,\n    CascadedDropdown,\n    SortingDropdown,\n    FilteringDropdown,\n    ActiveFilterNotice,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      printers: [],\n      loading: true,\n      isEnt: false,\n      archivedPrinterNum: 0,\n      shouldShowArchiveWarning: false,\n\n      // Sorting\n      sortingLocalStoragePrefix: SortingLocalStoragePrefix,\n      sortingOptions: SortingOptions,\n      sortingValue: restoreSortingValue(SortingLocalStoragePrefix, SortingOptions),\n\n      // Filtering\n      filterLocalStoragePrefix: FilterLocalStoragePrefix,\n      filterOptions: FilterOptions,\n      filterValues: restoreFilterValues(FilterLocalStoragePrefix, FilterOptions),\n    }\n  },\n\n  computed: {\n    dhBadgeNum() {\n      if (this.user && this.user.is_dh_unlimited) {\n        return '\\u221E'\n      } else {\n        return Math.round(this.user.dh_balance)\n      }\n    },\n    mobileMenuOptions() {\n      const options = [\n        {\n          key: 'sorting',\n          icon: 'fas fa-sort-amount-down',\n          title: `${this.$i18next.t(`Sort`)}`,\n          expandable: true,\n        },\n        {\n          key: 'filtering',\n          icon: 'fas fa-filter',\n          title: `${this.$i18next.t(`Filter`)}`,\n          expandable: true,\n        },\n      ]\n\n      if (this.isEnt) {\n        options.unshift({\n          key: 'dh',\n          svgIcon: 'svg-hour-glass',\n          title: `${this.$i18next.t(`{name} AI Detection Hours`,{name:this.dhBadgeNum})}`,\n          href: '/user_preferences/dh/',\n        })\n      }\n\n      return options\n    },\n\n    visiblePrinters() {\n      let printers = this.printers\n      switch (this.filterValues.status) {\n        case 'online':\n          printers = printers.filter((p) => !p.isDisconnected())\n          break\n        case 'active':\n          printers = printers.filter((p) => p.isActive())\n          break\n        case 'none':\n          break\n      }\n\n      if (this.sortingValue.sorting.key === 'created_at') {\n        printers = sortBy(printers, (p) => p.createdAt())\n      } else if (this.sortingValue.sorting.key === 'name') {\n        printers = sortBy(printers, (p) => p.name)\n      }\n\n      if (this.sortingValue.direction.key === 'desc') {\n        printers.reverse()\n      }\n\n      return printers\n    },\n    hiddenPrinterCount() {\n      return this.printers.length - this.visiblePrinters.length\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.user = user()\n    this.fetchPrinters()\n  },\n\n  methods: {\n    fetchPrinters() {\n      this.loading = true\n      return axios\n        .get(urls.printers(), {\n          params: {\n            with_archived: true,\n          },\n        })\n        .then((response) => {\n          const printers = response.data\n          if (\n            getLocalPref('single-printer-redirect-enabled', true) &&\n            printers.length == 1 &&\n            !printers[0].archived_at\n          ) {\n            window.location.href = `/printers/${printers[0].id}/control/`\n            return\n          }\n\n          this.loading = false\n          response.data.forEach((p) => {\n            if (p.archived_at) {\n              this.archivedPrinterNum += 1\n            } else {\n              this.insertPrinter(normalizedPrinter(p))\n            }\n          })\n          this.shouldShowArchiveWarningFunc()\n        })\n    },\n    insertPrinter(printer) {\n      this.printers.push(printer)\n    },\n    onPrinterUpdated(printer) {\n      let index = this.printers.findIndex((p) => p.id == printer.id)\n      if (index < 0) {\n        // FIXME any alert here?\n        return\n      }\n\n      this.$set(this.printers, index, printer)\n    },\n    resetGcodesModal() {\n      this.selectedGcodeId = null\n      this.targetPrinter = null\n    },\n\n    // Sorting\n    onSortingUpdated(sortingValue) {\n      this.sortingValue = sortingValue\n    },\n\n    // Filtering\n    onFilterUpdated(filterOptionKey, filterOptionValue) {\n      this.filterValues[filterOptionKey] = filterOptionValue\n    },\n    resetFilters() {\n      for (const key of Object.keys(this.filterValues)) {\n        this.filterValues[key] = 'none'\n        setLocalPref(`${FilterLocalStoragePrefix}-${key}`, 'none')\n      }\n    },\n    handleNeverShowAgain() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        html: `<p style=\"text-align: center\">${this.$i18next.t(\"You can always view your archived printers in by navigating to the General tab within Preferences.\")}</p>`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          localStorage.setItem('shouldNeverShowArchived', JSON.stringify(true))\n          this.shouldShowArchiveWarning = false\n        }\n      })\n    },\n    shouldShowArchiveWarningFunc() {\n      const shouldNeverShow = localStorage.getItem('shouldNeverShowArchived')\n      if (JSON.parse(shouldNeverShow) === true) {\n        this.shouldShowArchiveWarning = false\n      } else {\n        this.shouldShowArchiveWarning = this.archivedPrinterNum > 0\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-list-page\n  .consider-upgrade\n    margin-bottom: var(--gap-between-blocks)\n\n  .printer-cards\n     margin-top: calc(var(--gap-between-blocks) * -1)\n\n  .printer-card-wrapper\n    margin-top: var(--gap-between-blocks)\n\n  .bottom-messages\n    margin-top: var(--gap-between-blocks)\n\n  .warning\n    display: flex\n    flex-direction: row\n    flex-wrap: wrap\n    justify-content: space-between\n    align-items: center\n\n    .warning-action\n      padding: 0.25em 0\n      margin-left: auto\n      margin: 0px 5px 0px 5px\n      cursor: pointer\n\n.btn.hours-btn\n  position: relative\n  color: var(--color-text-primary)\n\n  .badge\n    position: absolute\n    left: 18px\n    top: 4px\n    border-radius: var(--border-radius-sm)\n    background-color: var(--color-primary)\n    height: auto\n    font-size: .625rem\n\n.custom-svg-icon\n  height: 1.3rem\n  width: 1.3rem\n\n::v-deep .dropdown-item .clickable-area\n  margin: -0.25rem -1.5rem\n  padding: 0.25rem 1.5rem\n</style>\n\n<style lang=\"sass\">\ndiv[id^=b-modal-gcodes]\n  .modal-header\n    display: none\n  .modal-body\n    padding: 0\n  .modal-footer\n    display: none\n\n#new-printer\n  min-height: 25em\n  .new-printer-container\n    display: flex\n    flex-flow: column\n    align-items: center\n    justify-content: center\n    margin-top: 6em\n    a\n      text-align: center\n      border: thin dashed\n      color: var(--color-primary)\n      border-color: var(--color-primary)\n      padding: 4em 3em\n      border-radius: var(--border-radius-lg)\n      &:hover\n        text-decoration: none\n        background-color: var(--color-hover)\n    .icon\n      width: 2rem\n      height: 2rem\n      margin-bottom: 1rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterListPage.vue?vue&type=template&id=7f862148&scoped=true&\"\nimport script from \"./PrinterListPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterListPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterListPage.vue?vue&type=style&index=0&id=7f862148&prod&lang=sass&scoped=true&\"\nimport style1 from \"./PrinterListPage.vue?vue&type=style&index=1&id=7f862148&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7f862148\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"printer_shared\"}}),_c('div',{staticClass:\"row justify-content-center\"},[(_vm.loading)?_c('b-spinner',{staticClass:\"mt-5\",attrs:{\"label\":\"Loading...\"}}):_vm._e(),(_vm.printer)?_c('div',{staticClass:\"col-sm-12 col-lg-6 printer-card\"},[_c('div',{staticClass:\"card\"},[_c('div',{staticClass:\"card-header\"},[_c('div',[_vm._v(_vm._s(_vm.printer.name))])]),(_vm.webcams.length || _vm.printer?.pic?.img_url)?_c('b-card-text',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('b-row',[_c('b-col',{staticClass:\"pb-0\",staticStyle:{\"position\":\"relative\"}},[_c('b-container',{staticClass:\"p-0\",attrs:{\"fluid\":\"\"}},[_c('b-row',{attrs:{\"no-gutters\":\"\"}},[(_vm.webcams.length === 0 && _vm.printer?.pic?.img_url)?_c('b-col',{key:_vm.printer?.pic?.img_url,attrs:{\"cols\":12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"autoplay\":true,\"stickyStreamingSrc\":'IMAGE'}})],1)]):_vm._e(),_vm._l((_vm.webcams),function(webcam,index){return _c('b-col',{key:index,attrs:{\"cols\":_vm.webcams.length > 1 ? 6 : 12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.printerComm.webrtcConnections.get(webcam.name),\"autoplay\":true,\"webcam\":webcam}})],1)])})],2)],1)],1)],1)],1):_vm._e()],1),_c('div',{staticClass:\"p-3 p-md-5\"},[_c('p',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You are viewing an awesome 3D print your friend shared specifically with you on\"))+\" \")]),_c('a',{attrs:{\"href\":\"https://www.obico.io/\"}},[_c('svg',{staticClass:\"logo-img\",attrs:{\"width\":\"100%\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-full\"}})])]),_c('hr'),_c('br'),_c('br'),_c('p',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t(\"lets you monitor and control your printer from anywhere, on your phone.\"))+\" \")]),_c('a',{staticClass:\"btn btn-block btn-primary\",attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"Sign up for a free {brandName} account\",{brandName:_vm.$syndicateText.brandName})))])])]):_vm._e()],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.inMobileWebView)?_c('b-navbar',{class:{\n      'navbar-dark': _vm.theme === _vm.themes.Dark,\n      'navbar-light': _vm.theme === _vm.themes.Light,\n    },attrs:{\"toggleable\":\"xl\"}},[_c('b-container',{staticClass:\"p-0\"},[_c('b-navbar-brand',{attrs:{\"href\":\"/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('b-navbar-toggle',{attrs:{\"target\":\"navbar-toggle-collapse\"}},[_c('span',{staticClass:\"navbar-toggler-icon\"})]),_c('b-collapse',{attrs:{\"id\":\"navbar-toggle-collapse\",\"is-nav\":\"\"},model:{value:(_vm.showMainMenu),callback:function ($$v) {_vm.showMainMenu=$$v},expression:\"showMainMenu\"}},[_c('b-navbar-nav',[(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('printers') },attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Printers\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('print_history') },attrs:{\"href\":\"/print_history/\"}},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('g_code_folders') },attrs:{\"href\":\"/g_code_folders/cloud/\"}},[_vm._v(_vm._s(_vm.$t(\"G-Codes\")))]):_vm._e(),(_vm.isEnt && !_vm.user)?_c('b-nav-item',{staticClass:\"glowing\",class:{ active: _vm.viewName === 'publictimelapse_list' },attrs:{\"href\":\"/ent_pub/publictimelapses/\"}},[_vm._v(_vm._s(_vm.$t(\"Spaghetti Gallery\")))]):_vm._e(),(_vm.isEnt)?_c('b-nav-item',{class:{ active: _vm.viewName === 'pricing' },attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Pricing\")))]):_vm._e(),_c('b-nav-item',{attrs:{\"href\":\"https://www.obico.io/help/\"}},[_vm._v(_vm._s(_vm.$t(\"Help\")))]),_c('b-nav-item',{attrs:{\"href\":\"https://obico.io/discord\"}},[_vm._v(_vm._s(_vm.$t(\"Community\")))])],1),_c('b-navbar-nav',{staticClass:\"ml-auto\"},[(!_vm.user)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/login/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN\")))]):_vm._e(),(!_vm.user && _vm.allowSignUp)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))]):_vm._e(),(_vm.user)?_c('b-nav-item-dropdown',{ref:\"accountDropdown\",attrs:{\"right\":\"\",\"toggle-class\":\"user-menu\",\"text\":_vm.user.first_name || _vm.user.email}},[_c('b-dropdown-item',{attrs:{\"href\":\"/user_preferences/\"}},[_c('i',{staticClass:\"fas fa-cog mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Preferences\"))+\" \")]),_c('b-dropdown-divider'),_c('b-dropdown-item',{attrs:{\"href\":\"/accounts/logout/\"}},[_c('i',{staticClass:\"fas fa-sign-out-alt mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Log out\"))+\" \")])],1):_vm._e()],1)],1)],1)],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-navbar\n      v-if=\"!inMobileWebView\"\n      toggleable=\"xl\"\n      :class=\"{\n        'navbar-dark': theme === themes.Dark,\n        'navbar-light': theme === themes.Light,\n      }\"\n    >\n      <b-container class=\"p-0\">\n        <b-navbar-brand href=\"/\">\n          <SyndicateAwareSVG href=\"#svg-logo-compact\" width=\"100\" height=\"30\" />\n        </b-navbar-brand>\n\n        <b-navbar-toggle target=\"navbar-toggle-collapse\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </b-navbar-toggle>\n\n        <b-collapse id=\"navbar-toggle-collapse\" v-model=\"showMainMenu\" is-nav>\n          <b-navbar-nav>\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/printers/\"\n              :class=\"{ active: viewName.includes('printers') }\"\n              >{{ $t(\"Printers\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/print_history/\"\n              :class=\"{ active: viewName.includes('print_history') }\"\n              >{{ $t(\"Print History\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"/g_code_folders/cloud/\"\n              :class=\"{ active: viewName.includes('g_code_folders') }\"\n              >{{ $t(\"G-Codes\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt && !user\"\n              href=\"/ent_pub/publictimelapses/\"\n              :class=\"{ active: viewName === 'publictimelapse_list' }\"\n              class=\"glowing\"\n              >{{ $t(\"Spaghetti Gallery\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt\"\n              href=\"/ent_pub/pricing/\"\n              :class=\"{ active: viewName === 'pricing' }\"\n              >{{ $t(\"Pricing\") }}</b-nav-item\n            >\n            <b-nav-item href=\"https://www.obico.io/help/\">{{ $t(\"Help\") }}</b-nav-item>\n            <b-nav-item href=\"https://obico.io/discord\">{{ $t(\"Community\") }}</b-nav-item>\n          </b-navbar-nav>\n\n          <b-navbar-nav class=\"ml-auto\">\n            <b-nav-item v-if=\"!user\" href=\"/accounts/login/\">{{ $t(\"SIGN IN\") }}</b-nav-item>\n            <b-nav-item v-if=\"!user && allowSignUp\" href=\"/accounts/signup/\">{{ $t(\"SIGN UP\") }}</b-nav-item>\n            <b-nav-item-dropdown\n              v-if=\"user\"\n              ref=\"accountDropdown\"\n              right\n              toggle-class=\"user-menu\"\n              :text=\"user.first_name || user.email\"\n            >\n              <b-dropdown-item href=\"/user_preferences/\">\n                <i class=\"fas fa-cog mr-2\"></i>{{$t(\"Preferences\")}}\n              </b-dropdown-item>\n              <b-dropdown-divider></b-dropdown-divider>\n              <b-dropdown-item href=\"/accounts/logout/\">\n                <i class=\"fas fa-sign-out-alt mr-2\"></i>{{$t(\"Log out\")}}\n              </b-dropdown-item>\n            </b-nav-item-dropdown>\n          </b-navbar-nav>\n        </b-collapse>\n      </b-container>\n    </b-navbar>\n  </div>\n</template>\n\n<script>\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'NavBar',\n\n  components: {},\n\n  props: {\n    viewName: {\n      default() {\n        return ''\n      },\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n      themes: Themes,\n      showMainMenu: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n\n    theme() {\n      return currentThemeValue()\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  methods: {\n    hideDropdowns() {\n      this.showMainMenu = false\n\n      // Check account dropdown (preferences and logout)\n      const accountDropdown = this.$refs.accountDropdown\n      if (accountDropdown) {\n        accountDropdown.hide()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .navbar\n  padding: 0.5rem 1rem\n\n  a.navbar-brand\n    margin-top: -3px\n\n  .navbar-toggler\n    color: var(--color-text-primary)\n\n  .nav-item\n    text-transform: uppercase\n\n  .user-menu\n    text-transform: none\n\n  .badge-btn\n    position: relative\n    height: 1.8rem\n    margin-right: 1.5em\n\n    img\n      height: 1.3rem\n\n    .badge\n      position: absolute\n      left: 22px\n      top: 1px\n      height: 18px\n      border-radius: 4px\n      transition: transform 0.2s\n\n      /* Animation */\n      &:hover\n        transform: scale(1.3)\n\n  @media (min-width: 1200px)\n    padding: 0rem 1rem\n\n    .nav-item\n      padding: 0.5rem 0.24rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NavBar.vue?vue&type=template&id=649a7c88&scoped=true&\"\nimport script from \"./NavBar.vue?vue&type=script&lang=js&\"\nexport * from \"./NavBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NavBar.vue?vue&type=style&index=0&id=649a7c88&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"649a7c88\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <nav-bar view-name=\"printer_shared\"></nav-bar>\n\n    <div class=\"row justify-content-center\">\n      <b-spinner v-if=\"loading\" class=\"mt-5\" label=\"Loading...\"></b-spinner>\n      <div v-if=\"printer\" class=\"col-sm-12 col-lg-6 printer-card\">\n        <div class=\"card\">\n          <div class=\"card-header\">\n            <div>{{ printer.name }}</div>\n          </div>\n\n        <b-card-text v-if=\"webcams.length || printer?.pic?.img_url\" class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n            <b-row>\n                <b-col class=\"pb-0\" style=\"position: relative\">\n                  <b-container fluid class=\"p-0\">\n                    <b-row no-gutters>\n                      <b-col v-if=\"webcams.length === 0 && printer?.pic?.img_url\" :key=\"printer?.pic?.img_url\" :cols=\"12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :autoplay=\"true\"\n                            :stickyStreamingSrc=\"'IMAGE'\"\n                          />\n                        </div>\n                      </b-col>\n                      <b-col v-for=\"(webcam, index) in webcams\" :key=\"index\" :cols=\"webcams.length > 1 ? 6 : 12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :webrtc=\"printerComm.webrtcConnections.get(webcam.name)\"\n                            :autoplay=\"true\"\n                            :webcam=\"webcam\"\n                          />\n                        </div>\n                      </b-col>\n                    </b-row>\n                  </b-container>\n              </b-col>\n            </b-row>\n        </b-card-text>\n          </div>\n          <div class=\"p-3 p-md-5\">\n            <p class=\"text-center\">\n              {{$t(\"You are viewing an awesome 3D print your friend shared specifically with you on\")}}\n            </p>\n            <a href=\"https://www.obico.io/\">\n              <svg width=\"100%\" class=\"logo-img\">\n                <use href=\"#svg-logo-full\" />\n              </svg>\n            </a>\n            <hr />\n            <br /><br />\n            <p class=\"text-center\">\n              {{ $syndicateText.brandName }} {{$t(\"lets you monitor and control your printer from anywhere, on your phone.\")}}\n            </p>\n            <a class=\"btn btn-block btn-primary\" href=\"/accounts/signup/\"\n              >{{ $t(\"Sign up for a free {brandName} account\",{brandName:$syndicateText.brandName}) }}</a\n            >\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport split from 'lodash/split'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport WebRTCConnection from '@src/lib/webrtc'\nimport StreamingBox from '@src/components/StreamingBox'\nimport NavBar from '@src/components/NavBar.vue'\nexport default {\n  name: 'SharedPrinterPage',\n  components: {\n    StreamingBox,\n    NavBar,\n  },\n  data: function () {\n    return {\n      printer: null,\n      shareToken: null,\n      videoAvailable: {},\n      loading: true,\n      webcams: [],\n      isWebrtcOpened: false,\n    }\n  },\n  created() {\n    this.shareToken = split(window.location.pathname, '/').slice(-2, -1).pop()\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.shareToken,\n      urls.printerSharedWebSocket(this.shareToken),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n          this.loading = false\n          if ((this.printer?.settings?.webcams || []).length > 0) {\n            const webcamsDeepCopy = JSON.parse(JSON.stringify(this.printer?.settings?.webcams)) // Probably a good idea to deep copy as we will change the objects and keep them around\n            for (const webcam of webcamsDeepCopy) {\n              if (this.printerComm.webrtcConnections.has(webcam.name)) {\n                  continue;\n              }\n              this.webcams.push(webcam)\n              const webrtc = WebRTCConnection(webcam.stream_mode, webcam.stream_id)\n              this.printerComm.setWebRTCConnection(webcam.name, webrtc);\n              // Has to be called after this.webcams.push(webcam) otherwise the callbacks won't be established properly.\n              webrtc.openForShareToken(this.shareToken)\n            }\n          }\n       },\n      }\n    )\n    this.printerComm.connect()\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n    background: #000\n\n#printer-list-page\n  margin-top: 1.5rem\n.printer-card\n  margin-bottom: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SharedPrinterPage.vue?vue&type=template&id=36e7a07b&scoped=true&\"\nimport script from \"./SharedPrinterPage.vue?vue&type=script&lang=js&\"\nexport * from \"./SharedPrinterPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SharedPrinterPage.vue?vue&type=style&index=0&id=36e7a07b&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"36e7a07b\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"lg\":\"8\"}},[(!_vm.printer)?_c('loading-placeholder'):_c('div',{staticClass:\"surface with-loading-animation full-on-mobile\"},[_c('section',{staticClass:\"settings\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Settings\")))]),_c('div',{staticClass:\"form-group mb-4 mt-4\"},[_c('div',{staticClass:\"form-label text-muted mb-2\"},[_vm._v(_vm._s(_vm.$t(\"Give your shiny new printer a name\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.name,\"saving\":_vm.saving.name}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.name),expression:\"printer.name\"}],staticClass:\"form-control field_required\",attrs:{\"id\":\"id_name\",\"type\":\"text\",\"name\":\"name\",\"maxlength\":\"200\",\"placeholder\":\"\",\"required\":\"required\"},domProps:{\"value\":(_vm.printer.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.printer, \"name\", $event.target.value)}}})])],1),_c('div',{staticClass:\"failure-notification\"},[_c('div',{staticClass:\"form-group mt-4 mb-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"When a potential failure is detected\"))+\":\")]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.action_on_failure_NONE,\"saving\":_vm.saving.action_on_failure_NONE}},[_c('div',{staticClass:\"custom-control custom-radio mt-1 radio\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.action_on_failure),expression:\"printer.action_on_failure\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":\"id_action_on_failure_0\",\"type\":\"radio\",\"name\":\"action_on_failure\",\"value\":\"NONE\"},domProps:{\"checked\":_vm._q(_vm.printer.action_on_failure,\"NONE\")},on:{\"change\":[function($event){return _vm.$set(_vm.printer, \"action_on_failure\", \"NONE\")},function($event){return _vm.updateSetting('action_on_failure')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_action_on_failure_0\"}},[_vm._v(_vm._s(_vm.$t(\"Just notify me\")))])])]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.action_on_failure_PAUSE,\"saving\":_vm.saving.action_on_failure_PAUSE}},[_c('div',{staticClass:\"custom-control custom-radio mt-1 radio\",attrs:{\"id\":\"action_on_failure_PAUSE\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.action_on_failure),expression:\"printer.action_on_failure\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":\"id_action_on_failure_1\",\"type\":\"radio\",\"name\":\"action_on_failure\",\"value\":\"PAUSE\"},domProps:{\"checked\":_vm._q(_vm.printer.action_on_failure,\"PAUSE\")},on:{\"change\":[function($event){return _vm.$set(_vm.printer, \"action_on_failure\", \"PAUSE\")},function($event){return _vm.updateSetting('action_on_failure')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_action_on_failure_1\"}},[_vm._v(_vm._s(_vm.$t(\"Pause the printer and notify me\")))])])])],1)])]),_c('section',{staticClass:\"mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Failure Detection\")))]),_c('div',{staticClass:\"card-body p-0 pt-3\"},[_c('p',{staticClass:\"text-warning\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"If you are not sure about the settings below, leave the default values to minimize surprises.\"))+\" \")]),_c('div',{staticClass:\"form-group mt-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"When print is paused,\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.tools_off_on_pause,\"saving\":_vm.saving.tools_off_on_pause}},[_c('div',{staticClass:\"custom-control custom-checkbox mt-2 checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.tools_off_on_pause),expression:\"printer.tools_off_on_pause\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"id_tools_off_on_pause\",\"type\":\"checkbox\",\"name\":\"tools_off_on_pause\"},domProps:{\"checked\":Array.isArray(_vm.printer.tools_off_on_pause)?_vm._i(_vm.printer.tools_off_on_pause,null)>-1:(_vm.printer.tools_off_on_pause)},on:{\"change\":[function($event){var $$a=_vm.printer.tools_off_on_pause,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.printer, \"tools_off_on_pause\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.printer, \"tools_off_on_pause\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.printer, \"tools_off_on_pause\", $$c)}},function($event){return _vm.updateSetting('tools_off_on_pause')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_tools_off_on_pause\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Turn off hotend heater(s)\"))+\" \")])])]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.bed_off_on_pause,\"saving\":_vm.saving.bed_off_on_pause}},[_c('div',{staticClass:\"custom-control custom-checkbox mt-2 checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.printer.bed_off_on_pause),expression:\"printer.bed_off_on_pause\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"id_bed_off_on_pause\",\"type\":\"checkbox\",\"name\":\"bed_off_on_pause\"},domProps:{\"checked\":Array.isArray(_vm.printer.bed_off_on_pause)?_vm._i(_vm.printer.bed_off_on_pause,null)>-1:(_vm.printer.bed_off_on_pause)},on:{\"change\":[function($event){var $$a=_vm.printer.bed_off_on_pause,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.printer, \"bed_off_on_pause\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.printer, \"bed_off_on_pause\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.printer, \"bed_off_on_pause\", $$c)}},function($event){return _vm.updateSetting('bed_off_on_pause')}]}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"id_bed_off_on_pause\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Turn off bed heater\"))+\" \")])])]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.retract_on_pause,\"saving\":_vm.saving.retract_on_pause}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.retractFilamentByEnabled),expression:\"retractFilamentByEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"retract-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.retractFilamentByEnabled)?_vm._i(_vm.retractFilamentByEnabled,null)>-1:(_vm.retractFilamentByEnabled)},on:{\"change\":function($event){var $$a=_vm.retractFilamentByEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.retractFilamentByEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.retractFilamentByEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.retractFilamentByEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"retract-checkbox\"}},[_vm._v(_vm._s(_vm.$t(\"Retract filament by\")))])]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":0.5,\"disable\":!_vm.retractFilamentByEnabled},model:{value:(_vm.retractOnPause),callback:function ($$v) {_vm.retractOnPause=$$v},expression:\"retractOnPause\"}})],1)]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.lift_z_on_pause,\"saving\":_vm.saving.lift_z_on_pause}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.liftExtruderByEnabled),expression:\"liftExtruderByEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"lift-z-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.liftExtruderByEnabled)?_vm._i(_vm.liftExtruderByEnabled,null)>-1:(_vm.liftExtruderByEnabled)},on:{\"change\":function($event){var $$a=_vm.liftExtruderByEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.liftExtruderByEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.liftExtruderByEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.liftExtruderByEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"lift-z-checkbox\"}},[_vm._v(_vm._s(_vm.$t(\"Lift extruder along Z axis by\")))])]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":0.5,\"disable\":!_vm.liftExtruderByEnabled},model:{value:(_vm.liftExtruderBy),callback:function ($$v) {_vm.liftExtruderBy=$$v},expression:\"liftExtruderBy\"}})],1)])],1),_c('div',{staticClass:\"form-group sensitivity my-4\"},[_c('div',{staticClass:\"form-label text-muted\"},[_vm._v(_vm._s(_vm.$t(\"AI failure detection sensitivity\")))]),_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.detective_sensitivity,\"saving\":_vm.saving.detective_sensitivity}},[_c('div',{staticClass:\"my-2 sensitivity-slider\"},[_c('vue-slider',{attrs:{\"lazy\":true,\"min\":0.8,\"max\":1.2,\"interval\":0.05,\"tooltip-formatter\":_vm.sensitivityTooltipFormatter},model:{value:(_vm.detectiveSensitivity),callback:function ($$v) {_vm.detectiveSensitivity=$$v},expression:\"detectiveSensitivity\"}})],1)]),(_vm.sensitivityTooltipFormatter(_vm.printer.detective_sensitivity) === 'Low')?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Low - I don't want a lot of false alarms. Only alert me when you are absolutely sure.\"))+\" \")]):(\n                      _vm.sensitivityTooltipFormatter(_vm.printer.detective_sensitivity) === 'Medium'\n                    )?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"Medium - A few false alarms won't bother me. But some well-disguised spaghetti will be missed.\"))+\" \")]):_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"High - Hit me with all the false alarms. I want to catch as many failures as possible.\"))+\" \")])],1)])]),_c('section',{staticClass:\"mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Time-lapse\")))]),(!(_vm.timelapseOnFinishEnabled && _vm.timelapseOnCancelEnabled))?_c('p',{staticClass:\"text-warning\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_c('i18next',{attrs:{\"translation\":_vm.$t(`Focused Feedback won't be available when time-lapse recording is turned off. You won't be able to {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"help us get better while earning AI Detection Hours for yourself\")))])]},proxy:true}],null,false,2529399454)})],1):_vm._e(),_c('div',{staticClass:\"form-group mt-4\"},[_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.min_timelapse_secs_on_finish,\"saving\":_vm.saving.min_timelapse_secs_on_finish}},[_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.timelapseOnFinishEnabled),expression:\"timelapseOnFinishEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"timelapseOnFinishEnabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.timelapseOnFinishEnabled)?_vm._i(_vm.timelapseOnFinishEnabled,null)>-1:(_vm.timelapseOnFinishEnabled)},on:{\"change\":function($event){var $$a=_vm.timelapseOnFinishEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.timelapseOnFinishEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.timelapseOnFinishEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.timelapseOnFinishEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"timelapseOnFinishEnabled\"}},[_vm._v(_vm._s(_vm.$t(\"Record time-lapse when a print finishes successfully.\")))])])]),(_vm.timelapseOnFinishEnabled)?_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Skip if the print is finished in less than\"))+\" \")]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":5,\"unit\":\"minutes\"},model:{value:(_vm.minTimelapseMinutesOnFinish),callback:function ($$v) {_vm.minTimelapseMinutesOnFinish=$$v},expression:\"minTimelapseMinutesOnFinish\"}})],1):_vm._e()]),_c('saving-animation',{staticClass:\"mobile-full-width\",attrs:{\"errors\":_vm.errorMessages.min_timelapse_secs_on_cancel,\"saving\":_vm.saving.min_timelapse_secs_on_cancel}},[_c('div',{staticClass:\"form-inline mt-3 mb-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.timelapseOnCancelEnabled),expression:\"timelapseOnCancelEnabled\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"timelapseOnCancelEnabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.timelapseOnCancelEnabled)?_vm._i(_vm.timelapseOnCancelEnabled,null)>-1:(_vm.timelapseOnCancelEnabled)},on:{\"change\":function($event){var $$a=_vm.timelapseOnCancelEnabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.timelapseOnCancelEnabled=$$a.concat([$$v]))}else{$$i>-1&&(_vm.timelapseOnCancelEnabled=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.timelapseOnCancelEnabled=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"timelapseOnCancelEnabled\"}},[_vm._v(_vm._s(_vm.$t(\"Record time-lapse when a print is cancelled.\")))])])]),(_vm.timelapseOnCancelEnabled)?_c('div',{staticClass:\"form-inline my-1 checkbox-with-input\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Skip if the print is cancelled in less than\"))+\" \")]),_c('number-input',{staticClass:\"wrappable-field\",attrs:{\"step\":5,\"unit\":\"minutes\"},model:{value:(_vm.minTimelapseMinutesOnCancel),callback:function ($$v) {_vm.minTimelapseMinutesOnCancel=$$v},expression:\"minTimelapseMinutesOnCancel\"}})],1):_vm._e()])],1)]),_c('section',{staticClass:\"danger mt-5\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Danger Zone\")))]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary\",attrs:{\"href\":_vm.printerWizardUrl}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Re-Link Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_c('i18next',{attrs:{\"translation\":_vm.$t(`If your printer is always showing as 'offline', and you have gone through {localizedDom}, you can try to re-link printer as the last resort.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/troubleshoot-server-connection-issues/')}},[_vm._v(_vm._s(_vm.$t(\"all the trouble-shooting steps\")))])]},proxy:true}])})],1)])]),(_vm.isEnt)?_c('div',{staticClass:\"mt-4\"},[_c('button',{staticClass:\"btn btn-outline-warning\",on:{\"click\":_vm.archivePrinter}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Archive Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Archived printers are not counted toward your subscription plan. You won't see them in the app either. Go to {localizedDom} to find all archived printers and/or un-archive them.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent/printers/archived/\"}},[_vm._v(_vm._s(_vm.$t(\"this page\")))])]},proxy:true}],null,false,2102701858)})],1)])]):_vm._e(),_c('div',{staticClass:\"mt-4\"},[_c('button',{staticClass:\"btn btn-outline-danger\",on:{\"click\":_vm.deletePrinter}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Delete Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted mt-1\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Bye-bye printer.\")))])])])])])],1)],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group input-group-sm input-wrapper\"},[_c('div',{staticClass:\"input-group-prepend\"},[_c('button',{staticClass:\"btn btn-outline-secondary control-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.disable},on:{\"click\":function($event){_vm.inputValue = _vm.inputValue > 0 ? Math.round((_vm.inputValue - _vm.step) * 10) / 10 : 0\n        _vm.$emit('input', _vm.inputValue)}}},[_vm._v(\" ↓ \")])]),_c('input',{staticClass:\"form-control text-center field_required\",style:({ opacity: _vm.disable ? 0.3 : 1 }),attrs:{\"type\":\"text\",\"disabled\":\"\",\"aria-describedby\":\"basic-addon1\"},domProps:{\"value\":_vm.inputValue + ' ' + _vm.unit}}),_c('div',{staticClass:\"input-group-append\"},[_c('button',{staticClass:\"btn btn-outline-secondary control-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.disable},on:{\"click\":function($event){_vm.inputValue = Math.round((_vm.inputValue + _vm.step) * 10) / 10\n        _vm.$emit('input', _vm.inputValue)}}},[_vm._v(\" ↑ \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"input-group input-group-sm input-wrapper\">\n    <div class=\"input-group-prepend\">\n      <button\n        class=\"btn btn-outline-secondary control-button\"\n        type=\"button\"\n        :disabled=\"disable\"\n        @click=\"\n          inputValue = inputValue > 0 ? Math.round((inputValue - step) * 10) / 10 : 0\n          $emit('input', inputValue)\n        \"\n      >\n        ↓\n      </button>\n    </div>\n    <input\n      type=\"text\"\n      class=\"form-control text-center field_required\"\n      disabled\n      aria-describedby=\"basic-addon1\"\n      :value=\"inputValue + ' ' + unit\"\n      :style=\"{ opacity: disable ? 0.3 : 1 }\"\n    />\n    <div class=\"input-group-append\">\n      <button\n        class=\"btn btn-outline-secondary control-button\"\n        type=\"button\"\n        :disabled=\"disable\"\n        @click=\"\n          inputValue = Math.round((inputValue + step) * 10) / 10\n          $emit('input', inputValue)\n        \"\n      >\n        ↑\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'NumberInput',\n\n  props: {\n    value: {\n      type: Number,\n      default: 0,\n    },\n    step: {\n      type: Number,\n      default: 0.5,\n    },\n    disable: {\n      type: Boolean,\n      default: false,\n    },\n    unit: {\n      type: String,\n      default: 'mm',\n    },\n  },\n\n  data() {\n    return {\n      inputValue: this.value,\n    }\n  },\n\n  watch: {\n    value(newValue) {\n      this.inputValue = newValue\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.input-group.input-wrapper\n  border-radius: var(--border-radius-sm)\n  overflow: hidden\n  border: 1px solid var(--color-divider)\n\n  .control-button\n    border: none\n\n  .btn-outline-secondary\n    background-color: var(--color-input-background)\n\n    &:hover, &:focus, &:active\n      color: var(--color-text-primary)\n      background-color: var(--color-input-background)\n      opacity: .8\n      outline: none\n      box-shadow: none !important\n      border: none\n\n\n  input.form-control\n    background-color: var(--color-input-background)\n    color: var(--color-text-primary)\n    width: 6rem\n    border: none\n    border-left: 2px solid var(--color-divider)\n    border-right: 2px solid var(--color-divider)\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NumberInput.vue?vue&type=template&id=0f88dca4&scoped=true&\"\nimport script from \"./NumberInput.vue?vue&type=script&lang=js&\"\nexport * from \"./NumberInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NumberInput.vue?vue&type=style&index=0&id=0f88dca4&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0f88dca4\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <b-col lg=\"8\">\n            <loading-placeholder v-if=\"!printer\" />\n            <div v-else class=\"surface with-loading-animation full-on-mobile\">\n              <section class=\"settings\">\n                <h2 class=\"section-title\">{{ $t(\"Settings\") }}</h2>\n                <div class=\"form-group mb-4 mt-4\">\n                  <div class=\"form-label text-muted mb-2\">{{ $t(\"Give your shiny new printer a name\") }}</div>\n                  <saving-animation :errors=\"errorMessages.name\" :saving=\"saving.name\">\n                    <input\n                      id=\"id_name\"\n                      v-model=\"printer.name\"\n                      type=\"text\"\n                      name=\"name\"\n                      maxlength=\"200\"\n                      placeholder=\"\"\n                      class=\"form-control field_required\"\n                      required=\"required\"\n                    />\n                  </saving-animation>\n                </div>\n                <!-- Potential failure section -->\n                <div class=\"failure-notification\">\n                  <div class=\"form-group mt-4 mb-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"When a potential failure is detected\") }}:</div>\n                    <saving-animation\n                      :errors=\"errorMessages.action_on_failure_NONE\"\n                      :saving=\"saving.action_on_failure_NONE\"\n                    >\n                      <div class=\"custom-control custom-radio mt-1 radio\">\n                        <input\n                          id=\"id_action_on_failure_0\"\n                          v-model=\"printer.action_on_failure\"\n                          type=\"radio\"\n                          name=\"action_on_failure\"\n                          class=\"custom-control-input field_required\"\n                          value=\"NONE\"\n                          @change=\"updateSetting('action_on_failure')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_action_on_failure_0\"\n                          >{{ $t(\"Just notify me\") }}</label\n                        >\n                      </div>\n                    </saving-animation>\n                    <saving-animation\n                      :errors=\"errorMessages.action_on_failure_PAUSE\"\n                      :saving=\"saving.action_on_failure_PAUSE\"\n                    >\n                      <div\n                        id=\"action_on_failure_PAUSE\"\n                        class=\"custom-control custom-radio mt-1 radio\"\n                      >\n                        <input\n                          id=\"id_action_on_failure_1\"\n                          v-model=\"printer.action_on_failure\"\n                          type=\"radio\"\n                          name=\"action_on_failure\"\n                          class=\"custom-control-input field_required\"\n                          value=\"PAUSE\"\n                          @change=\"updateSetting('action_on_failure')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_action_on_failure_1\"\n                          >{{ $t(\"Pause the printer and notify me\") }}</label\n                        >\n                      </div>\n                    </saving-animation>\n                  </div>\n                </div>\n              </section>\n              <section class=\"mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Failure Detection\") }}</h2>\n                <div class=\"card-body p-0 pt-3\">\n                  <p class=\"text-warning\">\n                    <i class=\"fas fa-exclamation-triangle\"></i>\n                    {{$t(\"If you are not sure about the settings below, leave the default values to minimize surprises.\")}}\n                  </p>\n\n                  <!-- Advanced settngs: when printer is paused -->\n                  <div class=\"form-group mt-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"When print is paused,\") }}</div>\n                    <saving-animation\n                      :errors=\"errorMessages.tools_off_on_pause\"\n                      :saving=\"saving.tools_off_on_pause\"\n                    >\n                      <div class=\"custom-control custom-checkbox mt-2 checkbox\">\n                        <input\n                          id=\"id_tools_off_on_pause\"\n                          v-model=\"printer.tools_off_on_pause\"\n                          type=\"checkbox\"\n                          name=\"tools_off_on_pause\"\n                          class=\"custom-control-input\"\n                          @change=\"updateSetting('tools_off_on_pause')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_tools_off_on_pause\">\n                          {{$t(\"Turn off hotend heater(s)\")}}\n                        </label>\n                      </div>\n                    </saving-animation>\n                    <saving-animation\n                      :errors=\"errorMessages.bed_off_on_pause\"\n                      :saving=\"saving.bed_off_on_pause\"\n                    >\n                      <div class=\"custom-control custom-checkbox mt-2 checkbox\">\n                        <input\n                          id=\"id_bed_off_on_pause\"\n                          v-model=\"printer.bed_off_on_pause\"\n                          type=\"checkbox\"\n                          name=\"bed_off_on_pause\"\n                          class=\"custom-control-input\"\n                          @change=\"updateSetting('bed_off_on_pause')\"\n                        />\n                        <label class=\"custom-control-label\" for=\"id_bed_off_on_pause\">\n                          {{$t(\"Turn off bed heater\")}}\n                        </label>\n                      </div>\n                    </saving-animation>\n\n                    <saving-animation\n                      :errors=\"errorMessages.retract_on_pause\"\n                      :saving=\"saving.retract_on_pause\"\n                      class=\"mobile-full-width\"\n                    >\n                      <div class=\"form-inline my-1 checkbox-with-input\">\n                        <div class=\"custom-control custom-checkbox\">\n                          <input\n                            id=\"retract-checkbox\"\n                            v-model=\"retractFilamentByEnabled\"\n                            type=\"checkbox\"\n                            class=\"custom-control-input\"\n                          />\n                          <label class=\"custom-control-label\" for=\"retract-checkbox\"\n                            >{{ $t(\"Retract filament by\") }}</label\n                          >\n                        </div>\n                        <number-input\n                          v-model=\"retractOnPause\"\n                          :step=\"0.5\"\n                          :disable=\"!retractFilamentByEnabled\"\n                          class=\"wrappable-field\"\n                        ></number-input>\n                      </div>\n                    </saving-animation>\n\n                    <saving-animation\n                      :errors=\"errorMessages.lift_z_on_pause\"\n                      :saving=\"saving.lift_z_on_pause\"\n                      class=\"mobile-full-width\"\n                    >\n                      <div class=\"form-inline my-1 checkbox-with-input\">\n                        <div class=\"custom-control custom-checkbox\">\n                          <input\n                            id=\"lift-z-checkbox\"\n                            v-model=\"liftExtruderByEnabled\"\n                            type=\"checkbox\"\n                            class=\"custom-control-input\"\n                          />\n                          <label class=\"custom-control-label\" for=\"lift-z-checkbox\"\n                            >{{ $t(\"Lift extruder along Z axis by\") }}</label\n                          >\n                        </div>\n                        <number-input\n                          v-model=\"liftExtruderBy\"\n                          :step=\"0.5\"\n                          :disable=\"!liftExtruderByEnabled\"\n                          class=\"wrappable-field\"\n                        ></number-input>\n                      </div>\n                    </saving-animation>\n                  </div>\n\n                  <!-- Advanced settngs: sensitivity slider -->\n                  <div class=\"form-group sensitivity my-4\">\n                    <div class=\"form-label text-muted\">{{ $t(\"AI failure detection sensitivity\") }}</div>\n                    <saving-animation\n                      :errors=\"errorMessages.detective_sensitivity\"\n                      :saving=\"saving.detective_sensitivity\"\n                    >\n                      <div class=\"my-2 sensitivity-slider\">\n                        <vue-slider\n                          v-model=\"detectiveSensitivity\"\n                          :lazy=\"true\"\n                          :min=\"0.8\"\n                          :max=\"1.2\"\n                          :interval=\"0.05\"\n                          :tooltip-formatter=\"sensitivityTooltipFormatter\"\n                        />\n                      </div>\n                    </saving-animation>\n                    <div\n                      v-if=\"sensitivityTooltipFormatter(printer.detective_sensitivity) === 'Low'\"\n                    >\n                      {{$t(\"Low - I don't want a lot of false alarms. Only alert me when you are absolutely sure.\")}}\n                    </div>\n                    <div\n                      v-else-if=\"\n                        sensitivityTooltipFormatter(printer.detective_sensitivity) === 'Medium'\n                      \"\n                    >\n                      {{$t(\"Medium - A few false alarms won't bother me. But some well-disguised spaghetti will be missed.\")}}\n                    </div>\n                    <div v-else>\n                      {{$t(\"High - Hit me with all the false alarms. I want to catch as many failures as possible.\")}}\n                    </div>\n                  </div>\n                </div>\n              </section>\n              <section class=\"mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Time-lapse\") }}</h2>\n                <p\n                  v-if=\"!(timelapseOnFinishEnabled && timelapseOnCancelEnabled)\"\n                  class=\"text-warning\"\n                >\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  <i18next :translation=\"$t(`Focused Feedback won't be available when time-lapse recording is turned off. You won't be able to {localizedDom}`)\">\n                    <template #localizedDom>\n                      <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\">{{$t(\"help us get better while earning AI Detection Hours for yourself\")}}</a>\n                    </template>\n                  </i18next>\n\n                </p>\n                <div class=\"form-group mt-4\">\n                  <saving-animation\n                    :errors=\"errorMessages.min_timelapse_secs_on_finish\"\n                    :saving=\"saving.min_timelapse_secs_on_finish\"\n                    class=\"mobile-full-width\"\n                  >\n                    <div class=\"form-inline my-1 checkbox-with-input\">\n                      <div class=\"custom-control custom-checkbox\">\n                        <input\n                          id=\"timelapseOnFinishEnabled\"\n                          v-model=\"timelapseOnFinishEnabled\"\n                          type=\"checkbox\"\n                          class=\"custom-control-input\"\n                        />\n                        <label class=\"custom-control-label\" for=\"timelapseOnFinishEnabled\"\n                          >{{ $t(\"Record time-lapse when a print finishes successfully.\") }}</label\n                        >\n                      </div>\n                    </div>\n                    <div\n                      v-if=\"timelapseOnFinishEnabled\"\n                      class=\"form-inline my-1 checkbox-with-input\"\n                    >\n                      <div class=\"custom-control custom-checkbox\">\n                        {{$t(\"Skip if the print is finished in less than\")}}\n                      </div>\n                      <number-input\n                        v-model=\"minTimelapseMinutesOnFinish\"\n                        :step=\"5\"\n                        unit=\"minutes\"\n                        class=\"wrappable-field\"\n                      ></number-input>\n                    </div>\n                  </saving-animation>\n                  <saving-animation\n                    :errors=\"errorMessages.min_timelapse_secs_on_cancel\"\n                    :saving=\"saving.min_timelapse_secs_on_cancel\"\n                    class=\"mobile-full-width\"\n                  >\n                    <div class=\"form-inline mt-3 mb-1 checkbox-with-input\">\n                      <div class=\"custom-control custom-checkbox\">\n                        <input\n                          id=\"timelapseOnCancelEnabled\"\n                          v-model=\"timelapseOnCancelEnabled\"\n                          type=\"checkbox\"\n                          class=\"custom-control-input\"\n                        />\n                        <label class=\"custom-control-label\" for=\"timelapseOnCancelEnabled\"\n                          >{{ $t(\"Record time-lapse when a print is cancelled.\") }}</label\n                        >\n                      </div>\n                    </div>\n                    <div\n                      v-if=\"timelapseOnCancelEnabled\"\n                      class=\"form-inline my-1 checkbox-with-input\"\n                    >\n                      <div class=\"custom-control custom-checkbox\">\n                        {{$t(\"Skip if the print is cancelled in less than\")}}\n                      </div>\n                      <number-input\n                        v-model=\"minTimelapseMinutesOnCancel\"\n                        :step=\"5\"\n                        unit=\"minutes\"\n                        class=\"wrappable-field\"\n                      ></number-input>\n                    </div>\n                  </saving-animation>\n                </div>\n              </section>\n              <section class=\"danger mt-5\">\n                <h2 class=\"section-title\">{{ $t(\"Danger Zone\") }}</h2>\n                <div class=\"mt-4\">\n                  <a class=\"btn btn-outline-secondary\" :href=\"printerWizardUrl\">\n                    {{$t(\"Re-Link Printer\")}}\n                  </a>\n                  <div class=\"text-muted mt-1\">\n                    <small>\n                      <i18next :translation=\"$t(`If your printer is always showing as 'offline', and you have gone through {localizedDom}, you can try to re-link printer as the last resort.`)\">\n                        <template #localizedDom>\n                          <a :href=\"getDocUrl('/user-guides/troubleshoot-server-connection-issues/')\">{{$t(\"all the trouble-shooting steps\")}}</a>\n                        </template>\n                      </i18next>\n                    </small>\n                  </div>\n                </div>\n                <div v-if=\"isEnt\" class=\"mt-4\">\n                  <button class=\"btn btn-outline-warning\" @click=\"archivePrinter\">\n                    {{$t(\"Archive Printer\")}}\n                  </button>\n                  <div class=\"text-muted mt-1\">\n                    <small>\n                      <i18next :translation=\"$t(`Archived printers are not counted toward your subscription plan. You won't see them in the app either. Go to {localizedDom} to find all archived printers and/or un-archive them.`)\">\n                        <template #localizedDom>\n                          <a href=\"/ent/printers/archived/\">{{ $t(\"this page\") }}</a>\n                        </template>\n                      </i18next>\n                      </small>\n                  </div>\n                </div>\n                <div class=\"mt-4\">\n                  <button class=\"btn btn-outline-danger\" @click=\"deletePrinter\">\n                    {{$t(\"Delete Printer\")}}\n                  </button>\n                  <div class=\"text-muted mt-1\">\n                    <small>{{ $t(\"Bye-bye printer.\") }}</small>\n                  </div>\n                </div>\n              </section>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n\n      <!-- <div class=\"row justify-content-center\">\n        <div class=\"col-sm-11 col-md-10 col-lg-8\">\n\n\n        </div>\n      </div> -->\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport split from 'lodash/split'\nimport escape from 'lodash/escape'\nimport VueSlider from 'vue-slider-component'\n\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport urls from '@config/server-urls'\nimport SavingAnimation from '@src/components/SavingAnimation.vue'\nimport NumberInput from '@src/components/NumberInput.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { settings } from '@src/lib/page-context'\n\nexport default {\n  components: {\n    SavingAnimation,\n    NumberInput,\n    PageLayout,\n    VueSlider,\n  },\n\n  data() {\n    return {\n      isEnt: false,\n      printer: null,\n      printerId: '',\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        retract_on_pause: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        lift_z_on_pause: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        min_timelapse_secs_on_finish: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        min_timelapse_secs_on_cancel: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n    }\n  },\n\n  computed: {\n    retractFilamentByEnabled: {\n      get() {\n        return this.printer.retract_on_pause > 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.retract_on_pause = 6.5 // Default retraction value\n        } else {\n          this.printer.retract_on_pause = 0\n        }\n      },\n    },\n    retractOnPause: {\n      get() {\n        return this.printer ? this.printer.retract_on_pause : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.retract_on_pause = newValue\n        }\n      },\n    },\n    liftExtruderByEnabled: {\n      get() {\n        return this.printer.lift_z_on_pause > 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.lift_z_on_pause = 2.5 // Default z-lift value\n        } else {\n          this.printer.lift_z_on_pause = 0\n        }\n      },\n    },\n    liftExtruderBy: {\n      get() {\n        return this.printer ? this.printer.lift_z_on_pause : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.lift_z_on_pause = newValue\n        }\n      },\n    },\n    timelapseOnFinishEnabled: {\n      get() {\n        return this.printer.min_timelapse_secs_on_finish >= 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.min_timelapse_secs_on_finish = 600\n        } else {\n          this.printer.min_timelapse_secs_on_finish = -1\n        }\n      },\n    },\n    minTimelapseMinutesOnFinish: {\n      get() {\n        return this.printer ? this.printer.min_timelapse_secs_on_finish / 60 : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.min_timelapse_secs_on_finish = newValue * 60\n        }\n      },\n    },\n    timelapseOnCancelEnabled: {\n      get() {\n        return this.printer.min_timelapse_secs_on_cancel >= 0\n      },\n      set(newValue) {\n        if (newValue) {\n          this.printer.min_timelapse_secs_on_cancel = 300\n        } else {\n          this.printer.min_timelapse_secs_on_cancel = -1\n        }\n      },\n    },\n    minTimelapseMinutesOnCancel: {\n      get() {\n        return this.printer ? this.printer.min_timelapse_secs_on_cancel / 60 : undefined\n      },\n      set(newValue) {\n        if (this.printer) {\n          this.printer.min_timelapse_secs_on_cancel = newValue * 60\n        }\n      },\n    },\n    printerWizardUrl() {\n      return urls.printerWizard(this.printer.id)\n    },\n    printerName: {\n      get: function () {\n        return this.printer ? this.printer.name : undefined\n      },\n      set: function (newValue) {\n        this.printer.name = newValue\n      },\n    },\n    detectiveSensitivity: {\n      get() {\n        return this.printer.detective_sensitivity\n      },\n      set(newValue) {\n        this.printer.detective_sensitivity = newValue\n        this.updateSetting('detective_sensitivity')\n      },\n    },\n  },\n\n  // Watch these properties so that updates can be triggered at key-press, instead of losing focus\n  // To watch deep properties in an object: https://stackoverflow.com/questions/42133894/vue-js-how-to-properly-watch-for-nested-data\n  watch: {\n    printerName: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('name')\n      }\n    },\n    retractOnPause: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.changeRetractOnPause(newValue)\n      }\n    },\n    liftExtruderBy: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.changeLiftExtruderBy(newValue)\n      }\n    },\n    minTimelapseMinutesOnFinish: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('min_timelapse_secs_on_finish')\n      }\n    },\n    minTimelapseMinutesOnCancel: function (newValue, oldValue) {\n      if (oldValue !== undefined) {\n        this.updateSetting('min_timelapse_secs_on_cancel')\n      }\n    },\n  },\n\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.printerId = split(window.location.pathname, '/').slice(-2, -1).pop()\n    this.fetchPrinter()\n  },\n\n  methods: {\n    /**\n     * Get actual printer settings\n     */\n    fetchPrinter() {\n      return axios\n        .get(urls.printer(this.printerId))\n        .then((response) => {\n          this.printer = normalizedPrinter(response.data, this.printer)\n        })\n        .catch((error) => {\n          this.errorDialog(error, `${this.$i18next.t('Printer not found')}`)\n        })\n    },\n\n    /**\n     * Update printer settings\n     * @param {String} propName\n     * @param {any} propValue\n     * @param {String} settingsItem\n     */\n    patchPrinter(propName, propValue) {\n      const inputElem = this.getSettingsItemInput(propName, propValue)\n      this.setSavingStatus(inputElem, true)\n\n      // Make request to API\n      return axios\n        .patch(urls.printer(this.printerId), {\n          [propName]: propValue,\n        })\n        .catch((err) => {\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            if (err.response.data.non_field_errors) {\n              this.errorAlert(err.response.data.non_field_errors)\n            } else {\n              for (const error in err.response.data) {\n                this.errorMessages[inputElem] = err.response.data[error]\n              }\n            }\n          } else {\n            this.errorAlert()\n          }\n        })\n        .then(() => {\n          this.setSavingStatus(inputElem, false)\n        })\n    },\n\n    /**\n     * Show error alert if can not save settings\n     */\n    errorAlert() {\n      this.$swal.Toast.fire({\n        icon: 'error',\n        html: `<div>${this.$i18next.t(\"Can not update printer settings.\")}</div><div>${this.$i18next.t(\"Get help from\")} <a href=\"https://obico.io/discord\">${this.$i18next.t(\"the {brandName} general support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"or\")} <a href=\"https://obico.io/discord\">${this.$i18next.t(\"{brandName} for klipper support forum\",{brandName:this.$syndicateText.brandName})}</a> ${this.$i18next.t(\"if this error persists.\")}</div>`,\n      })\n    },\n\n    /**\n     * Update particular settings item\n     * @param {String} settingsItem\n     */\n    updateSetting(settingsItem) {\n      if (settingsItem in this.delayedSubmit) {\n        const delayInfo = this.delayedSubmit[settingsItem]\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit[settingsItem]['timeoutId'] = setTimeout(() => {\n          this.patchPrinter(settingsItem, this.printer[settingsItem])\n        }, delayInfo['delay'])\n        return\n      }\n\n      this.patchPrinter(settingsItem, this.printer[settingsItem])\n    },\n\n    sensitivityTooltipFormatter: function (value) {\n      if (value < 0.95) {\n        return 'Low'\n      }\n      if (value > 1.05) {\n        return 'High'\n      }\n      return 'Medium'\n    },\n\n    deletePrinter(printer) {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} printer? This action can not be undone.`,{name:this.printer.name})}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.delete(urls.printer(this.printerId) + '?with_archived=true').then(() => {\n            window.location.href = `/printers/`\n          })\n        }\n      })\n    },\n\n    archivePrinter() {\n      this.$swal.Confirm.fire().then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.post(urls.printerAction(this.printerId, '/archive/')).then(() => {\n            this.$swal.Prompt.fire({\n              title: `${this.$i18next.t('Printer archived')}`,\n              html: `<p>${this.$i18next.t(\"{name} is archived.\",{name:escape(this.printer.name)})}</p><p>${this.$i18next.t(\"You can find it on\")} <a href=\"/ent/printers/archived/\">${this.$i18next.t(\"this page\")}</a> ${this.$i18next.t(\"and un-archive it\")}.</p>`,\n              confirmButtonText: `${this.$i18next.t('Go to the printer page')}`,\n            }).then(() => {\n              window.location.href = '/printers/'\n            })\n          })\n        }\n      })\n    },\n\n    /**\n     * Return input element by given name\n     * @param {String} settingsItem\n     * @returns {Object, null}\n     */\n    getSettingsItemInput: function (settingsItem, value = '') {\n      switch (settingsItem) {\n        case 'action_on_failure':\n          return `${settingsItem}_${value}`\n        default:\n          return `${settingsItem}`\n      }\n    },\n\n    /**\n     * Interlayer for saving status control to be able to set same saving status\n     * for 2 or more different inputs grouped to one block\n     * @param {String} propName\n     * @param {String} status\n     */\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n\n    changeRetractOnPause(value) {\n      this.printer.retract_on_pause = value\n      this.updateSetting('retract_on_pause')\n    },\n\n    changeLiftExtruderBy(value) {\n      this.printer.lift_z_on_pause = value\n      this.updateSetting('lift_z_on_pause')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import 'vue-slider-component/lib/theme/default.scss'\n\n.card\n  overflow: visible !important\n\n.custom-control-label\n  font-size: 16px\n\n@media (max-width: 768px)\n  .mobile-full-width\n    width: 100%\n    margin-top: .25em\n    margin-bottom: .4em\n\n.section-title\n  padding-bottom: 10px\n  border-bottom: 1px solid var(--color-text-primary)\n\n.form-label\n  font-size: 18px\n\nsection.danger\n  .section-title\n    color: var(--color-danger)\n    border-color: var(--color-danger)\n\n.form-inline\n  .wrappable-field\n    margin-left: 1.5rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterSettingsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterSettingsPage.vue?vue&type=template&id=7705cf7b&scoped=true&\"\nimport script from \"./PrinterSettingsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterSettingsPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterSettingsPage.vue?vue&type=style&index=0&id=7705cf7b&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7705cf7b\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[_c('div',{staticClass:\"row\"},[_c('h3',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Link Printer\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":2}})],1)]),_c('b-row',{staticClass:\"center py-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('loading',{attrs:{\"active\":_vm.chosenDeviceId != null,\"can-cancel\":false}}),(_vm.discoveryEnabled)?_c('div',{staticClass:\"discover\"},[_c('div',{staticClass:\"discover-body\"},[(!_vm.canStartLinking)?_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('div',{staticClass:\"spinner-border big\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"})]),_c('div',{staticClass:\"lead\"},[_vm._v(_vm._s(_vm.$t(\"Scanning...\")))])]):_c('div',[_c('div',{staticClass:\"lead my-3\"},[_c('div',{staticClass:\"spinner-border\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"})]),_c('span',{staticClass:\"sr-only\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Scanning..., {name} printer(s) found on your local network:\",{name:_vm.discoveredPrinters.length}))+\" \")]),_vm._l((_vm.discoveredPrinters),function(discoveredPrinter){return _c('discovered-printer',{key:discoveredPrinter.device_id,attrs:{\"discovered-printer\":discoveredPrinter},on:{\"auto-link-printer\":_vm.autoLinkPrinter}})})],2),(_vm.discoveryCount >= 2)?_c('div',{staticClass:\"text-muted pt-4\"},[_c('div',[_vm._v(_vm._s(_vm.$t(\"To link your printer, please make sure:\")))]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t(\"The printer is powered on. If you are using an external SBC such as a Raspberry Pi, make sure it's powered on as well.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"The printer or SBC is connected to the same local network as your phone/computer.\"))+\" \")]),(_vm.targetOctoPrint)?_c('li',[_vm._v(_vm._s(_vm.$t(\"{brandName} for OctoPrint is 1.8.0 or above.\",{brandName:_vm.$syndicateText.brandName})))]):_vm._e()])]):_vm._e(),_c('div',{staticClass:\"d-flex flex-column align-items-center\"},[_c('div',{staticClass:\"mt-5 mb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t(`Can’t find the printer you want to link? Switch to Manual Linking instead.`))+\" \")]),_c('button',{staticClass:\"btn btn-outline-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.discoveryEnabled = false}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Switch to Manual Linking\"))+\" \")])])])]):(_vm.useLegacyVerificationCode)?_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row justify-content-center pb-3\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8 d-flex flex-column align-items-center\"},[_c('input',{ref:\"code\",staticClass:\"code-btn\",attrs:{\"disabled\":\"\"},domProps:{\"value\":`${_vm.verificationCode && _vm.verificationCode.code}`}}),_c('small',{staticClass:\"mx-auto py-1\",class:{ 'text-muted': !_vm.copied }},[_vm._v(_vm._s(_vm.copied ? _vm.$t('Code copied to system clipboard') : _vm.$t('Ctrl-C/Cmd-C to copy the code')))]),_c('div',{staticClass:\"mx-auto pt-1 pb-4\"},[_c('span',{staticClass:\"text-muted\"},[_vm._v(_vm._s(_vm.$t(\"Code will expire in \")))]),_vm._v(_vm._s(_vm.timeToExpire)+\" \")]),_c('div',{staticClass:\"lead\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Enter the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t(\"6-digit verification code\")))])]},proxy:true}])})],1)])]),_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8 img-container\"},[(_vm.targetOctoPrint)?_c('img',{staticClass:\"screenshot\",attrs:{\"src\":require('@static/img/octoprint-plugin-guide/plugin_verification_code.png')},on:{\"click\":function($event){return _vm.zoomIn($event)}}}):_vm._e(),(_vm.targetKlipper)?_c('img',{staticClass:\"screenshot\",attrs:{\"src\":require('@static/img/octoprint-plugin-guide/moonraker_verification_code.png')},on:{\"click\":function($event){return _vm.zoomIn($event)}}}):_vm._e(),_c('div',{staticClass:\"helper mx-auto py-2\"},[_c('a',{staticClass:\"link font-weight-bold\",on:{\"click\":_vm.showVerificationCodeHelpModal}},[_vm._v(_vm._s(_vm.$t(\"Can't find the page to enter the 6-digit code?\")))])])])])]):_c('div',{staticClass:\"container pt-5\"},[_c('div',{staticClass:\"row justify-content-center pb-1\"},[_c('div',{staticClass:\"col-sm-12 col-md-8 col-lg-6 d-flex flex-column align-items-center\"},[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.oneTimePasscode),expression:\"oneTimePasscode\"}],staticClass:\"form-control code-btn\",attrs:{\"type\":\"text\",\"aria-label\":\"One-time Passcode\",\"disabled\":_vm.oneTimePasscodeStatus === 'inprogress'},domProps:{\"value\":(_vm.oneTimePasscode)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.oneTimePasscode=$event.target.value},_vm.oneTimePasscodeChanged]}}),(_vm.oneTimePasscodeStatus === 'inprogress')?_c('div',{staticClass:\"spinner-border text-primary ml-2\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Loading...\")])]):_vm._e()])])]),_c('div',{staticClass:\"row justify-content-center pb-3\"},[(_vm.oneTimePasscodeStatus === 'failed')?_c('div',{staticClass:\"text-danger col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Invalid code. Is it expired?\"))+\" \")]):_c('div',{staticClass:\"col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Enter the One-time Passcode\"))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('muted-alert',{staticClass:\"muted-alert wizard-secondary-text-font text-secondary\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`If you using Obico for OctoPrint older than 2.5.0, or Obico for Klipper older than 1.6.0, switch to {localizedDom}.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",on:{\"click\":function($event){_vm.useLegacyVerificationCode = true}}},[_vm._v(_vm._s(_vm.$t(\"6-digit verification code\")))])]},proxy:true}])})],1)],1)])],1)]),(!_vm.discoveryEnabled && !_vm.useLegacyVerificationCode)?_c('b-row',{staticClass:\"mt-3 mb-5\"},[_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Touch Screen\")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/klipperScreenMenu.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Check to see if your printer already has Obico installed your printer screen.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Navigate to the settings menu on the LCD screen of your printer.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Find the “Link Obico” menu item and tap it to open the connection screen.\")))])])]),_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"LCD Screen \")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/lcdScreenLarge.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"Check to see if your printer already has Obico Easy Link installed on the LCD menu.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Navigate to the settings menu on the LCD screen of your printer.\")))]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Find the “Link Obico” menu item.\")))])])]),_c('div',{staticClass:\"col-md-4 p-4 method-block\"},[_c('h4',{staticClass:\"text-center font-weight-bold wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Install Via SSH\")))]),_c('div',{staticClass:\"image-block\"},[_c('img',{staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":require(\"@static/img/printer-wizard/commandLinePrompt.png\"),\"alt\":\"\"}})]),_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t(\"If you can't find Obico Easy Link, you will need to SSH to your printer to install Obico. You will need to find a guide that works for your printer.\")))])]),_c('div',[_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/klipper-setup/')}},[_vm._v(_vm._s(_vm.$t(\"Show me how\")))])])])]):_vm._e(),_c('div',{staticClass:\"d-flex justify-content-between align-items-center button-wrap\"},[_c('div',{staticClass:\"back\",on:{\"click\":function($event){return _vm.$router.back()}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Back\")))])])]),_c('div',{staticClass:\"text-center mt-5 wizard-default-font\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Need help? Check out the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.targetKlipper? _vm.getDocUrl('/user-guides/klipper-setup/'):_vm.getDocUrl('/user-guides/octoprint-plugin-setup/')}},[_vm._v(_vm._s(_vm.$t(\"step-by-step set up guide\"))+\".\")])]},proxy:true}])})],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const onPrinterLinked = () => {\n  if (window.posthog) {\n    window.posthog.capture('PrinterAdded (Web)')\n  }\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"discovered-printers mt-4\"},[_c('div',{staticClass:\"flex-grow-0 pt-1 mr-2\"},[(_vm.discoveredPrinter.agent.toLowerCase().includes('octoprint'))?_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/octoprint_logo.png')}}):(_vm.discoveredPrinter.agent.toLowerCase().includes('klipper'))?_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/klipper_logo.jpg')}}):_c('img',{staticClass:\"logo-img\",attrs:{\"src\":require('@static/img/raspberry_pi.png')}})]),_c('div',{staticClass:\"row flex-grow-1 ml-1 link-action\"},[_c('div',{staticClass:\"col-sm-12 col-md-10 pb-2\"},[(_vm.discoveredPrinter.rpi_model)?_c('div',[_vm._v(\" \"+_vm._s(_vm.discoveredPrinter.rpi_model)+\" \")]):_vm._e(),(_vm.discoveredPrinter.machine_type)?_c('div',[_vm._v(\" \"+_vm._s(_vm.discoveredPrinter.machine_type)+\" \")]):_vm._e(),(_vm.discoveredPrinter.agent)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Platform\"))+\": \"+_vm._s(_vm.discoveredPrinter.agent)+\" \")]):_vm._e(),(_vm.discoveredPrinter.host_or_ip)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"IP address\"))+\": \"+_vm._s(_vm.discoveredPrinter.host_or_ip)+\" \")]):_vm._e(),(_vm.discoveredPrinter.hostname)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Hostname\"))+\": \"+_vm._s(_vm.discoveredPrinter.hostname)+\" \")]):_vm._e(),(_vm.discoveredPrinter.octopi_version)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"OctoPi\"))+\": \"+_vm._s(_vm.discoveredPrinter.octopi_version)+\" \")]):_vm._e(),(!_vm.discoveredPrinter.octopi_version && _vm.discoveredPrinter.os)?_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"OS\"))+\": \"+_vm._s(_vm.discoveredPrinter.os)+\" \")]):_vm._e()]),_c('div',{staticClass:\"col-sm-12 col-md-2 center px-3\"},[_c('button',{staticClass:\"btn btn-block btn-primary\",on:{\"click\":function($event){return _vm.$emit('auto-link-printer', { ..._vm.discoveredPrinter })}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Link\"))+\" \")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"discovered-printers mt-4\">\n    <div class=\"flex-grow-0 pt-1 mr-2\">\n      <img v-if=\"discoveredPrinter.agent.toLowerCase().includes('octoprint')\" class=\"logo-img\" :src=\"require('@static/img/octoprint_logo.png')\" />\n      <img v-else-if=\"discoveredPrinter.agent.toLowerCase().includes('klipper')\" class=\"logo-img\" :src=\"require('@static/img/klipper_logo.jpg')\" />\n      <img\n        v-else\n        class=\"logo-img\"\n        :src=\"require('@static/img/raspberry_pi.png')\"\n      />\n    </div>\n    <div class=\"row flex-grow-1 ml-1 link-action\">\n      <div class=\"col-sm-12 col-md-10 pb-2\">\n        <div v-if=\"discoveredPrinter.rpi_model\">\n          {{ discoveredPrinter.rpi_model }}\n        </div>\n        <div v-if=\"discoveredPrinter.machine_type\">\n          {{ discoveredPrinter.machine_type }}\n        </div>\n        <div v-if=\"discoveredPrinter.agent\" class=\"text-muted small\">\n          {{$t(\"Platform\")}}: {{ discoveredPrinter.agent }}\n        </div>\n        <div v-if=\"discoveredPrinter.host_or_ip\" class=\"text-muted small\">\n          {{$t(\"IP address\")}}: {{ discoveredPrinter.host_or_ip }}\n        </div>\n        <div v-if=\"discoveredPrinter.hostname\" class=\"text-muted small\">\n          {{$t(\"Hostname\")}}: {{ discoveredPrinter.hostname }}\n        </div>\n        <div v-if=\"discoveredPrinter.octopi_version\" class=\"text-muted small\">\n          {{$t(\"OctoPi\")}}: {{ discoveredPrinter.octopi_version }}\n        </div>\n        <div\n          v-if=\"!discoveredPrinter.octopi_version && discoveredPrinter.os\"\n          class=\"text-muted small\"\n        >\n          {{$t(\"OS\")}}: {{ discoveredPrinter.os }}\n        </div>\n      </div>\n      <div class=\"col-sm-12 col-md-2 center px-3\">\n        <button\n          class=\"btn btn-block btn-primary\"\n          @click=\"$emit('auto-link-printer', { ...discoveredPrinter })\"\n        >\n          {{$t(\"Link\")}}\n        </button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'DiscoveredPrinter',\n  props: {\n    discoveredPrinter: {\n      type: Object,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\">\n.discovered-printers\n  display: flex\n  flex-direction: columns\n\n  .logo-img\n    height: 3.5rem\n\n  .link-action\n    border-left: solid thin\n\n.center\n  display: flex\n  justify-content: center\n  align-items: center\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DiscoveredPrinter.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DiscoveredPrinter.vue?vue&type=template&id=9def43e8&\"\nimport script from \"./DiscoveredPrinter.vue?vue&type=script&lang=js&\"\nexport * from \"./DiscoveredPrinter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DiscoveredPrinter.vue?vue&type=style&index=0&id=9def43e8&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"px-2\"},[_c('div',{staticClass:\"title-pic\"},[_c('img',{staticClass:\"pic-item\",attrs:{\"src\":require('@static/img/webpage-multiple.svg')}}),_vm._m(0),_c('img',{staticClass:\"pic-item\",attrs:{\"src\":require('@static/img/printer.png')}})]),_c('div',{staticClass:\"my-4\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"The {brandName} app needs to make sure you have access to selected printer.\",{brandName:_vm.$syndicateText.brandName})))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"When you press 'Link Now' button below, a new browser window will pop up to finish a handshake with this printer.\"))+\" \")])]),_c('div',[_c('div',{staticClass:\"row my-2\"},[_c('div',{staticClass:\"col-sm-6\"},[_c('button',{staticClass:\"btn btn-block btn-primary mt-2\",attrs:{\"disabled\":_vm.linking},on:{\"click\":_vm.autoLinkPrinter}},[(_vm.linking)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_vm._e(),_vm._v(_vm._s(_vm.$t(\"Link Now\"))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})],1)]),_c('div',{staticClass:\"col-sm-6\"},[_c('button',{staticClass:\"btn btn-block btn-secondary mt-2\",on:{\"click\":_vm.cancel}},[_vm._v(_vm._s(_vm.$t(\"Cancel\")))])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pic-item\"},[_c('i',{staticClass:\"fas fa-ellipsis-h fa-2x\"}),_c('i',{staticClass:\"fas fa-ellipsis-h fa-2x\"})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"px-2\">\n    <div class=\"title-pic\">\n      <img class=\"pic-item\" :src=\"require('@static/img/webpage-multiple.svg')\" />\n      <div class=\"pic-item\">\n        <i class=\"fas fa-ellipsis-h fa-2x\"></i>\n        <i class=\"fas fa-ellipsis-h fa-2x\"></i>\n      </div>\n      <img class=\"pic-item\" :src=\"require('@static/img/printer.png')\" />\n    </div>\n    <div class=\"my-4\">\n      <p>{{$t(\"The {brandName} app needs to make sure you have access to selected printer.\",{brandName:$syndicateText.brandName})}}</p>\n      <p>\n        {{$t(\"When you press 'Link Now' button below, a new browser window will pop up to finish a handshake with this printer.\")}}\n      </p>\n    </div>\n    <div>\n      <div class=\"row my-2\">\n        <div class=\"col-sm-6\">\n          <button\n            class=\"btn btn-block btn-primary mt-2\"\n            :disabled=\"linking\"\n            @click=\"autoLinkPrinter\"\n          >\n            <b-spinner v-if=\"linking\" small></b-spinner>{{$t(\"Link Now\")}}&nbsp;<i\n              class=\"fas fa-external-link-alt\"\n            ></i>\n          </button>\n        </div>\n        <div class=\"col-sm-6\">\n          <button class=\"btn btn-block btn-secondary mt-2\" @click=\"cancel\">{{ $t(\"Cancel\") }}</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'AutoLinkPopup',\n  props: {\n    discoveredPrinter: {\n      type: Object,\n      required: true,\n    },\n    switchToManualLinking: {\n      type: Function,\n      required: true,\n    },\n    secretObtained: {\n      type: Function,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      linking: false,\n    }\n  },\n\n  mounted() {\n    window.addEventListener('message', this.gotWindowMessage)\n  },\n\n  beforeDestroy() {\n    window.removeEventListener('message', this.gotWindowMessage)\n  },\n\n  methods: {\n    autoLinkPrinter() {\n      this.linking = true\n      this.gotSecret = null\n\n      this.obicoDiscoveryPopup = window.open(\n        this.destUrl(),\n        '_blank',\n        'toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=500,height=100'\n      )\n\n      if (!this.obicoDiscoveryPopup) {\n        this.cancel()\n        this.$swal.Prompt.fire({\n          icon: 'error',\n          title: `${this.$i18next.t('Oops!')}`,\n          html: `<p>${this.$i18next.t(\"Handshake failed because the pop-up was blcoked.\")}</p><p>${this.$i18next.t(\"Please unblock the pop-up in your browser and try it again.\")}</p>`,\n          confirmButtonText: `${this.$i18next.t('Okay!')}`,\n          showCancelButton: true,\n          cancelButtonText: `${this.$i18next.t('Switch to Manual Setup')}`,\n        }).then((result) => {\n          if (result.isDismissed && result.dismiss === 'cancel') {\n            this.switchToManualLinking()\n          }\n        })\n        return\n      }\n\n      setTimeout(() => {\n        this.closeDiscoveryPopup()\n\n        if (!this.gotSecret) {\n          this.cancel()\n          this.$swal.Prompt.fire({\n            icon: 'error',\n            title: `${this.$i18next.t('Handshake failed!')}`,\n            html: `<p>${this.$i18next.t(\"Please make sure\")}:</p>\n              <ul>\n                <li>${this.$i18next.t(\"The OctoPrint you want to link is at {host}:{port}, and it's connected to the same local network as your computer/phone.\",{host:this.discoveredPrinter.host_or_ip,port:this.discoveredPrinter.port})}</li>\n                <li>${this.$i18next.t(\"The version of plugin is 1.8.0 or above.\")}</li>\n              </ul>`,\n            confirmButtonText: `${this.$i18next.t('Okay!')}`,\n            showCancelButton: true,\n            cancelButtonText: `${this.$i18next.t('Switch to Manual Setup')}`,\n          }).then((result) => {\n            if (result.isDismissed && result.dismiss === 'cancel') {\n              this.switchToManualLinking()\n            }\n          })\n        }\n      }, 5000)\n    },\n\n    destUrl() {\n      const pluginName = this.discoveredPrinter.agent ? 'obico' : 'thespaghettidetective'\n      return `http://${this.discoveredPrinter.host_or_ip}:${\n        this.discoveredPrinter.port || '80'\n      }/plugin/${pluginName}/grab-discovery-secret?device_id=${this.discoveredPrinter.device_id}`\n    },\n\n    switchToManual() {\n      this.cancel()\n      this.switchToManualLinking()\n    },\n\n    closeDiscoveryPopup() {\n      if (this.obicoDiscoveryPopup) {\n        this.obicoDiscoveryPopup.close()\n        this.obicoDiscoveryPopup = null\n      }\n    },\n\n    gotWindowMessage(ev) {\n      const data = { ...(ev?.data || {}) }\n      if (this.gotSecret || !this.discoveredPrinter.device_id || !data.device_secret) {\n        console.log('Ignored message', ev)\n        return\n      }\n\n      this.gotSecret = data\n      this.secretObtained(this.discoveredPrinter.device_id, data.device_secret)\n      this.cancel()\n    },\n\n    cancel() {\n      this.closeDiscoveryPopup()\n      this.$swal.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n\n.title-pic\n  display: flex\n  margin: 1.5rem 0\n  justify-content: center\n\n  .pic-item\n    height: 3rem\n    margin: 0 0.5rem\n\n  img\n    filter: grayscale(100%)\n  i\n    color: #888888\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AutoLinkPopup.vue?vue&type=template&id=76d88bae&scoped=true&\"\nimport script from \"./AutoLinkPopup.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinkPopup.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinkPopup.vue?vue&type=style&index=0&id=76d88bae&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"76d88bae\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"printer-progress\"},[_c('div',{staticClass:\"circle\",class:{active:_vm.step===0, done:_vm.step>0}},[_c('font-awesome-icon',{attrs:{\"icon\":\"fa-check\"}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Device Selection\"))+\" \")])],1),_c('div',{staticClass:\"line\",class:{active:_vm.step>=1}}),_c('div',{staticClass:\"circle\",class:{active:_vm.step===1, done:_vm.step>1}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'check']}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Install Obico\"))+\" \")])],1),_c('div',{staticClass:\"line\",class:{active:_vm.step===2}}),_c('div',{staticClass:\"circle\",class:{active:_vm.step===2,done:_vm.step===3}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'check']}}),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t(\"Link Printer\"))+\" \")])],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n    <div class='printer-progress'>\n      <div class=\"circle\" :class=\"{active:step===0, done:step>0}\">\n        <font-awesome-icon icon=\"fa-check\" />\n        <p>\n          {{ $t(\"Device Selection\") }}\n        </p>\n      </div>\n      <div class=\"line\" :class=\"{active:step>=1}\"></div>\n      <div class=\"circle\" :class=\"{active:step===1, done:step>1}\">\n        <font-awesome-icon :icon=\"['fas', 'check']\" />\n        <p>\n          {{ $t(\"Install Obico\") }}\n        </p></div>\n      <div class=\"line\" :class=\"{active:step===2}\"></div>\n      <div class=\"circle\" :class=\"{active:step===2,done:step===3}\">\n        <font-awesome-icon :icon=\"['fas', 'check']\" />\n        <p>\n          {{ $t(\"Link Printer\") }}\n        </p></div>\n    </div>\n</template>\n<script>\nexport default {\n    components:{},\n    props:{\n      step:{\n        default:0,\n        type:Number\n      }\n    },\n    data(){\n        return {\n        };\n    },\n    computed:{},\n    created(){},\n    mounted(){},\n    watch:{},\n    methods:{},\n};\n</script>\n<style scoped lang='scss'>\n.printer-progress{\n  display:flex;\n  align-items:center;\n  justify-content: space-between;\n  width:100%;\n  padding:0 30px;\n  .circle{\n    background-color: #fff;\n    border:1px solid #c6c6c6;\n    width:20px;\n    height:20px;\n    border-radius:15px;\n    position:relative;\n    display:flex;\n    justify-content: center;\n    align-items: center;\n    &.active{\n      border-color:var(--color-primary);\n      &:after{\n        position:absolute;\n        content:'';\n        width:4px;\n        height:4px;\n        border-radius:2px;\n        background-color: var(--color-primary);\n\n      }\n    }\n    &.done{\n      background-color:  var(--color-primary);\n      border-color:var(--color-primary);\n      svg{\n        color:#2D3E4F\n      }\n    }\n    p{\n      position:absolute;\n      bottom:-50px;\n      white-space: nowrap;\n    }\n  }\n  .line{\n    flex:1;\n    height:2px;\n    background-color: #fff;\n    &.active{\n      background-color:  var(--color-primary);\n    }\n  }\n\n}\n</style>\n\n\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterProgress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterProgress.vue?vue&type=template&id=b4e920a0&scoped=true&\"\nimport script from \"./PrinterProgress.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterProgress.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterProgress.vue?vue&type=style&index=0&id=b4e920a0&prod&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b4e920a0\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div class=\"row\">\n                <h3 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Link Printer\") }}</h3>\n              </div>\n              <b-row class=\"center mt-3 mb-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <PrinterProgress :step=\"2\"></PrinterProgress>\n                </div>\n              </b-row>\n\n              <b-row class=\"center py-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <loading :active=\"chosenDeviceId != null\" :can-cancel=\"false\"> </loading>\n                  <div v-if=\"discoveryEnabled\" class=\"discover\">\n                    <div class=\"discover-body\">\n                      <div v-if=\"!canStartLinking\" style=\"text-align: center\">\n                        <div class=\"spinner-border big\" role=\"status\">\n                          <span class=\"sr-only\"></span>\n                        </div>\n                        <div class=\"lead\">{{ $t(\"Scanning...\") }}</div>\n                      </div>\n                      <div v-else>\n                        <div class=\"lead my-3\">\n                          <div class=\"spinner-border\" role=\"status\">\n                            <span class=\"sr-only\"></span>\n                          </div>\n                          <span class=\"sr-only\"></span>\n                          {{ $t(\"Scanning..., {name} printer(s) found on your local network:\",{name:discoveredPrinters.length}) }}\n                        </div>\n                        <discovered-printer\n                          v-for=\"discoveredPrinter in discoveredPrinters\"\n                          :key=\"discoveredPrinter.device_id\"\n                          :discovered-printer=\"discoveredPrinter\"\n                          @auto-link-printer=\"autoLinkPrinter\"\n                        />\n                      </div>\n                      <div v-if=\"discoveryCount >= 2\" class=\"text-muted pt-4\">\n                        <div>{{$t(\"To link your printer, please make sure:\")}}</div>\n                        <ul>\n                          <li>{{ $t(\"The printer is powered on. If you are using an external SBC such as a Raspberry Pi, make sure it's powered on as well.\") }}</li>\n                          <li>\n                            {{$t(\"The printer or SBC is connected to the same local network as your phone/computer.\")}}\n                          </li>\n                          <li v-if=\"targetOctoPrint\">{{ $t(\"{brandName} for OctoPrint is 1.8.0 or above.\",{brandName:$syndicateText.brandName}) }}</li>\n                        </ul>\n                      </div>\n                      <div class=\"d-flex flex-column align-items-center\">\n                        <div class=\"mt-5 mb-3\">\n                        {{ $t(`Can’t find the printer you want to link? Switch to Manual Linking instead.`) }}\n                        </div>\n                        <button\n                          class=\"btn btn-outline-secondary\"\n                          type=\"button\"\n                          @click=\"discoveryEnabled = false\"\n                        >\n                          {{ $t(\"Switch to Manual Linking\") }}\n                        </button>\n                      </div>\n                    </div>\n                  </div>\n                  <div v-else-if=\"useLegacyVerificationCode\" class=\"container\">\n                    <div class=\"row justify-content-center pb-3\">\n                      <div class=\"col-sm-12 col-lg-8 d-flex flex-column align-items-center\">\n                        <input\n                          ref=\"code\"\n                          disabled\n                          class=\"code-btn\"\n                          :value=\"`${verificationCode && verificationCode.code}`\"\n                        />\n                        <small class=\"mx-auto py-1\" :class=\"{ 'text-muted': !copied }\">{{\n                          copied\n                            ? $t('Code copied to system clipboard')\n                            : $t('Ctrl-C/Cmd-C to copy the code')\n                        }}</small>\n                        <div class=\"mx-auto pt-1 pb-4\">\n                          <span class=\"text-muted\">{{ $t(\"Code will expire in \") }}</span\n                          >{{ timeToExpire }}\n                        </div>\n                        <div class=\"lead\">\n                          <i18next :translation=\"$t(`Enter the {localizedDom}`)\">\n                            <template #localizedDom>\n                              <strong>{{$t(\"6-digit verification code\")}}</strong>\n                            </template>\n                          </i18next>\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"row justify-content-center\">\n                      <div class=\"col-sm-12 col-lg-8 img-container\">\n                        <img\n                          v-if=\"targetOctoPrint\"\n                          class=\"screenshot\"\n                          :src=\"\n                            require('@static/img/octoprint-plugin-guide/plugin_verification_code.png')\n                          \"\n                          @click=\"zoomIn($event)\"\n                        />\n                        <img\n                          v-if=\"targetKlipper\"\n                          class=\"screenshot\"\n                          :src=\"\n                            require('@static/img/octoprint-plugin-guide/moonraker_verification_code.png')\n                          \"\n                          @click=\"zoomIn($event)\"\n                        />\n                        <div class=\"helper mx-auto py-2\">\n                          <a\n                            class=\"link font-weight-bold\"\n                            @click=\"showVerificationCodeHelpModal\"\n                            >{{ $t(\"Can't find the page to enter the 6-digit code?\") }}</a\n                          >\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <div v-else class=\"container pt-5\">\n                    <div class=\"row justify-content-center pb-1\">\n                      <div class=\"col-sm-12 col-md-8 col-lg-6 d-flex flex-column align-items-center\">\n                        <div class=\"d-flex align-items-center\">\n                          <input\n                            type=\"text\"\n                            class=\"form-control code-btn\"\n                            aria-label=\"One-time Passcode\"\n                            v-model=\"oneTimePasscode\"\n                            :disabled=\"oneTimePasscodeStatus === 'inprogress'\"\n                            @input=\"oneTimePasscodeChanged\"\n                          />\n                          <div class=\"spinner-border text-primary ml-2\" role=\"status\" v-if=\"oneTimePasscodeStatus === 'inprogress'\">\n                            <span class=\"sr-only\">Loading...</span>\n                          </div>\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"row justify-content-center pb-3\">\n                      <div v-if=\"oneTimePasscodeStatus === 'failed'\" class=\"text-danger col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\">\n                        {{$t(\"Invalid code. Is it expired?\")}}\n                      </div>\n                      <div v-else class=\"col-sm-12 d-flex flex-column align-items-center wizard-secondary-text-font text-secondary\">\n                        {{$t(\"Enter the One-time Passcode\")}}\n                      </div>\n                    </div>\n                    <div class=\"mt-4\">\n                      <muted-alert class=\"muted-alert wizard-secondary-text-font text-secondary\">\n                        <i18next class=\"\" :translation=\"$t(`If you using Obico for OctoPrint older than 2.5.0, or Obico for Klipper older than 1.6.0, switch to {localizedDom}.`)\">\n                          <template #localizedDom>\n                            <a class=\"link\" @click=\"useLegacyVerificationCode = true\">{{$t(\"6-digit verification code\")}}</a>\n                          </template>\n                        </i18next>\n                      </muted-alert>\n                    </div>\n                  </div>\n                </div>\n              </b-row>\n              <b-row v-if=\"!discoveryEnabled && !useLegacyVerificationCode\" class=\"mt-3 mb-5\">\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"Touch Screen\") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/klipperScreenMenu.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"Check to see if your printer already has Obico installed your printer screen.\") }}</li>\n                      <li>{{ $t(\"Navigate to the settings menu on the LCD screen of your printer.\") }}</li>\n                      <li>{{ $t(\"Find the “Link Obico” menu item and tap it to open the connection screen.\") }}</li>\n                    </ol>\n                </div>\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"LCD Screen \") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/lcdScreenLarge.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"Check to see if your printer already has Obico Easy Link installed on the LCD menu.\") }}</li>\n                      <li>{{ $t(\"Navigate to the settings menu on the LCD screen of your printer.\") }}</li>\n                      <li>{{ $t(\"Find the “Link Obico” menu item.\") }}</li>\n                    </ol>\n                </div>\n                <div class=\"col-md-4 p-4 method-block\">\n                    <h4 class=\"text-center font-weight-bold wizard-page-title-font\">{{ $t(\"Install Via SSH\") }}</h4>\n                    <div class=\"image-block\">\n                      <img src=\"@static/img/printer-wizard/commandLinePrompt.png\" style=\"max-width: 80%;\" alt=\"\">\n                    </div>\n                    <ol>\n                      <li>{{ $t(\"If you can't find Obico Easy Link, you will need to SSH to your printer to install Obico. You will need to find a guide that works for your printer.\") }}</li>\n                    </ol>\n                    <div>\n                      <a target=\"_blank\" :href=\"getDocUrl('/user-guides/klipper-setup/')\">{{ $t(\"Show me how\") }}</a>\n                    </div>\n                </div>\n              </b-row>\n              <div class=\"d-flex justify-content-between align-items-center button-wrap\">\n                <div class=\"back\" @click=\"$router.back()\">\n                  <i class=\"fas fa-chevron-left\"></i>\n                  <span> {{ $t(\"Back\") }}</span>\n                </div>\n              </div>\n              <div class=\"text-center mt-5 wizard-default-font\">\n                <i18next :translation=\"$t(`Need help? Check out the {localizedDom}`)\">\n                  <template #localizedDom>\n                    <a target=\"_blank\" :href=\"targetKlipper? getDocUrl('/user-guides/klipper-setup/'):getDocUrl('/user-guides/octoprint-plugin-setup/')\">{{$t(\"step-by-step set up guide\")}}.</a>\n                  </template>\n                </i18next>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport urls from '@config/server-urls'\nimport { onPrinterLinked } from '@config/event-handler'\n// TODO: this should be configured as global. But for some reason it doesn't work.\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport sortBy from 'lodash/sortBy'\nimport theme from '@src/styles/main.sass'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport DiscoveredPrinter from '@src/components/printers/wizard/DiscoveredPrinter.vue'\nimport AutoLinkPopup from '@src/components/printers/wizard/AutoLinkPopup.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\n\nexport default {\n  components: {\n    Loading,\n    PageLayout,\n    DiscoveredPrinter,\n    PrinterProgress,\n    MutedAlert,\n  },\n  data() {\n    return {\n      theme: theme,\n      verificationCode: null,\n      verifiedPrinter: null,\n      copied: false,\n      oneTimePasscode: '',\n      oneTimePasscodeStatus: null,\n      useLegacyVerificationCode: false, // To simplify the flow, this can only change from false -> true.\n      discoveryEnabled: true,\n      discoveryCount: 0,\n      discoveredPrinters: [],\n      chosenDeviceId: null,\n      gotSecret: null,\n      obicoDiscoveryPopup: null,\n      apiCallIntervalId: null,\n    }\n  },\n  computed: {\n    printerIdToLink() {\n      return this.$route.query.printerId;\n    },\n    title() {\n      return this.printerIdToLink ? 'Re-Link Printer' : 'Link Printer'\n    },\n    expiryMoment() {\n      if (this.verificationCode) {\n        return moment(this.verificationCode.expired_at)\n      } else {\n        return null\n      }\n    },\n    timeToExpire() {\n      if (this.expiryMoment) {\n        return moment.duration(this.expiryMoment.diff(moment())).humanize()\n      } else {\n        return '-'\n      }\n    },\n    canStartLinking() {\n      return this.verificationCode?.code && this.discoveredPrinters?.length > 0\n    },\n    targetOctoPrint() {\n      return this.$route.params.targetPlatform === 'octoprint'\n    },\n    targetKlipper() {\n      return this.$route.params.targetPlatform.startsWith('klipper-');\n    },\n  },\n  created() {\n    if (this.targetOctoPrint) {\n      this.useLegacyVerificationCode = true\n    }\n    this.getVerificationCode()\n    this.discoverPrinter()\n  },\n  methods: {\n    oneTimePasscodeChanged() {\n      this.oneTimePasscode = this.oneTimePasscode.toLowerCase();\n\n      // Call API when input reaches 5 characters\n      if (this.oneTimePasscode.length === 5) {\n        this.oneTimePasscodeStatus = 'inprogress'\n        axios\n          .post(urls.oneTimePasscodes(), {\n            one_time_passcode: this.oneTimePasscode,\n            verification_code: this.verificationCode.code,\n          })\n          .then((resp) => {\n            if (resp.status !== 200) {\n              this.oneTimePasscodeStatus = 'failed'\n            }\n          })\n          .catch((error) => {\n            this.oneTimePasscodeStatus = 'failed'\n          })\n      }\n    },\n    verificationCodeUrl() {\n      const baseUrl = urls.verificationCode()\n      if (!this.verificationCode) {\n        // Never retrieved veification code. Get one.\n        if (this.printerIdToLink) {\n          return `${baseUrl}?printer_id=${this.printerIdToLink}`\n        } else {\n          return baseUrl\n        }\n      }\n      if (this.verificationCode.verified_at) {\n        // Code is verified successfully, keep on polling to get update on the printer name if any\n        return `${baseUrl}${this.verificationCode.id}/`\n      }\n      if (moment().isBefore(this.expiryMoment)) {\n        // Not verified, and not expired\n        return `${baseUrl}${this.verificationCode.id}/`\n      }\n      // Not verified, but expired.\n      return baseUrl\n    },\n    callVerificationCodeApi() {\n      axios.get(this.verificationCodeUrl()).then((resp) => {\n        if (resp.data) {\n          this.verificationCode = resp.data\n          if (this.verificationCode.verified_at) {\n            this.verifiedPrinter = resp.data.printer\n            if (onPrinterLinked) {\n              onPrinterLinked()\n            }\n            this.$router.push({\n              path: `/printers/wizard/success/${this.verifiedPrinter.id}/`,\n              query: {\n                ...this.$route.query,\n              }\n            })\n            .catch((error) => {}) // There are NavigationDuplicated errors. Suspect it's because the setInterval is not super clean and occasionally results in multiple calls to this.\n          }\n        }\n      })\n    },\n    getVerificationCode() {\n      this.callVerificationCodeApi()\n      this.apiCallIntervalId = setInterval(() => {\n        if (this.verifiedPrinter) {\n          clearInterval(this.apiCallIntervalId)\n        } else {\n          this.callVerificationCodeApi()\n        }\n      }, 5000)\n    },\n    showVerificationCodeHelpModal() {\n      let html = `<p>${this.$i18next.t(\"The 6-digit code needs to be entered in the Obico plugin in OctoPrint. There are a few reasons why you can't find this page:\",{brandName:this.$syndicateText.brandName})}</p>\n        <p><ul>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"You don't have the plugin installed or you haven't restarted OctoPrint after installation. Click\")} <a href=\"/printers/wizard/\">here</a> ${this.$i18next.t(\"to walk through the process again.\")}</li>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"The installed plugin is on a version earlier than 1.5.0. You need to upgrade the plugin to\")} <b>1.5.0</b> ${this.$i18next.t(\"or later.\")}</li>\n        <li style=\"margin: 10px 0;\">${this.$i18next.t(\"Still no dice? Check out the step-by-step\")} <a target=\"_blank\" href=${this.getDocUrl('/user-guides/octoprint-plugin-setup/')}\">${this.$i18next.t(\"set up guide\")}</a>.</li>\n        </ul></p>`\n\n      if (!this.targetOctoPrint) {\n        html = `<p>${this.$i18next.t(\"The 6-digit code needs to be entered to the Obico for Klipper installation script.\")}</p>\n        <p>${this.$i18next.t(\"Check\")} <a target=\"_blank\" href=${this.getDocUrl('/user-guides/klipper-setup/')}> ${this.$i18next.t(\"this set up guide\")}</a> ${this.$i18next.t(\"for detailed instructions.\")}</p>`\n      }\n\n      this.$swal.fire({\n        title: `${this.$i18next.t(\"Can't find the page to enter the 6-digit code?\")}`,\n        html,\n        customClass: {\n          container: 'dark-backdrop',\n        },\n      })\n    },\n    zoomIn(event) {\n      event.target.classList.toggle('zoomedIn')\n    },\n    callPrinterDiscoveryApi() {\n      if (!this.discoveryEnabled) {\n        return\n      }\n      this.discoveryCount += 1\n      axios.get(urls.printerDiscovery()).then((resp) => {\n        this.discoveredPrinters = sortBy(resp.data, (p) => p.device_id)\n      })\n    },\n    discoverPrinter() {\n      if (!this.discoveryEnabled || this.verifiedPrinter) {\n        return\n      }\n      this.callPrinterDiscoveryApi()\n      setTimeout(() => {\n        this.discoverPrinter()\n      }, 5000)\n    },\n    autoLinkPrinter(discoveredPrinter) {\n      this.$swal.openModalWithComponent(\n        AutoLinkPopup,\n        {\n          discoveredPrinter,\n          switchToManualLinking: () => (this.discoveryEnabled = false),\n          secretObtained: (chosenDeviceId, secret) => this.secretObtained(chosenDeviceId, secret),\n        },\n        {\n          title: 'Browser Pop-up',\n          showConfirmButton: false,\n          allowOutsideClick: false,\n        }\n      )\n    },\n    secretObtained(chosenDeviceId, secret) {\n      this.chosenDeviceId = chosenDeviceId\n      axios.post(urls.printerDiscovery(), {\n        code: this.verificationCode.code,\n        device_id: this.chosenDeviceId,\n        device_secret: secret,\n      })\n      // Declare failure if nothing is linked after 20s\n      setTimeout(() => {\n        if (this.chosenDeviceId && !this.verifiedPrinter) {\n          this.chosenDeviceId = null\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: 'Something went wrong. Switched to using 6-digit code to link OctoPrint.',\n          })\n          this.discoveryEnabled = false\n        }\n        this.chosenDeviceId = null\n      }, 20000)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-back\n  color: var(--color-text-primary)\n  min-width: auto\n.header-img\n  width: 1em\n  height: 1em\n  margin-right: 12px\n  margin-bottom: 8px\n.img-container\n  padding: 1rem\n  text-align: center\nimg\n  max-height: 30vh\n.spacer\n width: 200px\n.code-btn\n  border-radius: var(--border-radius-sm)\n  text-align: center\n  width: 21rem\n  height: 60px\n  background-color: var(--color-input-background)\n  color: var(--color-text-primary)\n  font-size: 2rem\n  font-weight: 500\n  letter-spacing: 0.5em\n  border: none\n.helper\n  text-align: center\n  padding: 0 36px\nli\n  margin: 2px -35px\n.screenshot\n  max-width: 100%\n  transition: transform .3s\n  &:hover\n    cursor: pointer\n  &.zoomedIn\n    transform: scale(2)\n    position: relative\n    z-index: 9\n\npre\n  color: var(--color-text-secondary)\n  font-size: 0.9em\n</style>\n\n<style lang=\"sass\">\n// Unscoped styles to style plugin elements\n// TODO merge 2 style blocks\n\n// Step label (not active)\n.success-checkmark\n  width: 6rem\n  height: 6rem\n  margin-bottom: 1.5rem\n.printer-name-input\n  position: relative\n  .edit-icon\n    height: 100%\n    display: flex\n    flex-direction: column\n    justify-content: center\n    position: absolute\n    top: 0\n    left: 1em\n    opacity: .5\n  input\n    padding: .4em 2.4em\n    width: 100%\n    font-size: 20px\n    text-align: center\n.discover\n  .discover-body\n    min-height: 25rem\n    display: flex\n    flex-direction: column\n    justify-content: center\n    .spinner-border\n      width: 1.2em\n      height: 1.2em\n      margin-right: 0.2em\n      &.big\n        width: 5rem\n        height: 5rem\n        margin-bottom: 0.8rem\n  li\n    margin: initial\n.method-block\n  display: flex\n  flex-direction: column\n  align-items: center\n  .image-block\n    display: flex\n    justify-content: center\n.button-wrap\n  margin-top:80px\n  .back\n    cursor: pointer\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterLinkingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterLinkingPage.vue?vue&type=template&id=7e0a0f74&scoped=true&\"\nimport script from \"./PrinterLinkingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterLinkingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterLinkingPage.vue?vue&type=style&index=0&id=7e0a0f74&prod&lang=sass&scoped=true&\"\nimport style1 from \"./PrinterLinkingPage.vue?vue&type=style&index=1&id=7e0a0f74&prod&lang=sass&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7e0a0f74\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[(_vm.printerIdToLink)?_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('div',{staticClass:\"text-warning\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Warning: Re-Linking OctoPrint should be your last resort to solve issues. Please make sure you have exhausted all options on {localizedDom}.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://www.obico.io/help/\"}},[_vm._v(_vm._s(_vm.$t(\"{brandName}'s help website\",{brandName:_vm.$syndicateText.brandName})))])]},proxy:true}],null,false,3291268443)})],1)])]):_vm._e(),_c('div',{staticClass:\"row\"},[_c('h1',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Device Selection\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5 pb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":0}})],1)]),(_vm.devicesWithObicoPreInstalled.length > 0)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 py-4\"},[_c('h4',{staticClass:\"py-3\"},[_vm._v(_vm._s(_vm.$t(\"Devices with Obico Pre-installed\")))]),_c('div',{staticClass:\"printer-list\"},_vm._l((_vm.devicesWithObicoPreInstalled),function(item){return _c('div',{key:item.id,staticClass:\"printer-item\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-obico-enabled',item)}}},[_c('div',{staticClass:\"img-wrap clickable\"},[_c('img',{attrs:{\"src\":item.image_url,\"alt\":\"\"}})]),_c('div',{staticClass:\"item-label\"},[_vm._v(_vm._s(item.brand))]),_c('h5',{staticClass:\"item-label\"},[_c('b',[_vm._v(_vm._s(item.model))])])])}),0)])]):_vm._e(),_c('div',{staticClass:\"wizard-card-list py-4\"},[_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-preinstalled')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/klipper_logo.jpg')}})]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(_vm._s(_vm.$t(\"Pre-Installed Klipper Printer\")))]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Creality K1, Sonic Pad, Sovol SV07, Kingroon KLP1, Elegoo Neptune 4, etc...\")))])])]),_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('klipper-generic')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/klipper_logo.jpg')}}),_c('div',{staticClass:\"img-tip\"},[_c('img',{attrs:{\"src\":require('@static/img/mainsail_logo.png')}}),_c('img',{attrs:{\"src\":require('@static/img/fluidd_logo.png')}})])]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(_vm._s(_vm.$t(\"Generic Klipper - Self Installed\")))]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"If you installed Klipper yourself on a Raspberry Pi or other linux device. E.g., Voron, RatRig\")))])])]),_c('div',{staticClass:\"wizard-card-horizontal\",on:{\"click\":function($event){return _vm.targetPlatformClicked('octoprint')}}},[_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":require('@static/img/octoprint_logo.png')}})]),_c('div',{staticClass:\"text-wrap\"},[_c('h3',{staticClass:\"wizard-default-font\"},[_vm._v(\"OctoPrint\")]),_c('h4',{staticClass:\"wizard-secondary-text-font text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Including OctoPrint for Klipper such as OctoKlipper.\")))])])])])],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <b-row v-if=\"printerIdToLink\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <div class=\"text-warning\">\n                    <i18next :translation=\"$t(`Warning: Re-Linking OctoPrint should be your last resort to solve issues. Please make sure you have exhausted all options on {localizedDom}.`)\">\n                      <template #localizedDom>\n                        <a href=\"https://www.obico.io/help/\">{{$t(\"{brandName}'s help website\",{brandName:$syndicateText.brandName})}}</a>\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n              </b-row>\n              <div class=\"row\">\n                <h1 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Device Selection\") }}</h1>\n              </div>\n              <b-row class=\"center mt-3 mb-5 pb-5\">\n                <div class=\"col-sm-12 col-lg-8\"><PrinterProgress :step=\"0\"></PrinterProgress></div>\n              </b-row>\n              <div v-if=\"devicesWithObicoPreInstalled.length > 0\" class=\"row\">\n                <div class=\"col-sm-12 col-lg-6 py-4\">\n                  <h4 class=\"py-3\">{{ $t(\"Devices with Obico Pre-installed\") }}</h4>\n                  <div class=\"printer-list\">\n                    <div v-for=\"item in devicesWithObicoPreInstalled\" :key=\"item.id\" @click=\"targetPlatformClicked('klipper-obico-enabled',item)\" class=\"printer-item\">\n                      <div class=\"img-wrap clickable\">\n                        <img :src=\"item.image_url\" alt=\"\">\n                      </div>\n                      <div class=\"item-label\">{{ item.brand }}</div>\n                      <h5 class=\"item-label\"><b>{{ item.model }}</b></h5>\n                    </div>\n                  </div>\n\n                </div>\n              </div>\n              <div class=\"wizard-card-list py-4\">\n                <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('klipper-preinstalled')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/klipper_logo.jpg')\" />\n                    </div>\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">{{ $t(\"Pre-Installed Klipper Printer\") }}</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"Creality K1, Sonic Pad, Sovol SV07, Kingroon KLP1, Elegoo Neptune 4, etc...\") }}</h4>\n                    </div>\n                  </div>\n                  <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('klipper-generic')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/klipper_logo.jpg')\" />\n                      <div class=\"img-tip\">\n                        <img :src=\"require('@static/img/mainsail_logo.png')\" />\n                        <img :src=\"require('@static/img/fluidd_logo.png')\" />\n                      </div>\n                    </div>\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">{{ $t(\"Generic Klipper - Self Installed\") }}</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"If you installed Klipper yourself on a Raspberry Pi or other linux device. E.g., Voron, RatRig\") }}</h4>\n                    </div>\n                  </div>\n                  <div class=\"wizard-card-horizontal\" @click=\"targetPlatformClicked('octoprint')\">\n                    <div class=\"img-wrap\">\n                      <img :src=\"require('@static/img/octoprint_logo.png')\" />\n                    </div>\n\n                    <div class=\"text-wrap\">\n                      <h3 class=\"wizard-default-font\">OctoPrint</h3>\n                      <h4 class=\"wizard-secondary-text-font text-secondary\">{{ $t(\"Including OctoPrint for Klipper such as OctoKlipper.\") }}</h4>\n                    </div>\n                  </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\nexport default {\n  components: {\n    PageLayout,\n    PrinterProgress\n  },\n  data() {\n    return {\n      devicesWithObicoPreInstalled: [],\n    }\n  },\n  computed: {\n    printerIdToLink() {\n      return this.$route.query.printerId;\n    },\n  },\n  async created() {\n    const response = await fetch(`https://storage.googleapis.com/public-versioned/devices_with_obico_preinstalled.json?ts=${Date.now()}`);\n    this.devicesWithObicoPreInstalled = await response.json();\n  },\n  methods: {\n    targetPlatformClicked(platform,printerItem) {\n      this.$router.push({\n        path: `/printers/wizard/guide/${platform}/`,\n        query: {\n          ...this.$route.query,\n          printerItem:printerItem?JSON.stringify(printerItem):undefined\n        }\n      });\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n\n\n.clickable {\n  &:hover{\n    cursor: pointer;\n  }\n}\n.form-container{\n\n  .printer-list{\n    display:flex;\n    gap:20px;\n    .printer-item{\n      .img-wrap{\n        padding:20px;\n        background:#485B71;\n        border-radius:6px;\n        img{\n          width:100px;\n          height:auto;\n        }\n      }\n      .item-label{\n        margin-top:3px;\n        text-align:center;\n      }\n    }\n  }\n}\n\n\n.wizard-card-list{\n  margin-top:40px;\n\n  .wizard-card-horizontal{\n    margin-top:20px;\n    display:flex;\n    align-items:center;\n    gap:30px;\n    background-color: var(--color-surface-primary);\n    border-radius: var(--border-radius-md);\n    padding:20px;\n    cursor: pointer;\n\n  .img-wrap{\n    img{\n      width: 5em;\n    }\n    .img-tip{\n      display:flex;\n      justify-content:space-between;\n      img{\n        width:2em;\n      }\n    }\n  }\n  .text-wrap{\n    h5{\n      margin-top:10px;\n      color:#AAACB0;\n      font-size:16px;\n    }\n  }\n}\n}\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TargetPlatformSelectionPage.vue?vue&type=template&id=7924844c&scoped=true&\"\nimport script from \"./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"\nexport * from \"./TargetPlatformSelectionPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TargetPlatformSelectionPage.vue?vue&type=style&index=0&id=7924844c&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7924844c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[_c('div',{staticClass:\"row\"},[_c('h1',{staticClass:\"col-sm-12 text-center p-3 wizard-page-title-font\"},[_vm._v(_vm._s(_vm.$t(\"Install Obico\")))])]),_c('b-row',{staticClass:\"center mt-3 mb-5 pb-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-8\"},[_c('PrinterProgress',{attrs:{\"step\":1}})],1)]),_c('div',[(_vm.targetKlipperPreInstall)?_c('div',{staticClass:\"klipper-pre-install-wrap\"},[_c('img',{attrs:{\"src\":require(\"@static/img/printer-wizard/commandLinePrompt.png\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for Klipper\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/klipper-setup/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Find the Guide for Your Printer to install Obico for Klipper.\")))])]),_c('li',[_vm._v(_vm._s(_vm.$t('SSH to your device.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Enter the installation commands.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Alternatively, you can use KIAUH to install Obico.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Upon \"Scanning the networking...\", come back here and click \"Next\".')))])])])]):_vm._e(),(_vm.targetOctoPrint)?_c('div',{staticClass:\"kilpper-pre-install-wrap\"},[_c('img',{staticClass:\"octoprint-image\",attrs:{\"src\":require(\"@static/img/octoprint-plugin-guide/install_plugin.png\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for OctoPrint\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"Open OctoPrint in another browser tab.\")))]),_c('li',[_vm._v(\" \"+_vm._s(_vm.$t(\"Select\"))+\" \"),_c('em',[_vm._v(\"\\\"\"+_vm._s(_vm.$t(\"OctoPrint settings menu → Plugin Manager → Get More...\"))+\"\\\"\")]),_vm._v(\". \")]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Enter '{brandName}' to locate the plugin. Click\", { brandName: _vm.$syndicateText.brandName }))+\" \"),_c('em',[_vm._v(\"\\\"\"+_vm._s(_vm.$t(\"Install\"))+\"\\\"\")]),_vm._v(\".\")]),_c('li',[_vm._v(_vm._s(_vm.$t(\"Restart OctoPrint when prompted.\")))])])])]):_vm._e()]),(_vm.targetKlipperGeneric)?_c('div',{staticClass:\"kilpper-pre-install-wrap\"},[_c('img',{attrs:{\"src\":require(\"@static/img/klipper_logo.jpg\"),\"alt\":\"\"}}),_c('div',{staticClass:\"text-wrap\"},[_c('h3',[_vm._v(_vm._s(_vm.$t(\"Install Obico for Klipper\")))]),_c('ol',{staticClass:\"secondary-font\"},[_c('li',[_vm._v(_vm._s(_vm.$t(\"SSH to the Raspberry Pi (or other SBC) your Klipper runs on.\")))]),_c('li',[_c('div',[_vm._v(_vm._s(_vm.$t(\"Run:\")))]),_c('pre',{staticClass:\"mt-2\"},[_vm._v(\"    cd ~\\n    git clone https://github.com/TheSpaghettiDetective/moonraker-obico.git\\n    cd moonraker-obico\\n    ./install.sh\\n                      \")])]),_c('li',[_vm._v(_vm._s(_vm.$t('Alternatively, you can use KIAUH to install Obico.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('Upon \"Scanning the networking...\", come back here and click \"Next\".')))])])])]):_vm._e(),(_vm.printerItem)?_c('div',{staticClass:\"printer-item\"},[_c('div',{staticClass:\"printer-left\"},[_c('h5',[_vm._v(_vm._s(_vm.printerItem.brand +\" \" + _vm.printerItem.model))]),_c('div',{staticClass:\"img-wrap\"},[_c('img',{attrs:{\"src\":_vm.printerItem.image_url,\"alt\":\"\"}})])]),_c('div',{staticClass:\"line\"}),_c('div',{staticClass:\"printer-right\"},[_c('ol',[_c('li',[_vm._v(_vm._s(_vm.$t('1. Unbox and assemble the 3D printer following the manufacturers instructions')))]),_c('li',[_vm._v(_vm._s(_vm.$t('2. Power on the 3D printer and make sure it is connected to WiFi.')))]),_c('li',[_vm._v(_vm._s(_vm.$t('3. Tap “Next” when you are ready.')))])])])]):_vm._e(),_c('div',{staticClass:\"d-flex justify-content-between align-items-center button-wrap\"},[_c('div',{staticClass:\"back\",on:{\"click\":function($event){return _vm.$router.back()}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"Back\")))])]),_c('b-button',{attrs:{\"variant\":\"primary\"},on:{\"click\":_vm.goForward}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Next\"))+\" \")])],1),_c('div',{staticClass:\"text-center mt-5 wizard-default-font\"},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Need help? Check out the {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.targetKlipper? _vm.getDocUrl('/user-guides/klipper-setup/'):_vm.getDocUrl('/user-guides/octoprint-plugin-setup/')}},[_vm._v(_vm._s(_vm.$t(\"step-by-step set up guide\"))+\".\")])]},proxy:true}])})],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div class=\"row\">\n                <h1 class=\"col-sm-12 text-center p-3 wizard-page-title-font\">{{ $t(\"Install Obico\") }}</h1>\n              </div>\n              <b-row class=\"center mt-3 mb-5 pb-5\">\n                <div class=\"col-sm-12 col-lg-8\">\n                  <PrinterProgress :step=\"1\"></PrinterProgress>\n                </div>\n              </b-row>\n              <div>\n                <div v-if=\"targetKlipperPreInstall\" class=\"klipper-pre-install-wrap\">\n                  <img src=\"@static/img/printer-wizard/commandLinePrompt.png\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for Klipper\") }}</h3>\n                    <ol class=\"secondary-font\">\n                      <li><a :href=\"getDocUrl('/user-guides/klipper-setup/')\" target=\"_blank\">{{ $t(\"Find the Guide for Your Printer to install Obico for Klipper.\") }}</a></li>\n                      <li>{{ $t('SSH to your device.') }}</li>\n                      <li>{{ $t('Enter the installation commands.') }}</li>\n                      <li>{{ $t('Alternatively, you can use KIAUH to install Obico.') }}</li>\n                      <li>{{ $t('Upon \"Scanning the networking...\", come back here and click \"Next\".') }}</li>\n                    </ol>\n                  </div>\n                </div>\n                <div v-if=\"targetOctoPrint\"  class=\"kilpper-pre-install-wrap\">\n                  <img class=\"octoprint-image\" src=\"@static/img/octoprint-plugin-guide/install_plugin.png\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for OctoPrint\") }}</h3>\n                    <ol class=\"secondary-font\">\n                        <li>{{ $t(\"Open OctoPrint in another browser tab.\") }}</li>\n                        <li>\n                          {{ $t(\"Select\") }}\n                          <em>\"{{ $t(\"OctoPrint settings menu → Plugin Manager → Get More...\") }}\"</em>.\n                        </li>\n                        <li>{{ $t(\"Enter '{brandName}' to locate the plugin. Click\", { brandName: $syndicateText.brandName }) }}\n                          <em>\"{{ $t(\"Install\") }}\"</em>.</li>\n                        <li>{{ $t(\"Restart OctoPrint when prompted.\") }}</li>\n                      </ol>\n                    </div>\n                  </div>\n                </div>\n                <div v-if=\"targetKlipperGeneric\"  class=\"kilpper-pre-install-wrap\">\n                  <img src=\"@static/img/klipper_logo.jpg\" alt=\"\">\n                  <div class=\"text-wrap\">\n                    <h3>{{ $t(\"Install Obico for Klipper\") }}</h3>\n                    <ol class=\"secondary-font\">\n                        <li>{{ $t(\"SSH to the Raspberry Pi (or other SBC) your Klipper runs on.\") }}</li>\n                        <li>\n                          <div>{{ $t(\"Run:\") }}</div>\n                          <pre class=\"mt-2\">\n      cd ~\n      git clone https://github.com/TheSpaghettiDetective/moonraker-obico.git\n      cd moonraker-obico\n      ./install.sh\n                        </pre>\n                        </li>\n                      <li>{{ $t('Alternatively, you can use KIAUH to install Obico.') }}</li>\n                      <li>{{ $t('Upon \"Scanning the networking...\", come back here and click \"Next\".') }}</li>\n                    </ol>\n                  </div>\n                </div>\n                <div v-if=\"printerItem\" class=\"printer-item\">\n                  <div class=\"printer-left\">\n                    <h5>{{ printerItem.brand +\" \" +  printerItem.model }}</h5>\n                    <div class=\"img-wrap\">\n                      <img :src=\"printerItem.image_url\" alt=\"\">\n                    </div>\n\n                  </div>\n                  <div class=\"line\"></div>\n                  <div class=\"printer-right\">\n                    <ol>\n                      <li>{{ $t('1. Unbox and assemble the 3D printer following the manufacturers instructions') }}</li>\n                      <li>{{ $t('2. Power on the 3D printer and make sure it is connected to WiFi.') }}</li>\n                      <li>{{ $t('3. Tap “Next” when you are ready.') }}</li>\n                    </ol>\n\n                  </div>\n                </div>\n                <div class=\"d-flex justify-content-between align-items-center button-wrap\">\n                  <div class=\"back\" @click=\"$router.back()\">\n                    <i class=\"fas fa-chevron-left\"></i>\n                    <span> {{ $t(\"Back\") }}</span>\n                  </div>\n                    <b-button variant=\"primary\" @click=\"goForward\">\n                      {{ $t(\"Next\") }}\n                    </b-button>\n                </div>\n                <div class=\"text-center mt-5 wizard-default-font\">\n                  <i18next :translation=\"$t(`Need help? Check out the {localizedDom}`)\">\n                    <template #localizedDom>\n                      <a target=\"_blank\" :href=\"targetKlipper? getDocUrl('/user-guides/klipper-setup/'):getDocUrl('/user-guides/octoprint-plugin-setup/')\">{{$t(\"step-by-step set up guide\")}}.</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterProgress from '../../components/printers/wizard/PrinterProgress.vue';\nexport default {\n  components: {\n    PageLayout,\n    PrinterProgress\n  },\n  computed: {\n    printerItem(){\n      if(this.$route.query.printerItem){\n        return JSON.parse(this.$route.query.printerItem)\n      }\n      return\n    },\n    targetOctoPrint() {\n      return this.$route.params.targetPlatform === 'octoprint'\n    },\n    targetKlipperPreInstall() {\n      return this.$route.params.targetPlatform === 'klipper-preinstalled'\n    },\n    targetKlipperGeneric() {\n      return this.$route.params.targetPlatform === 'klipper-generic'\n    },\n    targetKlipper() {\n      return this.$route.params.targetPlatform.startsWith('klipper-');\n    },\n  },\n  methods: {\n    goForward() {\n      this.$router.push({\n        path: `/printers/wizard/link/${this.$route.params.targetPlatform}/`,\n        query: {\n          ...this.$route.query,\n        }\n      });\n    },\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.octoprint-image {\n  width: 100%; \n  margin-bottom: 1em;\n}\n.form-container {\n  .klipper-pre-install-wrap {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    img {\n      width: 150px;\n    }\n\n    .text-wrap {\n      width: 70%;\n      margin-top:20px;\n      h4 {\n        color: #EBEBEB;\n        font-size: 22px;\n        line-height:34px;\n        margin-top: 1em;\n        font-weight: 600;\n      }\n      ol{\n        padding-left:15px;\n        margin-top:8px;\n        li{\n          margin-top:10px;\n        }\n      }\n      .find-printer-link {\n        color: var(--color-primary);\n        i {\n          transform: rotate(45deg);\n        }\n        a {\n          margin-right: 4px;\n          font-weight: 600;\n          text-decoration: underline;\n        }\n      }\n    }\n  }\n  .octo-wrap{\n    img{\n      width:100%;\n    }\n  }\n  .klipper-wrap{\n    color:#EBEBEB;\n    font-size:20px;\n  }\n  .printer-item{\n    display:flex;\n    justify-content: space-between;\n    align-items:center;\n    gap:40px;\n\n    .printer-left{\n      flex:1;\n      display:flex;\n      flex-direction: column;\n      align-items:center;\n\n      .img-wrap{\n        margin-top:20px;\n        background-color: var(--color-surface-primary);\n        border-radius:var(--border-radius-lg);\n        padding:20px;\n        img{\n          width:300px;\n        }\n      }\n    }\n    .line{\n      align-self: stretch;\n      width:1px;\n      background-color: #fff;\n\n    }\n    .printer-right{\n      flex:1;\n      p{\n        margin-bottom:30px;\n        font-size:20px;\n      }\n    }\n  }\n  .button-wrap{\n    margin-top:80px;\n    .back{\n      cursor: pointer;\n    }\n  }\n\n}\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ObicoInstallationGuidePage.vue?vue&type=template&id=3e025757&scoped=true&\"\nimport script from \"./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"\nexport * from \"./ObicoInstallationGuidePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ObicoInstallationGuidePage.vue?vue&type=style&index=0&id=3e025757&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3e025757\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 p-4\"},[_c('div',{staticClass:\"form-container full-on-mobile border-radius-lg\"},[(_vm.verifiedPrinter)?_c('div',{staticClass:\"text-center py-5\"},[_c('svg',{staticClass:\"success-checkmark\"},[_c('use',{attrs:{\"href\":\"#svg-success-checkmark\"}})]),_c('h3',{staticClass:\"pb-4\"},[_vm._v(_vm._s(_vm.$t(\"Successfully linked to your account!\")))]),_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"},[_c('saving-animation',{attrs:{\"errors\":_vm.errorMessages.printer_name,\"saving\":_vm.saving.printer_name}},[_c('div',{staticClass:\"printer-name-input\"},[_c('div',{staticClass:\"edit-icon\"},[_c('i',{staticClass:\"fas fa-pen\"})]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.verifiedPrinter.name),expression:\"verifiedPrinter.name\"}],staticClass:\"dark\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('Printer name')},domProps:{\"value\":(_vm.verifiedPrinter.name)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.$set(_vm.verifiedPrinter, \"name\", $event.target.value)},_vm.updatePrinterName]}})])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Give your printer a shiny name.\"))+\" \")])])],1),_c('br'),_c('br'),_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"},[(_vm.redirectToTunnelCreation)?_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.redirectToTunnelCreation}},[_vm._v(_vm._s(_vm.$t(\"Authorize App Access\")))])]):_c('div',[_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Go Check Out Printer Feed!\")))])]),_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":\"/user_preferences/notification_twilio/\"}},[_vm._v(_vm._s(_vm.$t(\"Add Phone Number\")))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Receive text (SMS) in case of print failures.\"))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":_vm.editPrinterUrl}},[_vm._v(_vm._s(_vm.$t(\"Change Printer Settings\")))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You can always change it later.\"))+\" \")])])])])]):_vm._e()])])])])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-sm-12 p-4\">\n\n            <div class=\"form-container full-on-mobile border-radius-lg\">\n              <div v-if=\"verifiedPrinter\" class=\"text-center py-5\">\n                <svg class=\"success-checkmark\">\n                  <use href=\"#svg-success-checkmark\" />\n                </svg>\n                <h3 class=\"pb-4\">{{ $t(\"Successfully linked to your account!\") }}</h3>\n                <div\n                  class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"\n                >\n                  <saving-animation\n                    :errors=\"errorMessages.printer_name\"\n                    :saving=\"saving.printer_name\"\n                  >\n                    <div class=\"printer-name-input\">\n                      <div class=\"edit-icon\">\n                        <i class=\"fas fa-pen\"></i>\n                      </div>\n                      <input\n                        v-model=\"verifiedPrinter.name\"\n                        type=\"text\"\n                        class=\"dark\"\n                        :placeholder=\"$t('Printer name')\"\n                        @input=\"updatePrinterName\"\n                      />\n                    </div>\n                  </saving-animation>\n                  <div>\n                    <div class=\"text-muted mx-auto text-center font-weight-light\">\n                      {{$t(\"Give your printer a shiny name.\")}}\n                    </div>\n                  </div>\n                </div>\n                <br /><br />\n                <div\n                  class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3 d-flex flex-column align-center justify-content-center\"\n                >\n                  <div v-if=\"redirectToTunnelCreation\" class=\"mt-4\">\n                    <a\n                      :href=\"redirectToTunnelCreation\"\n                      class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                      >{{ $t(\"Authorize App Access\") }}</a\n                    >\n                  </div>\n                  <div v-else>\n                    <div class=\"mt-4\">\n                      <a href=\"/printers/\" class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                        >{{ $t(\"Go Check Out Printer Feed!\") }}</a\n                      >\n                    </div>\n                    <div class=\"mt-5\">\n                      <a\n                        href=\"/user_preferences/notification_twilio/\"\n                        class=\"btn btn-outline-secondary btn-block mx-auto\"\n                        >{{ $t(\"Add Phone Number\") }}</a\n                      >\n                    </div>\n                    <div>\n                      <div class=\"text-muted mx-auto text-center font-weight-light\">\n                        {{$t(\"Receive text (SMS) in case of print failures.\")}}\n                      </div>\n                    </div>\n                    <div class=\"mt-4\">\n                      <a :href=\"editPrinterUrl\" class=\"btn btn-outline-secondary btn-block mx-auto\"\n                        >{{ $t(\"Change Printer Settings\") }}</a\n                      >\n                    </div>\n                    <div>\n                      <div class=\"text-muted mx-auto text-center font-weight-light\">\n                        {{$t(\"You can always change it later.\")}}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\n\nimport PageLayout from '@src/components/PageLayout.vue'\nimport SavingAnimation from '@src/components/SavingAnimation.vue'\nimport urls from '@config/server-urls'\n\nexport default {\n  components: {\n    PageLayout,\n    SavingAnimation,\n  },\n  data() {\n    return {\n      verifiedPrinter: null,\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        printer_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n    }\n  },\n  computed: {\n    redirectToTunnelCreation() {\n      return new URLSearchParams(window.location.search).get('redirectToTunnelCreation')\n    },\n    editPrinterUrl() {\n      return `/printers/${this.verifiedPrinter.id}/`\n    },\n\n\n  },\n  created() {\n    this.fetchPrinter()\n  },\n  methods: {\n    async fetchPrinter() {\n      const response = await axios.get(urls.printer(this.$route.params.printerId))\n      this.verifiedPrinter = response.data\n    },\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n    updatePrinterName() {\n      if ('name' in this.verifiedPrinter && this.verifiedPrinter.name) {\n        const delayInfo = this.delayedSubmit['printer_name']\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit['printer_name']['timeoutId'] = setTimeout(() => {\n          this.setSavingStatus('printer_name', true)\n          // Make request to API\n          return axios\n            .patch(urls.printer(this.verifiedPrinter.id), {\n              name: this.verifiedPrinter.name,\n            })\n            .then(() => {\n              this.setSavingStatus('printer_name', false)\n            })\n            .catch((error) => {\n              this.errorDialog(error, 'Failed to update printer name')\n            })\n        }, delayInfo['delay'])\n        return\n      } else {\n        const delayInfo = this.delayedSubmit['printer_name']\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AddPrinterSuccessPage.vue?vue&type=template&id=86b2242c&scoped=true&\"\nimport script from \"./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"\nexport * from \"./AddPrinterSuccessPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"86b2242c\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"printer-name truncated\"},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.name : '')+\" \")])]},proxy:true},{key:\"topBarRight\",fn:function(){return [(_vm.printer)?_c('div',{staticClass:\"action-panel\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":\"#\",\"title\":\"Share\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onSharePrinter()}}},[_c('i',{staticClass:\"fas fa-share-alt fa-lg\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Share\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/tunnels/${_vm.printer.id}/`,\"title\":\"OctoPrint Tunnel\"}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"OctoPrint Tunnel\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/printers/${_vm.printer.id}/`,\"title\":\"Configure\"}},[_c('i',{staticClass:\"fas fa-wrench\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Configure\")))])]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'share',\n              icon: 'fas fa-share-alt fa-lg',\n              title: _vm.$t('Share'),\n              callback: true,\n            },\n            {\n              key: 'tunnel',\n              svgIcon: 'svg-tunnel',\n              title: _vm.$t('OctoPrint Tunnel'),\n              href: `/tunnels/${_vm.printer.id}/`,\n            },\n            {\n              key: 'settings',\n              icon: 'fas fa-wrench',\n              title: _vm.$t('Configure'),\n              href: `/printers/${_vm.printer.id}/`,\n            },\n          ]},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1)],1):_vm._e()]},proxy:true},{key:\"content\",fn:function(){return [(!_vm.printer)?_c('loading-placeholder'):_c('div',{staticClass:\"page-container\",attrs:{\"fluid\":\"\"}},[_c('div',{staticClass:\"widgets-container\"},[_vm._l((_vm.widgets),function(widget){return [(_vm.isWidgetVisible(widget))?_c(widget.component,{key:widget.id,tag:\"component\",attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"print\":_vm.lastPrint},on:{\"sendPrinterAction\":_vm.onSendPrinterAction,\"notAFailureClicked\":_vm.onNotAFailureClicked,\"updateSettings\":_vm.onUpdateSettings}}):_vm._e()]}),_c('div',{staticClass:\"extra-actions\"},[_c('h2',{staticClass:\"section-title\"},[_vm._v(_vm._s(_vm.$t(\"Additional Actions\")))]),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\"},on:{\"click\":_vm.onReorderClicked}},[_c('i',{staticClass:\"fas fa-arrows-alt-v\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Reorder\"))+\" & \"+_vm._s(_vm.$t(\"Hide\"))+\" \")]),_c('div',{staticClass:\"text-muted extra-actions-explanation\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Customize this page for each of your printers by reodering or hiding cards above.\")))])]),_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\",\"href\":\"/printers/wizard/\"}},[_c('i',{staticClass:\"fas fa-plus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Add Printer\"))+\" \")]),_c('div',{staticClass:\"text-muted extra-actions-explanation\"},[_c('small',[_vm._v(_vm._s(_vm.$t(\"Link another printer to {brandName}.\",{brandName:_vm.$syndicateText.brandName})))])])],1)],2),_c('div',{staticClass:\"stream-container\"},[_c('div',{staticClass:\"header-container\"},[_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Webcam')))]),_c('div',{staticClass:\"d-flex align-items-center\"},[(_vm.webcams.length > 1)?_c('b-dropdown',{staticClass:\"webcam-dropdown\",attrs:{\"block\":\"\",\"size\":\"sm\",\"variant\":\"link\",\"toggle-class\":\"text-decoration-none\",\"no-caret\":\"\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fa fa-camera\",attrs:{\"aria-hidden\":\"true\"}}),_vm._v(\" \"+_vm._s(!!_vm.selectedWebcam ? (_vm.selectedWebcam.name || 'Primary') : 'All')+\" \"),_c('i',{staticClass:\"fa fa-chevron-down\",attrs:{\"aria-hidden\":\"true\"}})]},proxy:true}],null,false,255726031)},[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"WEBCAM SELECTION\")))]),_vm._l((_vm.webcams),function(webcam,index){return _c('b-dropdown-item',{key:index,attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.chooseWebcam(index, webcam.stream_id)}}},[_vm._v(_vm._s(webcam.name || 'Primary'))])}),_c('b-dropdown-item',{on:{\"click\":function($event){return _vm.chooseWebcam('all')}}},[_vm._v(_vm._s(_vm.$t('All')))])],2):_c('div',{staticClass:\"mr-3\"},[_c('i',{staticClass:\"fa fa-camera\",attrs:{\"aria-hidden\":\"true\"}}),_vm._v(\" \"+_vm._s(_vm.webcams.length ? _vm.webcams[0].name || 'Primary' : '')+\" \")])],1)]),(_vm.webcams.length || _vm.printer?.pic?.img_url)?_c('b-card-text',{staticClass:\"px-0 py-0 content d-inline-block\",staticStyle:{\"width\":\"100%\"}},[_c('b-row',[_c('b-col',{staticClass:\"pb-0\",staticStyle:{\"position\":\"relative\"}},[_c('b-container',{staticClass:\"p-0\",attrs:{\"fluid\":\"\"}},[_c('b-row',{staticStyle:{\"flex-direction\":\"column\",\"align-items\":\"center\"},attrs:{\"no-gutters\":\"\"}},[(_vm.webcams.length === 0 && _vm.printer?.pic?.img_url)?_c('b-col',{key:_vm.printer?.pic?.img_url,attrs:{\"cols\":12}},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"autoplay\":true,\"stickyStreamingSrc\":'IMAGE'}})],1)]):_vm._e(),_vm._l((_vm.webcams),function(webcam,index){return _c('b-col',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isWebcamSelected(webcam)),expression:\"isWebcamSelected(webcam)\"}],key:index},[_c('div',{staticClass:\"d-flex justify-content-center webcamBackground\"},[_c('streaming-box',{attrs:{\"printer\":_vm.printer,\"webrtc\":_vm.printerComm.webrtcConnections.get(webcam.name),\"autoplay\":_vm.user.is_pro,\"webcam\":webcam,\"halfHeight\":_vm.webcams.length > 1 && !_vm.selectedWebcam},on:{\"onRotateRightClicked\":(deg) => _vm.handleRotateRightClicked(deg, webcam.stream_id)}})],1)])})],2)],1)],1)],1)],1):_vm._e()],1)])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.isPrinting ? _vm.$t('Print Progress') : _vm.$t('Last Print')))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.print)?[_c('div',{staticClass:\"header\"},[_c('g-code-details',{staticClass:\"g-code-details\",attrs:{\"file\":_vm.print.g_code_file || { filename: _vm.print.filename },\"show-open-button\":_vm.print.g_code_file &&\n              !_vm.print.g_code_file.resident_printer &&\n              !_vm.print.g_code_file.deleted,\"show-details\":false}})],1),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"details\"},[(!_vm.isPrinting)?[_c('div',{staticClass:\"info-line no-border\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\"},[(!_vm.print.status.isActive)?_c('div',{staticClass:\"print-status-color\",class:_vm.print.status.key},[_vm._v(\" \"+_vm._s(_vm.print.status.title)+\" \")]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"far fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Started\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.print.started_at.format('MMM D, YYYY h:mm a')))])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Duration\")))])]),(!_vm.print.status.isActive)?_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.duration || '-')+\" \")]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]:[(_vm.isPrinting)?_c('div',{staticClass:\"progress-container\"},[_c('div',{staticClass:\"progress-bar-wrapper\"},[_c('div',{staticClass:\"progress-bar-inner\",style:(`width: ${_vm.printProgressPercentage}%`)})]),_c('div',{staticClass:\"percentage-progress\"},[_vm._v(_vm._s(_vm.printProgressPercentage)+\"%\")])]):_vm._e(),_c('div',{staticClass:\"info-line no-border\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-info\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Status\")))])]),_c('div',{staticClass:\"value\",class:'text-' + _vm.printer.calculatedStateColor()},[_vm._v(\" \"+_vm._s(_vm.printer.calculatedState())+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'layer-group']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Layer\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.layerProgress)+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Remaining\")))])]),_c('div',{staticClass:\"value\"},[(_vm.secondsLeft)?_c('span',[_vm._v(_vm._s(_vm.humanizedDuration(_vm.secondsLeft)))]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-flag-checkered\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Finishing at\")))])]),_c('div',{staticClass:\"value\"},[(_vm.finishingAt)?_c('span',[_vm._v(_vm._s(_vm.finishingAt))]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])])]),_c('collapsable-details',[_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-clock\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Started\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.print.started_at.format(_vm.DATE_TIME_FORMAT))+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Elapsed\")))])]),_c('div',{staticClass:\"value\"},[(_vm.timeElapsed)?_c('span',[_vm._v(_vm._s(_vm.timeElapsed))]):_c('b-spinner',{attrs:{\"small\":\"\"}})],1)]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'ruler-vertical']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Z-height\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.mmProgress)+\" \")])]),_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('i',{staticClass:\"fas fa-stopwatch\"})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total time\")))])]),(_vm.timeTotal)?_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.timeTotal)+\" \")]):_c('span',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Calculating...\")))])]),(_vm.print.filament_used)?_c('div',{staticClass:\"info-line\"},[_c('div',{staticClass:\"label\"},[_c('div',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'ruler-vertical']}})],1),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Total filament\")))])]),_c('div',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.humanizedFilamentUsage(_vm.print.filament_used))+\" \")])]):_vm._e()])]],2),(!_vm.isPrinting)?_c('div',{staticClass:\"actions\"},[_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-secondary\",\"href\":`/prints/${_vm.print.id}`}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Open Print\"))+\" \")]),(_vm.file.url)?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"secondary\",\"disabled\":_vm.isPrintStarting},on:{\"click\":_vm.onRepeatClicked}},[(_vm.isPrintStarting)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-redo\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Reprint\"))+\" \")],1):_vm._e()],1):_vm._e()])]:[_c('p',{staticClass:\"empty-state-text\"},[_vm._v(_vm._s(_vm.$t(\"No prints found\")))])]],2)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ isPrinting ? $t('Print Progress') : $t('Last Print') }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <template v-if=\"print\">\n          <div class=\"header\">\n            <g-code-details\n              :file=\"print.g_code_file || { filename: print.filename }\"\n              :show-open-button=\"\n                print.g_code_file &&\n                !print.g_code_file.resident_printer &&\n                !print.g_code_file.deleted\n              \"\n              :show-details=\"false\"\n              class=\"g-code-details\"\n            />\n          </div>\n\n          <div class=\"content\">\n            <div class=\"details\">\n              <!-- Last Print -->\n              <template v-if=\"!isPrinting\">\n                <div class=\"info-line no-border\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                    <div class=\"title\">{{ $t(\"Status\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <div\n                      v-if=\"!print.status.isActive\"\n                      class=\"print-status-color\"\n                      :class=\"print.status.key\"\n                    >\n                      {{ print.status.title }}\n                    </div>\n                    <!-- Show loader if printer not marked as ended yet -->\n                    <b-spinner v-else small></b-spinner>\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"far fa-clock\"></i></div>\n                    <div class=\"title\">{{ $t(\"Started\") }}</div>\n                  </div>\n                  <div class=\"value\">{{ print.started_at.format('MMM D, YYYY h:mm a') }}</div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                    <div class=\"title\">{{ $t(\"Duration\") }}</div>\n                  </div>\n                  <div v-if=\"!print.status.isActive\" class=\"value\">\n                    {{ print.duration || '-' }}\n                  </div>\n                  <!-- Show loader if printer not marked as ended yet -->\n                  <b-spinner v-else small></b-spinner>\n                </div>\n              </template>\n\n              <!-- Print Progress -->\n              <template v-else>\n                <div v-if=\"isPrinting\" class=\"progress-container\">\n                  <div class=\"progress-bar-wrapper\">\n                    <div\n                      class=\"progress-bar-inner\"\n                      :style=\"`width: ${printProgressPercentage}%`\"\n                    ></div>\n                  </div>\n                  <div class=\"percentage-progress\">{{ printProgressPercentage }}%</div>\n                </div>\n\n                <div class=\"info-line no-border\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-info\"></i></div>\n                    <div class=\"title\">{{ $t(\"Status\") }}</div>\n                  </div>\n                  <div class=\"value\" :class=\"'text-' + printer.calculatedStateColor()\">\n                    {{ printer.calculatedState() }}\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\">\n                      <font-awesome-icon :icon=\"['fas', 'layer-group']\" />\n                    </div>\n                    <div class=\"title\">{{ $t(\"Layer\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    {{ layerProgress }}\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\">\n                      <i class=\"fas fa-stopwatch\"></i>\n                    </div>\n                    <div class=\"title\">{{ $t(\"Remaining\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <span v-if=\"secondsLeft\">{{ humanizedDuration(secondsLeft) }}</span>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                </div>\n                <div class=\"info-line\">\n                  <div class=\"label\">\n                    <div class=\"icon\"><i class=\"fas fa-flag-checkered\"></i></div>\n                    <div class=\"title\">{{ $t(\"Finishing at\") }}</div>\n                  </div>\n                  <div class=\"value\">\n                    <span v-if=\"finishingAt\">{{ finishingAt }}</span>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                </div>\n                <collapsable-details>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-clock\"></i></div>\n                      <div class=\"title\">{{ $t(\"Started\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ print.started_at.format(DATE_TIME_FORMAT) }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\"><i class=\"fas fa-stopwatch\"></i></div>\n                      <div class=\"title\">{{ $t(\"Elapsed\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      <span v-if=\"timeElapsed\">{{ timeElapsed }}</span>\n                      <b-spinner v-else small></b-spinner>\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <font-awesome-icon :icon=\"['fas', 'ruler-vertical']\" />\n                      </div>\n                      <div class=\"title\">{{ $t(\"Z-height\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ mmProgress }}\n                    </div>\n                  </div>\n                  <div class=\"info-line\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <i class=\"fas fa-stopwatch\"></i>\n                      </div>\n                      <div class=\"title\">{{ $t(\"Total time\") }}</div>\n                    </div>\n                    <div v-if=\"timeTotal\" class=\"value\">\n                      {{ timeTotal }}\n                    </div>\n                    <span v-else class=\"text-secondary\">{{ $t(\"Calculating...\") }}</span>\n                  </div>\n                  <div class=\"info-line\" v-if=\"print.filament_used\">\n                    <div class=\"label\">\n                      <div class=\"icon\">\n                        <font-awesome-icon :icon=\"['fas', 'ruler-vertical']\" />\n                      </div>\n                      <div class=\"title\">{{ $t(\"Total filament\") }}</div>\n                    </div>\n                    <div class=\"value\">\n                      {{ humanizedFilamentUsage(print.filament_used) }}\n                    </div>\n                  </div>\n                </collapsable-details>\n              </template>\n            </div>\n\n            <div v-if=\"!isPrinting\" class=\"actions\">\n              <b-button\n                variant=\"outline-secondary\"\n                class=\"custom-button\"\n                :href=\"`/prints/${print.id}`\"\n              >\n                {{$t(\"Open Print\")}}\n              </b-button>\n              <b-button\n                v-if=\"file.url\"\n                variant=\"secondary\"\n                class=\"custom-button\"\n                :disabled=\"isPrintStarting\"\n                @click=\"onRepeatClicked\"\n              >\n                <b-spinner v-if=\"isPrintStarting\" small></b-spinner>\n                <i v-else class=\"fas fa-redo\"></i>\n                {{$t(\"Reprint\")}}\n              </b-button>\n            </div>\n          </div>\n        </template>\n        <template v-else>\n          <p class=\"empty-state-text\">{{ $t(\"No prints found\") }}</p>\n        </template>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport moment from 'moment'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport GCodeDetails from '@src/components/GCodeDetails.vue'\nimport { humanizedDuration, timeFromNow, humanizedFilamentUsage } from '@src/lib/formatters'\nimport { sendToPrint, confirmPrint } from '@src/components/g-codes/sendToPrint'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport CollapsableDetails from '@src/components/CollapsableDetails.vue'\n\nconst DATE_TIME_FORMAT = 'MMM D, h:mm a'\n\nexport default {\n  name: 'PrintProgressWidget',\n\n  components: {\n    WidgetTemplate,\n    GCodeDetails,\n    CollapsableDetails,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    print: {\n      type: Object,\n      default: null,\n    },\n  },\n\n  data() {\n    return {\n      DATE_TIME_FORMAT,\n      timeElapsed: null,\n      finishingAt: null,\n      startedAt: null,\n      printProgressPercentage: 0,\n      extraVisible: false,\n    }\n  },\n\n  computed: {\n    file() {\n      return this.print?.g_code_file || {}\n    },\n    isPrinting() {\n      return this.printer.isActive() && this.printer.progressCompletion() < 100\n    },\n    isPrintStarting() {\n      return this.printer.inTransientState()\n    },\n    mmProgress() {\n      let progressInMillimeters\n\n      const progressMillimeters = this.printer.status?.currentZ\n      const totalMillimeters = this.printer.status?.file_metadata?.analysis?.printingArea?.maxZ\n\n      if ((progressMillimeters || progressMillimeters == 0) && totalMillimeters) {\n        progressInMillimeters = `${progressMillimeters.toFixed(2)}/${totalMillimeters.toFixed(\n          2\n        )} mm`\n      }\n\n      return progressInMillimeters || '--/--'\n    },\n    layerProgress() {\n      let progressInLayers\n\n      const progressLayers = this.printer.status?.currentLayerHeight\n      const totalLayers = this.printer.status?.file_metadata?.obico?.totalLayerCount\n      if ((progressLayers || progressLayers == 0) && totalLayers) {\n        progressInLayers = `${Math.round(progressLayers)}/${Math.round(totalLayers)}`\n      }\n\n      return progressInLayers || '--/--'\n    },\n    timeTotal() {\n      let secs = null\n      if (this.secondsPrinted && this.secondsLeft) {\n        secs = this.secondsPrinted + this.secondsLeft\n        return humanizedDuration(secs)\n      }\n      return null\n    },\n    secondsPrinted() {\n      return this.printer?.status?.progress?.printTime ?? null\n    },\n    secondsLeft() {\n      return this.printer?.status?.progress?.printTimeLeft ?? null\n    },\n  },\n\n  watch: {\n    printer: {\n      handler: function (newValue, oldValue) {\n        if (this.isPrinting) {\n          this.updatePrintProgress()\n        }\n      },\n      deep: true,\n    },\n  },\n\n  mounted() {\n    if (this.isPrinting) {\n      this.updatePrintProgress()\n    }\n  },\n\n  unmounted() {\n    clearInterval(this.printerStateCheckInterval)\n  },\n\n  methods: {\n    humanizedDuration,\n    humanizedFilamentUsage,\n    toggleZHeightProgressType() {\n      this.preferZHeightProgressInLayers = !this.preferZHeightProgressInLayers\n      setLocalPref('preferZHeightProgressInLayers', this.preferZHeightProgressInLayers)\n    },\n    updatePrintProgress() {\n      if (!this.isPrinting) return\n      if (!this.print) return\n\n      // Time elapsed\n      const elapsed = moment.duration(moment().diff(this.print.started_at))\n      this.timeElapsed = this.print.status.isActive ? humanizedDuration(elapsed.asSeconds()) : null\n\n      this.finishingAt =\n        typeof this.secondsLeft === 'number'\n          ? timeFromNow(this.secondsLeft, DATE_TIME_FORMAT)\n          : null\n\n      // Progress bar\n      this.printProgressPercentage = Math.round(this.printer.progressCompletion())\n      this.printProgressMillimeters = Math.round(this.printer.status?.currentZ || 0)\n      this.printMillimetersTotal = Math.round(\n        this.printer.status?.file_metadata?.analysis?.printingArea?.maxZ || 0\n      )\n    },\n\n    onRepeatClicked() {\n      if (this.isPrinting) return\n\n      if (!this.print) {\n        console.error(\"Can't repeat last print: no last print\")\n        return\n      }\n      if (this.print.g_code_file.deleted) {\n        console.error(\"Can't repeat last print: G-Code deleted\")\n        return\n      }\n      if (!this.print.g_code_file.url) {\n        // Usually OctoPrint/Klipper files\n        console.error(\"Can't repeat last print: no G-Code file in storage\")\n        return\n      }\n\n      confirmPrint(this.print.g_code_file, this.printer).then(() => {\n        sendToPrint({\n          printer: this.printer,\n          gcode: this.print.g_code_file,\n          isCloud: this.print.g_code_file?.resident_printer === null,\n          Swal: this.$swal,\n        })\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  padding-bottom: 1rem\n\n.header\n  margin-bottom: 1rem\n\n.info-line\n  display: flex\n  align-items: center\n  justify-content: space-between\n  margin-bottm: 6px\n  padding: 6px 0\n  gap: .5rem\n  border-top: 1px solid var(--color-divider-muted)\n  &.no-border\n    border-top: none\n  .label\n    display: flex\n    align-items: center\n    flex: 1\n    gap: .5rem\n    line-height: 1.1\n    .icon\n      width: 1rem\n      text-align: center\n  .value\n    font-weight: bold\n\n.g-code-details\n  padding: 0\n  width: 100%\n\n.actions\n  margin-top: 1rem\n  display: flex\n  justify-content: center\n  gap: 1rem\n\n.progress-container\n  font-weight: bold\n  margin-bottom: 1rem\n  display: flex\n  gap: 1rem\n  align-items: center\n  .progress-bar-wrapper\n    height: 12px\n    flex: 1\n    border-radius: 999px\n    background-color: var(--color-background)\n    position: relative\n    top: 1px\n    overflow: hidden\n  .progress-bar-inner\n    height: 100%\n    // border-radius: 999px\n    background-color: var(--color-primary)\n.empty-state-text\n  text-align: center\n  font-size: 1.125rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintProgressWidget.vue?vue&type=template&id=5b7d73ac&scoped=true&\"\nimport script from \"./PrintProgressWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintProgressWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintProgressWidget.vue?vue&type=style&index=0&id=5b7d73ac&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5b7d73ac\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Failure Detection\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.isEnt)?_c('div',{staticClass:\"dh-balance-wrapper\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn hours-btn\",style:({ marginRight: `${String(_vm.dhBadgeNum).length * 0.25}rem` }),attrs:{\"href\":\"/user_preferences/dh/\",\"title\":_vm.dhBadgeNum + ' '+_vm.$t('AI Detection Hours')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-glass\"}})]),_c('span',{staticClass:\"badge badge-light\",attrs:{\"id\":\"user-credits\"}},[_vm._v(_vm._s(_vm.dhBadgeNum))]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"AI Detection Hours\")))])])]):_vm._e(),_c('div',{staticClass:\"header\"},[_c('div',{staticClass:\"gauge-wrapper\"},[_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.printer.normalized_p,\"is-watching\":_vm.isWatching}})],1),(_vm.printer.not_watching_reason)?_c('div',{staticClass:\"overlay-info\"},[_c('muted-alert',{staticClass:\"muted-alert\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Not watching\"))+\" (\"+_vm._s(_vm.printer.not_watching_reason)+\"). \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/detective-not-watching/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t(\"Learn all possible reasons\"))+\" \"),_c('small',[_c('i',{staticClass:\"fas fa-external-link-alt\"})])])])])],1):_vm._e()]),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"line\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Enable AI failure detection\"))+\" \"),(!_vm.enableFailureDetection)?_c('div',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI failure detection is disabled. You are on your own.\"))+\" \")]):_vm._e()]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'watching_enabled-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"watching_enabled\"},domProps:{\"checked\":_vm.enableFailureDetection},on:{\"click\":_vm.onFailureDetectionToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'watching_enabled-toggle-' + _vm.printer.id}})])])]),_c('div',{staticClass:\"line\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":'pause_on_failure-toggle-' + _vm.printer.id}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pause on detected failures\"))+\" \"),(!_vm.pauseOnFailure)?_c('div',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"You will still be alerted via notifications.\"))+\" \")]):_vm._e()]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'pause_on_failure-toggle-' + _vm.printer.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":_vm.pauseOnFailure},on:{\"click\":_vm.onPauseOnFailureToggled}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'pause_on_failure-toggle-' + _vm.printer.id}})])])])]),(_vm.printer.alertUnacknowledged())?_c('div',{staticClass:\"failure-detected-message\"},[_c('div',{staticClass:\"warning-message\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Failure Detected!\"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"outline-warning custom-button\"},on:{\"click\":function($event){return _vm.onNotAFailureClicked($event)}}},[_vm._v(_vm._s(_vm.$t(\"Not a Failure?\")))])],1):_vm._e()])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Failure Detection\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-if=\"isEnt\" class=\"dh-balance-wrapper\">\n          <a\n            href=\"/user_preferences/dh/\"\n            class=\"btn shadow-none action-btn icon-btn hours-btn\"\n            :style=\"{ marginRight: `${String(dhBadgeNum).length * 0.25}rem` }\"\n            :title=\"dhBadgeNum + ' '+$t('AI Detection Hours')\"\n          >\n            <svg class=\"custom-svg-icon\">\n              <use href=\"#svg-hour-glass\"></use>\n            </svg>\n            <span id=\"user-credits\" class=\"badge badge-light\">{{ dhBadgeNum }}</span>\n            <span class=\"sr-only\">{{ $t(\"AI Detection Hours\") }}</span>\n          </a>\n        </div>\n        <div class=\"header\">\n          <div class=\"gauge-wrapper\">\n            <failure-detection-gauge\n              :normalized-p=\"printer.normalized_p\"\n              :is-watching=\"isWatching\"\n            />\n          </div>\n          <div v-if=\"printer.not_watching_reason\" class=\"overlay-info\">\n            <muted-alert class=\"muted-alert\">\n              <span\n                >{{$t(\"Not watching\")}} ({{ printer.not_watching_reason }}).\n                <a\n                  :href=\"getDocUrl('/user-guides/detective-not-watching/')\"\n                  target=\"_blank\"\n                  >{{$t(\"Learn all possible reasons\")}}\n                  <small><i class=\"fas fa-external-link-alt\"></i></small></a\n              ></span>\n            </muted-alert>\n          </div>\n        </div>\n        <div class=\"controls\">\n          <div class=\"line\">\n            <label class=\"label\" :for=\"'watching_enabled-toggle-' + printer.id\">\n              {{$t(\"Enable AI failure detection\")}}\n              <div v-if=\"!enableFailureDetection\" class=\"text-muted\">\n                {{$t(\"AI failure detection is disabled. You are on your own.\")}}\n              </div>\n            </label>\n            <div class=\"switch\">\n              <div class=\"custom-control custom-switch\">\n                <input\n                  :id=\"'watching_enabled-toggle-' + printer.id\"\n                  type=\"checkbox\"\n                  name=\"watching_enabled\"\n                  class=\"custom-control-input update-printer\"\n                  :checked=\"enableFailureDetection\"\n                  @click=\"onFailureDetectionToggled\"\n                />\n                <label\n                  class=\"custom-control-label\"\n                  :for=\"'watching_enabled-toggle-' + printer.id\"\n                  style=\"font-size: 1rem\"\n                ></label>\n              </div>\n            </div>\n          </div>\n          <div class=\"line\">\n            <label class=\"label\" :for=\"'pause_on_failure-toggle-' + printer.id\">\n              {{ $t(\"Pause on detected failures\") }}\n              <div v-if=\"!pauseOnFailure\" class=\"text-muted\">\n                {{$t(\"You will still be alerted via notifications.\")}}\n              </div>\n            </label>\n            <div class=\"switch\">\n              <div class=\"custom-control custom-switch\">\n                <input\n                  :id=\"'pause_on_failure-toggle-' + printer.id\"\n                  type=\"checkbox\"\n                  name=\"pause_on_failure\"\n                  class=\"custom-control-input update-printer\"\n                  :checked=\"pauseOnFailure\"\n                  @click=\"onPauseOnFailureToggled\"\n                />\n                <label\n                  class=\"custom-control-label\"\n                  :for=\"'pause_on_failure-toggle-' + printer.id\"\n                  style=\"font-size: 1rem\"\n                ></label>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"printer.alertUnacknowledged()\" class=\"failure-detected-message\">\n          <div class=\"warning-message\">\n            <i class=\"fas fa-exclamation-triangle\"></i>\n            {{$t(\"Failure Detected!\")}}\n          </div>\n          <b-button variant=\"outline-warning custom-button\" @click=\"onNotAFailureClicked($event)\"\n            >{{ $t(\"Not a Failure?\") }}</b-button\n          >\n        </div>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport { user, settings } from '@src/lib/page-context'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nexport default {\n  name: 'FailureDetectionWidget',\n\n  components: {\n    WidgetTemplate,\n    FailureDetectionGauge,\n    MutedAlert,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      enableFailureDetection: false,\n      pauseOnFailure: false,\n      isEnt: false,\n    }\n  },\n\n  computed: {\n    dhBadgeNum() {\n      if (this.user && this.user.is_dh_unlimited) {\n        return 'Unlimited'\n      } else {\n        return Math.round(this.user.dh_balance)\n      }\n    },\n    isWatching() {\n      return !this.printer.not_watching_reason\n    },\n    notWatchingExplanation() {\n      if (this.isWatching) return ''\n      let reason = this.printer.not_watching_reason\n      return `${reason}`\n    },\n  },\n\n  created() {\n    this.user = user()\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n    this.enableFailureDetection = this.printer.watching_enabled\n    this.pauseOnFailure = this.printer.action_on_failure === 'PAUSE'\n  },\n\n  methods: {\n    onFailureDetectionToggled() {\n      this.enableFailureDetection = !this.enableFailureDetection\n      this.$emit('updateSettings', {\n        settingName: 'watching_enabled',\n        settingValue: this.enableFailureDetection,\n      })\n    },\n    onPauseOnFailureToggled() {\n      this.pauseOnFailure = !this.pauseOnFailure\n      this.$emit('updateSettings', {\n        settingName: 'action_on_failure',\n        settingValue: this.pauseOnFailure ? 'PAUSE' : 'NONE',\n      })\n    },\n    onNotAFailureClicked(event) {\n      this.$emit('notAFailureClicked', event, false)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  padding-bottom: 1rem\n\n.header\n  position: relative\n  display: flex\n  justify-content: center\n  align-items: center\n  @media (max-width: 510px)\n    flex-direction: column\n\n  .overlay-info\n    position: absolute\n    left: 0\n    bottom: 0\n    right: 0\n    top: 0\n    display: flex\n    align-items: center\n    justify-content: center\n    .muted-alert\n      position: relative\n      z-index: 2\n    &::before\n      content: ''\n      position: absolute\n      left: 0\n      bottom: 0\n      right: 0\n      top: 0\n      background: var(--color-surface-secondary)\n      z-index: 1\n      opacity: 0.97\n\n.controls\n  margin-top: 1rem\n  .line\n    display: flex\n    justify-content: space-between\n    align-items: center\n    padding: 0.5rem 0\n    border-bottom: 1px solid var(--color-divider-muted)\n    &:last-of-type\n      border-bottom: none\n    .label\n      margin-bottom: 0\n      font-size: 1rem\n      .text-muted\n        font-size: 0.875rem\n\n.failure-detected-message\n  margin-top: 1rem\n  display: flex\n  gap: 1.5rem\n  align-items: center\n  @media (max-width: 510px)\n    flex-direction: column\n    gap: 0.75rem\n  .warning-message\n    background-color: var(--color-warning)\n    color: var(--color-on-warning)\n    padding: 0.625rem 1rem\n    border-radius: var(--border-radius-sm)\n    flex: 1\n    text-align: center\n    font-weight: bold\n    font-size: normal\n    i\n      margin-right: 0.25rem\n\n.dh-balance-wrapper\n  position: absolute\n  top: 8px\n  right: 12px\n.btn.hours-btn\n  padding-left: 0\n  padding-right: 0\n  width: 36px\n  position: relative\n  color: var(--color-text-primary)\n  .badge\n    position: absolute\n    left: 18px\n    top: 4px\n    border-radius: var(--border-radius-sm)\n    background-color: var(--color-primary)\n    height: auto\n    font-size: .625rem\n.custom-svg-icon\n  height: 1.3rem\n  width: 1.3rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FailureDetectionWidget.vue?vue&type=template&id=b62a7098&scoped=true&\"\nimport script from \"./FailureDetectionWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./FailureDetectionWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FailureDetectionWidget.vue?vue&type=style&index=0&id=b62a7098&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b62a7098\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Temperature Controls\")))]},proxy:true},{key:\"content\",fn:function(){return [_vm._t(\"content\",function(){return [_c('div',{staticClass:\"wrapper\"},[(_vm.show)?[_vm._l((_vm.temperatures),function(item,key){return _c('temperature-item',{key:key,attrs:{\"temp-key\":key,\"temp-item\":item,\"is-plugin-version-sufficient\":_vm.isPluginVersionSufficient},on:{\"TempEditClicked\":function($event){return _vm.onEditClicked(key, item)}}})}),(_vm.isPluginVersionSufficient)?_c('b-button',{staticClass:\"custom-button\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.onTemperaturePresetsClicked}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Temperature Presets\"))+\" \")]):_vm._e()]:[_c('div',{staticClass:\"text-center mt-4\"},[_c('b-spinner'),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t(\"Loading temperature...\")))])],1)]],2)]})]},proxy:true}],null,true)})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',[_c('h5',[_vm._v(_vm._s(_vm.$t(\"Presets\"))+\":\")])]),_c('div',[_c('b-form-select',{staticClass:\"form-control\",attrs:{\"id\":\"id_preset\"},model:{value:(_vm.currentPreset),callback:function ($$v) {_vm.currentPreset=$$v},expression:\"currentPreset\"}},_vm._l((_vm.allPresets),function(pre){return _c('b-form-select-option',{key:pre.name,attrs:{\"value\":pre.name}},[_vm._v(\" \"+_vm._s(pre.name)+\" \")])}),1)],1),_c('muted-alert',{staticClass:\"mt-4 mb-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('Temperature presets can be edited or added in {agentName} settings.',{agentName: _vm.agentName}))+\" \")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentPreset),expression:\"currentPreset\"}],attrs:{\"id\":\"selected-preset\",\"type\":\"hidden\"},domProps:{\"value\":(_vm.currentPreset)},on:{\"input\":function($event){if($event.target.composing)return;_vm.currentPreset=$event.target.value}}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div>\n      <h5>{{ $t(\"Presets\") }}:</h5>\n    </div>\n    <div>\n      <b-form-select id=\"id_preset\" v-model=\"currentPreset\" class=\"form-control\">\n        <b-form-select-option v-for=\"pre in allPresets\" :key=\"pre.name\" :value=\"pre.name\">\n          {{ pre.name }}\n        </b-form-select-option>\n      </b-form-select>\n    </div>\n\n    <muted-alert class=\"mt-4 mb-1\">\n      {{ $t('Temperature presets can be edited or added in {agentName} settings.',{agentName}) }}\n      \n    </muted-alert>\n\n    <input id=\"selected-preset\" v-model=\"currentPreset\" type=\"hidden\" />\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nexport default {\n  name: 'TempPresets',\n\n  components: {\n    MutedAlert,\n  },\n\n  props: {\n    presets: {\n      type: Array,\n      required: true,\n    },\n    printer: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data: function () {\n    return {\n      currentPreset: null,\n    }\n  },\n\n  computed: {\n    allPresets() {\n      let presets = [...this.presets]\n      presets.push({ value: 0, name: 'OFF' })\n      return presets\n    },\n    agentName() {\n      return this.printer.agentDisplayName()\n    },\n  },\n\n  mounted() {\n    this.currentPreset = this.allPresets[0].name\n  },\n\n  methods: {},\n}\n</script>\n<style></style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempPresets.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TempPresets.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TempPresets.vue?vue&type=template&id=be0e3f46&\"\nimport script from \"./TempPresets.vue?vue&type=script&lang=js&\"\nexport * from \"./TempPresets.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Temperature Controls\") }}</template>\n    <template #content>\n      <slot name=\"content\">\n        <div class=\"wrapper\">\n          <template v-if=\"show\">\n            <temperature-item\n              v-for=\"(item, key) in temperatures\"\n              :key=\"key\"\n              :temp-key=\"key\"\n              :temp-item=\"item\"\n              :is-plugin-version-sufficient=\"isPluginVersionSufficient\"\n              @TempEditClicked=\"onEditClicked(key, item)\"\n            />\n            <b-button\n              v-if=\"isPluginVersionSufficient\"\n              variant=\"outline-primary\"\n              class=\"custom-button\"\n              @click=\"onTemperaturePresetsClicked\"\n            >\n              {{$t(\"Temperature Presets\")}}\n            </b-button>\n          </template>\n          <template v-else>\n            <div class=\"text-center mt-4\">\n              <b-spinner></b-spinner>\n              <p class=\"mt-2\">{{ $t(\"Loading temperature...\") }}</p>\n            </div>\n          </template>\n        </div>\n      </slot>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport TempTargetEditor from '@src/components/printers/TempTargetEditor.vue'\nimport TempPresets from '@src/components/printers/TempPresets.vue'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport get from 'lodash/get'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport TemperatureItem from '@src/components/printers/TemperatureItem.vue'\n\nexport default {\n  name: 'TemperatureWidget',\n\n  components: {\n    WidgetTemplate,\n    TemperatureItem,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    temperatures() {\n      const temperatures = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (Boolean(value.actual) && !isNaN(value.actual)) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          temperatures[key] = value\n        }\n      }\n      return temperatures\n    },\n    isPluginVersionSufficient() {\n      // If temp_profiles is missing, it's a plugin version too old to change temps\n      return get(this.printer, 'settings.temp_profiles') != undefined\n    },\n    show() {\n      return Object.keys(this.temperatures).length > 0\n    },\n  },\n\n  methods: {\n    temperatureDisplayName,\n    onEditClicked(key, item) {\n      if (!this.isPluginVersionSufficient || item.target === null) {\n        return\n      }\n\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let presets\n      let maxTemp = 350\n\n      if (key.search(/bed|chamber/) > -1) {\n        maxTemp = 140\n      }\n      if (key.search(/tool/) > -1) {\n        // OctoPrint uses 'extruder' for toolx heaters\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v['extruder'] }\n        })\n      } else {\n        presets = tempProfiles.map((v) => {\n          return { name: v.name, target: v[key] }\n        })\n      }\n\n      this.$swal\n        .openModalWithComponent(\n          TempTargetEditor,\n          {\n            presets: presets,\n            maxTemp: maxTemp,\n            curTarget: item.target,\n          },\n          {\n            title: 'Set ' + temperatureDisplayName(key) + ' Temperature',\n            confirmButtonText: 'Confirm',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                target: parseInt(document.getElementById('target-temp').value),\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value) {\n            let targetTemp = result.value.target\n            this.handleSetTemp(key, targetTemp)\n          }\n        })\n    },\n    onTemperaturePresetsClicked() {\n      let tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n\n      this.$swal\n        .openModalWithComponent(\n          TempPresets,\n          {\n            presets: tempProfiles,\n            printer: this.printer,\n          },\n          {\n            title: `${this.$i18next.t('Temperature Presets')}`,\n            confirmButtonText: 'Apply',\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                preset: document.getElementById('selected-preset').value,\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value?.preset) {\n            this.applyTempPreset(result.value.preset)\n          }\n        })\n    },\n    applyTempPreset(preset) {\n      const tempProfiles = get(this.printer, 'settings.temp_profiles', [])\n      let profile = tempProfiles.find((p) => p.name === preset)\n\n      const presetObj = {}\n\n      if (!profile) {\n        if (preset === 'OFF') {\n          presetObj.bed = 0\n          presetObj.extruder = 0\n          presetObj.chamber = 0\n        } else {\n          return\n        }\n      } else {\n        Object.entries(profile).forEach((p) => {\n          const presetName = p[0]\n          if (presetName.toLowerCase().includes('bed')) {\n            presetObj.bed = p[1]\n          } else if (\n            presetName.toLowerCase().includes('tool') ||\n            presetName.toLowerCase().includes('extruder')\n          ) {\n            presetObj.extruder = p[1]\n          } else if (presetName.toLowerCase().includes('chamber')) {\n            presetObj.chamber = p[1]\n          }\n        })\n      }\n\n      const temperatures = get(this.printer, 'status.temperatures', [])\n      Object.entries(temperatures).forEach((t) => {\n        const toolName = t[0]\n        if (toolName.toLowerCase().includes('bed')) {\n          this.handleSetTemp(toolName, presetObj.bed)\n        } else if (\n          toolName.toLowerCase().includes('tool') ||\n          toolName.toLowerCase().includes('extruder')\n        ) {\n          this.handleSetTemp(toolName, presetObj.extruder)\n        } else if (toolName.toLowerCase().includes('chamber') && presetObj.chamber) {\n          this.handleSetTemp(toolName, presetObj.chamber)\n        }\n      })\n    },\n    handleSetTemp(name, temp) {\n      this.printerComm.passThruToPrinter({\n        func: 'set_temperature',\n        target: '_printer',\n        args: [name, temp],\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding-bottom: 1rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TemperatureWidget.vue?vue&type=template&id=85ef39ce&scoped=true&\"\nimport script from \"./TemperatureWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./TemperatureWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TemperatureWidget.vue?vue&type=style&index=0&id=85ef39ce&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"85ef39ce\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [(_vm.activeMenu)?_c('div',{staticClass:\"nav-btn\",on:{\"click\":function($event){_vm.activeMenu = null}}},[_c('i',{staticClass:\"fas fa-arrow-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t(\"Back\"))+\" \")]):_c('span',[_vm._v(_vm._s(_vm.$t(\"Printer Controls\")))])]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.activeMenu),expression:\"!activeMenu\"}],staticClass:\"home-menu\"},[_c('button',{staticClass:\"menu-button\",attrs:{\"disabled\":_vm.printer.isActive()},on:{\"click\":function($event){_vm.activeMenu = 'move-head'}}},[_c('svg',{staticClass:\"icon move-xy\"},[_c('use',{attrs:{\"href\":\"#svg-move-xy\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Move Head\")))])]),_c('button',{staticClass:\"menu-button\",attrs:{\"disabled\":_vm.printer.isActive()},on:{\"click\":function($event){_vm.activeMenu = 'extrude'}}},[_c('svg',{staticClass:\"icon extruder\"},[_c('use',{attrs:{\"href\":\"#extruder\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Extrude\")))])]),(_vm.printer.isAgentMoonraker())?_c('button',{staticClass:\"menu-button\",on:{\"click\":function($event){_vm.activeMenu = 'baby-step-z'}}},[_c('svg',{staticClass:\"icon move-z\"},[_c('use',{attrs:{\"href\":\"#svg-move-z\"}})]),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Baby Step Z\")))])]):_vm._e(),(!_vm.hideTunePrinter)?_c('button',{staticClass:\"menu-button\",on:{\"click\":function($event){_vm.activeMenu = 'tune-printer'}}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'gear']}}),_c('div',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t(\"Tune Printer\")))])],1):_vm._e()]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'move-head'),expression:\"activeMenu === 'move-head'\"}],staticClass:\"control-panel move-head\"},[_c('div',{staticClass:\"main\"},[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.xyzJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.xyzJogDistance.value },on:{\"click\":function($event){_vm.xyzJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"xy-move\"},[_c('div',{staticClass:\"left\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.x, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-left\"})]),_c('div',{staticClass:\"right\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.x, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-right\"})]),_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.y, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.y, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})]),_c('div',{staticClass:\"home\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.xy, _vm.directions.home)}}},[_c('i',{staticClass:\"fas fa-home\"})])]),_c('div',{staticClass:\"z-move\"},[_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})]),_c('div',{staticClass:\"home\",on:{\"click\":function($event){return _vm.xyzControl(_vm.axis.z, _vm.directions.home)}}},[_c('i',{staticClass:\"fas fa-home\"})])])]),_c('div',{staticClass:\"additional\"},[_c('div',{staticClass:\"control-btn\",on:{\"click\":_vm.homeAll}},[_c('i',{staticClass:\"fas fa-home\"}),_vm._v(_vm._s(_vm.$t(\" Home All\")))]),_c('div',{staticClass:\"control-btn\",on:{\"click\":_vm.disableSteppers}},[_c('i',{staticClass:\"fas fa-power-off\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Disable Steppers\"))+\" \")])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'extrude'),expression:\"activeMenu === 'extrude'\"}],staticClass:\"control-panel extrude\"},[_c('div',{staticClass:\"main\"},[(_vm.showExtrudeControl)?[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.extrudeJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.extrudeJogDistance.value },on:{\"click\":function($event){_vm.extrudeJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"main-buttons\"},[_c('div',{staticClass:\"control-btn\",on:{\"click\":function($event){return _vm.handleFilament(_vm.filamentDirections.retract)}}},[_c('i',{staticClass:\"fas fa-minus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Retract\"))+\" \")]),_c('div',{staticClass:\"control-btn\",on:{\"click\":function($event){return _vm.handleFilament(_vm.filamentDirections.extrude)}}},[_c('i',{staticClass:\"fas fa-plus\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Extrude\"))+\" \")])])]:[_c('div',{staticClass:\"text-center mt-4\"},[_c('b-spinner'),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t(\"Loading tools...\")))])],1)]],2),(_vm.showToolsSelector)?_c('div',{staticClass:\"additional\"},[_c('b-form-select',{staticClass:\"form-control tool-select\",model:{value:(_vm.activeTool),callback:function ($$v) {_vm.activeTool=$$v},expression:\"activeTool\"}},_vm._l((_vm.tools),function(item,key){return _c('b-form-select-option',{key:key,attrs:{\"value\":key}},[_vm._v(\" \"+_vm._s(_vm.temperatureDisplayName(key))+\" \")])}),1)],1):_vm._e(),(_vm.activeToolTemperature)?_c('div',{staticClass:\"extrude-temperature\"},[_c('div',{staticClass:\"temperature-icon\"},[_c('svg',[_c('use',{attrs:{\"href\":\"#extruder\"}})])]),_c('div',{staticClass:\"temperature-tool truncated\"},[_vm._v(_vm._s(_vm.activeToolDisplayName))]),_c('div',{staticClass:\"temperature-value\"},[_c('span',[_vm._v(_vm._s(_vm.activeToolActualTemperature))]),(_vm.activeToolTargetTemperature)?_c('span',{staticClass:\"temperature-target\"},[_vm._v(\" / \"+_vm._s(_vm.activeToolTargetTemperature)+\" \")]):_vm._e()])]):_vm._e()]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'baby-step-z'),expression:\"activeMenu === 'baby-step-z'\"}],staticClass:\"control-panel baby-step-z\"},[_c('div',{staticClass:\"main\"},[_c('div',{staticClass:\"toggles\"},_vm._l((_vm.zOffsetJogDistance.options),function(option){return _c('div',{key:'xyz-' + option,staticClass:\"pill\",class:{ active: option === _vm.zOffsetJogDistance.value },on:{\"click\":function($event){_vm.zOffsetJogDistance.value = option}}},[_vm._v(\" \"+_vm._s(option)+\" \")])}),0),_c('div',{staticClass:\"z-move\"},[_c('div',{staticClass:\"up\",on:{\"click\":function($event){return _vm.controlZOffset(_vm.directions.up)}}},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('div',{staticClass:\"down\",on:{\"click\":function($event){return _vm.controlZOffset(_vm.directions.down)}}},[_c('i',{staticClass:\"fas fa-arrow-down\"})])])]),_c('div',{staticClass:\"additional\"},[_c('div',{staticClass:\"current-offset\"},[_c('div',{staticClass:\"label\"},[_vm._v(_vm._s(_vm.$t(\"Current Offset\")))]),_c('div',{staticClass:\"value\"},[(_vm.currentZOffset || typeof _vm.currentZOffset === 'number')?_c('span',[_vm._v(\" \"+_vm._s(_vm.currentZOffset)+\" \")]):_c('span',[_c('b-spinner',{attrs:{\"small\":\"\"}})],1)])])])]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.activeMenu === 'tune-printer'),expression:\"activeMenu === 'tune-printer'\"}],staticClass:\"control-panel tune-printer\"},[(!_vm.printer.isAgentMoonraker() || _vm.currentFeedRate !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Feed Rate / Speed\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"print-speed-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFeedRateFactor === null || parseInt(_vm.customFeedRateFactor) < 1},on:{\"click\":function($event){return _vm.setPrintSpeed(_vm.customFeedRateFactor)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,3696614275)},[_c('b-form-input',{attrs:{\"placeholder\":\"100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFeedRateFactor),callback:function ($$v) {_vm.customFeedRateFactor=$$v},expression:\"customFeedRateFactor\"}})],1)],1)])]:_vm._e(),(!_vm.printer.isAgentMoonraker() || _vm.currentFlowRate !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Flow Rate\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"flow-rate-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFlowRateFactor === null || parseInt(_vm.customFlowRateFactor) < 1},on:{\"click\":function($event){return _vm.setFlowRate(_vm.customFlowRateFactor)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,4188500917)},[_c('b-form-input',{attrs:{\"placeholder\":\"100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFlowRateFactor),callback:function ($$v) {_vm.customFlowRateFactor=$$v},expression:\"customFlowRateFactor\"}})],1)],1)])]:_vm._e(),(!_vm.printer.isAgentMoonraker() || _vm.currentFanSpeed !== null)?[_c('div',{staticClass:\"controls-title\"},[_c('span',[_vm._v(_vm._s(_vm.$t(\"Fan Speed\")))]),_c('help-widget',{staticClass:\"help-message\",attrs:{\"id\":\"fan-speed-widget-help\"}})],1),_c('div',{staticClass:\"controls\"},[_c('b-button',{staticClass:\"off\",attrs:{\"variant\":\"background\",\"small\":\"\"},on:{\"click\":function($event){{\n                  _vm.customFanSpeed = 0\n                  _vm.setFanSpeed(0)\n                }}}},[_vm._v(_vm._s(_vm.$t(\"0% (Off)\")))]),_c('div',{staticClass:\"custom\"},[_c('b-input-group',{attrs:{\"prepend\":\"%\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('b-button',{attrs:{\"variant\":\"background\",\"disabled\":_vm.customFanSpeed === null ||\n                      parseInt(_vm.customFanSpeed) > 100 ||\n                      parseInt(_vm.customFanSpeed) < 0},on:{\"click\":function($event){return _vm.setFanSpeed(_vm.customFanSpeed)}}},[_vm._v(_vm._s(_vm.$t(\"Apply\")))])]},proxy:true}],null,false,22301740)},[_c('b-form-input',{attrs:{\"placeholder\":\"0-100\",\"type\":\"number\"},on:{\"focus\":function($event){return $event.target.select()}},model:{value:(_vm.customFanSpeed),callback:function ($$v) {_vm.customFanSpeed=$$v},expression:\"customFanSpeed\"}})],1)],1),_c('b-button',{staticClass:\"btn\",attrs:{\"variant\":\"background\",\"small\":\"\"},on:{\"click\":function($event){{\n                  _vm.customFanSpeed = 100\n                  _vm.setFanSpeed(100)\n                }}}},[_vm._v(\"100%\")])],1)]:_vm._e(),(!_vm.printer.isAgentMoonraker())?_c('muted-alert',{staticClass:\"info-block\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"These settings can only be set. They can't be read back from the firmware due to a limitation of the communication protocol.\"))+\" \")]):_vm._e()],2)])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>\n      <div v-if=\"activeMenu\" class=\"nav-btn\" @click=\"activeMenu = null\">\n        <i class=\"fas fa-arrow-left\"></i>&nbsp;&nbsp;{{$t(\"Back\")}}\n      </div>\n      <span v-else>{{ $t(\"Printer Controls\") }}</span>\n    </template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div v-show=\"!activeMenu\" class=\"home-menu\">\n          <button\n            class=\"menu-button\"\n            :disabled=\"printer.isActive()\"\n            @click=\"activeMenu = 'move-head'\"\n          >\n            <svg class=\"icon move-xy\"><use href=\"#svg-move-xy\" /></svg>\n            <div class=\"title\">{{ $t(\"Move Head\") }}</div>\n          </button>\n          <button\n            class=\"menu-button\"\n            :disabled=\"printer.isActive()\"\n            @click=\"activeMenu = 'extrude'\"\n          >\n            <svg class=\"icon extruder\"><use href=\"#extruder\" /></svg>\n            <div class=\"title\">{{ $t(\"Extrude\") }}</div>\n          </button>\n          <button\n            v-if=\"printer.isAgentMoonraker()\"\n            class=\"menu-button\"\n            @click=\"activeMenu = 'baby-step-z'\"\n          >\n            <svg class=\"icon move-z\"><use href=\"#svg-move-z\" /></svg>\n            <div class=\"title\">{{ $t(\"Baby Step Z\") }}</div>\n          </button>\n          <button v-if=\"!hideTunePrinter\" class=\"menu-button\" @click=\"activeMenu = 'tune-printer'\">\n            <font-awesome-icon :icon=\"['fas', 'gear']\" />\n            <div class=\"title\">{{ $t(\"Tune Printer\") }}</div>\n          </button>\n        </div>\n\n        <!-- Move Head -->\n        <div v-show=\"activeMenu === 'move-head'\" class=\"control-panel move-head\">\n          <div class=\"main\">\n            <div class=\"toggles\">\n              <div\n                v-for=\"option in xyzJogDistance.options\"\n                :key=\"'xyz-' + option\"\n                class=\"pill\"\n                :class=\"{ active: option === xyzJogDistance.value }\"\n                @click=\"xyzJogDistance.value = option\"\n              >\n                {{ option }}\n              </div>\n            </div>\n            <div class=\"xy-move\">\n              <div class=\"left\" @click=\"xyzControl(axis.x, directions.down)\">\n                <i class=\"fas fa-arrow-left\"></i>\n              </div>\n              <div class=\"right\" @click=\"xyzControl(axis.x, directions.up)\">\n                <i class=\"fas fa-arrow-right\"></i>\n              </div>\n              <div class=\"up\" @click=\"xyzControl(axis.y, directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"xyzControl(axis.y, directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n              <div class=\"home\" @click=\"xyzControl(axis.xy, directions.home)\">\n                <i class=\"fas fa-home\"></i>\n              </div>\n            </div>\n            <div class=\"z-move\">\n              <div class=\"up\" @click=\"xyzControl(axis.z, directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"xyzControl(axis.z, directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n              <div class=\"home\" @click=\"xyzControl(axis.z, directions.home)\">\n                <i class=\"fas fa-home\"></i>\n              </div>\n            </div>\n          </div>\n          <div class=\"additional\">\n            <div class=\"control-btn\" @click=\"homeAll\"><i class=\"fas fa-home\"></i>{{ $t(\" Home All\") }}</div>\n            <div class=\"control-btn\" @click=\"disableSteppers\">\n              <i class=\"fas fa-power-off\"></i> {{$t(\"Disable Steppers\")}}\n            </div>\n          </div>\n        </div>\n\n        <!-- Extrude -->\n        <div v-show=\"activeMenu === 'extrude'\" class=\"control-panel extrude\">\n          <div class=\"main\">\n            <template v-if=\"showExtrudeControl\">\n              <div class=\"toggles\">\n                <div\n                  v-for=\"option in extrudeJogDistance.options\"\n                  :key=\"'xyz-' + option\"\n                  class=\"pill\"\n                  :class=\"{ active: option === extrudeJogDistance.value }\"\n                  @click=\"extrudeJogDistance.value = option\"\n                >\n                  {{ option }}\n                </div>\n              </div>\n              <div class=\"main-buttons\">\n                <div class=\"control-btn\" @click=\"handleFilament(filamentDirections.retract)\">\n                  <i class=\"fas fa-minus\"></i> {{$t(\"Retract\")}}\n                </div>\n                <div class=\"control-btn\" @click=\"handleFilament(filamentDirections.extrude)\">\n                  <i class=\"fas fa-plus\"></i> {{$t(\"Extrude\")}}\n                </div>\n              </div>\n            </template>\n            <template v-else>\n              <div class=\"text-center mt-4\">\n                <b-spinner></b-spinner>\n                <p class=\"mt-2\">{{ $t(\"Loading tools...\") }}</p>\n              </div>\n            </template>\n          </div>\n          <div v-if=\"showToolsSelector\" class=\"additional\">\n            <b-form-select v-model=\"activeTool\" class=\"form-control tool-select\">\n              <b-form-select-option v-for=\"(item, key) in tools\" :key=\"key\" :value=\"key\">\n                {{ temperatureDisplayName(key) }}\n              </b-form-select-option>\n            </b-form-select>\n          </div>\n          <div v-if=\"activeToolTemperature\" class=\"extrude-temperature\">\n            <div class=\"temperature-icon\">\n              <svg>\n                <use href=\"#extruder\" />\n              </svg>\n            </div>\n            <div class=\"temperature-tool truncated\">{{ activeToolDisplayName }}</div>\n            <div class=\"temperature-value\">\n              <span>{{ activeToolActualTemperature }}</span>\n              <span v-if=\"activeToolTargetTemperature\" class=\"temperature-target\">\n                / {{ activeToolTargetTemperature }}\n              </span>\n            </div>\n          </div>\n        </div>\n\n        <!-- Baby Step Z -->\n        <div v-show=\"activeMenu === 'baby-step-z'\" class=\"control-panel baby-step-z\">\n          <div class=\"main\">\n            <div class=\"toggles\">\n              <div\n                v-for=\"option in zOffsetJogDistance.options\"\n                :key=\"'xyz-' + option\"\n                class=\"pill\"\n                :class=\"{ active: option === zOffsetJogDistance.value }\"\n                @click=\"zOffsetJogDistance.value = option\"\n              >\n                {{ option }}\n              </div>\n            </div>\n            <div class=\"z-move\">\n              <div class=\"up\" @click=\"controlZOffset(directions.up)\">\n                <i class=\"fas fa-arrow-up\"></i>\n              </div>\n              <div class=\"down\" @click=\"controlZOffset(directions.down)\">\n                <i class=\"fas fa-arrow-down\"></i>\n              </div>\n            </div>\n          </div>\n          <div class=\"additional\">\n            <div class=\"current-offset\">\n              <div class=\"label\">{{ $t(\"Current Offset\") }}</div>\n              <div class=\"value\">\n                <span v-if=\"currentZOffset || typeof currentZOffset === 'number'\">\n                  {{ currentZOffset }}\n                </span>\n                <span v-else>\n                  <b-spinner small></b-spinner>\n                </span>\n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- Tune Printer -->\n        <div v-show=\"activeMenu === 'tune-printer'\" class=\"control-panel tune-printer\">\n          <template v-if=\"!printer.isAgentMoonraker() || currentFeedRate !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Feed Rate / Speed\") }}</span>\n              <help-widget id=\"print-speed-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFeedRateFactor === null || parseInt(customFeedRateFactor) < 1\n                      \"\n                      @click=\"setPrintSpeed(customFeedRateFactor)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFeedRateFactor\"\n                    placeholder=\"100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isAgentMoonraker() || currentFlowRate !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Flow Rate\") }}</span>\n              <help-widget id=\"flow-rate-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFlowRateFactor === null || parseInt(customFlowRateFactor) < 1\n                      \"\n                      @click=\"setFlowRate(customFlowRateFactor)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFlowRateFactor\"\n                    placeholder=\"100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n            </div>\n          </template>\n\n          <template v-if=\"!printer.isAgentMoonraker() || currentFanSpeed !== null\">\n            <div class=\"controls-title\">\n              <span>{{ $t(\"Fan Speed\") }}</span>\n              <help-widget id=\"fan-speed-widget-help\" class=\"help-message\"></help-widget>\n            </div>\n            <div class=\"controls\">\n              <b-button\n                class=\"off\"\n                variant=\"background\"\n                small\n                @click=\"\n                  {\n                    customFanSpeed = 0\n                    setFanSpeed(0)\n                  }\n                \"\n                >{{ $t(\"0% (Off)\") }}</b-button\n              >\n              <div class=\"custom\">\n                <b-input-group prepend=\"%\">\n                  <template #append>\n                    <b-button\n                      variant=\"background\"\n                      :disabled=\"\n                        customFanSpeed === null ||\n                        parseInt(customFanSpeed) > 100 ||\n                        parseInt(customFanSpeed) < 0\n                      \"\n                      @click=\"setFanSpeed(customFanSpeed)\"\n                      >{{ $t(\"Apply\") }}</b-button\n                    >\n                  </template>\n                  <b-form-input\n                    v-model=\"customFanSpeed\"\n                    placeholder=\"0-100\"\n                    type=\"number\"\n                    @focus=\"$event.target.select()\"\n                  ></b-form-input>\n                </b-input-group>\n              </div>\n              <b-button\n                class=\"btn\"\n                variant=\"background\"\n                small\n                @click=\"\n                  {\n                    customFanSpeed = 100\n                    setFanSpeed(100)\n                  }\n                \"\n                >100%</b-button\n              >\n            </div>\n          </template>\n\n          <muted-alert v-if=\"!printer.isAgentMoonraker()\" class=\"info-block\">\n            {{$t(\"These settings can only be set. They can't be read back from the firmware due to a limitation of the communication protocol.\")}}\n          </muted-alert>\n        </div>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport get from 'lodash/get'\nimport { temperatureDisplayName } from '@src/lib/utils'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport MutedAlert from '@src/components/MutedAlert.vue'\n\nconst AXIS = {\n  x: 'x',\n  y: 'y',\n  z: 'z',\n  xy: ['x', 'y'],\n  xyz: ['x', 'y', 'z'],\n}\n\nconst DIRECTIONS = {\n  up: 1,\n  down: -1,\n  home: 0,\n}\n\nconst FILAMENT_DIRECTIONS = {\n  retract: -1,\n  extrude: 1,\n}\n\nexport default {\n  name: 'PrinterControlWidget',\n\n  components: {\n    WidgetTemplate,\n    HelpWidget,\n    MutedAlert,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      activeMenu: null, // 'move-head' | 'extrude' | 'baby-step-z'\n\n      axis: AXIS,\n      directions: DIRECTIONS,\n      filamentDirections: FILAMENT_DIRECTIONS,\n\n      xyzJogDistance: {\n        value: 10,\n        options: [1, 10, 50, 100],\n      },\n      extrudeJogDistance: {\n        value: 10,\n        options: [1, 10, 50],\n      },\n      zOffsetJogDistance: {\n        value: 0.01,\n        options: [0.005, 0.01, 0.05, 0.1],\n      },\n      activeTool: null,\n\n      currentZOffset: null,\n\n      customFeedRateFactor: null,\n      customFlowRateFactor: null,\n      customFanSpeed: null,\n    }\n  },\n\n  computed: {\n    tools() {\n      const extruders = {}\n      for (const [key, value] of Object.entries(get(this.printer, 'status.temperatures', {}))) {\n        if (\n          Boolean(value.actual) &&\n          !isNaN(value.actual) &&\n          (key.toLowerCase().includes('tool') || key.toLowerCase().includes('extruder'))\n        ) {\n          // Take out NaN, 0, null. Apparently printers like Prusa throws random temperatures here.\n          extruders[key] = value\n        }\n      }\n      return extruders\n    },\n    showExtrudeControl() {\n      return Object.keys(this.tools).length > 0\n    },\n    showToolsSelector() {\n      return Object.keys(this.tools).length > 1\n    },\n    activeToolTemperature() {\n      return this.activeTool ? this.tools[this.activeTool] : null\n    },\n    activeToolDisplayName() {\n      return this.activeTool ? temperatureDisplayName(this.activeTool) : ''\n    },\n    activeToolActualTemperature() {\n      if (!this.activeToolTemperature || isNaN(this.activeToolTemperature.actual)) {\n        return null\n      }\n      return `${parseFloat(this.activeToolTemperature.actual).toFixed(1)} °C`\n    },\n    activeToolTargetTemperature() {\n      const target = this.activeToolTemperature?.target\n      if (target === null || target === undefined || isNaN(target)) {\n        return null\n      }\n      return `${Math.round(target)} °C`\n    },\n    currentFeedRate() {\n      const val = this.printer.status?.currentFeedRate\n      return val !== undefined ? val : null\n    },\n    currentFlowRate() {\n      const val = this.printer.status?.currentFlowRate\n      return val !== undefined ? val : null\n    },\n    currentFanSpeed() {\n      const val = this.printer.status?.currentFanSpeed\n      return val !== undefined ? val : null\n    },\n    hideTunePrinter() {\n      return (\n        this.printer.isAgentMoonraker() &&\n        this.currentFlowRate === null &&\n        this.currentFanSpeed === null &&\n        this.currentFeedRate === null\n      )\n    },\n  },\n\n  watch: {\n    tools: {\n      handler: function (newValue, prevValue) {\n        const toolKeys = Object.keys(newValue || {})\n        if (toolKeys.length === 0) {\n          this.activeTool = null\n        } else if (\n          !this.activeTool ||\n          !Object.prototype.hasOwnProperty.call(newValue, this.activeTool)\n        ) {\n          this.activeTool = toolKeys[0]\n        }\n      },\n      immediate: true,\n    },\n    printer: {\n      handler: function (newValue, oldValue) {\n        if (newValue.isActive() && ['move-head', 'extrude'].includes(this.activeMenu)) {\n          this.activeMenu = null\n        }\n      },\n      deep: true,\n    },\n    xyzJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`xyz-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    extrudeJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`extrude-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    zOffsetJogDistance: {\n      handler: function (newValue, oldValue) {\n        if (isLocalStorageSupported()) {\n          localStorage.setItem(`z-offset-mm-per-step-${this.printer.id}`, newValue.value)\n        }\n      },\n      deep: true,\n    },\n    activeMenu(newValue, oldValue) {\n      if (newValue === 'baby-step-z') {\n        this.getCurrentZOffset()\n      } else if (newValue === 'tune-printer') {\n        this.customFeedRateFactor =\n          this.currentFeedRate !== null ? Math.round(this.currentFeedRate * 100) : null\n        this.customFlowRateFactor =\n          this.currentFlowRate !== null ? Math.round(this.currentFlowRate * 100) : null\n        this.customFanSpeed =\n          this.currentFanSpeed !== null ? Math.round(this.currentFanSpeed * 100) : null\n      }\n    },\n  },\n\n  created() {\n    // Get jogDistance from localStorage or set default value\n    if (isLocalStorageSupported()) {\n      this.xyzJogDistance.value =\n        +localStorage.getItem(`xyz-mm-per-step-${this.printer.id}`) || this.xyzJogDistance.value\n\n      this.extrudeJogDistance.value =\n        +localStorage.getItem(`extrude-mm-per-step-${this.printer.id}`) ||\n        this.extrudeJogDistance.value\n\n      this.zOffsetJogDistance.value =\n        +localStorage.getItem(`z-offset-mm-per-step-${this.printer.id}`) ||\n        this.zOffsetJogDistance.value\n    }\n\n    // Listen for ESC key to close active menu\n    const onEscape = (e) => {\n      if (e.keyCode === 27) {\n        this.activeMenu = null\n      }\n    }\n    document.addEventListener('keydown', onEscape)\n    this.$once('hook:destroyed', () => {\n      document.removeEventListener('keydown', onEscape)\n    })\n  },\n\n  methods: {\n    // XYZ Control\n    xyzControl(axis, direction) {\n      let args = []\n      let func = 'jog'\n      if (direction === this.directions.home) {\n        args.push(axis)\n        func = 'home'\n      } else {\n        args.push({ [axis]: direction * this.xyzJogDistance.value })\n      }\n      const payload = { func: func, target: '_printer', args: args }\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n    getCurrentZOffset() {\n      const moonrakerPayload = { func: 'printer/objects/query?gcode_move', target: 'moonraker_api' }\n      this.printerComm.passThruToPrinter(moonrakerPayload, (err, ret) => {\n        if (err) {\n          this.currentZOffset = 'no reading'\n        } else {\n          const offset = ret.status.gcode_move.homing_origin[2]\n          const cleanOffset = parseFloat(offset.toFixed(3))\n          this.currentZOffset = cleanOffset\n        }\n      })\n    },\n    homeAll() {\n      this.xyzControl(this.axis.xyz, this.directions.home)\n    },\n    disableSteppers() {\n      const octoPayload = { func: 'commands', target: '_printer', args: ['M18'] }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: 'M18' },\n      }\n\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n\n    // Extrude / Retract\n    temperatureDisplayName,\n    handleFilament(direction) {\n      const currentToolTemp = this.tools[this.activeTool].actual\n      if (currentToolTemp < 179) {\n        this.$swal.Confirm.fire({\n          title: `${this.$i18next.t('Unable to extrude / retract')}`,\n          html: `<p class=\"text-center\">${this.$i18next.t(\"The hotend is below the minimum temperature\")}</p>`,\n          confirmButtonText: `${this.$i18next.t('Heat to 180°C')}`,\n          cancelButtonText: `${this.$i18next.t('Cancel')}`,\n        }).then((result) => {\n          if (result.isConfirmed) {\n            this.printerComm.passThruToPrinter(\n              { func: 'set_temperature', target: '_printer', args: [this.activeTool, 180] },\n              (err, ret) => {\n                if (err) {\n                  this.$swal.Toast.fire({\n                    icon: 'error',\n                    title: err,\n                  })\n                }\n              }\n            )\n          }\n        })\n\n        return\n      }\n\n      const toolNum = Object.entries(this.tools).findIndex((t) => t[0] === this.activeTool)\n      const changeAmount = direction * this.extrudeJogDistance.value\n      const commandScript = `M83\\nT${toolNum}\\nG1 E${changeAmount} F300`\n\n      const octoPayload = { func: 'commands', target: '_printer', args: [commandScript] }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: commandScript },\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n\n    // Baby Step Z\n    controlZOffset(direction) {\n      const changeAmount = this.zOffsetJogDistance.value * direction\n      const octoVal = Math.round(changeAmount * 10000) / 10000\n      const moonrakerVal = octoVal > 0 ? `+${octoVal}` : `${octoVal}`\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [`M290 Z ${octoVal}`],\n        force: true,\n      }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: `SET_GCODE_OFFSET Z_ADJUST=${moonrakerVal}` },\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.currentZOffset = null\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        } else {\n          this.getCurrentZOffset()\n        }\n      })\n    },\n\n    // Print Speed / Flow Rate / Fan Speed\n    setPrintSpeed(value) {\n      if (value === null || value < 1) return\n      this.sendCommandToPrinter(`M220 S${Math.round(value)}`)\n    },\n    setFlowRate(value) {\n      if (value === null || value < 1) return\n      this.sendCommandToPrinter(`M221 S${Math.round(value)}`)\n    },\n    setFanSpeed(value) {\n      if (value === null || value < 0 || value > 100) return\n      let command = value === 0 ? 'M107' : `M106 S${Math.round((value / 100) * 255)}`\n      this.sendCommandToPrinter(command)\n    },\n    sendCommandToPrinter(command, { onError, onSuccess } = {}) {\n      const payload = this.printer.isAgentMoonraker()\n        ? {\n            func: 'printer/gcode/script',\n            target: 'moonraker_api',\n            kwargs: { script: command },\n          }\n        : {\n            func: 'commands',\n            target: '_printer',\n            args: [command],\n          }\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          if (onError) {\n            onError(err, ret)\n          } else {\n            this.$swal.Toast.fire({\n              icon: 'error',\n              title: err,\n            })\n          }\n        } else {\n          if (onSuccess) {\n            onSuccess(err, ret)\n          } else {\n            this.$swal.Toast.fire({\n              icon: 'success',\n              title: `${this.$i18next.t('Command successfully sent!')}`,\n            })\n          }\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.nav-btn\n  display: inline-block\n  color: var(--color-text-primary)\n  cursor: pointer\n\n.wrapper\n  padding-bottom: 1.5rem\n  min-height: 260px\n  display: flex\n  justify-content: center\n  align-items: center\n\n.home-menu\n  display: flex\n  flex-direction: row\n  justify-content: center\n  gap: 1rem\n  width: 100%\n  flex-wrap: wrap\n  @media (max-width: 510px)\n    gap: .5rem\n\n.menu-button\n  width: calc((100% - 3rem) / 3)\n  flex-shrink: 0\n  padding: 1.5rem 1rem\n  background-color: var(--color-background)\n  color: var(--color-text-primary)\n  border: none\n  border-radius: var(--border-radius-md)\n  display: flex\n  flex-direction: column\n  align-items: center\n  justify-content: center\n  gap: .5rem\n  cursor: pointer\n  @media (max-width: 510px)\n    width: calc((100% - 2rem) / 3)\n    padding: 1rem 0.5rem\n  &:hover\n    opacity: .8\n  &:disabled\n    opacity: .5\n    cursor: not-allowed\n  i, svg\n    font-size: 1.75rem\n    @media (max-width: 510px)\n      font-size: 1.2rem\n.icon\n  --icon-size: 42px\n  width: var(--icon-size)\n  height: var(--icon-size)\n  color: var(--color-text-primary)\n  &.move-xy\n    --icon-size: 38px\n  &.extruder\n    --icon-size: 36px\n  @media (max-width: 510px)\n    --icon-size: 24px !important\n.title\n  font-size: 0.875rem\n  line-height: 1.2\n\n\n.control-panel\n  width: 100%\n  .main\n    display: flex\n    align-items: center\n    justify-content: center\n    gap: 2rem\n    margin-bottom: 2rem\n    @media (max-width: 510px)\n      gap: 1rem\n  .toggles\n    display: flex\n    flex-direction: column\n    gap: .5rem\n  .pill\n    padding: .25rem\n    width: 3.5rem\n    background-color: var(--color-secondary)\n    color: var(--color-on-secondary)\n    border-radius: 999px\n    font-size: 0.875rem\n    text-align: center\n    cursor: pointer\n    &.active\n      background-color: var(--color-primary)\n      color: var(--color-on-primary)\n  .xy-move, .z-move\n    width: 146px\n    height: 146px\n    border-radius: var(--border-radius-md)\n    background-color: var(--color-background)\n    color: var(--color-text-primary)\n    position: relative\n    .left, .right, .up, .down, .home\n      position: absolute\n      width: 42px\n      height: 42px\n      font-size: 1.25rem\n      text-align: center\n      line-height: 42px\n      margin: auto\n      left: 0\n      right: 0\n      top: 0\n      bottom: 0\n      cursor: pointer\n      &:hover\n        opacity: .8\n    .left\n      right: unset\n    .right\n      left: unset\n    .up\n      bottom: unset\n    .down\n      top: unset\n\n  .z-move\n    width: 60px\n  .additional\n    display: flex\n    justify-content: center\n    gap: 1rem\n  .control-btn\n    display: flex\n    align-items: center\n    gap: .5rem\n    cursor: pointer\n    background-color: var(--color-background)\n    border-radius: var(--border-radius-sm)\n    color: var(--color-text-primary)\n    padding: .5rem 1rem\n    font-size: 0.875rem\n    &:hover\n      opacity: .8\n\n.current-offset\n  display: flex\n  gap: 1rem\n  border: 1px solid var(--color-divider-muted)\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n  padding: .5rem 1rem\n  font-size: 0.875rem\n  .value\n    font-weight: bold\n\n.main-buttons\n  display: flex\n  flex-direction: column\n  gap: 1rem\n  .control-btn\n    font-size: 1rem\n    border-radius: var(--border-radius-md)\n    padding: .625rem 1.5rem\n\n.tool-select\n  width: 80%\n\n.extrude-temperature\n  display: flex\n  align-items: center\n  gap: .875rem\n  width: 100%\n  min-height: 62px\n  margin-top: 1rem\n  padding: .8125rem\n  border-radius: var(--border-radius-md)\n  background-color: var(--color-background)\n  color: var(--color-text-primary)\n  .temperature-icon\n    width: 36px\n    height: 36px\n    flex-shrink: 0\n    display: flex\n    align-items: center\n    justify-content: center\n    background-color: var(--color-primary)\n    color: var(--color-on-primary)\n    border-radius: var(--border-radius-sm)\n    svg\n      width: 20px\n      height: 20px\n  .temperature-tool\n    min-width: 0\n    font-size: 1rem\n    font-weight: 600\n  .temperature-value\n    display: flex\n    gap: .375rem\n    align-items: baseline\n    margin-left: auto\n    white-space: nowrap\n    font-size: 1rem\n    font-weight: bold\n  .temperature-target\n    color: var(--color-text-secondary)\n\n.tune-printer\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n\n  .controls-title\n    font-size: 1rem\n    width: 100%\n    display: flex\n    gap: .375rem\n  .controls\n    width: 100%\n    display: flex\n    gap: .75rem\n    margin-bottom: 1rem\n\n    .off\n      flex-shrink: 0\n      width: 100px\n\n    .custom\n      border-radius: 100px\n      overflow: hidden\n      flex: 1\n\n    ::v-deep .input-group-text\n      background-color: var(--color-divider)\n      color: var(--color-text-primary)\n\n    @media (max-width: 510px)\n      flex-direction: column\n      .off\n        width: 100%\n\n  .info-block\n    width: 100%\n\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterControlWidget.vue?vue&type=template&id=8cc7b434&scoped=true&\"\nimport script from \"./PrinterControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterControlWidget.vue?vue&type=style&index=0&id=8cc7b434&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"8cc7b434\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper\"},[_c('draggable',{attrs:{\"ghost-class\":\"ghost\",\"handle\":\".handle\"},on:{\"start\":function($event){_vm.dragging = true},\"end\":function($event){_vm.dragging = false}},model:{value:(_vm.currentItems),callback:function ($$v) {_vm.currentItems=$$v},expression:\"currentItems\"}},_vm._l((_vm.currentItems),function(item){return _c('div',{key:item.id,staticClass:\"item\"},[_c('div',{staticClass:\"handle\"},[_c('i',{staticClass:\"fas fa-grip-lines\"})]),_c('div',{staticClass:\"title\"},[_c('span',[_vm._v(_vm._s(_vm.getTitle(item.id)))])]),_c('div',{staticClass:\"switch\"},[_c('div',{staticClass:\"custom-control custom-switch\"},[_c('input',{staticClass:\"custom-control-input update-printer\",attrs:{\"id\":'widget-toggle-' + item.id,\"type\":\"checkbox\",\"name\":\"pause_on_failure\"},domProps:{\"checked\":item.enabled},on:{\"click\":function($event){return _vm.toggleItemEnabled(item)}}}),_c('label',{staticClass:\"custom-control-label\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"for\":'widget-toggle-' + item.id}})])])])}),0),_c('input',{ref:\"sortingConfig\",attrs:{\"id\":\"sorting-config\",\"type\":\"hidden\"}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"wrapper\">\n    <draggable\n      v-model=\"currentItems\"\n      ghost-class=\"ghost\"\n      handle=\".handle\"\n      @start=\"dragging = true\"\n      @end=\"dragging = false\"\n    >\n      <div v-for=\"item in currentItems\" :key=\"item.id\" class=\"item\">\n        <div class=\"handle\">\n          <i class=\"fas fa-grip-lines\"></i>\n        </div>\n        <div class=\"title\">\n          <span>{{ getTitle(item.id) }}</span>\n        </div>\n        <div class=\"switch\">\n          <div class=\"custom-control custom-switch\">\n            <input\n              :id=\"'widget-toggle-' + item.id\"\n              type=\"checkbox\"\n              name=\"pause_on_failure\"\n              class=\"custom-control-input update-printer\"\n              :checked=\"item.enabled\"\n              @click=\"toggleItemEnabled(item)\"\n            />\n            <label\n              class=\"custom-control-label\"\n              :for=\"'widget-toggle-' + item.id\"\n              style=\"font-size: 1rem\"\n            ></label>\n          </div>\n        </div>\n      </div>\n    </draggable>\n    <input id=\"sorting-config\" ref=\"sortingConfig\" type=\"hidden\" />\n  </div>\n</template>\n\n<script>\nimport draggable from 'vuedraggable'\n\nexport default {\n  name: 'ReorderModal',\n\n  components: {\n    draggable,\n  },\n\n  props: {\n    items: {\n      type: Array,\n      required: true,\n    },\n    extraInfo: {\n      type: Array,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      dragging: false,\n      currentItems: [],\n    }\n  },\n\n  watch: {\n    dragging(newVal, oldVal) {\n      if (!newVal) {\n        this.saveNewOrder()\n      }\n    },\n  },\n\n  created() {\n    this.currentItems = JSON.parse(JSON.stringify(this.items))\n  },\n\n  mounted() {},\n\n  methods: {\n    getTitle(id) {\n      return this.extraInfo.find((item) => item.id === id).title\n    },\n    toggleItemEnabled(item) {\n      item.enabled = !item.enabled\n      this.saveNewOrder()\n    },\n    saveNewOrder() {\n      this.$refs.sortingConfig.value = JSON.stringify(this.currentItems)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: column\n  gap: 1rem\n\n.item\n  display: flex\n  align-items: center\n  gap: .5rem\n  border-bottom: 1px solid var(--color-divider-muted)\n  padding: .5rem 0\n  .handle\n    font-size: 1.25rem\n    color: var(--color-text-secondary)\n    cursor: move\n  .title\n    flex: 1\n  &.ghost\n    opacity: .1\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ReorderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ReorderModal.vue?vue&type=template&id=74b26ea3&scoped=true&\"\nimport script from \"./ReorderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ReorderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReorderModal.vue?vue&type=style&index=0&id=74b26ea3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"74b26ea3\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Printer Terminal\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"terminal-widget\"},[_c('printer-terminal',{attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"show-full-screen-opt\":true}})],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:['wrapper', { 'full-screen-height': _vm.fullScreenHeight }]},[_c('div',{staticClass:\"actionWrap\"},[(_vm.showFullScreenOpt)?_c('a',{attrs:{\"href\":`/printers/${_vm.printer.id}/terminal/`}},[_c('b-button',{staticClass:\"actionBtn\",attrs:{\"disabled\":!_vm.feedIsOn}},[_c('i',{staticClass:\"fas fa-expand actionIcon\"})])],1):_vm._e(),(_vm.canToggleFeed)?_c('b-button',{staticClass:\"actionBtn\",on:{\"click\":_vm.toggleTerminalPower}},[(_vm.feedIsOn === null)?_c('b-spinner',{attrs:{\"small\":\"\"}}):_c('i',{class:['fas', 'fa-power-off', 'actionIcon', { 'text-primary': !_vm.feedIsOn }]})],1):_vm._e(),_c('b-button',{staticClass:\"actionBtn\",attrs:{\"disabled\":!_vm.feedIsOn},on:{\"click\":_vm.clearFeed}},[_c('i',{staticClass:\"fas fa-trash actionIcon\"})]),_c('b-dropdown',{staticClass:\"actionBtnNoP\",attrs:{\"disabled\":!_vm.feedIsOn,\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"action-btn icon-btn\",\"menu-class\":\"scrollable\",\"title\":\"Filter\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_c('div',[_c('div',[_c('b-dropdown-text',{staticClass:\"small text-secondary\"},[_vm._v(_vm._s(_vm.$t(\"Filter\")))]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('temperature', !_vm.hideTempMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideTempMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-fire\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress Temperature\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('sd', !_vm.hideSDMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideSDMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-sd-card\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress SD Status Messages\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('gcode', !_vm.hideGCodeMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideGCodeMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-code\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress Position Messages\")))])])])]),_c('b-dropdown-item',{nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.updateFilterPrefs('ok', !_vm.hideOKMessages)}}},[_c('div',{staticClass:\"dropdown-text-group\"},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: _vm.hideOKMessages ? 'visible' : 'hidden' })}),_c('div',{staticClass:\"filterItemH\"},[_c('i',{staticClass:\"fas fa-thumbs-up\"}),_c('div',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.$t(\"Suppress 'OK' Messages\")))])])])])],1)])])],1),_c('terminal-feed-view',{staticClass:\"feedWrap\",attrs:{\"terminal-feed-array\":_vm.terminalFeedArray,\"feed-is-on\":_vm.feedIsOn}}),_c('div',{staticClass:\"inputWrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.inputValue),expression:\"inputValue\"}],staticClass:\"textInput\",attrs:{\"disabled\":!_vm.feedIsOn,\"type\":\"text\",\"placeholder\":_vm.$t('Enter code...')},domProps:{\"value\":(_vm.inputValue)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.sendMessage.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.inputValue=$event.target.value}}}),_c('b-button',{staticClass:\"sendBtn\",attrs:{\"disabled\":!_vm.feedIsOn,\"variant\":\"outline-primary\"},on:{\"click\":_vm.sendMessage}},[_c('i',{staticClass:\"fas fa-chevron-right text-primary-icon\"})])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"feedWrap\",attrs:{\"colorScheme\":\"background\"}},[(!_vm.feedIsOn)?_c('div',{staticStyle:{\"width\":\"100%\"}},[_c('p',{staticStyle:{\"margin\":\"0\",\"margin-top\":\"5px\",\"text-align\":\"center\"}},[_c('i',{staticClass:\"fas fa-power-off\",staticStyle:{\"margin-right\":\"5px\"}}),_vm._v(_vm._s(_vm.$t(\"Terminal feed is off\"))+\" \")])]):_vm._l((_vm.terminalFeedArray),function(feed,index){return _c('div',{key:index,staticClass:\"itemWrap\"},[(feed?.msg)?_c('div',{staticClass:\"terminalText\"},[_c('p',{staticClass:\"messageTimeStamp\"},[_vm._v(\" \"+_vm._s(feed.normalTimeStamp)+\" \")]),_c('p',{staticClass:\"messageText\"},[_vm._v(\" \"+_vm._s(feed.msg)+\" \")])]):_vm._e(),_c('div',{staticClass:\"divider\"})])})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"feedWrap\" colorScheme=\"background\">\n    <div v-if=\"!feedIsOn\" style=\"width: 100%\">\n      <p style=\"margin: 0; margin-top: 5px; text-align: center\">\n        <i class=\"fas fa-power-off\" style=\"margin-right: 5px\"></i>{{$t(\"Terminal feed is off\")}}\n      </p>\n    </div>\n    <div v-else v-for=\"(feed, index) in terminalFeedArray\" :key=\"index\" class=\"itemWrap\">\n      <div v-if=\"feed?.msg\" class=\"terminalText\">\n        <p class=\"messageTimeStamp\">\n          {{ feed.normalTimeStamp }}\n        </p>\n        <p class=\"messageText\">\n          {{ feed.msg }}\n        </p>\n      </div>\n      <div class=\"divider\"></div>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'TerminalFeedView',\n\n  components: {},\n\n  props: {\n    terminalFeedArray: {\n      type: Array,\n      required: true,\n    },\n    feedIsOn: {\n      type: Boolean,\n      required: true,\n    },\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.feedWrap\n  display: flex\n  align-items: flex-start\n  flex-direction: column\n  overflow-y: scroll\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.feedWrap::-webkit-scrollbar\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.feedWrap::-webkit-scrollbar-thumb\n  background-color: var(--color-surface-primary)\n  border-radius:  var(--border-radius-md)\n\n.filterItemH\n  display: flex\n  flex-direction: row\n  align-items: center\n\n.terminalText\n  display: flex\n  align-items: center\n  flex-direction: row\n\n.messageTimeStamp\n  opacity: 0.8\n  margin-right: 20px\n  font-size: 0.7rem\n  margin-top: 7px\n  margin-bottom: 7px\n.divider\n  width: 100%\n  background-color: var(--color-divider)\n  height: 1px\n\n.itemWrap\n  display: flex\n  flex-direction: column\n  width: 100%\n.messageText\n  margin-top: 7px\n  margin-bottom: 7px\n  white-space: pre-wrap\n  word-break: break-all\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalFeedView.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TerminalFeedView.vue?vue&type=template&id=04d63edc&scoped=true&\"\nimport script from \"./TerminalFeedView.vue?vue&type=script&lang=js&\"\nexport * from \"./TerminalFeedView.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TerminalFeedView.vue?vue&type=style&index=0&id=04d63edc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"04d63edc\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div :class=\"['wrapper', { 'full-screen-height': fullScreenHeight }]\">\n    <div class=\"actionWrap\">\n      <a v-if=\"showFullScreenOpt\" :href=\"`/printers/${printer.id}/terminal/`\">\n        <b-button :disabled=\"!feedIsOn\" class=\"actionBtn\">\n          <i class=\"fas fa-expand actionIcon\"></i>\n        </b-button>\n      </a>\n      <b-button v-if=\"canToggleFeed\" class=\"actionBtn\" @click=\"toggleTerminalPower\">\n        <b-spinner v-if=\"feedIsOn === null\" small />\n        <i v-else :class=\"['fas', 'fa-power-off', 'actionIcon', { 'text-primary': !feedIsOn }]\"></i>\n      </b-button>\n      <b-button :disabled=\"!feedIsOn\" class=\"actionBtn\" @click=\"clearFeed\">\n        <i class=\"fas fa-trash actionIcon\"></i>\n      </b-button>\n      <b-dropdown\n        :disabled=\"!feedIsOn\"\n        right\n        no-caret\n        class=\"actionBtnNoP\"\n        toggle-class=\"action-btn icon-btn\"\n        menu-class=\"scrollable\"\n        title=\"Filter\"\n      >\n        <template #button-content>\n          <i class=\"fas fa-filter\"></i>\n        </template>\n        <div>\n          <div>\n            <b-dropdown-text class=\"small text-secondary\">{{ $t(\"Filter\") }}</b-dropdown-text>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"\n                updateFilterPrefs('temperature', !hideTempMessages)\n              \"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideTempMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-fire\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress Temperature\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('sd', !hideSDMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideSDMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-sd-card\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress SD Status Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('gcode', !hideGCodeMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideGCodeMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-code\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress Position Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n            <b-dropdown-item\n              @click.native.capture.stop.prevent=\"updateFilterPrefs('ok', !hideOKMessages)\"\n            >\n              <div class=\"dropdown-text-group\">\n                <i\n                  class=\"fas fa-check text-primary\"\n                  :style=\"{ visibility: hideOKMessages ? 'visible' : 'hidden' }\"\n                ></i>\n                <div class=\"filterItemH\">\n                  <i class=\"fas fa-thumbs-up\"></i>\n                  <div class=\"text\">{{ $t(\"Suppress 'OK' Messages\") }}</div>\n                </div>\n              </div>\n            </b-dropdown-item>\n          </div>\n        </div>\n      </b-dropdown>\n    </div>\n    <terminal-feed-view\n      class=\"feedWrap\"\n      :terminal-feed-array=\"terminalFeedArray\"\n      :feed-is-on=\"feedIsOn\"\n    />\n    <div class=\"inputWrap\">\n      <input\n        :disabled=\"!feedIsOn\"\n        v-model=\"inputValue\"\n        type=\"text\"\n        class=\"textInput\"\n        :placeholder=\"$t('Enter code...')\"\n        @keyup.enter=\"sendMessage\"\n      />\n      <b-button\n        :disabled=\"!feedIsOn\"\n        variant=\"outline-primary\"\n        class=\"sendBtn\"\n        @click=\"sendMessage\"\n      >\n        <i class=\"fas fa-chevron-right text-primary-icon\"></i>\n      </b-button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport moment from 'moment'\nimport TerminalFeedView from '@src/components/terminal/TerminalFeedView'\n\nexport default {\n  name: 'PrinterTerminal',\n\n  components: {\n    TerminalFeedView,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n    fullScreenHeight: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    showFullScreenOpt: {\n      type: Boolean,\n      required: true,\n      default: true,\n    },\n  },\n\n  data() {\n    return {\n      oldTerminalFeed: null,\n      terminalFeedArray: [],\n      inputValue: '',\n      hideTempMessages: true,\n      hideSDMessages: true,\n      hideOKMessages: true,\n      hideGCodeMessages: true,\n      feedIsOn: true,\n    }\n  },\n\n  computed: {\n    canToggleFeed() {\n      if (this.printer.isAgentMoonraker()) {\n        return false\n      }\n      return this.printer.isAgentVersionGte('2.4.7', '0.0.0')\n    },\n  },\n\n  created() {\n    this.printerComm.onTerminalFeedReceived = this.onNextTerminalFeed\n    this.terminalSetup()\n  },\n\n  mounted() {\n    const hideTempPref = localStorage.getItem(`printer-terminal-filter-prefs-temperature`)\n    const hideSDPref = localStorage.getItem(`printer-terminal-filter-prefs-sd`)\n    const hideOKPref = localStorage.getItem(`printer-terminal-filter-prefs-ok`)\n    const hideGCodePref = localStorage.getItem(`printer-terminal-filter-prefs-gcode`)\n    if (hideTempPref) {\n      this.hideTempMessages = JSON.parse(hideTempPref)\n    }\n    if (hideSDPref) {\n      this.hideSDMessages = JSON.parse(hideSDPref)\n    }\n    if (hideGCodePref) {\n      this.hideGCodeMessages = JSON.parse(hideGCodePref)\n    }\n    if (hideOKPref) {\n      this.hideOKMessages = JSON.parse(hideOKPref)\n    }\n  },\n\n  methods: {\n    onNextTerminalFeed(newTerminalFeed) {\n      const sameMsg = newTerminalFeed?.msg === this.oldTerminalFeed?.msg\n      const same_ts = newTerminalFeed?._ts === this.oldTerminalFeed?._ts\n      const newMsg = newTerminalFeed?.msg\n\n      this.oldTerminalFeed = newTerminalFeed\n      const tempRegex = /((N\\d+\\s+)?M105)|((ok\\s+([PBN]\\d+\\s+)*)?([BCLPR]|T\\d*):-?\\d+)/g\n      const SDRegex = /((N\\d+\\s+)?M27)|(SD printing byte)|(Not SD printing)/g\n      const gCodeRegex = /^G[0-3].*$/g\n\n      if (this.hideSDMessages && SDRegex.test(newMsg)) return\n      if (this.hideTempMessages && tempRegex.test(newMsg)) return\n      if (this.hideGCodeMessages && gCodeRegex.test(newMsg)) return\n      if (this.hideOKMessages && newMsg.toLowerCase().trim() === 'ok') return\n      if (!sameMsg && !same_ts) {\n        newTerminalFeed.normalTimeStamp = moment().format('h:mm:ssa')\n        newTerminalFeed.msg = newMsg.trim() // remove unnecessary whitespace\n        this.terminalFeedArray.unshift(newTerminalFeed)\n      }\n    },\n\n    sendMessage() {\n      if (!this.inputValue.length) return\n      if (!this.feedIsOn) return\n      const newString = this.inputValue.toUpperCase()\n\n      if (this.printer.isAgentMoonraker()) {\n        this.onNextTerminalFeed({ msg: newString, _ts: new Date() }) // Moonraker doesn't echo the gcodes user enters. Hence we need to insert them to the terminal\n      }\n\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: { script: `${newString}` },\n      }\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [`${newString}`],\n        force: true,\n      }\n\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n      this.inputValue = ''\n    },\n    clearFeed() {\n      this.terminalFeedArray = []\n    },\n    updateFilterPrefs(str, val) {\n      localStorage.setItem(`printer-terminal-filter-prefs-${str}`, JSON.stringify(val))\n      if (str === 'temperature') {\n        this.hideTempMessages = val\n      } else if (str === 'gcode') {\n        this.hideGCodeMessages = val\n      } else if (str === 'ok') {\n        this.hideOKMessages = val\n      } else {\n        this.hideSDMessages = val\n      }\n    },\n    async terminalSetup() {\n      if (!this.canToggleFeed) {\n        this.feedIsOn = true\n        return\n      }\n\n      this.printerComm.passThruToPrinter(\n        {\n          func: 'toggle_terminal_feed',\n          target: 'gcode_hooks',\n          args: ['get'],\n        },\n        (err, ret) => {\n          this.feedIsOn = ret || false\n        }\n      )\n    },\n\n    async toggleTerminalPower() {\n      const str = this.feedIsOn ? 'off' : 'on'\n      this.feedIsOn = null\n      this.clearFeed()\n      this.printerComm.passThruToPrinter(\n        {\n          func: 'toggle_terminal_feed',\n          target: 'gcode_hooks',\n          args: [str],\n        },\n        (err, ret) => {\n          this.feedIsOn = ret || false\n        }\n      )\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n\n.full-screen-height\n  height: calc(100vh - 50px - var(--gap-between-blocks))\n  margin-bottom: -120px\n\n.wrapper\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: .825rem\n  padding-bottom: 1rem\n  position: relative\n  width: 100%\n\n.feedWrap\n  display: flex\n  flex-direction: column\n  flex: 1\n  padding: 10px\n  width: 100%\n  background-color: var(--color-background)\n  border: solid var(--color-surface-primary) 1px\n.feedWrap::-webkit-scrollbar\n  background-color: var(--color-background)\n.feedWrap::-webkit-scrollbar-thumb\n  background-color: var(--color-surface-primary)\n\n.inputWrap\n  display: flex\n  flex-direction: row\n  justify-content: space-between\n  height: 50px\n  width: 100%\n  gap: 1rem\n\n.textInput\n  height: 100%\n  flex: 1\n  padding: 10px\n\n.sendBtn\n  height: 100%\n  width: auto\n  min-width: 60px\n  border-radius: var(--border-radius-sm)\n  background-color: var(--color-surface-primary)\n  border: none\n\n.actionBtn\n  margin-left: 5px\n  margin-right: 5px\n  padding: 10px 16px\n  height: 100%\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-surface-primary)\n  border-radius: var(--border-radius-sm)\n  border: none\n  &:hover\n    cursor: pointer\n\n.actionBtnNoP\n  margin-left: 5px\n  margin-right: 5px\n  height: 100%\n  display: flex\n  align-items: center\n  justify-content: center\n  background-color: var(--color-surface-primary)\n  border-radius: var(--border-radius-sm)\n  z-index: 1\n  &:hover\n    cursor: pointer\n\n.actionIcon\n  width: 16px\n  height: 16px\n  color: var(--color-text-primary)\n\n.text-primary-icon\n  color: var(--color-text-primary)\n\n.actionWrap\n  display: flex\n  flex-direction: row\n  top: 0px\n  right: 15px\n  align-items: center\n  justify-content: flex-end\n  width: 100%\n  padding: 10px 15px\n\n.filterItemH\n  display: flex\n  flex-direction: row\n  align-items: center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterTerminal.vue?vue&type=template&id=7c771c69&scoped=true&\"\nimport script from \"./PrinterTerminal.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterTerminal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterTerminal.vue?vue&type=style&index=0&id=7c771c69&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c771c69\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <widget-template>\n    <template #title>{{ $t(\"Printer Terminal\") }}</template>\n    <template #content>\n      <div class=\"terminal-widget\">\n        <printer-terminal\n          :printer=\"printer\"\n          :printer-comm=\"printerComm\"\n          :show-full-screen-opt=\"true\"\n        ></printer-terminal>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\nimport PrinterTerminal from '@src/components/terminal/PrinterTerminal'\n\nexport default {\n  name: 'TerminalWidget',\n\n  components: {\n    WidgetTemplate,\n    PrinterTerminal,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.terminal-widget\n  height: 400px\n  display: flex\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TerminalWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TerminalWidget.vue?vue&type=template&id=78933ce3&scoped=true&\"\nimport script from \"./TerminalWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./TerminalWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TerminalWidget.vue?vue&type=style&index=0&id=78933ce3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"78933ce3\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"LCD Display Message\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"wrapper\"},[_c('div',{staticClass:\"message-content\"},[_c('p',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.printer.status.display_status.message))])]),_c('b-button',{staticClass:\"dismiss-btn\",attrs:{\"variant\":\"outline-primary\"},on:{\"click\":_vm.onDisplayClear}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Dismiss\"))+\" \")])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template>\n    <template #title>{{ $t(\"LCD Display Message\") }}</template>\n    <template #content>\n      <div class=\"wrapper\">\n        <div class=\"message-content\">\n          <p class=\"text\">{{ printer.status.display_status.message }}</p>\n        </div>\n        <b-button variant=\"outline-primary\" class=\"dismiss-btn\" @click=\"onDisplayClear\">\n          {{ $t(\"Dismiss\") }}\n        </b-button>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\n\nexport default {\n  name: 'DisplayStatusWidget',\n\n  components: {\n    WidgetTemplate,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  methods: {\n    onDisplayClear() {\n      const octoPayload = {\n        func: 'commands',\n        target: '_printer',\n        args: [\"M117\"],\n        force: true,\n      }\n      const moonrakerPayload = {\n        func: 'printer/gcode/script',\n        target: 'moonraker_api',\n        kwargs: {\"script\": \"SET_DISPLAY_TEXT\"},\n      }\n      const payload = this.printer.isAgentMoonraker() ? moonrakerPayload : octoPayload\n\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper\n  display: flex\n  flex-direction: row\n  align-items: center\n  justify-content: space-between\n  gap: 1rem\n  padding-bottom: 1rem\n\n.message-content\n  display: flex\n  align-items: center\n  justify-content: flex-start\n  flex: 1\n  min-width: 0\n\n.text\n  margin: 0\n  font-size: 1.5rem\n  font-weight: bold\n  color: var(--color-warning)\n  word-break: break-word\n  overflow-wrap: break-word\n  text-align: left\n  line-height: 1.4\n\n.dismiss-btn\n  flex-shrink: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DisplayStatusWidget.vue?vue&type=template&id=e46a13a2&scoped=true&\"\nimport script from \"./DisplayStatusWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./DisplayStatusWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DisplayStatusWidget.vue?vue&type=style&index=0&id=e46a13a2&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e46a13a2\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.availablePowerDevices.length)?_c('widget-template',{scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$t(\"Power\")))]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"power-control\"},[_vm._l((_vm.availablePowerDevices),function(item){return _c('div',{key:item.device,staticClass:\"power-item\"},[_c('div',{staticClass:\"title\"},[_c('div',{staticClass:\"name\"},[_vm._v(_vm._s(item.device))]),_c('div',{staticClass:\"status text-danger\",class:{ 'text-success': item.status.toUpperCase() === 'ON' }},[_vm._v(\" • \"+_vm._s(item.status.toUpperCase())+\" \")])]),_c('b-button',{attrs:{\"variant\":\"outline-primary\"},on:{\"click\":function($event){return _vm.togglePower(item)}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Toggle Power \"))+\" \")])],1)}),(_vm.availablePowerDevices.length > 1)?_c('div',{staticClass:\"bulk-actions\"},[_c('b-button',{attrs:{\"variant\":\"success\"},on:{\"click\":function($event){return _vm.batchPowerControl('on')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Power On All \"))+\" \")]),_c('b-button',{attrs:{\"variant\":\"danger\"},on:{\"click\":function($event){return _vm.batchPowerControl('off')}}},[_vm._v(\" \"+_vm._s(_vm.$t(\" Power Off All \"))+\" \")])],1):_vm._e(),_c('muted-alert',{staticClass:\"info-block\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Rapid toggling power may result in error. Please allow a cooldown period.\"))+\" \")])],2)]},proxy:true}],null,false,1595045800)}):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <widget-template v-if=\"availablePowerDevices.length\">\n    <template #title>{{ $t(\"Power\") }}</template>\n    <template #content>\n      <div class=\"power-control\">\n        <div v-for=\"item in availablePowerDevices\" :key=\"item.device\" class=\"power-item\">\n          <div class=\"title\">\n            <div class=\"name\">{{ item.device }}</div>\n            <div\n              class=\"status text-danger\"\n              :class=\"{ 'text-success': item.status.toUpperCase() === 'ON' }\"\n            >\n              • {{ item.status.toUpperCase() }}\n            </div>\n          </div>\n          <b-button variant=\"outline-primary\" @click=\"togglePower(item)\">\n            {{ $t(\" Toggle Power \") }}\n          </b-button>\n        </div>\n\n        <div v-if=\"availablePowerDevices.length > 1\" class=\"bulk-actions\">\n          <b-button variant=\"success\" @click=\"batchPowerControl('on')\">\n            {{ $t(\" Power On All \") }}\n          </b-button>\n          <b-button variant=\"danger\" @click=\"batchPowerControl('off')\">\n            {{ $t(\" Power Off All \") }}\n          </b-button>\n        </div>\n\n        <muted-alert class=\"info-block\">\n          {{$t(\"Rapid toggling power may result in error. Please allow a cooldown period.\")}}\n        </muted-alert>\n      </div>\n    </template>\n  </widget-template>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport WidgetTemplate from '@src/components/printer-control/WidgetTemplate'\n\nexport default {\n  name: 'PowerControlWidget',\n\n  components: {\n    MutedAlert,\n    WidgetTemplate,\n  },\n\n  props: {\n    printer: {\n      type: Object,\n      required: true,\n    },\n    printerComm: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      powerDevices: [],\n    }\n  },\n\n  computed: {\n    availablePowerDevices() {\n      if (!this.printer.isOffline() && !this.printer.isDisconnected()) {\n        return this.powerDevices\n      }\n\n      return this.powerDevices.filter(device => device.type !== 'klipper_device')\n    },\n  },\n\n  created() {\n    this.getPowerDevices()\n  },\n\n  methods: {\n    getPowerDevices() {\n      const payload = {\n        func: 'machine/device_power/devices',\n        target: 'moonraker_api',\n        args: [],\n      }\n      this.printerComm.passThruToPrinter(payload, (err, ret) => {\n        this.powerDevices = err ? [] : ret?.devices || []\n      })\n    },\n    togglePower(device) {\n      const action = device.status.toUpperCase() === 'ON' ? 'off' : 'on'\n      const payload = {\n        func: `machine/device_power/device?device=${device.device}&action=${action}`,\n        target: 'moonraker_api',\n        kwargs: { verb: 'post' },\n      }\n      this.printerComm.passThruToPrinter(payload, (err) => {\n        this.getPowerDevices()\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n    batchPowerControl(action) {\n      if (!this.availablePowerDevices.length) return\n\n      const devices = this.availablePowerDevices.map(device => device.device).join('&')\n      const payload = {\n        func: `machine/device_power/${action}?${devices}`,\n        target: 'moonraker_api',\n        kwargs: { verb: 'post' },\n      }\n      this.printerComm.passThruToPrinter(payload, (err) => {\n        this.getPowerDevices()\n        if (err) {\n          this.$swal.Toast.fire({\n            icon: 'error',\n            title: err,\n          })\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.power-control\n  padding-bottom: .5rem\n  .power-item\n    margin: 1rem 0\n    display: flex\n    flex-direction: column\n    gap: .5rem\n  .title\n    display: flex\n    justify-content: space-between\n    font-size: 1rem\n    font-weight: bold\n  .bulk-actions\n    display: flex\n    gap: 1rem\n    margin: 2rem 0\n    button\n      flex: 1\n  .info-block\n    width: 100%\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PowerControlWidget.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PowerControlWidget.vue?vue&type=template&id=6b4f0900&scoped=true&\"\nimport script from \"./PowerControlWidget.vue?vue&type=script&lang=js&\"\nexport * from \"./PowerControlWidget.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PowerControlWidget.vue?vue&type=style&index=0&id=6b4f0900&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6b4f0900\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarLeft>\n      <div class=\"printer-name truncated\">\n        {{ printer ? printer.name : '' }}\n      </div>\n    </template>\n\n    <template #topBarRight>\n      <div v-if=\"printer\" class=\"action-panel\">\n        <!-- Share Feed -->\n        <a\n          href=\"#\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"Share\"\n          @click.prevent=\"onSharePrinter()\"\n        >\n          <i class=\"fas fa-share-alt fa-lg\"></i>\n          <span class=\"sr-only\">{{ $t(\"Share\") }}</span>\n        </a>\n        <!-- Tunnel -->\n        <a\n          :href=\"`/tunnels/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"OctoPrint Tunnel\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-tunnel\" />\n          </svg>\n          <span class=\"sr-only\">{{ $t(\"OctoPrint Tunnel\") }}</span>\n        </a>\n        <!-- Configure -->\n        <a\n          :href=\"`/printers/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          title=\"Configure\"\n        >\n          <i class=\"fas fa-wrench\"></i>\n          <span class=\"sr-only\">{{ $t(\"Configure\") }}</span>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'share',\n                icon: 'fas fa-share-alt fa-lg',\n                title: $t('Share'),\n                callback: true,\n              },\n              {\n                key: 'tunnel',\n                svgIcon: 'svg-tunnel',\n                title: $t('OctoPrint Tunnel'),\n                href: `/tunnels/${printer.id}/`,\n              },\n              {\n                key: 'settings',\n                icon: 'fas fa-wrench',\n                title: $t('Configure'),\n                href: `/printers/${printer.id}/`,\n              },\n            ]\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n      </div>\n    </template>\n    <template #content>\n      <loading-placeholder v-if=\"!printer\" />\n      <div v-else class=\"page-container\" fluid>\n        <div class=\"widgets-container\">\n          <template v-for=\"widget in widgets\">\n            <component\n              :is=\"widget.component\"\n              v-if=\"isWidgetVisible(widget)\"\n              :key=\"widget.id\"\n              :printer=\"printer\"\n              :printer-comm=\"printerComm\"\n              :print=\"lastPrint\"\n              @sendPrinterAction=\"onSendPrinterAction\"\n              @notAFailureClicked=\"onNotAFailureClicked\"\n              @updateSettings=\"onUpdateSettings\"\n            ></component>\n          </template>\n\n          <div class=\"extra-actions\">\n            <h2 class=\"section-title\">{{ $t(\"Additional Actions\") }}</h2>\n            <b-button variant=\"outline-secondary\" class=\"custom-button\" @click=\"onReorderClicked\">\n              <i class=\"fas fa-arrows-alt-v\"></i>\n              {{$t(\"Reorder\")}} &amp; {{$t(\"Hide\")}}\n            </b-button>\n            <div class=\"text-muted extra-actions-explanation\">\n              <small>{{ $t(\"Customize this page for each of your printers by reodering or hiding cards above.\") }}</small\n              >\n            </div>\n            <b-button variant=\"outline-primary\" class=\"custom-button\" href=\"/printers/wizard/\">\n              <i class=\"fas fa-plus\"></i>\n              {{$t(\"Add Printer\")}}\n            </b-button>\n            <div class=\"text-muted extra-actions-explanation\">\n              <small>{{ $t(\"Link another printer to {brandName}.\",{brandName:$syndicateText.brandName}) }}</small>\n            </div>\n          </div>\n        </div>\n        <div class=\"stream-container\">\n          <div class=\"header-container\">\n            <div class=\"title\">{{ $t('Webcam') }}</div>\n            <div class=\"d-flex align-items-center\">\n              <b-dropdown v-if=\"webcams.length > 1\" class=\"webcam-dropdown\" block size=\"sm\" variant=\"link\" toggle-class=\"text-decoration-none\" no-caret>\n                <template #button-content>\n                  <i class=\"fa fa-camera\" aria-hidden=\"true\"></i>\n                  {{ !!selectedWebcam ? (selectedWebcam.name || 'Primary') : 'All' }}\n                  <i class=\"fa fa-chevron-down\" aria-hidden=\"true\"></i>\n                </template>\n                <b-dropdown-text class=\"small text-secondary\">{{ $t(\"WEBCAM SELECTION\") }}</b-dropdown-text>\n                <b-dropdown-item v-for=\"(webcam, index) in webcams\" :key=\"index\" href=\"#\" @click=\"chooseWebcam(index, webcam.stream_id)\">{{ webcam.name || 'Primary' }}</b-dropdown-item>\n                <b-dropdown-item @click=\"chooseWebcam('all')\">{{ $t('All') }}</b-dropdown-item>\n              </b-dropdown>\n              <div v-else class=\"mr-3\">\n                <i class=\"fa fa-camera\" aria-hidden=\"true\"></i>\n                {{ webcams.length ? webcams[0].name || 'Primary' : '' }}\n              </div>\n            </div>\n          </div>\n        <b-card-text v-if=\"webcams.length || printer?.pic?.img_url\" class=\"px-0 py-0 content d-inline-block\" style=\"width: 100%;\">\n            <b-row>\n                <b-col class=\"pb-0\" style=\"position: relative\">\n                  <b-container fluid class=\"p-0\">\n                    <b-row no-gutters style=\"flex-direction: column; align-items: center;\">\n                      <b-col v-if=\"webcams.length === 0 && printer?.pic?.img_url\" :key=\"printer?.pic?.img_url\" :cols=\"12\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :autoplay=\"true\"\n                            :stickyStreamingSrc=\"'IMAGE'\"\n                          />\n                        </div>\n                      </b-col>\n                      <b-col v-for=\"(webcam, index) in webcams\" :key=\"index\" v-show=\"isWebcamSelected(webcam)\">\n                        <div class=\"d-flex justify-content-center webcamBackground\">\n                          <streaming-box\n                            :printer=\"printer\"\n                            :webrtc=\"printerComm.webrtcConnections.get(webcam.name)\"\n                            :autoplay=\"user.is_pro\"\n                            :webcam=\"webcam\"\n                            :halfHeight=\"webcams.length > 1 && !selectedWebcam\"\n                            @onRotateRightClicked=\"(deg) => handleRotateRightClicked(deg, webcam.stream_id)\"\n                          />\n                        </div>\n                      </b-col>\n                    </b-row>\n                  </b-container>\n              </b-col>\n            </b-row>\n        </b-card-text>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport split from 'lodash/split'\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport { normalizedPrinter, normalizedPrint } from '@src/lib/normalizers'\nimport StreamingBox from '@src/components/StreamingBox'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport WebRTCConnection, {DataChannelOnlyWebRTCConnection} from '@src/lib/webrtc'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { user } from '@src/lib/page-context'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport PrintJobControlWidget from '@src/components/printer-control/PrintJobControlWidget'\nimport PrintProgressWidget from '@src/components/printer-control/PrintProgressWidget'\nimport FailureDetectionWidget from '@src/components/printer-control/FailureDetectionWidget'\nimport TemperatureWidget from '@src/components/printer-control/TemperatureWidget'\nimport PrinterControlWidget from '@src/components/printer-control/PrinterControlWidget'\nimport ReorderModal from '@src/components/ReorderModal'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport SharePrinter from '@src/components/printers/SharePrinter.vue'\nimport TerminalWidget from '../components/printer-control/TerminalWidget.vue'\nimport DisplayStatusWidget from '../components/printer-control/DisplayStatusWidget.vue'\nimport PowerControlWidget from '@src/components/printer-control/PowerControlWidget.vue'\n\nconst RESUME_PRINT = '/resume_print/'\nconst MUTE_CURRENT_PRINT = '/mute_current_print/?mute_alert=true'\nconst ACK_ALERT_NOT_FAILED = '/acknowledge_alert/?alert_overwrite=NOT_FAILED'\n\n// Widgets config (for local storage and params) format: [{id: 1, enabled: true}, ...]\n// WIDGETS below maps IDs to other useful info\nconst WIDGETS = [\n  {\n    id: 7,\n    title: 'LCD Display Message',\n    component: 'DisplayStatusWidget',\n  },\n  {\n    id: 1,\n    title: 'Print Job Control',\n    component: 'PrintJobControlWidget',\n  },\n  {\n    id: 2,\n    title: 'Last Print / Progress',\n    component: 'PrintProgressWidget',\n  },\n  {\n    id: 3,\n    title: 'Failure Detection',\n    component: 'FailureDetectionWidget',\n  },\n  {\n    id: 4,\n    title: 'Temperature Controls',\n    component: 'TemperatureWidget',\n  },\n  {\n    id: 5,\n    title: 'Printer Controls',\n    component: 'PrinterControlWidget',\n  },\n  {\n    id: 8,\n    title: 'Power',\n    component: 'PowerControlWidget',\n  },\n  {\n    id: 6,\n    title: 'Terminal Widget',\n    component: 'TerminalWidget',\n  },\n]\n\nexport default {\n  name: 'PrinterControlPage',\n\n  components: {\n    StreamingBox,\n    PageLayout,\n    CascadedDropdown,\n    PrintJobControlWidget,\n    PrintProgressWidget,\n    FailureDetectionWidget,\n    TemperatureWidget,\n    PrinterControlWidget,\n    PowerControlWidget,\n    TerminalWidget,\n    DisplayStatusWidget,\n  },\n\n  data() {\n    return {\n      user: null,\n      printerId: null,\n      printer: null,\n      webcams: [],\n      currentBitrate: null,\n      lastPrint: null,\n      lastPrintFetchCounter: 0,\n      widgetsConfig: null,\n      customRotationDeg: 0,\n      preferredWebcam: null,\n      customRotationData: [],\n    }\n  },\n\n  computed: {\n    widgets() {\n      if (!this.widgetsConfig) return\n      return this.widgetsConfig.map((widget) => {\n        const configItem = WIDGETS.find((w) => w.id === widget.id)\n        return { ...widget, ...configItem }\n      })\n    },\n    videoRotationDeg() {\n      const rotation = +(this.printer?.settings?.webcam_rotation ?? 0) + this.customRotationDeg\n      return rotation % 360\n    },\n    selectedWebcam() {\n      if (this.preferredWebcam === null) {\n        return undefined\n      } else {\n        return this.webcams.find(webcam => webcam.stream_id == this.preferredWebcam)\n      }\n    }\n  },\n\n  watch: {\n    printer: {\n      handler(newValue, oldValue) {\n        if (newValue && oldValue === null) {\n          this.widgetsConfig = this.restoreWidgets()\n        } else {\n          if (\n            newValue?.isActive() !== oldValue?.isActive() ||\n            newValue?.current_print?.started_at !== oldValue?.current_print?.started_at\n          ) {\n            // poll server for the last print with correct status on starting/cancelling/finishing print\n            this.fetchLastPrint({ pollForCorrect: true })\n          }\n        }\n      },\n      deep: true,\n    },\n  },\n\n  created() {\n    this.customRotationDeg = getLocalPref('webcamRotationDeg', 0, `${this.printer?.id}_${this.webcams.length ? this.webcams[0].stream_id : 0}`)\n    this.user = user()\n    this.printerId = split(window.location.pathname, '/').slice(-3, -2).pop()\n    this.fetchLastPrint()\n    this.preferredWebcam = getLocalPref('preferredWebcam', null, this.printerId)\n\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printerId,\n      urls.printerWebSocket(this.printerId),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n\n          if (this.printer?.settings?.data_channel_id && !this.printerComm.webrtcConnections.has(null)) { // null means it's data channel only\n            const dataChannelOnlyWebrtc = DataChannelOnlyWebRTCConnection([parseInt(this.printer.settings.data_channel_id)]);\n            dataChannelOnlyWebrtc.openForPrinter(this.printer.id, this.printer.auth_token);\n            this.printerComm.setWebRTCConnection(null, dataChannelOnlyWebrtc);\n          }\n\n          if ((this.printer?.settings?.webcams || []).length > 0) {\n            const webcamsDeepCopy = JSON.parse(JSON.stringify(this.printer?.settings?.webcams)) // Probably a good idea to deep copy as we will change the objects and keep them around\n\n            for (const webcam of webcamsDeepCopy) {\n              if (this.printerComm.webrtcConnections.has(webcam.name)) {\n                  continue;\n              }\n              this.webcams.push(webcam)\n              const webrtc = WebRTCConnection(webcam.stream_mode, webcam.stream_id)\n              this.printerComm.setWebRTCConnection(webcam.name, webrtc);\n              // Has to be called after this.webcams.push(webcam) otherwise the callbacks won't be established properly.\n              webrtc.openForPrinter(this.printer.id, this.printer.auth_token)\n            }\n          }\n        },\n        onStatusReceived: (printerStatus) => {\n          // Backward compatibility: octoprint_data is for OctoPrint-Obico 2.1.2 or earlier, or moonraker-obico 0.5.1 or earlier\n          const status = printerStatus.status || printerStatus.octoprint_data\n          this.printer = normalizedPrinter({ status }, this.printer)\n        },\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  mounted() {\n    document.querySelector('body').style.paddingBottom = 0\n  },\n\n  methods: {\n    isWidgetVisible(widget) {\n      if (!widget.enabled) return false\n\n      // PrintJobControlWidget always shows\n      if (widget.component === 'PrintJobControlWidget') return true\n\n      // Moonraker power devices remain available when Klippy is disconnected.\n      if (widget.component === 'PowerControlWidget') {\n        return this.printer.agent_connected && this.printer.isAgentMoonraker()\n      }\n\n      // DisplayStatusWidget only shows when there's a message\n      if (widget.component === 'DisplayStatusWidget') {\n        return !!this.printer.status?.display_status?.message\n      }\n\n      // All other widgets require printer to be online and connected\n      return !this.printer.isOffline() && !this.printer.isDisconnected()\n    },\n    isWebcamSelected(webcam) {\n      if (this.preferredWebcam === null) {\n        return true\n      }\n      // In case this.preferredWebcam is an old stream_id that no longer exists\n      const webcamExists = this.webcams.some(w => w.stream_id === this.preferredWebcam)\n      if (!webcamExists) {\n        return true\n      }\n      return this.preferredWebcam === webcam.stream_id\n    },\n    handleRotateRightClicked(val, streamId) {\n      const customRotationIndex = this.customRotationData.findIndex(custom => custom.streamId === streamId)\n      if (customRotationIndex === -1) {\n        this.customRotationData.push({ streamId: streamId, customRotation: val })\n      } else {\n        this.customRotationData[customRotationIndex].customRotation = val\n      }\n\n      this.customRotationDeg = val\n    },\n    chooseWebcam(value, streamId = 'all') {\n      if (value == 'all') {\n        this.preferredWebcam = null\n      } else {\n        this.preferredWebcam = streamId\n      }\n      setLocalPref('preferredWebcam', this.preferredWebcam, this.printer.id)\n    },\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n    onSharePrinter() {\n      this.$swal.openModalWithComponent(\n        SharePrinter,\n        {\n          isProAccount: this.user.is_pro,\n          printer: this.printer,\n        },\n        {\n          confirmButtonText: 'Close',\n        }\n      )\n    },\n    restoreWidgets() {\n      let widgets = WIDGETS.map((w) => ({ id: w.id, enabled: true }))\n\n      if (isLocalStorageSupported()) {\n        widgets =\n          JSON.parse(localStorage.getItem('printer-control-widgets-' + this.printer.id)) || widgets\n      }\n\n      // add any new widgets\n      for (const WIDGET of WIDGETS) {\n        if (!widgets.find((w) => w.id === WIDGET.id)) {\n          widgets.push({ id: WIDGET.id, enabled: true })\n        }\n      }\n\n      // remove any old widgets which are no longer supported\n      for (const widget of widgets) {\n        if (!WIDGETS.find((w) => w.id === widget.id)) {\n          widgets.splice(widgets.indexOf(widget), 1)\n        }\n      }\n\n      // delete terminal widget if it's not supported\n      const terminalWidget = widgets.find((w) => w.id === 6)\n      if (terminalWidget && !this.printer.isAgentVersionGte('2.3.11', '1.4.4')) {\n        widgets.splice(widgets.indexOf(terminalWidget), 1)\n      }\n\n      if (isLocalStorageSupported()) {\n        localStorage.setItem('printer-control-widgets-' + this.printer.id, JSON.stringify(widgets))\n      }\n      return widgets\n    },\n    onUpdateSettings(props) {\n      const { settingName, settingValue } = props\n      this.printer[settingName] = settingValue\n\n      axios\n        .patch(urls.printer(this.printer.id), {\n          [settingName]: settingValue,\n        })\n        .catch((err) => {\n          console.error('Failed to update printer settings: ', err)\n        })\n    },\n    fetchLastPrint(props) {\n      const defaultProps = { pollForCorrect: false }\n      const { pollForCorrect } = props || defaultProps\n\n      axios\n        .get(urls.prints(), {\n          params: {\n            start: 0,\n            limit: 1,\n            filter_by_printer_ids: [this.printerId],\n            sorting: 'date_desc',\n          },\n        })\n        .then((response) => {\n          if (response.data.length) {\n            this.lastPrint = normalizedPrint(response.data[0])\n          }\n\n          if (pollForCorrect) {\n            let retry = false\n            if (!this.lastPrint || this.printer.isActive() !== this.lastPrint.status.isActive) {\n              retry = true\n            }\n\n            if (retry && this.lastPrintFetchCounter < 5) {\n              const newDelay = (this.lastPrintFetchCounter + 1) * 1000\n              setTimeout(() => this.fetchLastPrint({ pollForCorrect: true }), newDelay)\n              this.lastPrintFetchCounter += 1\n            } else {\n              this.lastPrintFetchCounter = 0\n            }\n          }\n        })\n        .catch((error) => {\n          console.error('Error fetching last print: ', error)\n        })\n    },\n\n    onNotAFailureClicked(ev, resumePrint) {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Noted!')}`,\n        html: `<p>${this.$i18next.t(\"Do you want to mute failure detection on for this print?\")}</p><small>${this.$i18next.t(\"If you select 'Mute', failure detection will be turned off for this print, but will be automatically turned on for your next print.\")}</small>`,\n        confirmButtonText: `${this.$i18next.t('Mute')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          // Hack: So that 2 APIs are not called at the same time\n          setTimeout(() => {\n            this.onSendPrinterAction(this.printer.id, MUTE_CURRENT_PRINT)\n          }, 1000)\n        }\n        if (resumePrint) {\n          this.printer.setTransientState('Resuming')\n          this.onSendPrinterAction(this.printer.id, RESUME_PRINT)\n        } else {\n          this.onSendPrinterAction(this.printer.id, ACK_ALERT_NOT_FAILED)\n        }\n      })\n      ev.preventDefault()\n    },\n    onSendPrinterAction(printerId, path, isOctoPrintCommand) {\n      axios.post(urls.printerAction(printerId, path))\n    },\n    onReorderClicked() {\n      this.$swal\n        .openModalWithComponent(\n          ReorderModal,\n          {\n            items: [...this.widgetsConfig],\n            extraInfo: WIDGETS,\n          },\n          {\n            confirmButtonText: `${this.$i18next.t('Save')}`,\n            showCancelButton: true,\n            preConfirm: () => {\n              return {\n                config: document.getElementById('sorting-config').value,\n              }\n            },\n          }\n        )\n        .then((result) => {\n          if (result.value?.config) {\n            const config = JSON.parse(result.value.config)\n\n            this.widgetsConfig = config\n\n            if (isLocalStorageSupported()) {\n              localStorage.setItem(\n                'printer-control-widgets-' + this.printer.id,\n                JSON.stringify(config)\n              )\n            }\n          }\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.webcamBackground\n    position: relative\n\n// Navbar\n.printer-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n.divider\n  margin-right: 1rem\n  width: 1px\n  height: 1rem\n  display: inline-block\n  background-color: var(--color-divider)\n.custom-svg-icon\n  height: 1.25rem\n  width: 1.25rem\n\n.page-container\n  --widget-width: 480px\n  display: flex\n  flex: 1\n  padding: 0 15px\n  @media (max-width: 768px)\n    flex: unset\n\n.widgets-container\n  flex-shrink: 0\n  width: var(--widget-width)\n.stream-container\n  flex: 1\n  position: fixed\n  right: var(--gap-between-blocks)\n  top: calc(50px + var(--gap-between-blocks))\n  width: calc(100vw - 100px - var(--gap-between-blocks)*3 - var(--widget-width))\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  background-color: #000\n\n  .header-container\n    display: flex\n    justify-content: space-between\n    background-color: var(--color-surface-secondary)\n    .title\n      color: var(--color-text-secondary)\n      padding: 6px 12px\n      font-size: 14px\n\n@media (max-width: 1024px)\n  .page-container\n    box-sizing: content-box\n    width: 100%\n    max-width: var(--widget-width)\n    margin: 0 auto\n    flex-direction: column\n\n  .widgets-container\n    order: 2\n    width: 100%\n\n  .stream-container\n    order: 1\n    position: relative\n    top: 0\n    left: 0\n    width: 100%\n    margin-bottom: 15px\n    flex: 0\n\n.page-container\n  @media (max-width: 510px)\n    box-sizing: border-box\n    padding: 0 15px\n\n    .widgets-container\n      width: 100%\n\n.extra-actions\n  display: flex\n  justify-content: center\n  margin-top: var(--gap-between-blocks)\n  gap: 1rem\n  .extra-actions-explanation, .section-title\n    display: none\n  @media (max-width: 510px)\n    margin-top: 2rem\n    flex-direction: column\n    .extra-actions-explanation\n      display: block\n      text-align: center\n      margin-top: -0.5rem\n      margin-bottom: 1rem\n    .section-title\n      display: block\n      text-align: center\n      margin-bottom: 1rem\n\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterControlPage.vue?vue&type=template&id=b5382844&scoped=true&\"\nimport script from \"./PrinterControlPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterControlPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterControlPage.vue?vue&type=style&index=0&id=b5382844&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5382844\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"flex-full-size\",class:{ 'is-in-mobile': _vm.useMobileLayout },attrs:{\"fluid\":\"xl\"}},[_c('b-row',{staticClass:\"flex-full-size\"},[_c('b-col',{staticClass:\"flex-full-size\"},[(_vm.user)?_c('div',{staticClass:\"flex-full-size\"},[(_vm.useMobileLayout)?_c('div',{staticClass:\"mobile-settings-wrapper full-on-mobile\"},[(_vm.$route.path === '/user_preferences/')?_c('div',{staticClass:\"mobile-settings-categories\"},[_c('h2',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.onlyNotifications),expression:\"!onlyNotifications\"}],staticClass:\"categories-title section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Account\"))+\" \")]),_vm._l((_vm.sections),function(value,name){return [(!value.isHidden)?_c('router-link',{key:name,class:value.isSubcategory ? 'subcategory' : '',attrs:{\"to\":value.route}},[_c('span',[(value.faIcon)?_c('i',{class:[value.faIcon, 'mr-2'],staticStyle:{\"font-size\":\"1.125rem\"}}):_vm._e(),_c('span',[_vm._v(_vm._s(value.title))])]),_c('i',{staticClass:\"fas fa-arrow-right\"})]):_vm._e()]}),(!_vm.onlyNotifications)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.logout.apply(null, arguments)}}},[_c('span',[_c('i',{class:['fas fa-sign-out-alt', 'mr-2'],staticStyle:{\"font-size\":\"1.125rem\"}}),_vm._v(\" \"+_vm._s(_vm.$t('Logout'))+\" \")])]):_vm._e()],2):_c('div',{staticClass:\"mobile-settings-content\",class:{ 'is-in-mobile': _vm.useMobileLayout }},[(\n                    _vm.currentSection &&\n                    (!_vm.currentSection.isNotificationChannel || _vm.availableNotificationPlugins)\n                  )?_c(_vm.currentRouteComponent,{tag:\"component\",attrs:{\"user\":_vm.user,\"error-messages\":_vm.errorMessages,\"saving\":_vm.saving,\"config\":_vm.config,\"notification-channel\":_vm.currentSection && _vm.currentSection.isNotificationChannel ? _vm.currentSection : {}},on:{\"createNotificationChannel\":_vm.createNotificationChannel,\"updateNotificationChannel\":_vm.patchNotificationChannel,\"deleteNotificationChannel\":_vm.deleteNotificationChannel,\"clearErrorMessages\":_vm.clearErrorMessages,\"addErrorMessage\":_vm.addErrorMessage,\"updateSetting\":_vm.updateSetting}}):_vm._e()],1)]):_c('b-tabs',{staticClass:\"desktop-settings-wrapper\",attrs:{\"vertical\":true,\"nav-wrapper-class\":\"settings-nav\",\"active-nav-item-class\":\"\",\"content-class\":\"desktop-settings-content\"},on:{\"activate-tab\":_vm.updateRoute},scopedSlots:_vm._u([{key:\"tabs-end\",fn:function(){return [_c('li',{staticClass:\"nav-item\"},[_c('a',{staticClass:\"nav-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.logout.apply(null, arguments)}}},[_c('i',{class:['fas fa-sign-out-alt', 'mr-2']}),_vm._v(\" \"+_vm._s(_vm.$t('Logout'))+\" \")])])]},proxy:true}],null,false,2570481543)},[_vm._l((_vm.sections),function(value,name){return [(!value.isHidden)?_c('b-tab',{key:name,attrs:{\"title-item-class\":value.isSubcategory ? 'subcategory' : '',\"active\":_vm.$route.path === value.route,\"disabled\":value.isNotificationChannel && !_vm.user.notification_enabled},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [(value.faIcon)?_c('i',{class:[value.faIcon, 'mr-2']}):_vm._e(),_vm._v(\" \"+_vm._s(value.title)+\" \")]},proxy:true}],null,true)},[(!value.isNotificationChannel || _vm.availableNotificationPlugins)?_c(name,{tag:\"component\",attrs:{\"user\":_vm.user,\"error-messages\":_vm.errorMessages,\"saving\":_vm.saving,\"config\":_vm.config,\"notification-channel\":value.isNotificationChannel ? value : {}},on:{\"createNotificationChannel\":_vm.createNotificationChannel,\"updateNotificationChannel\":_vm.patchNotificationChannel,\"deleteNotificationChannel\":_vm.deleteNotificationChannel,\"clearErrorMessages\":_vm.clearErrorMessages,\"addErrorMessage\":_vm.addErrorMessage,\"updateSetting\":_vm.updateSetting}}):_vm._e()],1):_vm._e()]})],2)],1):_c('div',{staticClass:\"text-center\"},[_c('b-spinner',{staticClass:\"mt-5\",attrs:{\"label\":_vm.$t('Loading...')}})],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import routes from '@config/user-preferences/pref-routes'\nimport notificationPlugins from '@src/notifications/plugins'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport i18n from '@src/i18n/i18n.js'\n\nconst onlyNotifications =\n  new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n\nconst defaultSections = {\n  GeneralPreferences: {\n    title: `${i18n.t('General')}`,\n    faIcon: 'fas fa-cog',\n    importComponent: () => import('@src/components/user-preferences/GeneralPreferences'),\n    route: routes.GeneralPreferences,\n    isHidden: inMobileWebView() || onlyNotifications,\n  },\n  ThemePreferences: {\n    title: `${i18n.t('Appearance')}`,\n    faIcon: 'fas fa-magic',\n    importComponent: () => import('@src/components/user-preferences/ThemePreferences'),\n    route: routes.ThemePreferences,\n    isHidden:\n      (inMobileWebView() &&\n        !(new URLSearchParams(window.location.search).get('themeable') === 'true')) ||\n      onlyNotifications,\n  },\n  ProfilePreferences: {\n    title: `${i18n.t('Profile')}`,\n    faIcon: 'fas fa-user-edit',\n    importComponent: () => import('@src/components/user-preferences/ProfilePreferences'),\n    route: routes.ProfilePreferences,\n    isHidden: onlyNotifications,\n  },\n  AuthorizedApps: {\n    title: `${i18n.t('Authorized Apps')}`,\n    faIcon: 'fas fa-check-circle',\n    importComponent: () => import('@src/components/user-preferences/AuthorizedApps'),\n    route: routes.AuthorizedApps,\n    isHidden: onlyNotifications,\n  },\n\n  // Notifications\n  GeneralNotifications: {\n    title: `${i18n.t('Notifications')}`,\n    faIcon: 'fas fa-bell',\n    importComponent: () =>\n      import('@src/components/user-preferences/notifications/GeneralNotifications'),\n    route: routes.GeneralNotifications,\n  },\n  PushNotifications: {\n    title: `${i18n.t('Push Notification')}`,\n    isSubcategory: true,\n    isNotificationChannel: true,\n    importComponent: () => ({}),\n    route: routes.PushNotifications,\n    isHidden: !inMobileWebView(),\n  },\n}\n\nconst notificationSections = Object.keys(notificationPlugins).reduce((obj, name) => {\n  return Object.assign(obj, {\n    [name]: {\n      title: notificationPlugins[name].displayName,\n      channelName: name,\n      isSubcategory: true,\n      isNotificationChannel: true,\n      route: routes[name],\n      importComponent: () =>\n        import('@src/notifications/plugins/' + notificationPlugins[name].componentName),\n    },\n  })\n}, {})\n\nexport default {\n  ...defaultSections,\n  ...notificationSections,\n}\n","import routes from '@config/user-preferences/pref-routes'\nimport publicSections from '@src/config/user-preferences/sections'\nimport i18n from '@src/i18n/i18n.js'\nlet entSections = {}\n\nconst onlyNotifications =\n  new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n\nconst subscriptionSection = {\n  title: `${i18n.t('Subscription')}`,\n  faIcon: 'fas fa-money-check',\n  importComponent: () => import('@entSrc/components/user-preferences/SubscriptionPreferences'),\n  route: routes.Subscription,\n  isHidden: onlyNotifications,\n}\nconst detectiveHoursSection = {\n  title: `${i18n.t('AI Detection Hours')}`,\n  faIcon: 'fas fa-hourglass-half',\n  importComponent: () => import('@entSrc/components/user-preferences/DetectiveHours'),\n  route: routes.DetectiveHours,\n  isHidden: onlyNotifications,\n}\nconst deleteAccountSection = {\n  title: `${i18n.t('Delete Account')}`,\n  faIcon: 'fas fa-trash-alt',\n  importComponent: () => import('@entSrc/components/user-preferences/DeleteAccount'),\n  route: routes.DeleteAccount,\n  isHidden: onlyNotifications,\n}\n\nfor (const [key, value] of Object.entries(publicSections)) {\n  // insert Subscription section right before Athorized Apps\n  if (key === 'AuthorizedApps') {\n    entSections.Subscription = subscriptionSection\n    entSections.DetectiveHours = detectiveHoursSection\n  }\n  entSections[key] = value\n}\n\n// reinsurance: if Authorized Apps will gone, instert Subscription at the end\nif (!entSections.Subscription) {\n  entSections.Subscription = subscriptionSection\n  entSections.DetectiveHours = detectiveHoursSection\n}\n\nentSections.DeleteAccount = deleteAccountSection\n\nexport default entSections\n","<template>\n  <page-layout>\n    <template #content>\n      <b-container fluid=\"xl\" :class=\"{ 'is-in-mobile': useMobileLayout }\" class=\"flex-full-size\">\n        <b-row class=\"flex-full-size\">\n          <b-col class=\"flex-full-size\">\n            <div v-if=\"user\" class=\"flex-full-size\">\n              <!-- Mobile (web / app) -->\n              <div v-if=\"useMobileLayout\" class=\"mobile-settings-wrapper full-on-mobile\">\n                <div v-if=\"$route.path === '/user_preferences/'\" class=\"mobile-settings-categories\">\n                  <h2 v-show=\"!onlyNotifications\" class=\"categories-title section-title\">\n                    {{$t(\"Account\")}}\n                  </h2>\n                  <template v-for=\"(value, name) in sections\">\n                    <router-link\n                      v-if=\"!value.isHidden\"\n                      :key=\"name\"\n                      :to=\"value.route\"\n                      :class=\"value.isSubcategory ? 'subcategory' : ''\"\n                    >\n                      <span>\n                        <i\n                          v-if=\"value.faIcon\"\n                          :class=\"[value.faIcon, 'mr-2']\"\n                          style=\"font-size: 1.125rem\"\n                        ></i>\n                        <span>{{ value.title }}</span>\n                      </span>\n                      <i class=\"fas fa-arrow-right\"></i>\n                    </router-link>\n                  </template>\n\n                  <a v-if=\"!onlyNotifications\" href=\"#\" @click.prevent=\"logout\">\n                    <span>\n                      <i :class=\"['fas fa-sign-out-alt', 'mr-2']\" style=\"font-size: 1.125rem\"></i>\n                      {{$t('Logout')}}\n                    </span>\n                  </a>\n                </div>\n                <div\n                  v-else\n                  class=\"mobile-settings-content\"\n                  :class=\"{ 'is-in-mobile': useMobileLayout }\"\n                >\n                  <component\n                    :is=\"currentRouteComponent\"\n                    v-if=\"\n                      currentSection &&\n                      (!currentSection.isNotificationChannel || availableNotificationPlugins)\n                    \"\n                    :user=\"user\"\n                    :error-messages=\"errorMessages\"\n                    :saving=\"saving\"\n                    :config=\"config\"\n                    :notification-channel=\"\n                      currentSection && currentSection.isNotificationChannel ? currentSection : {}\n                    \"\n                    @createNotificationChannel=\"createNotificationChannel\"\n                    @updateNotificationChannel=\"patchNotificationChannel\"\n                    @deleteNotificationChannel=\"deleteNotificationChannel\"\n                    @clearErrorMessages=\"clearErrorMessages\"\n                    @addErrorMessage=\"addErrorMessage\"\n                    @updateSetting=\"updateSetting\"\n                  ></component>\n                </div>\n              </div>\n              <!-- Desktop -->\n              <b-tabs\n                v-else\n                :vertical=\"true\"\n                class=\"desktop-settings-wrapper\"\n                nav-wrapper-class=\"settings-nav\"\n                active-nav-item-class=\"\"\n                content-class=\"desktop-settings-content\"\n                @activate-tab=\"updateRoute\"\n              >\n                <template v-for=\"(value, name) in sections\">\n                  <b-tab\n                    v-if=\"!value.isHidden\"\n                    :key=\"name\"\n                    :title-item-class=\"value.isSubcategory ? 'subcategory' : ''\"\n                    :active=\"$route.path === value.route\"\n                    :disabled=\"value.isNotificationChannel && !user.notification_enabled\"\n                  >\n                    <template #title>\n                      <i v-if=\"value.faIcon\" :class=\"[value.faIcon, 'mr-2']\"></i>\n                      {{ value.title }}\n                    </template>\n                    <component\n                      :is=\"name\"\n                      v-if=\"!value.isNotificationChannel || availableNotificationPlugins\"\n                      :user=\"user\"\n                      :error-messages=\"errorMessages\"\n                      :saving=\"saving\"\n                      :config=\"config\"\n                      :notification-channel=\"value.isNotificationChannel ? value : {}\"\n                      @createNotificationChannel=\"createNotificationChannel\"\n                      @updateNotificationChannel=\"patchNotificationChannel\"\n                      @deleteNotificationChannel=\"deleteNotificationChannel\"\n                      @clearErrorMessages=\"clearErrorMessages\"\n                      @addErrorMessage=\"addErrorMessage\"\n                      @updateSetting=\"updateSetting\"\n                    ></component>\n                  </b-tab>\n                </template>\n                <template #tabs-end>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link\" href=\"#\" @click.prevent=\"logout\">\n                      <i :class=\"['fas fa-sign-out-alt', 'mr-2']\"></i>\n                      {{$t('Logout')}}\n                    </a>\n                  </li>\n                </template>\n              </b-tabs>\n            </div>\n            <div v-else class=\"text-center\">\n              <b-spinner class=\"mt-5\" :label=\"$t('Loading...')\"></b-spinner>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport sections from '@config/user-preferences/sections'\nimport routes from '@config/user-preferences/pref-routes'\nimport { getNotificationSettingKey } from '@src/lib/utils'\n\nexport default {\n  name: 'UserPreferencesPage',\n\n  components: {\n    PageLayout,\n    ...Object.keys(sections).reduce((obj, name) => {\n      return Object.assign(obj, { [name]: sections[name].importComponent })\n    }, {}),\n  },\n\n  props: {\n    config: {\n      default() {\n        return {}\n      },\n      type: Object,\n    },\n  },\n\n  data() {\n    return {\n      sections,\n      availableNotificationPlugins: null,\n      configuredNotificationChannels: null,\n      user: null,\n      saving: {},\n      errorMessages: {},\n      delayedSubmit: {\n        // Make pause before sending new value to API\n        first_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n        last_name: {\n          delay: 1000,\n          timeoutId: null,\n        },\n      },\n      combinedInputs: {}, // Send changes to API only if all the other values in the array have data\n      useMobileLayout: false,\n    }\n  },\n\n  computed: {\n    visibleSections() {\n      return Object.values(sections).filter((item) => !item.isHidden)\n    },\n    currentRouteComponent() {\n      for (const [component, route] of Object.entries(routes)) {\n        if (this.$route.path === route) {\n          return component\n        }\n      }\n      return null\n    },\n    currentSection() {\n      for (const section of Object.values(this.sections)) {\n        if (section.route === this.$route.path) {\n          return section\n        }\n      }\n      return null\n    },\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n    clientIsThemeable() {\n      return (\n        !inMobileWebView() ||\n        new URLSearchParams(window.location.search).get('themeable') === 'true'\n      )\n    },\n    onlyNotifications() {\n      return new URLSearchParams(window.location.search).get('onlyNotifications') === 'true'\n    },\n  },\n\n  created() {\n    this.fetchNotificationPlugins()\n    this.fetchNotificationChannels()\n    this.fetchUser()\n  },\n\n  mounted() {\n    this.checkMobileLayout()\n    window.onresize = this.checkMobileLayout\n    if (this.useMobileLayout) {\n      document.querySelector('body').style.paddingTop = '0px'\n    }\n  },\n\n  methods: {\n    updateRoute(newTabIndex) {\n      const section = Object.values(this.visibleSections)[newTabIndex]\n      this.$router.replace({ path: section.route })\n    },\n    logout() {\n      this.$swal.Confirm.fire({\n        title: `${this.$i18next.t('Confirmation')}`,\n        html: `<p class=\"text-center\">${this.$i18next.t(\"You a going to logout from your account\")}</p>`,\n        confirmButtonText: `${this.$i18next.t('Logout')}`,\n        cancelButtonText: `${this.$i18next.t('Cancel')}`,\n      }).then((result) => {\n        if (result.isConfirmed) {\n          window.location.replace('/accounts/logout/')\n        }\n      })\n    },\n    checkMobileLayout() {\n      const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0)\n      this.useMobileLayout = inMobileWebView() || vw < 1140\n    },\n    fetchUser() {\n      return axios.get(urls.user()).then((response) => {\n        this.user = response.data\n      })\n    },\n    fetchNotificationPlugins() {\n      return axios.get(urls.notificationPlugins()).then((response) => {\n        const plugins = response.data.plugins || {}\n        this.availableNotificationPlugins = plugins\n        for (const [key, val] of Object.entries(this.sections)) {\n          if (val.isNotificationChannel) {\n            this.sections[key].pluginInfo = plugins[val.channelName]\n          }\n          if (val.channelName && plugins[val.channelName] && plugins[val.channelName].env_vars) {\n            const env_vars = plugins[val.channelName].env_vars\n            const needHidden = Object.values(env_vars).some(envItem => {\n              return envItem.is_required && !envItem.is_set\n            })\n            if (needHidden) {\n              this.$set(this.sections, key, { ...this.sections[key], isHidden: true });\n            }\n          }\n        }\n      })\n    },\n    fetchNotificationChannels() {\n      return axios.get(urls.notificationChannels()).then((response) => {\n        const channels = response.data\n        this.configuredNotificationChannels = channels\n        for (const [key, val] of Object.entries(this.sections)) {\n          if (val.isNotificationChannel) {\n            this.sections[key].channelInfo = channels.find(\n              (channel) => channel.name === val.channelName\n            )\n          }\n        }\n      })\n    },\n    createNotificationChannel({ section, config, opts = {} }) {\n      const data = {\n        user: this.user.id,\n        name: section.channelName,\n        config,\n        ...opts,\n      }\n\n      const key = getNotificationSettingKey(section, 'config')\n      this.setSavingStatus(key, true)\n\n      return axios\n        .post(urls.notificationChannels(), data)\n        .then(() => {\n          this.setSavingStatus(key, false)\n          this.$router.go()\n        })\n        .catch((err) => {\n          this.setSavingStatus(key, false)\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            let errors = []\n            for (const error of Object.values(err.response.data)) {\n              if (typeof error === 'object') {\n                for (const innnerError of Object.values(error)) {\n                  errors.push(innnerError)\n                }\n              } else if (typeof error === 'string') {\n                errors.push(error)\n              } else {\n                console.warn('Undefined error object structure')\n                console.log(err.response)\n              }\n            }\n            const key = getNotificationSettingKey(section, 'config')\n            this.$set(this.errorMessages, key, errors)\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n    },\n    patchNotificationChannel({ section, propNames, propValues }) {\n      if (propValues !== undefined) {\n        // assuming propNames.length and propValues.lenth are equal\n        propValues.forEach((value, index) => {\n          const propName = propNames[index]\n          this.sections[section.channelName].channelInfo[propName] = value\n        })\n      }\n\n      let data = {\n        name: section.channelName,\n      }\n\n      for (const prop of propNames) {\n        data[prop] = section.channelInfo[prop]\n      }\n\n      for (const prop of propNames) {\n        const key = getNotificationSettingKey(section, prop)\n        this.setSavingStatus(key, true)\n      }\n\n      return axios\n        .patch(urls.updateNotificationChannel(section.channelInfo.id), data)\n        .then(() => {\n          for (const prop of propNames) {\n            const key = getNotificationSettingKey(section, prop)\n            this.setSavingStatus(key, false)\n          }\n        })\n        .catch((err) => {\n          for (const prop of propNames) {\n            const key = getNotificationSettingKey(section, prop)\n            this.setSavingStatus(key, false)\n          }\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            let errors = []\n            for (const error of Object.values(err.response.data)) {\n              if (typeof error === 'object') {\n                for (const innnerError of Object.values(error)) {\n                  errors.push(innnerError)\n                }\n              } else if (typeof error === 'string') {\n                errors.push(error)\n              } else {\n                console.warn('Undefined error object structure')\n                console.log(err.response)\n              }\n            }\n            for (const prop of propNames) {\n              const key = getNotificationSettingKey(section, prop)\n              this.$set(this.errorMessages, key, errors)\n            }\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n    },\n    deleteNotificationChannel(section) {\n      return axios\n        .delete(urls.updateNotificationChannel(section.channelInfo.id))\n        .then(() => {\n          this.$router.go()\n        })\n        .catch((err) => {\n          this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n        })\n    },\n    clearErrorMessages(propName) {\n      this.errorMessages[propName] = []\n    },\n    addErrorMessage(propName, message) {\n      this.errorMessages[propName]\n        ? this.errorMessages[propName].push(message)\n        : (this.errorMessages[propName] = [message])\n    },\n    patchUser(propName, propValue) {\n      let data = {}\n      let key = propName\n      const combinedInputs = this.checkForCombinedValues(propName)\n      if (combinedInputs) {\n        // Must include all the inputs from the array\n        // or don't send if some of them have no data\n        for (const input of combinedInputs.inputs) {\n          key = combinedInputs.key\n          const value = this.user[input]\n          data[input] = value\n        }\n        // Allow either completely empty or completely filled data\n        const values = Object.values(data)\n        const emptyValues = values.filter((val) => !val)\n        if (emptyValues.length !== values.length && emptyValues.length !== 0) {\n          return\n        }\n      } else {\n        data = { [propName]: propValue }\n      }\n      this.setSavingStatus(key, true)\n      // Make request to API\n      return axios\n        .patch(urls.user(), data)\n        .catch((err) => {\n          if (err.response && err.response.data && typeof err.response.data === 'object') {\n            if (err.response.data.non_field_errors) {\n              this.errorDialog(err, err.response.data.non_field_errors)\n            } else {\n              for (const error in err.response.data) {\n                this.errorMessages[key] = err.response.data[error]\n              }\n            }\n          } else {\n            this.errorDialog(err, `${this.$i18next.t('Can not update your preferences')}`)\n          }\n        })\n        .then(() => {\n          // send to mobile app to update it's state\n          if (window.ReactNativeWebView) {\n            if (key === 'first_name') {\n              window.ReactNativeWebView.postMessage(\n                JSON.stringify({ firstName: this.user.first_name })\n              )\n            } else if (key === 'last_name') {\n              window.ReactNativeWebView.postMessage(\n                JSON.stringify({ lastName: this.user.last_name })\n              )\n            }\n          }\n\n          this.setSavingStatus(key, false)\n        })\n    },\n    checkForCombinedValues(propName) {\n      for (const [key, inputs] of Object.entries(this.combinedInputs)) {\n        if (inputs.includes(propName)) {\n          return { inputs, key }\n        }\n      }\n      return null\n    },\n    setSavingStatus(propName, status) {\n      if (status) {\n        delete this.errorMessages[propName]\n      }\n      this.$set(this.saving, propName, status)\n    },\n    updateSetting(settingsItem, value) {\n      if (value !== undefined) {\n        this.user[settingsItem] = value\n      }\n\n      if (settingsItem in this.delayedSubmit) {\n        const delayInfo = this.delayedSubmit[settingsItem]\n        if (delayInfo['timeoutId']) {\n          clearTimeout(delayInfo['timeoutId'])\n        }\n        this.delayedSubmit[settingsItem]['timeoutId'] = setTimeout(() => {\n          this.patchUser(settingsItem, this.user[settingsItem])\n        }, delayInfo['delay'])\n        return\n      }\n      this.patchUser(settingsItem, this.user[settingsItem])\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.flex-full-size\n  display: flex\n  flex-direction: column\n  flex: 1\n.desktop-settings-wrapper\n  margin: 0\n  background-color: var(--color-surface-secondary)\n  border-radius: var(--border-radius-lg)\n  ::v-deep .desktop-settings-content\n    padding: 2rem\n    padding-right: 3rem\n.mobile-settings-wrapper\n  flex: 1\n  background-color: var(--color-surface-secondary)\n  padding: 1.5rem\n  .mobile-settings-content\n    padding-right: 1rem\n  .mobile-settings-categories\n    .categories-title\n      font-weight: bold\n      font-size: 1.5rem\n      margin-bottom: 1rem\n    a\n      color: var(--text-primary)\n      display: flex\n      justify-content: space-between\n      align-items: center\n      padding: .8rem 0\n      border-bottom: 1px solid var(--color-divider)\n      font-size: 1.2em\n      &.subcategory\n        font-size: 1em\n        padding-left: 1.625em\n      i\n        font-size: .8rem\n::v-deep section:not(:first-child) .section-title\n  margin-top: 2rem\n::v-deep .settings-nav\n  width: 25%\n  background-color: var(--color-surface-primary)\n  min-height: 80vh\n  padding: 1.5rem 1rem\n  border-radius: var(--border-radius-lg) 0 0 var(--border-radius-lg)\n  .subcategory\n    a\n      padding-left: 3.125em\n      font-size: 0.9em\n  .active\n    border-radius: 6px\n  a\n    border: initial\n::v-deep .nav-tabs\n  border-bottom: none\n\n::v-deep .inactive\n  opacity: .3\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UserPreferencesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UserPreferencesPage.vue?vue&type=template&id=6717962a&scoped=true&\"\nimport script from \"./UserPreferencesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./UserPreferencesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UserPreferencesPage.vue?vue&type=style&index=0&id=6717962a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"6717962a\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarRight\",fn:function(){return [_c('div',[_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-filter\"})]},proxy:true}])},[_vm._l((_vm.eventClassFiltering),function(eventClass){return _c('b-dropdown-item',{key:eventClass.key,on:{\"click\":function($event){return _vm.toggleEventFiltering('eventClassFiltering', eventClass.key)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: eventClass.selected ? 'visible' : 'hidden' })}),_c('span',{class:_vm.cssClassFromEventClass(eventClass.key)},[_vm._v(_vm._s(eventClass.title))])])}),_c('b-dropdown-divider'),_vm._l((_vm.eventTypeFiltering),function(eventType){return _c('b-dropdown-item',{key:eventType.key,on:{\"click\":function($event){return _vm.toggleEventFiltering('eventTypeFiltering', eventType.key)}}},[_c('i',{staticClass:\"fas fa-check text-primary\",style:({ visibility: eventType.selected ? 'visible' : 'hidden' })}),_vm._v(_vm._s(eventType.title)+\" \")])})],2)],1)]},proxy:true},{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('div',{staticClass:\"col-sm-12 col-md-10 col-lg-8\"},[(!_vm.loading && _vm.printerEvents.length === 0)?_c('div',{staticClass:\"text-center\"},[_c('img',{staticClass:\"w-25 my-4\",attrs:{\"src\":require('@static/img/vacation.gif')}}),_c('h5',{staticClass:\"text-primary\"},[_vm._v(_vm._s(_vm.$t(\"Nothing to look here. Enjoy your vacation!\")))])]):_c('div',[_vm._l((_vm.printerEvents),function(item){return _c('printer-event-card',{key:item.id,attrs:{\"printer-event\":item}})}),_c('mugen-scroll',{staticClass:\"text-center p-4\",attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(_vm.noMoreData)?_c('div',{staticClass:\"text-center p-2\"},[_vm._v(_vm._s(_vm.$t(\"No more notifications.\")))]):_vm._e(),(!_vm.noMoreData)?_c('b-spinner',{attrs:{\"label\":\"Loading...\"}}):_vm._e()],1)],2)])])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"printer-event-card my-3\",class:_vm.tintBorderClass},[_c('div',{staticClass:\"printer-event-text\",class:{ link: _vm.printerEvent.info_url },on:{\"click\":_vm.onTextClick}},[_c('div',{staticClass:\"title font-weight-bold my-2\",class:_vm.tintClass},[_vm._v(\" \"+_vm._s(_vm.eventTitle)+\" \"),(_vm.printerEvent.info_url)?_c('i',{staticClass:\"fas fa-external-link-alt\"}):_vm._e()]),_c('div',{staticClass:\"description\",domProps:{\"innerHTML\":_vm._s(_vm.eventText)}}),_c('div',{staticClass:\"my-2 text-muted font-weight-light small\"},[_vm._v(\" \"+_vm._s(_vm.printerEvent.created_at.format('LLLL'))+\" \")])]),(_vm.printerEvent.image_url)?_c('div',{staticClass:\"printer-event-snapshot\",style:({ backgroundImage: `url(${_vm.printerEvent.image_url})` })}):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"printer-event-card my-3\" :class=\"tintBorderClass\">\n    <div class=\"printer-event-text\" :class=\"{ link: printerEvent.info_url }\" @click=\"onTextClick\">\n      <div class=\"title font-weight-bold my-2\" :class=\"tintClass\">\n        {{ eventTitle }}\n        <i v-if=\"printerEvent.info_url\" class=\"fas fa-external-link-alt\"></i>\n      </div>\n      <!-- eslint-disable-next-line vue/no-v-html -->\n      <div class=\"description\" v-html=\"eventText\"></div>\n      <div class=\"my-2 text-muted font-weight-light small\">\n        {{ printerEvent.created_at.format('LLLL') }}\n      </div>\n    </div>\n    <div\n      v-if=\"printerEvent.image_url\"\n      :style=\"{ backgroundImage: `url(${printerEvent.image_url})` }\"\n      class=\"printer-event-snapshot\"\n    ></div>\n  </div>\n</template>\n\n<script>\nimport { sanitizeEventText } from '@src/lib/utils'\n\nexport default {\n  name: 'PrinterEventCard',\n\n  components: {},\n\n  props: {\n    printerEvent: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  computed: {\n    eventTitle() {\n      return this.printerEvent.event_title || `${this.$i18next.t('Unknown event')}`\n    },\n    eventText() {\n      return sanitizeEventText(this.printerEvent.event_text)\n    },\n    tintClass() {\n      switch (this.printerEvent.event_class) {\n        case 'ERROR':\n          return 'text-danger'\n        case 'WARNING':\n          return 'text-warning'\n        case 'SUCCESS':\n          return 'text-success'\n        default:\n          return ''\n      }\n    },\n    tintBorderClass() {\n      switch (this.printerEvent.event_class) {\n        case 'ERROR':\n          return 'border-danger'\n        case 'WARNING':\n          return 'border-warning'\n        case 'SUCCESS':\n          return 'border-success'\n        default:\n          return ''\n      }\n    },\n  },\n\n  methods: {\n    onTextClick() {\n      if (this.printerEvent.info_url) {\n        window.open(this.printerEvent.info_url, '_blank')\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-event-card\n  display: flex\n  justify-content: space-between\n  border-radius: var(--border-radius-sm)\n  background-color: var(--color-surface-secondary)\n  border-left: solid thick\n\n  >:last-child\n    border-top-right-radius: inherit\n    border-bottom-right-radius: inherit\n\n.printer-event-text\n  flex: 1\n  padding: 0px 14px\n  overflow: hidden\n\n  .title\n    display: flex\n    justify-content: space-between\n\n  &.link\n    &:hover\n      cursor: pointer\n      opacity: .9\n\n  .description ::v-deep div\n    text-overflow: ellipsis\n    overflow: hidden\n    white-space: nowrap\n\n.printer-event-snapshot\n  flex: 0 0 120px\n  background-size: cover\n  background-repeat: no-repeat\n  background-position: center center\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterEventCard.vue?vue&type=template&id=3cbabed8&scoped=true&\"\nimport script from \"./PrinterEventCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterEventCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterEventCard.vue?vue&type=style&index=0&id=3cbabed8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3cbabed8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #topBarRight>\n      <div>\n        <b-dropdown right no-caret toggle-class=\"icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-filter\"></i>\n          </template>\n          <b-dropdown-item\n            v-for=\"eventClass in eventClassFiltering\"\n            :key=\"eventClass.key\"\n            @click=\"toggleEventFiltering('eventClassFiltering', eventClass.key)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: eventClass.selected ? 'visible' : 'hidden' }\"\n            ></i\n            ><span :class=\"cssClassFromEventClass(eventClass.key)\">{{ eventClass.title }}</span>\n          </b-dropdown-item>\n          <b-dropdown-divider />\n          <b-dropdown-item\n            v-for=\"eventType in eventTypeFiltering\"\n            :key=\"eventType.key\"\n            @click=\"toggleEventFiltering('eventTypeFiltering', eventType.key)\"\n          >\n            <i\n              class=\"fas fa-check text-primary\"\n              :style=\"{ visibility: eventType.selected ? 'visible' : 'hidden' }\"\n            ></i\n            >{{ eventType.title }}\n          </b-dropdown-item>\n        </b-dropdown>\n      </div>\n    </template>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <div class=\"col-sm-12 col-md-10 col-lg-8\">\n            <div v-if=\"!loading && printerEvents.length === 0\" class=\"text-center\">\n              <img :src=\"require('@static/img/vacation.gif')\" class=\"w-25 my-4\" />\n              <h5 class=\"text-primary\">{{ $t(\"Nothing to look here. Enjoy your vacation!\") }}</h5>\n            </div>\n            <div v-else>\n              <printer-event-card\n                v-for=\"item in printerEvents\"\n                :key=\"item.id\"\n                :printer-event=\"item\"\n              />\n              <mugen-scroll\n                :handler=\"fetchMoreData\"\n                :should-handle=\"!loading\"\n                class=\"text-center p-4\"\n              >\n                <div v-if=\"noMoreData\" class=\"text-center p-2\">{{ $t(\"No more notifications.\") }}</div>\n                <b-spinner v-if=\"!noMoreData\" label=\"Loading...\"></b-spinner>\n              </mugen-scroll>\n            </div>\n          </div>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport filter from 'lodash/filter'\nimport map from 'lodash/map'\nimport axios from 'axios'\nimport MugenScroll from 'vue-mugen-scroll'\n\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport PrinterEventCard from '@src/components/printer-events/PrinterEventCard.vue'\nimport { getLocalPref, setLocalPref } from '@src/lib/pref'\nimport { normalizedPrinterEvent } from '@src/lib/normalizers'\nimport findIndex from 'lodash/findIndex'\n\nconst LOCAL_PREF_NAMES = {\n  eventClassFiltering: 'printer-event-class-filtering',\n  eventTypeFiltering: 'printer-event-type-filtering',\n}\n\nconst localPrefKey = (prefix, key) => {\n  return `${LOCAL_PREF_NAMES['prefix']}.${key}`\n}\n\nconst localPref = (prefix, key, defaultValue) => {\n  return getLocalPref(localPrefKey(prefix, key), defaultValue)\n}\n\nconst PAGE_SIZE = 12\n\nexport default {\n  name: 'PrinterEventsPage',\n\n  components: {\n    MugenScroll,\n    PageLayout,\n    PrinterEventCard,\n  },\n\n  props: {},\n\n  data() {\n    return {\n      printerEvents: [],\n      loading: false,\n      noMoreData: false,\n      eventClassFiltering: [\n        { key: 'ERROR', title: 'Error', selected: localPref('eventClassFiltering', 'ERROR', true) },\n        {\n          key: 'WARNING',\n          title: 'Warning',\n          selected: localPref('eventClassFiltering', 'WARNING', true),\n        },\n        {\n          key: 'SUCCESS',\n          title: 'Successs',\n          selected: localPref('eventClassFiltering', 'SUCCESS', true),\n        },\n        { key: 'INFO', title: 'Other', selected: localPref('eventClassFiltering', 'INFO', true) },\n      ],\n      eventTypeFiltering: [\n        {\n          key: 'ALERT',\n          title: 'Failure Detection',\n          selected: localPref('eventTypeFiltering', 'ALERT', true),\n        },\n        {\n          key: 'ENDED',\n          title: 'Print Job Ended',\n          selected: localPref('eventTypeFiltering', 'ENDED', true),\n        },\n        {\n          key: 'STARTED',\n          title: 'Print Job Started',\n          selected: localPref('eventTypeFiltering', 'STARTED', true),\n        },\n        {\n          key: 'PAUSE_RESUME',\n          title: 'Print Job Paused/Resumed',\n          selected: localPref('eventTypeFiltering', 'PAUSE_RESUME', true),\n        },\n        {\n          key: 'FILAMENT_CHANGE',\n          title: 'Filament Change',\n          selected: localPref('eventTypeFiltering', 'FILAMENT_CHANGE', true),\n        },\n        {\n          key: 'PRINTER_ERROR',\n          title: 'Printer Error',\n          selected: localPref('eventTypeFiltering', 'PRINTER_ERROR', true),\n        },\n      ],\n    }\n  },\n\n  created() {\n    this.refetchData()\n  },\n\n  methods: {\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n\n      this.loading = true\n      const filter_by_classes = map(filter(this.eventClassFiltering, 'selected'), 'key')\n      const filter_by_types = map(filter(this.eventTypeFiltering, 'selected'), 'key')\n      axios\n        .get(urls.printerEvents(), {\n          params: {\n            start: this.printerEvents.length,\n            limit: PAGE_SIZE,\n            filter_by_classes,\n            filter_by_types,\n          },\n        })\n        .then((response) => {\n          this.loading = false\n          this.noMoreData = response.data.length < PAGE_SIZE\n          this.printerEvents.push(...response.data.map((data) => normalizedPrinterEvent(data)))\n        })\n    },\n    refetchData() {\n      this.printerEvents = []\n      this.noMoreData = false\n      this.fetchMoreData()\n    },\n    cssClassFromEventClass(eventClass) {\n      switch (eventClass) {\n        case 'ERROR':\n          return 'text-danger'\n        case 'INFO':\n          return ''\n        default:\n          return `text-${eventClass.toLowerCase()}`\n      }\n    },\n    toggleEventFiltering(filter, key) {\n      const i = findIndex(this[filter], (f) => f.key == key)\n      const original = this[filter][i]\n      this.$set(this[filter], i, { ...original, selected: !original.selected })\n      setLocalPref(localPrefKey('eventClassFiltering', filter.key), !original.selected)\n      this.refetchData()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped></style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventsPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterEventsPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterEventsPage.vue?vue&type=template&id=0d7008ab&scoped=true&\"\nimport script from \"./PrinterEventsPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterEventsPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0d7008ab\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"printer-name truncated\"},[_vm._v(\" \"+_vm._s(_vm.printer ? _vm.printer.name : '')+\" \")])]},proxy:true},{key:\"topBarRight\",fn:function(){return [(_vm.printer)?_c('div',{staticClass:\"action-panel\"},[_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/tunnels/${_vm.printer.id}/`,\"title\":_vm.$t('OctoPrint Tunnel')}},[_c('svg',{staticClass:\"custom-svg-icon\"},[_c('use',{attrs:{\"href\":\"#svg-tunnel\"}})]),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"OctoPrint Tunnel\")))])]),_c('a',{staticClass:\"btn shadow-none action-btn icon-btn\",attrs:{\"href\":`/printers/${_vm.printer.id}/`,\"title\":_vm.$t('Configure')}},[_c('i',{staticClass:\"fas fa-wrench\"}),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t(\"Configure\")))])]),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn d-md-none\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}],null,false,3452768261)},[_c('cascaded-dropdown',{ref:\"cascadedDropdown\",attrs:{\"menu-options\":[\n            {\n              key: 'tunnel',\n              svgIcon: 'svg-tunnel',\n              title: _vm.$t('OctoPrint Tunnel'),\n              href: `/tunnels/${_vm.printer.id}/`,\n            },\n            {\n              key: 'settings',\n              icon: 'fas fa-wrench',\n              title: _vm.$t('Configure'),\n              href: `/printers/${_vm.printer.id}/`,\n            },\n          ]},on:{\"menuOptionClicked\":_vm.onMenuOptionClicked}})],1)],1):_vm._e()]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"contentWrap\"},[(_vm.printerComm !== null && _vm.printer !== null)?_c('printer-terminal',{attrs:{\"printer\":_vm.printer,\"printer-comm\":_vm.printerComm,\"full-screen-height\":true,\"show-full-screen-opt\":false}}):_vm._e()],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <!-- Tob bar -->\n    <template #topBarLeft>\n      <div class=\"printer-name truncated\">\n        {{ printer ? printer.name : '' }}\n      </div>\n    </template>\n    <template #topBarRight>\n      <div v-if=\"printer\" class=\"action-panel\">\n        <!-- Tunnel -->\n        <a\n          :href=\"`/tunnels/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          :title=\"$t('OctoPrint Tunnel')\"\n        >\n          <svg class=\"custom-svg-icon\">\n            <use href=\"#svg-tunnel\" />\n          </svg>\n          <span class=\"sr-only\">{{ $t(\"OctoPrint Tunnel\") }}</span>\n        </a>\n        <!-- Configure -->\n        <a\n          :href=\"`/printers/${printer.id}/`\"\n          class=\"btn shadow-none action-btn icon-btn\"\n          :title=\"$t('Configure')\"\n        >\n          <i class=\"fas fa-wrench\"></i>\n          <span class=\"sr-only\">{{ $t(\"Configure\") }}</span>\n        </a>\n        <!-- Mobile Menu -->\n        <b-dropdown right no-caret toggle-class=\"icon-btn d-md-none\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <cascaded-dropdown\n            ref=\"cascadedDropdown\"\n            :menu-options=\"[\n              {\n                key: 'tunnel',\n                svgIcon: 'svg-tunnel',\n                title: $t('OctoPrint Tunnel'),\n                href: `/tunnels/${printer.id}/`,\n              },\n              {\n                key: 'settings',\n                icon: 'fas fa-wrench',\n                title: $t('Configure'),\n                href: `/printers/${printer.id}/`,\n              },\n            ]\"\n            @menuOptionClicked=\"onMenuOptionClicked\"\n          />\n        </b-dropdown>\n      </div>\n    </template>\n    <!-- Page content -->\n    <template #content>\n      <div class=\"contentWrap\">\n        <printer-terminal\n          v-if=\"printerComm !== null && printer !== null\"\n          :printer=\"printer\"\n          :printer-comm=\"printerComm\"\n          :full-screen-height=\"true\"\n          :show-full-screen-opt=\"false\"\n        ></printer-terminal>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport urls from '@config/server-urls'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport { user } from '@src/lib/page-context'\nimport split from 'lodash/split'\nimport CascadedDropdown from '@src/components/CascadedDropdown'\nimport PrinterTerminal from '@src/components/terminal/PrinterTerminal'\n\nexport default {\n  name: 'PrinterTerminalPage',\n\n  components: {\n    PageLayout,\n    CascadedDropdown,\n    PrinterTerminal,\n  },\n\n  data: function () {\n    return {\n      user: null,\n      printerId: null,\n      printer: null,\n      printerComm: null,\n    }\n  },\n\n  created() {\n    this.user = user()\n    this.printerId = split(window.location.pathname, '/').slice(-3, -2).pop()\n    this.printerComm = printerCommManager.getOrCreatePrinterComm(\n      this.printerId,\n      urls.printerWebSocket(this.printerId),\n      {\n        onPrinterUpdateReceived: (data) => {\n          this.printer = normalizedPrinter(data, this.printer)\n        },\n        onTerminalFeedReceived: this.onNextTerminalFeed,\n      }\n    )\n    this.printerComm.connect()\n  },\n\n  methods: {\n    onMenuOptionClicked(menuOptionKey) {\n      if (menuOptionKey === 'share') {\n        this.onSharePrinter()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.printer-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n\n.custom-svg-icon\n  height: 1.25rem\n  width: 1.25rem\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrinterTerminalPage.vue?vue&type=template&id=020f0348&scoped=true&\"\nimport script from \"./PrinterTerminalPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PrinterTerminalPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrinterTerminalPage.vue?vue&type=style&index=0&id=020f0348&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"020f0348\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',[_c('b-col',[_c('h2',{staticClass:\"text-center\"},[_vm._v(_vm._s(_vm.$t('First Layer Snapshots')))]),_c('p',{staticClass:\"my-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Help {brandName}'s First Layer AI (codename: Celestrius) learn and improve quickly by telling her what issues exist in each of these snapshots.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',{staticClass:\"text-secondary\"},[_vm._v(_vm._s(_vm.$t('Why should I do this?')))]),_c('p',{staticClass:\"text-secondary small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"{brandName}'s First Layer AI is still in her infant time. Just like a human baby, the only way she can learn is to be told by adults what is good and what is bad. By telling her what issues exist in these snapshots, you will help her get better at telling a good first layer apart from a bad one.\",{brandName:_vm.$syndicateText.brandName}))+\" \")]),_c('p',{staticClass:\"small\"},[_c('i',[_vm._v(\" \"+_vm._s(_vm.$t(\"Privacy Notice: By participating in this survey, you grant the {brandName} team members the permission to review all snapshots below.\",{brandName:_vm.$syndicateText.brandName}))+\" \")])]),_c('h5',{staticClass:\"text-primary mt-4\"},[_vm._v(_vm._s(_vm.$t('Earn 3 AI Detection Hours!')))]),_c('p',{staticClass:\"text-primary mb-5\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"{name} snapshots were selected from your first layer print. Earn 3 AI Detection Hours by telling us if you see any printing issues with these snapshots!\",{name:_vm.shots.length}))+\" \")])])],1),_c('b-row',{staticClass:\"feedback-card\"},[_c('b-col',{attrs:{\"md\":\"8\",\"lg\":\"6\"}},[_c('div',{staticClass:\"card\"},[_c('loading',{attrs:{\"active\":_vm.firstLayerInspection === null,\"is-full-page\":true}}),(_vm.firstLayerInspection !== null)?_c('div',[_c('div',[_c('div',[_c('vue-slick-carousel',{ref:\"carousel\",attrs:{\"arrows\":false,\"dots\":true},on:{\"afterChange\":_vm.onNextShot},scopedSlots:_vm._u([{key:\"customPaging\",fn:function(page){return [_c('div',{class:_vm.pageClass(page)},[_vm._v(\"•\")])]}}],null,false,3226812120)},_vm._l((_vm.shots),function(shot,i){return _c('first-layer-shot-card',{key:i,attrs:{\"shot\":shot,\"shot-index\":i,\"total-shots\":_vm.shots.length},on:{\"imageUpdated\":_vm.onImageUpdated,\"prev\":_vm.onPrev,\"next\":_vm.onNext}})}),1)],1),_c('br'),_c('div',{staticClass:\"card-body p-3\"})])]):_vm._e()],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('img',{staticClass:\"card-img-top\",attrs:{\"src\":_vm.shot.image_url}}),_c('div',{staticClass:\"px-3 pt-4\"},[_c('p',[_vm._v(_vm._s(_vm.$t('What issues do you see in this snapshot? Select all that apply.')))]),_c('div',{staticClass:\"mb-4\"},[_c('b-form',[_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.raisedRipples),callback:function ($$v) {_vm.$set(_vm.labels, \"raisedRipples\", $$v)},expression:\"labels.raisedRipples\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Raised ripples ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('raised', 'Raised ripples')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.bubbling),callback:function ($$v) {_vm.$set(_vm.labels, \"bubbling\", $$v)},expression:\"labels.bubbling\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Bubbling ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('bubbling', 'Bubbling')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.bumpsAndRoughSurface),callback:function ($$v) {_vm.$set(_vm.labels, \"bumpsAndRoughSurface\", $$v)},expression:\"labels.bumpsAndRoughSurface\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Bumps or rough surfaces ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('bumps', 'Bumps or rough surfaces')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.detached),callback:function ($$v) {_vm.$set(_vm.labels, \"detached\", $$v)},expression:\"labels.detached\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Detached or warping ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('detached', 'Detached or warping')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.gaps),callback:function ($$v) {_vm.$set(_vm.labels, \"gaps\", $$v)},expression:\"labels.gaps\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Gaps between lines ({localizedDom})`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (() => _vm.openExample('gaps', 'Gaps between lines')).apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('examples')))])]},proxy:true}])})],1),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.other),callback:function ($$v) {_vm.$set(_vm.labels, \"other\", $$v)},expression:\"labels.other\"}},[_vm._v(_vm._s(_vm.$t('Other')))]),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.noIssues),callback:function ($$v) {_vm.$set(_vm.labels, \"noIssues\", $$v)},expression:\"labels.noIssues\"}},[_vm._v(_vm._s(_vm.$t('No issues')))]),_c('b-form-checkbox',{staticClass:\"pr-5\",model:{value:(_vm.labels.notANozzleCam),callback:function ($$v) {_vm.$set(_vm.labels, \"notANozzleCam\", $$v)},expression:\"labels.notANozzleCam\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(`Oops, this is {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/nozzle-camera-configuration'),\"target\":\"_blank\"}},[_vm._v(\" \"+_vm._s(_vm.$t('not a nozzle camera')))])]},proxy:true}])})],1)],1)],1),_c('div',{staticClass:\"navigation-container my-4\"},[_c('b-button',{attrs:{\"disabled\":_vm.isFirst,\"variant\":\"outline-secondary\"},on:{\"click\":function($event){return _vm.$emit('prev')}}},[_c('i',{staticClass:\"fas fa-chevron-left\"}),_vm._v(\"  \"+_vm._s(_vm.$t('Previous'))+\" \")]),_c('b-button',{attrs:{\"disabled\":!_vm.labelsSelected,\"variant\":\"outline-secondary\"},on:{\"click\":_vm.onNext}},[_vm._v(\" \"+_vm._s(_vm.isLast ? _vm.$t('Finish') : _vm.$t('Next'))+\"  \"),_c('i',{staticClass:\"fas fa-chevron-right\"})])],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <img class=\"card-img-top\" :src=\"shot.image_url\" />\n    <div class=\"px-3 pt-4\">\n      <p>{{ $t('What issues do you see in this snapshot? Select all that apply.') }}</p>\n      <div class=\"mb-4\">\n        <b-form>\n          <b-form-checkbox v-model=\"labels.raisedRipples\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Raised ripples ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('raised', 'Raised ripples')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.bubbling\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Bubbling ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('bubbling', 'Bubbling')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.bumpsAndRoughSurface\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Bumps or rough surfaces ({localizedDom})`)\">\n              <template #localizedDom>\n                <a\n                  href=\"#\"\n                  @click.prevent=\"() => openExample('bumps', 'Bumps or rough surfaces')\"\n                  >{{ $t('examples') }}</a\n                >\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.detached\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Detached or warping ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('detached', 'Detached or warping')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.gaps\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Gaps between lines ({localizedDom})`)\">\n              <template #localizedDom>\n                <a href=\"#\" @click.prevent=\"() => openExample('gaps', 'Gaps between lines')\">{{\n                  $t('examples')\n                }}</a>\n              </template>\n            </i18next>\n          </b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.other\" class=\"pr-5\">{{ $t('Other') }}</b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.noIssues\" class=\"pr-5\">{{\n            $t('No issues')\n          }}</b-form-checkbox>\n          <b-form-checkbox v-model=\"labels.notANozzleCam\" class=\"pr-5\">\n            <i18next :translation=\"$t(`Oops, this is {localizedDom}`)\">\n              <template #localizedDom>\n                <a :href=\"getDocUrl('/user-guides/nozzle-camera-configuration')\" target=\"_blank\"\n                  >&nbsp;{{ $t('not a nozzle camera') }}</a\n                >\n              </template>\n            </i18next>\n          </b-form-checkbox>\n        </b-form>\n      </div>\n      <div class=\"navigation-container my-4\">\n        <b-button :disabled=\"isFirst\" variant=\"outline-secondary\" @click=\"$emit('prev')\">\n          <i class=\"fas fa-chevron-left\"></i>&nbsp;&nbsp;{{ $t('Previous') }}\n        </b-button>\n\n        <b-button :disabled=\"!labelsSelected\" variant=\"outline-secondary\" @click=\"onNext\">\n          {{ isLast ? $t('Finish') : $t('Next') }}&nbsp;&nbsp;<i class=\"fas fa-chevron-right\"></i>\n        </b-button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport raised1 from '@src/components/first-layer-review/example-images/raisedRipples-2.jpg'\nimport raised2 from '@src/components/first-layer-review/example-images/raisedRipples-3.jpg'\nimport bubbling1 from '@src/components/first-layer-review/example-images/bubbling-1.jpg'\nimport bubbling2 from '@src/components/first-layer-review/example-images/bubbling-2.jpg'\nimport bumps1 from '@src/components/first-layer-review/example-images/bumpsAndRoughSurface-1.jpg'\nimport bumps2 from '@src/components/first-layer-review/example-images/bumpsAndRoughSurface-2.jpg'\nimport detached1 from '@src/components/first-layer-review/example-images/detached-1.jpg'\nimport detached2 from '@src/components/first-layer-review/example-images/detached-2.jpg'\nimport gaps1 from '@src/components/first-layer-review/example-images/gaps-1.jpg'\nimport gaps2 from '@src/components/first-layer-review/example-images/gaps-2.jpg'\n\nexport default {\n  name: 'FirstLayerShotCard',\n\n  props: {\n    shot: {\n      type: Object,\n      required: true,\n    },\n    totalShots: {\n      type: Number,\n      required: true,\n    },\n    shotIndex: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  computed: {\n    labelsSelected() {\n      return this.labelsToString(this.labels) !== ''\n    },\n    isFirst() {\n      return this.shotIndex === 0\n    },\n    isLast() {\n      return this.totalShots - 1 === this.shotIndex\n    },\n  },\n  watch: {\n    shot: {\n      immediate: true,\n      handler(shot) {\n        this.parseLabelsString(shot.labels)\n      },\n    },\n  },\n\n  data() {\n    return {\n      answer: this.shot.answer,\n      labels: {\n        bubbling: false,\n        raisedRipples: false,\n        bumpsAndRoughSurface: false,\n        detached: false,\n        gaps: false,\n        other: false,\n        noIssues: false,\n        notANozzleCam: false,\n      },\n    }\n  },\n\n  methods: {\n    labelsToString: function (labels) {\n      return Object.keys(labels)\n        .filter((key) => labels[key])\n        .join('|')\n    },\n\n    onNext: function () {\n      this.updateLabels()\n      this.$emit('next')\n    },\n\n    updateLabels: function () {\n      const labelsString = this.labelsToString(this.labels)\n\n      axios\n        .patch(`/ent/api/first_layer_inspection_image/${this.shot.id}/`, {\n          labels: labelsString,\n        })\n        .then((response) => {\n          this.$emit('imageUpdated', response.data)\n        })\n    },\n    parseLabelsString(labels) {\n      const labelArray = labels.split('|')\n      for (const key in this.labels) {\n        this.$set(this.labels, key, labelArray.includes(key))\n      }\n    },\n    openExample(type, desc) {\n      const imageUrls = {\n        raised: [raised1, raised2],\n        bubbling: [bubbling1, bubbling2],\n        bumps: [bumps1, bumps2],\n        detached: [detached1, detached2],\n        gaps: [gaps1, gaps2],\n      }\n      this.$swal.fire({\n        title: `<p style=\"text-align:center\">${desc}</p>`,\n        html: `\n          <div style=\"display:flex; align-items:center; justify-content:center; width: 100%; gap: 10px; flex-direction: column;\">\n              <img src=${imageUrls[type][0]} width=\"100%\" height=\"400\" alt=\"${type} example 1\"></img>\n              <img src=${imageUrls[type][1]} width=\"100%\" height=\"400\" alt=\"${type} example 2\"></img>\n            </div>\n            `,\n        customClass: {\n          container: 'dark-backdrop',\n        },\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.navigation-container\n  display: flex\n  justify-content: space-between\n  align-items: center\n  gap: 1rem\n  margin: -1.5em\n  margin-bottom: .5em\n  padding: 1em 1.5em\n  background-color: var(--color-surface-primary)\n  .btn\n    flex-shrink: 0\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerShotCard.vue?vue&type=template&id=26964d5c&scoped=true&\"\nimport script from \"./FirstLayerShotCard.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerShotCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerShotCard.vue?vue&type=style&index=0&id=26964d5c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"26964d5c\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row>\n          <b-col>\n            <h2 class=\"text-center\">{{ $t('First Layer Snapshots') }}</h2>\n            <p class=\"my-4\">\n              {{$t(\"Help {brandName}'s First Layer AI (codename: Celestrius) learn and improve quickly by telling her what issues exist in each of these snapshots.\",{brandName:$syndicateText.brandName})}}\n            </p>\n            <p class=\"text-secondary\">{{ $t('Why should I do this?') }}</p>\n            <p class=\"text-secondary small\">\n              {{$t(\"{brandName}'s First Layer AI is still in her infant time. Just like a human baby, the only way she can learn is to be told by adults what is good and what is bad. By telling her what issues exist in these snapshots, you will help her get better at telling a good first layer apart from a bad one.\",{brandName:$syndicateText.brandName})}}\n            </p>\n            <p class=\"small\">\n              <i\n                >\n                {{ $t(\"Privacy Notice: By participating in this survey, you grant the {brandName} team members the permission to review all snapshots below.\",{brandName:$syndicateText.brandName}) }}\n                </i\n              >\n            </p>\n            <h5 class=\"text-primary mt-4\">{{ $t('Earn 3 AI Detection Hours!') }}</h5>\n            <p class=\"text-primary mb-5\">\n              {{ $t(\"{name} snapshots were selected from your first layer print. Earn 3 AI Detection Hours by telling us if you see any printing issues with these snapshots!\",{name:shots.length}) }}\n            </p>\n          </b-col>\n        </b-row>\n        <b-row class=\"feedback-card\">\n          <b-col md=\"8\" lg=\"6\">\n            <div class=\"card\">\n              <loading :active=\"firstLayerInspection === null\" :is-full-page=\"true\"></loading>\n              <div v-if=\"firstLayerInspection !== null\">\n                <div>\n                  <div>\n                    <vue-slick-carousel\n                      ref=\"carousel\"\n                      :arrows=\"false\"\n                      :dots=\"true\"\n                      @afterChange=\"onNextShot\"\n                    >\n                      <first-layer-shot-card\n                        v-for=\"(shot, i) in shots\"\n                        :key=\"i\"\n                        :shot=\"shot\"\n                        :shot-index=\"i\"\n                        :total-shots=\"shots.length\"\n                        @imageUpdated=\"onImageUpdated\"\n                        @prev=\"onPrev\"\n                        @next=\"onNext\"\n                      ></first-layer-shot-card>\n                      <template #customPaging=\"page\">\n                        <div :class=\"pageClass(page)\">&bull;</div>\n                      </template>\n                    </vue-slick-carousel>\n                  </div>\n                  <br />\n                  <div class=\"card-body p-3\"></div>\n                </div>\n              </div>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport findIndex from 'lodash/findIndex'\nimport VueSlickCarousel from 'vue-slick-carousel'\nimport 'vue-slick-carousel/dist/vue-slick-carousel.css'\nimport 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'\nimport Loading from 'vue-loading-overlay'\nimport 'vue-loading-overlay/dist/vue-loading.css'\nimport PageLayout from '@src/components/PageLayout'\nimport FirstLayerShotCard from '@src/components/first-layer-review/FirstLayerShotCard.vue'\n\nexport default {\n  name: 'FirstLayerInspectionImagePage',\n  components: {\n    Loading,\n    FirstLayerShotCard,\n    VueSlickCarousel,\n    PageLayout,\n  },\n\n  data: function () {\n    return {\n      shots: [],\n      currentShot: 0,\n      firstLayerInspection: null,\n      inspectionId: null,\n    }\n  },\n  computed: {},\n\n  mounted() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      const urlParts = window.location.pathname.split('/')\n      this.inspectionId = urlParts[urlParts.length - 2]\n\n      const urlParams = new URLSearchParams(window.location.search)\n      this.inspectionId = urlParams.get('print_id')\n\n      axios.get(urls.firstLayerInspection(this.inspectionId)).then((response) => {\n        if (response.data.length) {\n          this.firstLayerInspection = response.data[0]\n          this.shots = this.firstLayerInspection.images.sort((a, b) => a.id - b.id)\n        }\n      })\n    },\n\n    onImageUpdated(data) {\n      const i = findIndex(this.shots, (shot) => shot.id == data.id)\n      this.$set(this.shots, i, data)\n      const { credited_dhs } = data\n\n      if (credited_dhs > 0) {\n        this.$swal.Prompt.fire({\n          title: `${this.$i18next.t('You just earned 3 AI Detection Hours!')}`,\n          html: `<p>${this.$i18next.t(\"Having more training data is crucial for a better First Layer AI. Thank you!\")}</p><p>${this.$i18next.t(\"You can now close this page\")}.</p>`,\n          confirmButtonText: `${this.$i18next.t('Okay!')}`,\n        })\n      }\n    },\n\n    onNextShot(shotIndex) {\n      this.currentShot = shotIndex\n    },\n\n    onPrev() {\n      this.$refs.carousel.prev()\n    },\n\n    onNext() {\n      this.$refs.carousel.next()\n    },\n\n    pageClass(page) {\n      if (page === this.currentShot) {\n        return 'page-visiting'\n      }\n      return this.shots[page].answered_at ? 'text-success' : 'page-unvisited'\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.prev-btn\n  display: inline\n  position: absolute\n  left: 2%\n  top: 40%\n  opacity: 0.5\n\n.next-btn\n  display: inline\n  position: absolute\n  right: 2%\n  top: 40%\n  opacity: 0.5\n\n.page-visiting\n  color: var(--color-primary)\n\n.page-unvisited\n  color: var(--color-divider)\n\n.feedback-container\n  padding-left: 30px\n  padding-right: 30px\n\n.cardH\n  align-items: center\n  justify-content: center\n  display: flex\n  gap: 5px\n\n.feedback-card\n  justify-content: center\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FirstLayerInspectionImagePage.vue?vue&type=template&id=07968630&scoped=true&\"\nimport script from \"./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"\nexport * from \"./FirstLayerInspectionImagePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FirstLayerInspectionImagePage.vue?vue&type=style&index=0&id=07968630&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"07968630\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('chat-panel-header',{ref:\"chatHeader\",attrs:{\"should-popup-chat-panel\":Boolean(_vm.oauthAccessToken),\"credits-info\":_vm.creditsInfo},on:{\"action\":_vm.callAgentAction,\"show-contact-support-form\":_vm.showContactSupportForm,\"show-discord-support-message\":_vm.showDiscordSupportMessage,\"show-upgrade-modal\":_vm.openUpgradeModal}}),_c('upgrade-modal',{attrs:{\"show\":_vm.showUpgradeModal,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"close\":_vm.closeUpgradeModal}}),(_vm.oauthAccessToken)?_c('div',{staticClass:\"chat-container mt-3\"},[_c('div',{ref:\"chatMessageContainer\",staticClass:\"chat-messages\",on:{\"scroll\":_vm.handleChatScroll}},[_vm._m(0),_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.content)?_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[(message.has_upgrade_link)?_c('div',{staticClass:\"upgrade-message\"},[_c('div',[_vm._v(_vm._s(_vm.$t('Since you are on a Free plan, please join our Discord server to seek support from the community.')))]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('You can also {localizedDom} to get email support from the Obico team.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"upgrade-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.openUpgradeModal.apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('upgrade to the Unlimited plan')))])]},proxy:true}],null,true)})],1)]):_c('VueMarkdown',[_vm._v(_vm._s(message.content))]),(\n                message.per_override_explanations && message.per_override_explanations.length > 0\n              )?_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Detailed explanations:\")))]),_vm._l((message.per_override_explanations),function(explanation,index){return _c('div',{key:index},[_c('div',[_c('b',[_vm._v(_vm._s(explanation.parameter)+\":\")]),_vm._v(\" \"+_vm._s(explanation.explanation)+\" \")])])})],2):_vm._e()],1)]):_vm._e(),(message.slicing_profiles && _vm.slicingSettingsInMessage(message))?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I have applied the following settings:\")))]),(message.slicing_profiles.use_print_process_preset)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Process preset:\"))+\" \"),_c('b',[_vm._v(_vm._s(message.slicing_profiles.use_print_process_preset))])]):_vm._e(),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Additional slicing parameters:\"))+\" \"),(Object.keys(_vm.changedParams(message)).length === 0)?_c('b',[_vm._v(_vm._s(_vm.$t(\"None\")))]):_vm._e(),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\"     - \"+_vm._s(key)+\": \"),_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(value))])])})],2)]),(index !== _vm.messages.length - 1)?_c('div',{staticClass:\"quick-button pt-2\"},[_c('quick-button-component',{attrs:{\"message\":_vm.$t('Re-apply settings')},on:{\"click\":function($event){return _vm.applySettingsInMessage(message)}}})],1):_vm._e()],1)]):_vm._e(),(message.suggested_printing_method)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I suggest the following to achieve the best results:\")))]),_c('VueMarkdown',[_vm._v(_vm._s(message.suggested_printing_method))])],1)]):_vm._e(),(message.jusprinNotification)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Oh no! My slicing algorithm lord just said:\")))]),_c('div',{staticClass:\"notification-text\",class:message.jusprinNotification.level},[_c('i',{class:message.jusprinNotification.level === 'error'\n                    ? 'mdi mdi-alert-circle'\n                    : 'mdi mdi-alert'}),_vm._v(\" \"+_vm._s(message.jusprinNotification.text)+\" \")])])]):_vm._e(),(message.discord_support)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"discord-support-container\"},[_c('div',{staticClass:\"discord-info\"},[_c('div',{staticClass:\"discord-url\"},[_c('strong',[_vm._v(\"Discord Server:\")]),_c('code',[_vm._v(_vm._s(message.discord_support.url))])]),_c('div',{staticClass:\"discord-instructions\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Scan this QR code with your phone to join our Discord server:\"))+\" \")])]),_c('div',{staticClass:\"qr-code-container\"},[_c('img',{staticClass:\"qr-code\",attrs:{\"src\":message.discord_support.qr_code_url,\"alt\":\"Discord QR Code\"},on:{\"error\":_vm.handleQRCodeError}})])])])]):_vm._e()])}),(_vm.thinking)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block align-items-center\"},[_c('div',{staticClass:\"message-content thinking-animation\"},[_c('VueMarkdown',[_vm._v(\"_\"+_vm._s(_vm.$t(\"Thinking...\"))+\"_\")])],1)])]):_vm._e(),(_vm.showContactSupport)?_c('contact-support-form',{attrs:{\"messages\":_vm.messages,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"form-dismissed\":_vm.handleContactSupportFormDismissed}}):_vm._e(),(_vm.slicingProgress)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block slicing-message-block\",class:{ 'fade-out': _vm.slicingProgress.fadeOut }},[_c('div',{staticClass:\"message-content\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.slicingProgress.overrun ? _vm.$t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.') : _vm.slicingProgress.text || _vm.$t('Slicing in progress...'))+\" \")]),_c('div',{staticClass:\"slicing-progress-container\"},[_c('div',{staticClass:\"slicing-progress-bar\",style:({ width: `${_vm.slicingProgress?.percentage * 100}%` })}),_c('div',{staticClass:\"slicing-progress-text\"},[_vm._v(\" \"+_vm._s(Math.round(_vm.slicingProgress?.percentage * 100))+\"% \")])]),(_vm.slicingProgress.errors && _vm.slicingProgress.errors.length > 0)?_c('div',{staticClass:\"slicing-errors\"},_vm._l((_vm.slicingProgress.errors),function(error,index){return _c('div',{key:index,staticClass:\"error-message\"},[_vm._v(\" \"+_vm._s(error)+\" \")])}),0):_vm._e()])])]):_vm._e(),(_vm.quickButtons.length > 0)?_c('div',{staticClass:\"quick-button pt-2\"},_vm._l((_vm.quickButtons),function(action,index){return _c('quick-button-component',{key:index,attrs:{\"message\":action.message},on:{\"click\":action.onClick}})}),1):_vm._e()],2),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showScrollButton),expression:\"showScrollButton\"}],staticClass:\"scroll-to-bottom\",on:{\"click\":_vm.scrollToBottom}},[_c('i',{staticClass:\"mdi mdi-arrow-down large-icon\"})]),_c('div',{staticClass:\"chat-input\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userInput),expression:\"userInput\"}],ref:\"chatTextarea\",attrs:{\"rows\":\"1\",\"type\":\"text\",\"disabled\":!_vm.readyForUserQuery,\"placeholder\":_vm.readyForUserQuery\n            ? _vm.$t('Type your message here...')\n            : _vm.$t('Select printer, filament, and add models first')},domProps:{\"value\":(_vm.userInput)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleEnterKey.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.userInput=$event.target.value}}}),_vm._v(\" \"),_c('button',{staticClass:\"send-button\",attrs:{\"disabled\":!_vm.readyForUserQuery},on:{\"click\":_vm.onUserInput}},[_c('i',{staticClass:\"mdi mdi-arrow-up send-icon\"})])])]):_c('div',[_c('div',{staticClass:\"login-container\"},[_c('div',[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"id\":\"signUpSignInBtn\"},on:{\"click\":() => _vm.callAgentAction('show_login')}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Sign Up/Sign In to Get Started\"))+\" \")])])])])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('i',{staticClass:\"mdi mdi-alert-circle-outline\"}),_c('span',[_vm._v(\" You are on an outdated JusPrin version. Download the latest version at \"),_c('span',{staticClass:\"highlighted-url\"},[_vm._v(\"https://github.com/TheSpaghettiDetective/JusPrin/releases/latest\")])])])])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"btn btn-outline-primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.handleClick}},[_vm._v(\" \"+_vm._s(_vm.message)+\" \")])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a href=\"#\" class=\"btn btn-outline-primary\" @click=\"handleClick\">\n    {{ message }}\n  </a>\n</template>\n\n<script>\nexport default {\n  name: 'QuickButtonComponent',\n  props: {\n    message: {\n      type: String,\n      required: true,\n    },\n  },\n  methods: {\n    handleClick(event) {\n      this.$emit('click', event)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn\n  width: auto\n  max-width: 100%\n  white-space: normal\n  text-align: center\n  padding: 0.5rem 1rem\n  hyphens: auto\n  word-wrap: break-word\n  overflow-wrap: break-word\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuickButtonComponent.vue?vue&type=template&id=81513708&scoped=true&\"\nimport script from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nexport * from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuickButtonComponent.vue?vue&type=style&index=0&id=81513708&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"81513708\",\n  null\n  \n)\n\nexport default component.exports","import axios from 'axios'\n\nexport default {\n  get: (url, authToken) => {\n    return axios.get(url, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n  post: (url, authToken, data) => {\n    return axios.post(url, data, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n  put: (url, authToken, data) => {\n    return axios.put(url, data, {\n      headers: {\n        Authorization: `Bearer ${authToken}`,\n      },\n    })\n  },\n}\n","// Global state\nwindow.stubAgentActionResponse = new Map()\nwindow.agentActionCallMap = {}\n\nimport i18next from '@src/i18n/i18n.js'\n\n// Helper functions\nexport function setAgentActionRetVal({ refId, retVal = null, error = null }) {\n  window.agentActionCallMap[refId] = { retVal, error }\n}\n\nexport function callAgentAction(action, payload = null, refId = null) {\n  const message = { action }\n  if (payload !== null) message.payload = payload\n  if (refId !== null) message.refId = refId\n\n  if (window.wx?.postMessage) {\n    window.wx.postMessage(message)\n  } else {\n    console.log(`window.wx.postMessage(${JSON.stringify(message)})`)\n\n    if (refId !== null && refId !== undefined) {\n      setTimeout(() => {\n        const retVal = window.stubAgentActionResponse.get(action) || {}\n        setAgentActionRetVal({ refId, retVal })\n      }, 10)\n    }\n  }\n}\n\nexport function getAgentActionResponse(action, payload = {}, timeout = 10000) {\n  return new Promise((resolve, reject) => {\n    const refId = Math.random().toString(36).substring(2, 15)\n    window.agentActionCallMap[refId] = null // Initialize with null\n\n    callAgentAction(action, payload, refId)\n\n    const timeoutId = setTimeout(() => {\n      if (refId in window.agentActionCallMap) {\n        reject(new Error(i18next.t('Timeout: No response for action \"{action}\" within {timeout}ms', {\n          action,\n          timeout\n        })))\n        delete window.agentActionCallMap[refId] // Clean up\n      }\n    }, timeout)\n\n    // Poll for response\n    const checkResponse = () => {\n      const response = window.agentActionCallMap[refId]\n      if (response !== null && response !== undefined) {\n        clearTimeout(timeoutId)\n        delete window.agentActionCallMap[refId] // Clean up\n        if (response.error) {\n          reject(new Error(response.error))\n        } else {\n          resolve(response.retVal)\n        }\n      } else {\n        setTimeout(checkResponse, 10) // Check again in 10ms\n      }\n    }\n    checkResponse()\n  })\n}\n","import { callAgentAction, getAgentActionResponse } from '../lib/agentAction'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  data() {\n    return {\n      quickButtonsStack: [],\n    }\n  },\n  computed: {\n    quickButtons() {\n      return this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n    },\n    cannedActions() {\n      return {\n        addPrinters: {\n          message: this.$i18next.t('Add printer'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n          },\n        },\n        addFilaments: {\n          message: this.$i18next.t('Add filament'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n          },\n        },\n        changePrinter: {\n          message: this.$i18next.t('Change printer'),\n          onClick: () => this.showPresetOptions('printer'),\n        },\n        changeFilament: {\n          message: this.$i18next.t('Change filament'),\n          onClick: () => this.showPresetOptions('filament'),\n        },\n        moreOptions: {\n          message: this.$i18next.t('More options'),\n          onClick: () => this.showMoreOptions(),\n        },\n        cancel: {\n          message: this.$i18next.t('Cancel'),\n          onClick: () => this.popQuickButtons(),\n        },\n        sliceWithCurrentSettings: {\n          message: this.$i18next.t('Slice with current settings'),\n          onClick: () => this.doSliceWithCurrentSettings(),\n        },\n        endTroubleshooting: {\n          message: this.$i18next.t('End troubleshooting'),\n          onClick: () => {\n            this.current_workflow = null\n            this.onUserQueryQuickButton(this.$i18next.t('I want to end troubleshooting'))\n          },\n        },\n        stayInTroubleshooting: {\n          message: this.$i18next.t('Stay in troubleshooting'),\n          onClick: () => {\n            this.onUserQueryQuickButton(this.$i18next.t('I want to continue troubleshooting'))\n          },\n        },\n        startOver: {\n          message: this.$i18next.t('Start over'),\n          onClick: () => this.startOver(),\n        },\n        exportGCode: {\n          message: this.$i18next.t('Export G-code'),\n          onClick: () => this.callAgentAction('export_gcode'),\n        },\n        switchToPreview: {\n          message: this.$i18next.t('Switch to preview'),\n          onClick: () => this.callAgentAction('switch_to_preview'),\n        },\n        autoOrient: {\n          message: this.$i18next.t('Auto-orient models'),\n          onClick: () => {\n            this.autoOrientAllObjects()\n          },\n        },\n        undoAutoOrient: {\n          message: this.$i18next.t('Undo auto-orient'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-orient is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoOrient])\n          },\n        },\n        undoAutoArrange: {\n          message: this.$i18next.t('Undo auto-arrange'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-arrange is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoArrange])\n          },\n        },\n        enableSupport: {\n          message: this.$i18next.t('Enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '1' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Support enabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.enableSupport])\n            this.setQuickButtons([this.cannedActions.undoEnableSupport, ...this.quickButtons])\n          },\n        },\n        undoEnableSupport: {\n          message: this.$i18next.t('Undo enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '0' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Support is now disabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoEnableSupport])\n          },\n        },\n        tellMeWhatNotificationMeans: {\n          message: this.$i18next.t('Explain it to me'),\n          onClick: () => {\n            // Find the last assistant message that contains a notification\n            const lastErrorMessage = [...this.messages]\n              .reverse()\n              .find((msg) => msg.role === 'assistant' && msg.jusprinNotification)\n\n            // Get the original error message if found\n            let originalErrorMessage = ''\n            if (lastErrorMessage && lastErrorMessage.jusprinNotification) {\n              originalErrorMessage = lastErrorMessage.jusprinNotification.text\n            }\n\n            // Format the new message\n            const newMessage = this.$i18next.t('JusPrin displays this message: *\"{originalErrorMessage}\"* Explain it to me.', {\n              originalErrorMessage\n            })\n\n            // Send the message\n            this.onUserQueryQuickButton(newMessage)\n          },\n        },\n        acknowledgeError: {\n          message: this.$i18next.t('Okay'),\n          onClick: () => {\n            this.messages.pop()\n            this.popQuickButtons()\n          },\n        },\n        commonPrintingPrompts: {\n          message: this.$i18next.t('Common printing prompts'),\n          onClick: () => this.showCommonPrintingPrompts(),\n        },\n        testRender: {\n          message: this.$i18next.t('Test render'),\n          onClick: () => this.renderPlateForAnalysis(),\n        },\n        analyseModel: {\n          message: this.$i18next.t('✨ Do your magic!'),\n          onClick: () => this.getAnalysisResult(),\n        },\n        plateAnalysisLooksGoodToMe: {\n          message: this.$i18next.t('Looks good to me'),\n          onClick: () => this.queryWithSuggestedPrintingMethod(),\n        },\n        plateAnalysisIsNotGood: {\n          message: this.$i18next.t('You got it wrong. Scratch that.'),\n          onClick: () => this.removePlateAnalysis(),\n        },\n        editPlateAnalysis: {\n          message: this.$i18next.t('Let me change it'),\n          onClick: () => this.editPlateAnalysis(),\n        },\n      }\n    },\n    shouldShowSliceWithCurrentSettingsQuickButton() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      return lastMessage && this.slicingSettingsInMessage(lastMessage)\n    },\n    shouldShowStartOverQuickButton() {\n      return this.messages.some((message) => message.role === 'user')\n    },\n    shouldShowPlateAnalysisQuickButton() {\n      return !this.haveDonePlateAnalysis && this.hasModelObjects\n    },\n  },\n  methods: {\n    pushQuickButtons(actions) {\n      this.quickButtonsStack.push(actions)\n    },\n    popQuickButtons() {\n      this.quickButtonsStack.pop()\n    },\n    removeQuickButtons(actions) {\n      const actionMessages = actions.map((action) => action.message)\n      let topActions = this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n      topActions = topActions.filter((action) => !actionMessages.includes(action.message))\n      this.$set(this.quickButtonsStack, this.quickButtonsStack.length - 1, topActions)\n    },\n    clearQuickButtons() {\n      this.quickButtonsStack = []\n    },\n    setQuickButtons(actions) {\n      this.clearQuickButtons()\n      this.pushQuickButtons(actions)\n    },\n    initUserQueryHintButtons() {\n      const initQueryHints = [\n        this.$i18next.t('Just do a standard print. Nothing special.'),\n        this.$i18next.t('I want to do a fast print. Draft quality.'),\n        this.$i18next.t('Print a strong part.'),\n        this.$i18next.t('My last print did not stick to the bed. Help me fix it.'),\n      ]\n\n      return initQueryHints.map((hint) => ({\n        message: hint,\n        onClick: () => this.onUserQueryQuickButton(hint),\n      }))\n    },\n    showCommonPrintingPrompts() {\n      this.pushQuickButtons([...this.initUserQueryHintButtons(), this.cannedActions.cancel])\n    },\n    async showPresetOptions(presetType) {\n      const presets = (await getAgentActionResponse('get_presets'))[`${presetType}Presets`] || []\n      const options = presets.map((preset) => ({\n        message: preset.name,\n        onClick: async () => {\n          await getAgentActionResponse(`select_preset`, {\n            type: presetType,\n            name: preset.name,\n          })\n          await this.refreshSelectedPresets()\n          this.populateQuickButtons()\n        },\n      }))\n      this.messages.push({\n        role: 'assistant',\n        content: this.$i18next.t('Select a {presetType}. If the {presetType} is not listed, use the \"Add {presetType}\" button to add it first.', {\n          presetType\n        }),\n      })\n      this.pushQuickButtons([\n        ...options,\n        this.cannedActions[`add${presetType.charAt(0).toUpperCase() + presetType.slice(1)}s`],\n        this.cannedActions.cancel,\n      ])\n    },\n    showMoreOptions() {\n      const additionalActions = [\n        this.cannedActions.changePrinter,\n        this.cannedActions.changeFilament,\n        this.cannedActions.addPrinters,\n        this.cannedActions.addFilaments,\n        this.cannedActions.startOver,\n      ]\n      this.removeQuickButtons([this.cannedActions.moreOptions])\n\n      const topActions = this.quickButtons\n      // Filter out actions that are already present in topActions\n      const newActions = additionalActions.filter(\n        (newAction) => !topActions.some((existing) => existing.message === newAction.message)\n      )\n\n      if (newActions.length > 0) {\n        this.popQuickButtons()\n        this.pushQuickButtons([...topActions, ...newActions])\n      }\n    },\n    populateQuickButtons() {\n      const quickButtons = []\n      if (this.shouldShowSliceWithCurrentSettingsQuickButton) {\n        quickButtons.push(this.cannedActions.sliceWithCurrentSettings)\n        quickButtons.push(this.cannedActions.startOver)\n        quickButtons.push(this.cannedActions.moreOptions)\n        this.setQuickButtons(quickButtons)\n        return\n      }\n\n      if (this.shouldShowPlateAnalysisQuickButton) {\n        quickButtons.push(this.cannedActions.analyseModel)\n      }\n\n      if (this.hasModelObjects) {\n        quickButtons.push(this.cannedActions.commonPrintingPrompts)\n      }\n\n      if (this.shouldShowStartOverQuickButton) {\n        quickButtons.push(this.cannedActions.startOver)\n      }\n\n      quickButtons.push(this.cannedActions.moreOptions)\n      this.setQuickButtons(quickButtons)\n    },\n    populateQuickButtonsOnError() {\n      this.setQuickButtons([this.cannedActions.startOver])\n    },\n  },\n}\n","import pluralize from 'pluralize'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  computed: {\n    cannedMessages() {\n      return {\n        greeting: {\n          role: 'assistant',\n          content: this.$i18next.t(\"🤖 Hi, I'm JusBot, your 3D printing AI assistant.\"),\n        },\n        needToAddPrinters: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any printers yet. You need to add at least one printer before you can use JusPrin.\"\n          ),\n        },\n        needToAddFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any filaments yet. You need to add at least one filament before you can use JusPrin.\"\n          ),\n        },\n        noModelObjects: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you don't have any models on your plate.\\n\\nAdd some models to see the magic. 😀\"\n          ),\n        },\n        noSupportForMultiplePlatesOrFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            'I notice your model uses multiple plates or filaments.\\n\\nJusPrin is still in beta and does not support multiple plates or filaments yet.\\n\\nPlease manually slice your model. Also stay tuned for our product update.'\n          ),\n        },\n        currentPresetSelections: (printerName, filamentName) => ({\n          role: 'assistant',\n          content: `${this.$i18next.t('You are currently using:')}\\n- ${this.$i18next.t('Printer:')} **${printerName}**\\n- ${this.$i18next.t('Filament:')} **${filamentName}**`,\n        }),\n        currentModelObjects: (modelObjectCount) => ({\n          role: 'assistant',\n          content:\n            modelObjectCount === 1\n              ? this.$i18next.t('You have {num} model on your plate.', {\n                  num: modelObjectCount,\n                })\n              : this.$i18next.t('You have {num} models on your plate.', {\n                  num: modelObjectCount,\n                }),\n        }),\n        newModelObjects: (newModelObjects) => {\n          let content = ''\n          if (newModelObjects.length === 1) {\n            content = this.$i18next.t('I see \"{modelName}\" added to your plate.', {\n              modelName: newModelObjects[0].name\n            })\n          } else if (newModelObjects.length > 1) {\n            content = (newModelObjects.length - 1) === 1 ? this.$i18next.t('I see \"{modelName}\" and {num} other model added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n              : this.$i18next.t('I see \"{modelName}\" and {num} other models added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n          }\n          return {\n            role: 'assistant',\n            content,\n          }\n        },\n        generalError: {\n          role: 'assistant',\n          content: this.$i18next.t('Sorry, there was an error processing your request.'),\n        },\n      }\n    },\n  },\n}\n","export default {\n  methods: {\n    fixFilamentParamOverrides(param_overrides) {\n      // FIXME: No idea how these temps are used in Orca. But for most printers this hack seems to be good enough.\n\n      // Filament params now have an array of values but apply_config still expects a single value\n      Object.keys(param_overrides).forEach((key) => {\n        if (Array.isArray(param_overrides[key]) && param_overrides[key].length > 0) {\n          param_overrides[key] = param_overrides[key][0]; // Unpack to the first value\n        }\n      });\n\n      const plateTemps = [\n        'cool_plate_temp',\n        'eng_plate_temp',\n        'hot_plate_temp',\n        'textured_cool_plate_temp',\n        'textured_plate_temp',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTemp = plateTemps.find((key) => key in param_overrides)\n\n      if (existingTemp) {\n        const tempValue = param_overrides[existingTemp]\n        // Set the same temperature for all plate types\n        plateTemps.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      const plateTempsInitialLayer = [\n        'cool_plate_temp_initial_layer',\n        'eng_plate_temp_initial_layer',\n        'hot_plate_temp_initial_layer',\n        'textured_cool_plate_temp_initial_layer',\n        'textured_plate_temp_initial_layer',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTempInitialLayer = plateTempsInitialLayer.find((key) => key in param_overrides)\n\n      if (existingTempInitialLayer) {\n        const tempValue = param_overrides[existingTempInitialLayer]\n        // Set the same temperature for all plate types\n        plateTempsInitialLayer.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      return param_overrides\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:\"container\",staticClass:\"gradient-fade-wrapper\",class:{ 'is-unfaded': _vm.isUnfaded },on:{\"click\":_vm.toggleFade}},[_vm._t(\"default\"),(_vm.hasFade && !_vm.isUnfaded)?_c('div',{staticClass:\"fade-overlay\"}):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    ref=\"container\"\n    class=\"gradient-fade-wrapper\"\n    :class=\"{ 'is-unfaded': isUnfaded }\"\n    @click=\"toggleFade\"\n  >\n    <slot></slot>\n    <div v-if=\"hasFade && !isUnfaded\" class=\"fade-overlay\"></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'GradientFadableContainer',\n  data() {\n    return {\n      isUnfaded: false,\n      hasFade: false,\n    }\n  },\n  mounted() {\n    this.checkIfNeedsFade()\n  },\n  updated() {\n    this.checkIfNeedsFade()\n  },\n  methods: {\n    toggleFade() {\n      this.isUnfaded = !this.isUnfaded\n\n      // Wait for transition to complete before rechecking\n      setTimeout(() => {\n        this.checkIfNeedsFade()\n      }, 300)\n    },\n    checkIfNeedsFade() {\n      this.$nextTick(() => {\n        const el = this.$refs.container\n        if (!this.isUnfaded) {\n          this.hasFade = el.scrollHeight > el.clientHeight\n        } else {\n          this.hasFade = false\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gradient-fade-wrapper\n  position: relative\n  max-height: 8rem\n  overflow: hidden\n  transition: max-height 0.3s ease-out\n  cursor: pointer\n\n  &.is-unfaded\n    max-height: 1000px\n\n.fade-overlay\n  position: absolute\n  bottom: 0\n  left: 0\n  right: 0\n  height: 3rem\n  background: linear-gradient(transparent, var(--message-bg, white))\n  pointer-events: none\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GradientFadableContainer.vue?vue&type=template&id=5aa2b926&scoped=true&\"\nimport script from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GradientFadableContainer.vue?vue&type=style&index=0&id=5aa2b926&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"5aa2b926\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-header\"},[_c('div',{staticClass:\"header-left\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.chatPanelPopUpOnErrors),expression:\"chatPanelPopUpOnErrors\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"dont-show-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.chatPanelPopUpOnErrors)?_vm._i(_vm.chatPanelPopUpOnErrors,null)>-1:(_vm.chatPanelPopUpOnErrors)},on:{\"change\":function($event){var $$a=_vm.chatPanelPopUpOnErrors,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.chatPanelPopUpOnErrors=$$a.concat([$$v]))}else{$$i>-1&&(_vm.chatPanelPopUpOnErrors=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.chatPanelPopUpOnErrors=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"dont-show-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pop up on errors\"))+\" \")])])]),(_vm.creditsInfo && _vm.isEnt)?_c('div',{staticClass:\"credit-display\",class:_vm.creditStatusClass,attrs:{\"title\":_vm.creditTooltipText},on:{\"click\":function($event){return _vm.$emit('show-upgrade-modal')}}},[(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('i',{staticClass:\"mdi mdi-crown credit-icon\"}):_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credits\"}}),(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited Account'))+\" \")]):_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.remainingCredits)+\"/\"+_vm._s(_vm.creditsInfo.ai_credit_free_monthly_quota)+\" \")])]):_vm._e(),_c('div',{staticClass:\"header-actions\"},[_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Contact Support')},on:{\"click\":_vm.handleSupportButtonClick}},[_c('i',{staticClass:\"mdi mdi-message-question-outline large-icon\"})]),_c('div',{staticClass:\"header-divider\"},[_vm._v(\"|\")]),(_vm.curChatPanelViewMode !== 'large')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Large Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('large', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-expand large-icon\"})]):_vm._e(),(_vm.curChatPanelViewMode !== 'small')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Small Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('small', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-collapse large-icon\"})]):_vm._e(),_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Close')},on:{\"click\":function($event){return _vm.changeChatPanelVisibility(false)}}},[_c('i',{staticClass:\"mdi mdi-close large-icon\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"chat-header\">\n    <div class=\"header-left\">\n      <div class=\"custom-control custom-checkbox\">\n        <input\n          id=\"dont-show-checkbox\"\n          v-model=\"chatPanelPopUpOnErrors\"\n          class=\"custom-control-input\"\n          type=\"checkbox\"\n        />\n        <label class=\"custom-control-label\" for=\"dont-show-checkbox\"> {{ $t(\"Pop up on errors\") }} </label>\n      </div>\n    </div>\n\n    <!-- Credit Display -->\n    <div\n      v-if=\"creditsInfo && isEnt\"\n      class=\"credit-display\"\n      :class=\"creditStatusClass\"\n      @click=\"$emit('show-upgrade-modal')\"\n      :title=\"creditTooltipText\"\n    >\n      <i v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\" class=\"mdi mdi-crown credit-icon\"></i>\n      <img v-else src=\"/static/img/jusprin-credit.png\" alt=\"Credits\" class=\"credit-icon\" />\n      <span class=\"credit-text\" v-if=\"creditsInfo.ai_credit_free_monthly_quota === -1\">\n        {{ $t('Unlimited Account') }}\n      </span>\n      <span class=\"credit-text\" v-else>\n        {{ remainingCredits }}/{{ creditsInfo.ai_credit_free_monthly_quota }}\n      </span>\n    </div>\n\n    <div class=\"header-actions\">\n      <button\n        class=\"header-button\"\n        :title=\"$t('Contact Support')\"\n        @click=\"handleSupportButtonClick\"\n      >\n        <i class=\"mdi mdi-message-question-outline large-icon\"></i>\n      </button>\n\n      <div class=\"header-divider\">|</div>\n      <button\n        v-if=\"curChatPanelViewMode !== 'large'\"\n        class=\"header-button\"\n        :title=\"$t('Large Chat Window')\"\n        @click=\"changeChatPanelViewMode('large', true)\"\n      >\n        <i class=\"mdi mdi-arrow-expand large-icon\"></i>\n      </button>\n\n      <button\n        v-if=\"curChatPanelViewMode !== 'small'\"\n        class=\"header-button\"\n        :title=\"$t('Small Chat Window')\"\n        @click=\"changeChatPanelViewMode('small', true)\"\n      >\n        <i class=\"mdi mdi-arrow-collapse large-icon\"></i>\n      </button>\n\n      <button class=\"header-button\" :title=\"$t('Close')\" @click=\"changeChatPanelVisibility(false)\">\n        <i class=\"mdi mdi-close large-icon\"></i>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { getAgentActionResponse, callAgentAction } from '../lib/agentAction'\nimport { settings } from '@src/lib/page-context'\n\nexport default {\n  name: 'ChatPanelHeader',\n  props: {\n    shouldPopupChatPanel: {\n      type: Boolean,\n      default: true,\n    },\n    creditsInfo: {\n      type: Object,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      curChatPanelViewMode: 'large',\n      preferredChatPanelViewModeValue:\n        localStorage.getItem('jusprin.preferredChatPanelViewMode') || 'large',\n      curChatPanelVisible: false,\n      popupChatPanelTimeout: null,\n      notificationBadgeCount: {\n        green_badge: 0,\n        orange_badge: 0,\n        red_badge: 0,\n      },\n      chatPanelPopUpOnErrorsValue:\n        localStorage.getItem('jusprin.chatPanelPopUpOnErrors') !== 'false',\n      isEnt: false,\n    }\n  },\n  computed: {\n    chatPanelPopUpOnErrors: {\n      get() {\n        return this.chatPanelPopUpOnErrorsValue\n      },\n      set(newValue) {\n        this.chatPanelPopUpOnErrorsValue = newValue\n        localStorage.setItem('jusprin.chatPanelPopUpOnErrors', newValue.toString())\n      },\n    },\n    preferredChatPanelViewMode: {\n      get() {\n        return this.preferredChatPanelViewModeValue\n      },\n      set(newViewMode) {\n        this.preferredChatPanelViewModeValue = newViewMode\n        localStorage.setItem('jusprin.preferredChatPanelViewMode', newViewMode)\n      },\n    },\n    remainingCredits() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.creditsInfo || this.creditsInfo.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.creditsInfo.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    creditTooltipText() {\n      if (this.creditsInfo.ai_credit_free_monthly_quota === -1) {\n        return this.$i18next.t('Unlimited AI credits')\n      }\n\n      return this.$i18next.t('You are on a free plan, which has limited AI credits. Click to see upgrade options.')\n    },\n  },\n  created() {\n    const { IS_ENT } = settings()\n    this.isEnt = !!IS_ENT\n  },\n\n  async mounted() {\n    const devMode = new URLSearchParams(window.location.search).get('devmode') === 'true'\n    await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n    await this.changeChatPanelVisibility(devMode) // If dev mode, show the chat panel so that we can debug it\n  },\n\n  methods: {\n    async popupChatPanelIfNecessary(level) {\n      if (this.curChatPanelVisible) return // Don't popup if the panel is already open\n\n      if (!this.chatPanelPopUpOnErrors) {\n        if (level === 'error') {\n          this.notificationBadgeCount.red_badge += 1\n        } else if (level === 'warning') {\n          this.notificationBadgeCount.orange_badge += 1\n        } else {\n          this.notificationBadgeCount.green_badge += 1\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n        return\n      }\n      await this.changeChatPanelViewMode('small', false)\n      await this.changeChatPanelVisibility(true)\n    },\n    async changeChatPanelViewMode(newViewMode, savePreferredViewMode = false) {\n      const { view_mode } = await getAgentActionResponse('change_chatpanel_display', {\n        view_mode: newViewMode,\n      })\n\n      this.curChatPanelViewMode = view_mode\n      if (savePreferredViewMode) {\n        this.preferredChatPanelViewMode = view_mode\n      }\n    },\n    async changeChatPanelVisibility(newVisible) {\n      const { visible } = await getAgentActionResponse('change_chatpanel_display', {\n        visible: newVisible,\n      })\n      this.curChatPanelVisible = visible\n    },\n    async processChatPanelFocusEvent(event) {\n      if (!event?.data?.focusEventType) return\n\n      const { focusEventType } = event.data\n      if (focusEventType === 'in_focus') {\n        await this.changeChatPanelViewMode(this.preferredChatPanelViewMode, false)\n        await this.changeChatPanelVisibility(true)\n\n        this.notificationBadgeCount = {\n          green_badge: 0,\n          orange_badge: 0,\n          red_badge: 0,\n        }\n        callAgentAction('set_btn_notification_badges', this.notificationBadgeCount)\n      } else if (focusEventType === 'out_of_focus') {\n        this.changeChatPanelVisibility(false)\n      }\n    },\n    handleSupportButtonClick() {\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        // Free user - show Discord message\n        this.$emit('show-discord-support-message')\n      } else {\n        // Paid user - show contact form\n        this.$emit('show-contact-support-form')\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.chat-header\n  display: flex\n  justify-content: space-between\n  align-items: center\n  padding: 2px 16px\n  background-color: var(--color-primary)\n  color: white\n  position: sticky\n  top: 0\n  z-index: 10\n\n.header-left\n  display: flex\n  align-items: center\n\n.header-actions\n  display: flex\n  align-items: center\n  gap: 8px\n\n.header-button\n  background: none\n  border: none\n  color: white\n  padding: 4px\n  cursor: pointer\n  display: flex\n  align-items: center\n  justify-content: center\n  &:hover\n    opacity: 0.8\n\n.header-divider\n  color: rgba(255, 255, 255, 0.5)\n  margin: 0 8px\n\n.custom-control-input\n  cursor: pointer\n\n.custom-control-label\n  cursor: pointer\n  font-size: 14px\n\n.credit-display\n  display: flex\n  align-items: center\n  gap: 6px\n  padding: 4px 8px\n  border-radius: var(--border-radius-sm)\n  cursor: pointer\n  transition: opacity 0.2s\n  font-size: 14px\n  font-weight: 500\n\n  &:hover\n    opacity: 0.8\n\n  .credit-icon\n    width: 16px\n    height: 16px\n\n    &.mdi-crown\n      font-size: 1.25rem\n      display: inline-flex\n      align-items: center\n      color: gold\n\n  .credit-text\n    color: white\n\n  &.credit-success\n    background-color: var(--color-success)\n\n  &.credit-warning\n    background-color: var(--color-warning)\n\n  &.credit-exhausted\n    background-color: var(--color-danger)\n  margin-bottom: 0\n\n.custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.custom-control-input:checked ~ .custom-control-label::before\n  border-color: white !important\n  border-width: 1px\n  border-style: solid\n\n.large-icon\n  font-size: 24px\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatPanelHeader.vue?vue&type=template&id=7f13343f&scoped=true&\"\nimport script from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatPanelHeader.vue?vue&type=style&index=0&id=7f13343f&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7f13343f\",\n  null\n  \n)\n\nexport default component.exports","export default {\n  data() {\n    return {\n      processedNotifications: new Set(),\n    }\n  },\n  methods: {\n    processNotificationPushedEvent(event) {\n      if (!event.data?.text) return\n\n      const { level, text } = event.data\n      const notificationKey = `${level}:${text}`\n\n      if (this.processedNotifications.has(notificationKey)) return\n\n      this.processedNotifications.add(notificationKey)\n\n      if (!['error', 'warning'].includes(level)) {\n        return\n      }\n\n      if (this.slicingProgress) {\n        this.slicingProgress.errors.push(text)\n        return\n      }\n\n      this.messages.push({\n        role: 'assistant',\n        content: '', // jusprinNotification message is constructed from jusprinNotification field\n        jusprinNotification: {\n          level,\n          text,\n        },\n      })\n\n      this.pushQuickButtons([this.cannedActions.tellMeWhatNotificationMeans, this.cannedActions.acknowledgeError])\n      this.$refs.chatHeader.popupChatPanelIfNecessary(level)\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"contact-support-form\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"Would you like to send a support request?\")))]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.supportMessage),expression:\"supportMessage\"}],staticClass:\"form-control mb-3\",attrs:{\"rows\":\"4\",\"placeholder\":_vm.$t('Describe your issue here...')},domProps:{\"value\":(_vm.supportMessage)},on:{\"input\":function($event){if($event.target.composing)return;_vm.supportMessage=$event.target.value}}}),_c('div',{staticClass:\"d-flex justify-content-between\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.sendSupportRequest}},[_c('i',{staticClass:\"mdi mdi-message-question-outline mr-1\"}),_vm._v(\" \"+_vm._s(_vm.isSubmitting ? _vm.$t('Sending...') : _vm.$t('Ask for tech support'))+\" \")]),_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.cancelSupportRequest}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Nah, I'm good\"))+\" \")])]),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-3\"},[_vm._v(\" \"+_vm._s(_vm.error)+\" \")]):_vm._e()])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"message assistant\">\n    <div class=\"message-block\">\n      <div class=\"message-content\">\n        <div class=\"contact-support-form\">\n          <p>{{ $t(\"Would you like to send a support request?\") }}</p>\n          <textarea\n            v-model=\"supportMessage\"\n            class=\"form-control mb-3\"\n            rows=\"4\"\n            :placeholder=\"$t('Describe your issue here...')\"\n          ></textarea>\n          <div class=\"d-flex justify-content-between\">\n            <button class=\"btn btn-primary\" @click=\"sendSupportRequest\" :disabled=\"isSubmitting\">\n              <i class=\"mdi mdi-message-question-outline mr-1\"></i>\n              {{ isSubmitting ? $t('Sending...') : $t('Ask for tech support') }}\n            </button>\n            <button\n              class=\"btn btn-secondary\"\n              @click=\"cancelSupportRequest\"\n              :disabled=\"isSubmitting\"\n            >\n              {{ $t(\"Nah, I'm good\") }}\n            </button>\n          </div>\n          <div v-if=\"error\" class=\"alert alert-danger mt-3\">\n            {{ error }}\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'ContactSupportForm',\n  props: {\n    messages: {\n      type: Array,\n      required: true,\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      supportMessage: '',\n      isSubmitting: false,\n      error: null,\n    }\n  },\n  computed: {\n    lastUserMessage() {\n      // Find the last user message in the messages array using higher-order function\n      const lastUserMsg = [...this.messages].reverse().find((message) => message.role === 'user')\n\n      return lastUserMsg ? lastUserMsg.content : ''\n    },\n  },\n  created() {\n    // Pre-fill with the last user message\n    this.supportMessage = this.lastUserMessage\n  },\n  methods: {\n    async sendSupportRequest() {\n      if (!this.supportMessage.trim()) {\n        this.error = this.$t('Please enter a message before submitting.')\n        return\n      }\n\n      this.isSubmitting = true\n      this.error = null\n\n      try {\n        await api.post(urls.jusprinContactSupport(), this.oauthAccessToken, {\n          message: this.supportMessage,\n        })\n\n        this.$emit('form-dismissed', {\n          message:\n            this.$t('Your support request has been sent. Our team will get back to you as soon as possible.'),\n        })\n      } catch (error) {\n        console.error('Failed to send support request:', error)\n        this.error = this.$t('Failed to send your support request. Please try again later.')\n        this.isSubmitting = false\n      }\n    },\n    cancelSupportRequest() {\n      this.$emit('form-dismissed', {\n        message: this.$t(\"No problem! Let me know if there's anything else I can help you with.\"),\n      })\n    },\n  },\n}\n</script>\n\n<style scoped>\n.contact-support-form {\n  width: 100%;\n}\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContactSupportForm.vue?vue&type=template&id=16e50642&scoped=true&\"\nimport script from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nexport * from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ContactSupportForm.vue?vue&type=style&index=0&id=16e50642&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"16e50642\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.show)?_c('div',{staticClass:\"upgrade-modal-backdrop\",on:{\"click\":_vm.closeModal}},[_c('div',{staticClass:\"upgrade-modal surface\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"close-button icon-btn\",on:{\"click\":_vm.closeModal}},[_c('i',{staticClass:\"mdi mdi-close\"})]),_c('h2',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Your JusPrin Account\")))]),(!_vm.loading && !_vm.isUnlimitedPlan && _vm.remainingCredits <= 0)?_c('div',{staticClass:\"credit-exhausted-banner\"},[_c('i',{staticClass:\"mdi mdi-alert-circle\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"You have run out of AI credits!\")))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"text-center\"},[_c('i',{staticClass:\"mdi mdi-loading mdi-spin\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Loading...\"))+\" \")]):_c('div',[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-details\"},[(_vm.userInfo.first_name || _vm.userInfo.last_name)?_c('h3',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.userDisplayName))]):_vm._e(),_c('div',{staticClass:\"user-email\"},[_vm._v(_vm._s(_vm.userInfo.email))])]),_c('span',{staticClass:\"plan-badge\",class:{ 'pro-badge': _vm.isUnlimitedPlan }},[_vm._v(\" \"+_vm._s(_vm.isUnlimitedPlan ? _vm.$t('Unlimited') : _vm.$t('FREE Plan'))+\" \")])]),(_vm.isUnlimitedPlan)?[_c('div',{staticClass:\"body-section text-center\"},[_vm._m(0),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Yay! You are on the Unlimited Plan!'))+\" \")]),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\",\"margin-bottom\":\"3rem\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),_c('a',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"href\":\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Manage Subscription Plan'))+\" \")])])]:[_c('div',{staticClass:\"body-section\"},[_c('div',{staticClass:\"ai-credits-header\"},[_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"JusPrin Credit Icon\"}}),_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"AI Credits\")))])]),_c('div',{staticClass:\"progress-bar-container\"},[_c('div',{staticClass:\"progress-bar\",class:_vm.creditStatusClass,style:({ width: `${_vm.progressPercentage}%` })})]),_c('div',{staticClass:\"progress-info\"},[_c('span',{staticClass:\"usage-text\"},[_vm._v(\" You've used \"+_vm._s(_vm.credits.ai_credit_used_current_month)+\" AI credits of \"+_vm._s(_vm.isUnlimitedPlan ? 'unlimited' : _vm.credits.ai_credit_free_monthly_quota)+\" this month \")]),_c('span',{staticClass:\"reset-date\"},[_vm._v(_vm._s(_vm.$t(\"Reset on {resetDate}\", { resetDate: _vm.nextMonthResetDate })))])])]),_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\"))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\"))+\" \")]),_c('muted-alert',{staticClass:\"mt-2 feature-notice\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI credit limit is reset at the beginning of each month.\"))+\" \")]),_c('div',{staticClass:\"body-section\"},[_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"Get More AI Credits\")))]),_c('div',{staticClass:\"section-description\"},[_vm._v(_vm._s(_vm.$t(\"If you are running short on AI credits, there are two ways to get more.\")))]),_c('div',{staticClass:\"upgrade-option\"},[_c('div',{staticClass:\"upgrade-details\"},[_c('div',{staticClass:\"upgrade-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Upgrade to Unlimited Plan\"))+\" \"),(_vm.userInfo.has_active_subscription)?_c('span',{staticClass:\"discount\"},[_vm._v(_vm._s(_vm.$t(\"30% OFF\")))]):_vm._e()]),_c('div',{staticClass:\"text-primary small\"},[_vm._v(_vm._s(_vm.$t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\")))])]),_c('a',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"href\":\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade'))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Alternatively, you can {hostYourOwnLink} and get unlimited AI credits using your own OpenAI API key.')},scopedSlots:_vm._u([{key:\"hostYourOwnLink\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://github.com/TheSpaghettiDetective/obico-server/blob/release/README_jusprin_server.md\"}},[_vm._v(_vm._s(_vm.$t(\"host your own JusPrin server\")))])]},proxy:true}],null,false,2080485700)})],1)])]],2)])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"celebration\",staticStyle:{\"font-size\":\"2.5rem\",\"margin\":\"1.5rem 0\"}},[_vm._v(\" 🎉 \"),_c('i',{staticClass:\"mdi mdi-crown\",staticStyle:{\"color\":\"gold\",\"font-size\":\"2.5rem\"}}),_vm._v(\" 🎉 \")])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"show\" class=\"upgrade-modal-backdrop\" @click=\"closeModal\">\n    <div class=\"upgrade-modal surface\" @click.stop>\n      <button class=\"close-button icon-btn\" @click=\"closeModal\">\n        <i class=\"mdi mdi-close\"></i>\n      </button>\n\n      <h2 class=\"modal-title\">{{ $t(\"Your JusPrin Account\") }}</h2>\n\n      <!-- Red banner for zero credits -->\n      <div v-if=\"!loading && !isUnlimitedPlan && remainingCredits <= 0\" class=\"credit-exhausted-banner\">\n        <i class=\"mdi mdi-alert-circle\"></i>\n        <span>{{ $t(\"You have run out of AI credits!\") }}</span>\n      </div>\n\n      <div v-if=\"loading\" class=\"text-center\">\n        <i class=\"mdi mdi-loading mdi-spin\"></i> {{ $t(\"Loading...\") }}\n      </div>\n\n      <div v-else>\n        <div class=\"user-info\">\n          <div class=\"user-details\">\n            <h3 v-if=\"userInfo.first_name || userInfo.last_name\" class=\"user-name\">{{ userDisplayName }}</h3>\n            <div class=\"user-email\">{{ userInfo.email }}</div>\n          </div>\n          <span class=\"plan-badge\" :class=\"{ 'pro-badge': isUnlimitedPlan }\">\n            {{ isUnlimitedPlan ? $t('Unlimited') : $t('FREE Plan') }}\n          </span>\n        </div>\n\n        <template v-if=\"isUnlimitedPlan\">\n          <div class=\"body-section text-center\">\n            <div class=\"celebration\" style=\"font-size: 2.5rem; margin: 1.5rem 0;\">\n              🎉 <i class=\"mdi mdi-crown\" style=\"color: gold; font-size: 2.5rem;\"></i> 🎉\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold;\">\n              {{ $t('Yay! You are on the Unlimited Plan!') }}\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold; margin-bottom: 3rem;\">\n              {{ $t('Enjoy unlimited AI credits!') }}\n            </div>\n            <a\n              href=\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"\n              class=\"btn btn-primary upgrade-button\"\n            >\n              {{ $t('Manage Subscription Plan') }}\n            </a>\n          </div>\n        </template>\n        <template v-else>\n          <div class=\"body-section\">\n            <div class=\"ai-credits-header\">\n              <img src=\"/static/img/jusprin-credit.png\" alt=\"JusPrin Credit Icon\" class=\"credit-icon\" />\n              <h4 class=\"modal-section-title\">{{ $t(\"AI Credits\") }}</h4>\n            </div>\n            <div class=\"progress-bar-container\">\n              <div class=\"progress-bar\" :class=\"creditStatusClass\" :style=\"{ width: `${progressPercentage}%` }\"></div>\n            </div>\n            <div class=\"progress-info\">\n              <span class=\"usage-text\">\n                You've used {{ credits.ai_credit_used_current_month }} AI credits of {{ isUnlimitedPlan ? 'unlimited' : credits.ai_credit_free_monthly_quota }} this month\n              </span>\n              <span class=\"reset-date\">{{ $t(\"Reset on {resetDate}\", { resetDate: nextMonthResetDate }) }}</span>\n            </div>\n          </div>\n\n          <div class=\"text-muted small\">\n           {{ $t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\") }}\n           <br>\n           {{ $t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\") }}\n          </div>\n\n          <muted-alert class=\"mt-2 feature-notice\">\n            {{ $t(\"AI credit limit is reset at the beginning of each month.\") }}\n          </muted-alert>\n\n          <div class=\"body-section\">\n            <h4 class=\"modal-section-title\">{{ $t(\"Get More AI Credits\") }}</h4>\n            <div class=\"section-description\">{{ $t(\"If you are running short on AI credits, there are two ways to get more.\") }}</div>\n            <div class=\"upgrade-option\">\n              <div class=\"upgrade-details\">\n                <div class=\"upgrade-title\">\n                  {{ $t(\"Upgrade to Unlimited Plan\") }}\n                  <span v-if=\"userInfo.has_active_subscription\" class=\"discount\">{{ $t(\"30% OFF\") }}</span>\n                </div>\n                <div class=\"text-primary small\">{{ $t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\") }}</div>\n              </div>\n              <a\n                href=\"/ent/jusprin/pricing/?can_go_back_to_chat=1\"\n                class=\"btn btn-primary upgrade-button\"\n              >\n                {{ $t('Upgrade') }}\n              </a>\n            </div>\n            <div class=\"mt-4\">\n              <i18next :translation=\"$t('Alternatively, you can {hostYourOwnLink} and get unlimited AI credits using your own OpenAI API key.')\">\n                <template #hostYourOwnLink>\n                  <a href=\"https://github.com/TheSpaghettiDetective/obico-server/blob/release/README_jusprin_server.md\">{{ $t(\"host your own JusPrin server\") }}</a>\n                </template>\n              </i18next>\n            </div>\n          </div>\n        </template>\n\n        <div class=\"body-section\" v-else>\n          <h4 class=\"modal-section-title\">{{ $t(\"Your Active Subscription\") }}</h4>\n          <div class=\"subscription-info\">\n            <div class=\"subscription-details\">\n              <div class=\"subscription-plan\">\n                <i class=\"mdi mdi-crown\"></i>\n                {{ $t(\"You have an active {plan} subscription\", { plan: userInfo.subscription_plan || 'Pro' }) }}\n              </div>\n              <div class=\"text-muted small\">{{ $t(\"Your subscription gives you access to enhanced features and higher AI credit limits.\") }}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'UpgradeModal',\n  components: {\n    MutedAlert,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: false\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null\n    }\n  },\n  data() {\n    return {\n      loading: false,\n      userInfo: null,\n      credits: null,\n      error: null\n    }\n  },\n  computed: {\n    progressPercentage() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota === -1) return 100\n      if (this.credits.ai_credit_free_monthly_quota === 0) return 0\n      return Math.min(100, (this.credits.ai_credit_used_current_month / this.credits.ai_credit_free_monthly_quota) * 100)\n    },\n    isUnlimitedPlan() {\n      return this.credits?.ai_credit_free_monthly_quota === -1\n    },\n    remainingCredits() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.credits.ai_credit_free_monthly_quota - (this.credits.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.credits.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    userDisplayName() {\n      if (!this.userInfo) return ''\n      return `${this.userInfo.first_name || ''} ${this.userInfo.last_name || ''}`.trim()\n    },\n    nextMonthResetDate() {\n      const now = new Date()\n      const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1)\n      return nextMonth.toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric'\n      })\n    }\n  },\n  watch: {\n    show(newValue) {\n      if (newValue) {\n        this.fetchAICreditsData()\n      }\n    }\n  },\n  mounted() {\n    if (this.show) {\n      this.fetchAICreditsData()\n    }\n  },\n  methods: {\n    async fetchAICreditsData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      this.loading = true\n      this.error = null\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      if (response.data) {\n        this.userInfo = response.data.user\n        this.credits = response.data.ai_credits\n      }\n      this.loading = false\n    },\n    closeModal() {\n      this.$emit('close')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../../../styles/theme';\n@import '../../../../styles/mixin';\n\n// Upgrade Modal Styles\n.upgrade-modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: var(--color-overlay);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 1050;\n}\n\n.upgrade-modal {\n  background-color: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2rem;\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n  position: relative;\n  box-shadow: var(--shadow-top-nav);\n\n  @include respond-below(md) {\n    padding: 1.5rem;\n    margin: 0 1rem;\n    width: calc(100% - 2rem);\n  }\n\n  .close-button {\n    position: absolute;\n    top: 1rem;\n    right: 1rem;\n    width: 2rem;\n    height: 2rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 1.5rem;\n\n    &:hover, &:focus {\n      background-color: var(--color-hover) !important;\n      color: var(--color-text-primary) !important;\n    }\n  }\n\n  .modal-title {\n    color: var(--color-text-primary);\n    font-size: 1.5rem;\n    font-weight: 600;\n    margin: 0 0 1.5rem 0;\n    text-align: center;\n\n    @include respond-below(md) {\n      font-size: 1.25rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  .user-info {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n\n    @media (max-width: 400px) {\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 1rem;\n      margin-bottom: 1.5rem;\n    }\n\n    .user-details {\n      .user-name {\n        color: var(--color-text-primary);\n        font-size: 1.25rem;\n        font-weight: 600;\n        margin: 0 0 0.25rem 0;\n\n        @include respond-below(md) {\n          font-size: 1.125rem;\n        }\n      }\n\n      .user-email {\n        color: var(--color-text-secondary);\n        font-size: 0.875rem;\n        text-decoration: underline;\n      }\n    }\n\n    .plan-badge {\n      color: var(--color-text-primary);\n      padding: 0.25rem 0.75rem;\n      border-radius: var(--border-radius-sm);\n      border: 1px dashed var(--color-divider);\n      font-size: 0.75rem;\n      font-weight: 600;\n      text-transform: uppercase;\n\n      &.pro-badge {\n        color: var(--color-primary);\n        border: 1px dashed var(--color-primary);\n      }\n    }\n  }\n\n  .body-section {\n    margin-bottom: 1rem;\n\n    @include respond-below(md) {\n      margin-bottom: 1.5rem;\n    }\n\n    .ai-credits-header {\n      display: flex;\n      align-items: baseline;\n      gap: 0.5rem;\n      margin-bottom: 1rem;\n\n      .credit-icon {\n        width: 1.5rem;\n        height: 1.5rem;\n        flex-shrink: 0;\n      }\n    }\n\n    .progress-bar-container {\n      width: 100%;\n      height: 8px;\n      background-color: var(--color-surface-primary);\n      border-radius: var(--border-radius-xs);\n      overflow: hidden;\n      border: 1px solid var(--color-divider-muted);\n\n      .progress-bar {\n        height: 100%;\n        background-color: var(--color-primary);\n        border-radius: var(--border-radius-xs);\n        transition: width 0.3s ease;\n\n        &.credit-success {\n          background-color: var(--color-success);\n        }\n\n        &.credit-warning {\n          background-color: var(--color-warning);\n        }\n\n        &.credit-exhausted {\n          background-color: var(--color-danger);\n        }\n      }\n    }\n\n    .progress-info {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-top: 0.5rem;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 0.25rem;\n      }\n\n      .usage-text {\n        color: var(--color-text-primary);\n        font-size: 0.875rem;\n        font-weight: 500;\n        flex: 1;\n        min-width: 0;\n      }\n\n      .reset-date {\n        color: var(--color-text-secondary);\n        font-size: 0.75rem;\n        font-weight: 400;\n        flex-shrink: 0;\n        white-space: nowrap;\n      }\n    }\n\n    .modal-section-title {\n      color: var(--color-text-primary);\n      font-size: 1.5rem;\n      font-weight: 600;\n      margin-bottom: 0.5rem;\n      margin-top: 2rem;\n      text-decoration: none;\n    }\n\n    .section-description {\n      color: var(--color-text-secondary);\n      font-size: 0.875rem;\n      margin-bottom: 1rem;\n    }\n\n    .upgrade-option {\n      border: 1px solid var(--color-divider);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: stretch;\n        gap: 1rem;\n        padding: 0.875rem;\n      }\n\n      .upgrade-details {\n        flex: 1;\n        min-width: 0;\n\n        @media (min-width: 401px) {\n          min-width: 200px;\n        }\n\n        .upgrade-title {\n          color: var(--color-text-primary);\n          font-size: 1.2rem;\n          font-weight: 500;\n          margin-bottom: 0.25rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          .discount {\n            background-color: var(--color-primary);\n            color: var(--color-on-primary);\n            padding: 0.125rem 0.5rem;\n            border-radius: var(--border-radius-lg);\n            font-size: 0.75rem;\n            font-weight: 600;\n          }\n        }\n      }\n\n      .upgrade-button {\n        padding: 0.75rem 2rem;\n        font-size: 0.875rem;\n        font-weight: 600;\n        white-space: nowrap;\n        flex-shrink: 0;\n\n        @media (max-width: 400px) {\n          width: 100%;\n          white-space: normal;\n        }\n\n        &:hover {\n          background-color: var(--color-primary-hover);\n        }\n      }\n    }\n\n    .subscription-info {\n      border: 1px solid var(--color-primary);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      background-color: var(--color-surface-primary);\n\n      .subscription-details {\n        .subscription-plan {\n          color: var(--color-primary);\n          font-size: 1.1rem;\n          font-weight: 600;\n          margin-bottom: 0.5rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          i {\n            color: var(--color-primary);\n          }\n        }\n      }\n    }\n  }\n\n  .credit-exhausted-banner {\n    background-color: var(--color-danger);\n    color: white;\n    padding: 1rem;\n    border-radius: var(--border-radius-md);\n    margin-bottom: 1.5rem;\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    font-weight: 700;\n    font-size: 1rem;\n    text-align: center;\n    justify-content: center;\n    border: 2px solid var(--color-danger);\n    animation: pulse-danger 2s ease-in-out infinite;\n\n    i {\n      font-size: 1.25rem;\n      flex-shrink: 0;\n    }\n\n    span {\n      font-weight: 700;\n    }\n\n    @media (max-width: 400px) {\n      font-size: 0.875rem;\n      padding: 0.875rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  @keyframes pulse-danger {\n    0%, 100% {\n      box-shadow: 0 0 0 0 rgba(var(--color-danger-rgb, 220, 53, 69), 0.4);\n    }\n    50% {\n      box-shadow: 0 0 0 8px rgba(var(--color-danger-rgb, 220, 53, 69), 0);\n    }\n  }\n}\n</style>","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UpgradeModal.vue?vue&type=template&id=c75daef2&scoped=true&\"\nimport script from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpgradeModal.vue?vue&type=style&index=0&id=c75daef2&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"c75daef2\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <chat-panel-header\n      ref=\"chatHeader\"\n      @action=\"callAgentAction\"\n      :should-popup-chat-panel=\"Boolean(oauthAccessToken)\"\n      @show-contact-support-form=\"showContactSupportForm\"\n      @show-discord-support-message=\"showDiscordSupportMessage\"\n      @show-upgrade-modal=\"openUpgradeModal\"\n      :credits-info=\"creditsInfo\"\n    />\n\n    <!-- Upgrade Modal -->\n    <upgrade-modal\n      :show=\"showUpgradeModal\"\n      :oauth-access-token=\"oauthAccessToken\"\n      @close=\"closeUpgradeModal\"\n    />\n\n    <div v-if=\"oauthAccessToken\" class=\"chat-container mt-3\">\n      <div ref=\"chatMessageContainer\" class=\"chat-messages\" @scroll=\"handleChatScroll\">\n        <!-- Outdated version notice as first JusBot message bubble -->\n        <div class=\"message assistant\">\n          <div class=\"message-block\">\n            <div class=\"message-content\">\n              <i class=\"mdi mdi-alert-circle-outline\"></i>\n              <span>\n                You are on an outdated JusPrin version. Download the latest version at\n                <span class=\"highlighted-url\">https://github.com/TheSpaghettiDetective/JusPrin/releases/latest</span>\n              </span>\n            </div>\n          </div>\n        </div>\n        <div\n          v-for=\"(message, index) in messages\"\n          :key=\"index\"\n          class=\"message\"\n          :class=\"message.role\"\n        >\n          <div v-if=\"message.content\" class=\"message-block\">\n            <div class=\"message-content\">\n              <div v-if=\"message.has_upgrade_link\" class=\"upgrade-message\">\n                <div>{{ $t('Since you are on a Free plan, please join our Discord server to seek support from the community.') }}</div>\n                <div>\n                  <i18next :translation=\"$t('You can also {localizedDom} to get email support from the Obico team.')\">\n                    <template #localizedDom>\n                      <a href=\"#\" @click.prevent=\"openUpgradeModal\" class=\"upgrade-link\">{{ $t('upgrade to the Unlimited plan') }}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <VueMarkdown v-else>{{ message.content }}</VueMarkdown>\n              <gradient-fadable-container\n                v-if=\"\n                  message.per_override_explanations && message.per_override_explanations.length > 0\n                \"\n              >\n                <div class=\"pt-2 pb-1\">{{ $t(\"Detailed explanations:\") }}</div>\n                <div v-for=\"(explanation, index) in message.per_override_explanations\" :key=\"index\">\n                  <div>\n                    <b>{{ explanation.parameter }}:</b> {{ explanation.explanation }}\n                  </div>\n                </div>\n              </gradient-fadable-container>\n            </div>\n          </div>\n          <div\n            v-if=\"message.slicing_profiles && slicingSettingsInMessage(message)\"\n            class=\"message-block mt-2\"\n          >\n            <div class=\"message-content\">\n              <gradient-fadable-container>\n                <div class=\"pt-2 pb-1\">{{ $t(\"I have applied the following settings:\") }}</div>\n                <div v-if=\"message.slicing_profiles.use_print_process_preset\">\n                  {{ $t(\"- Process preset:\") }} <b>{{ message.slicing_profiles.use_print_process_preset }}</b>\n                </div>\n                <div>\n                  {{ $t(\"- Additional slicing parameters:\") }}\n                  <b v-if=\"Object.keys(changedParams(message)).length === 0\">{{ $t(\"None\") }}</b>\n                  <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n                    &nbsp;&nbsp;&nbsp;&nbsp;- {{ key }}:\n                    <span class=\"font-weight-bold\">{{ value }}</span>\n                  </div>\n                </div>\n              </gradient-fadable-container>\n              <div v-if=\"index !== messages.length - 1\" class=\"quick-button pt-2\">\n                <quick-button-component\n                  :message=\"$t('Re-apply settings')\"\n                  @click=\"applySettingsInMessage(message)\"\n                />\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.suggested_printing_method\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"I suggest the following to achieve the best results:\") }}</div>\n              <VueMarkdown>{{ message.suggested_printing_method }}</VueMarkdown>\n            </div>\n          </div>\n          <div v-if=\"message.jusprinNotification\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"Oh no! My slicing algorithm lord just said:\") }}</div>\n              <div class=\"notification-text\" :class=\"message.jusprinNotification.level\">\n                <i\n                  :class=\"\n                    message.jusprinNotification.level === 'error'\n                      ? 'mdi mdi-alert-circle'\n                      : 'mdi mdi-alert'\n                  \"\n                ></i>\n                {{ message.jusprinNotification.text }}\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.discord_support\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"discord-support-container\">\n                <div class=\"discord-info\">\n                  <div class=\"discord-url\">\n                    <strong>Discord Server:</strong>\n                    <code>{{ message.discord_support.url }}</code>\n                  </div>\n                  <div class=\"discord-instructions\">\n                    {{ $t(\"Scan this QR code with your phone to join our Discord server:\") }}\n                  </div>\n                </div>\n                <div class=\"qr-code-container\">\n                  <img\n                    :src=\"message.discord_support.qr_code_url\"\n                    alt=\"Discord QR Code\"\n                    class=\"qr-code\"\n                    @error=\"handleQRCodeError\"\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"thinking\" class=\"message assistant\">\n          <div class=\"message-block align-items-center\">\n            <div class=\"message-content thinking-animation\">\n              <VueMarkdown>_{{ $t(\"Thinking...\") }}_</VueMarkdown>\n            </div>\n          </div>\n        </div>\n        <contact-support-form\n          v-if=\"showContactSupport\"\n          :messages=\"messages\"\n          :oauth-access-token=\"oauthAccessToken\"\n          @form-dismissed=\"handleContactSupportFormDismissed\"\n        />\n        <div v-if=\"slicingProgress\" class=\"message assistant\">\n          <div\n            class=\"message-block slicing-message-block\"\n            :class=\"{ 'fade-out': slicingProgress.fadeOut }\"\n          >\n            <div class=\"message-content\">\n              <p>\n                {{\n                  slicingProgress.overrun\n                    ? $t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.')\n                    : slicingProgress.text || $t('Slicing in progress...')\n                }}\n              </p>\n              <div class=\"slicing-progress-container\">\n                <div\n                  class=\"slicing-progress-bar\"\n                  :style=\"{ width: `${slicingProgress?.percentage * 100}%` }\"\n                ></div>\n                <div class=\"slicing-progress-text\">\n                  {{ Math.round(slicingProgress?.percentage * 100) }}%\n                </div>\n              </div>\n              <div\n                v-if=\"slicingProgress.errors && slicingProgress.errors.length > 0\"\n                class=\"slicing-errors\"\n              >\n                <div\n                  v-for=\"(error, index) in slicingProgress.errors\"\n                  :key=\"index\"\n                  class=\"error-message\"\n                >\n                  {{ error }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"quickButtons.length > 0\" class=\"quick-button pt-2\">\n          <quick-button-component\n            v-for=\"(action, index) in quickButtons\"\n            :key=\"index\"\n            :message=\"action.message\"\n            @click=\"action.onClick\"\n          />\n        </div>\n      </div>\n      <button v-show=\"showScrollButton\" class=\"scroll-to-bottom\" @click=\"scrollToBottom\">\n        <i class=\"mdi mdi-arrow-down large-icon\"></i>\n      </button>\n\n      <div class=\"chat-input\">\n        <textarea\n          ref=\"chatTextarea\"\n          rows=\"1\"\n          v-model=\"userInput\"\n          type=\"text\"\n          :disabled=\"!readyForUserQuery\"\n          :placeholder=\"\n            readyForUserQuery\n              ? $t('Type your message here...')\n              : $t('Select printer, filament, and add models first')\n          \"\n          @keydown.enter.prevent=\"handleEnterKey\"\n        />\n        <button class=\"send-button\" :disabled=\"!readyForUserQuery\" @click=\"onUserInput\">\n          <i class=\"mdi mdi-arrow-up send-icon\"></i>\n        </button>\n      </div>\n    </div>\n    <div v-else>\n      <div class=\"login-container\">\n        <div>\n          <button\n            id=\"signUpSignInBtn\"\n            class=\"btn btn-primary\"\n            @click=\"() => callAgentAction('show_login')\"\n          >\n            {{ $t(\"Sign Up/Sign In to Get Started\") }}\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\nimport urls from '@config/server-urls'\nimport QuickButtonComponent from './components/QuickButtonComponent.vue'\nimport api from './lib/api'\nimport QuickButtonsMixin from './mixins/quickButtonsMixin'\nimport MessagesMixin from './mixins/messagesMixin'\nimport SlicingParamFixerMixin from './mixins/slicingParamFixerMixin'\nimport GradientFadableContainer from './components/GradientFadableContainer.vue'\nimport ChatPanelHeader from './components/ChatPanelHeader.vue'\nimport userNotificationMixin from './mixins/userNotificationMixin'\nimport { callAgentAction, getAgentActionResponse, setAgentActionRetVal } from './lib/agentAction'\nimport ContactSupportForm from './components/ContactSupportForm'\nimport UpgradeModal from './components/UpgradeModal'\n\nexport default {\n  name: 'EmbeddedChatPage',\n  components: {\n    VueMarkdown,\n    QuickButtonComponent,\n    GradientFadableContainer,\n    ChatPanelHeader,\n    ContactSupportForm,\n    UpgradeModal,\n  },\n  mixins: [QuickButtonsMixin, MessagesMixin, SlicingParamFixerMixin, userNotificationMixin],\n  data() {\n    return {\n      oauthAccessToken: null,\n      currentChatId: null,\n      userInput: '',\n      thinking: false,\n      messages: [],\n      modelObjects: [],\n      supportedActions: [],\n      autoOrientInProgress: false,\n      isDevMode: false,\n      haveDonePlateAnalysis: false,\n      showScrollButton: false,\n      slicingProgress: null,\n      current_workflow: null,\n      showUpgradeModal: false,\n      creditsInfo: null, // Will be populated from API responses\n      userInfo: null, // Will be populated from /jusprin/api/me/\n    }\n  },\n  computed: {\n    readyForUserQuery() {\n      if (this.slicingProgress || this.thinking) {\n        return false\n      }\n      return true\n    },\n    readyToSlice() {\n      return this.messages.some(\n        (message) => message.role === 'assistant' && this.slicingSettingsInMessage(message)\n      )\n    },\n    hasModelObjects() {\n      return this.modelObjects.length > 0\n    },\n    showContactSupport() {\n      // Check if any message has a contact_support agent action using higher-order function\n      return this.messages.some(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some((action) => action.name === 'contact_support')\n      )\n    },\n  },\n  watch: {\n    messages: 'onChatContentChanged',\n    quickButtons: 'onChatContentChanged',\n    userInput() {\n      this.$nextTick(() => {\n        this.adjustTextareaHeight()\n      })\n    },\n    oauthAccessToken(newValue, oldValue) {\n      // When token becomes available (changes from null to non-null), fetch user data\n      if (newValue && !oldValue) {\n        this.fetchUserData()\n      }\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.isDevMode = urlParams.get('devmode') === 'true'\n  },\n  mounted() {\n    this.initMessagesAndQuickButtons()\n  },\n  methods: {\n    callAgentAction,\n    setAgentActionRetVal, // For JusPrin CallEmbeddedChatMethod\n    async fetchUserData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      this.userInfo = response.data.user\n      this.creditsInfo = response.data.ai_credits\n    },\n    async withCreditCheck(apiCall) {\n      // Check if balance is 0 before making the call\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        const remainingCredits = Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n        if (remainingCredits <= 0) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n      }\n\n      try {\n        const result = await apiCall()\n\n        // Refresh user data after successful call\n        await this.fetchUserData()\n\n        return result\n      } catch (error) {\n        // Catch 402 errors and show UpgradeModal\n        if (error.response && error.response.status === 402) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n\n        // Let all other errors bubble up to Sentry\n        throw error\n      }\n    },\n    async callLongRunningAgentActionThenRefreshPresets(action, payload = null) {\n      await getAgentActionResponse(action, payload, 1000 * 60 * 60 * 24) // Make timeout super long as it's hard to know how long it takes user to finish things like adding a printer\n      this.refreshSelectedPresets()\n      this.populateQuickButtons()\n    },\n    processAgentEvent(event) {\n      if (event.type === 'modelObjectsChanged') {\n        this.processModelObjectsChangedEvent(event)\n      } else if (event.type === 'autoOrient') {\n        this.processAutoOrientEvent(event)\n      } else if (event.type === 'nativeErrorOccurred') {\n        this.processNativeErrorOccurredEvent(event)\n      } else if (event.type === 'notificationPushed') {\n        this.processNotificationPushedEvent(event)\n      } else if (event.type === 'chatPanelFocus') {\n        this.$refs.chatHeader.processChatPanelFocusEvent(event)\n      } else if (event.type === 'slicingProgress') {\n        this.processSlicingProgressEvent(event)\n      }\n    },\n\n    editedPreset(presetType, editedPresets = {}) {\n      return editedPresets[\n        `edited${presetType.charAt(0).toUpperCase() + presetType.slice(1)}Preset`\n      ]\n    },\n\n    overridesFromEditedPreset(presetType, editedPresets = {}) {\n      const editedPreset = this.editedPreset(presetType, editedPresets)\n      const { config, dirty_options } = editedPreset\n\n      if (!dirty_options || dirty_options.length === 0) {\n        return {}\n      }\n\n      const overrides = {}\n      dirty_options.forEach((option) => {\n        if (Object.prototype.hasOwnProperty.call(config, option)) {\n          overrides[option] = config[option]\n        }\n      })\n\n      return overrides\n    },\n\n    selectedPreset(presetType, presets) {\n      return presets[`${presetType}Presets`]?.find((preset) => preset.is_selected) || null\n    },\n\n    slicingSettingsInMessage(message) {\n      return (\n        message.slicing_profiles?.use_print_process_preset ||\n        message.slicing_profiles?.filament_overrides ||\n        message.slicing_profiles?.print_process_overrides\n      )\n    },\n\n    async onUserQueryQuickButton(msg) {\n      this.messages.push({ role: 'user', content: msg })\n      await this.sendUserQuery()\n    },\n\n    async onUserInput() {\n      if (this.userInput.trim()) {\n        this.clearQuickButtons()\n        this.messages.push({ role: 'user', content: this.userInput })\n        this.userInput = ''\n        // Reset textarea height to one line after clearing input\n        const textarea = this.$refs.chatTextarea\n        if (textarea) {\n          textarea.style.height = 'auto'\n        }\n        await this.sendUserQuery()\n      }\n    },\n    startOver() {\n      this.slicingProgress = null\n      this.processedNotifications = new Set()\n      this.current_workflow = null\n      this.initMessagesAndQuickButtons()\n    },\n\n    async sendUserQuery() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const presets = await getAgentActionResponse('get_presets')\n        const editedPresets = await getAgentActionResponse('get_edited_presets')\n        const currentProject = await getAgentActionResponse('get_current_project')\n        const plates = currentProject.plates\n        if (!this.userQueryPreconditionsMet(presets, editedPresets, plates)) {\n          this.thinking = false\n          return\n        }\n\n        // TODO: It's an important assumption that selected preset should be the same as edited preset\n        // Remove this check once it's in production for a while with no messages captured in sentry\n        for (const preset_type of ['filament', 'printProcess', 'printer']) {\n          if (\n            this.editedPreset(preset_type, editedPresets)?.name !==\n            this.selectedPreset(preset_type, presets)?.name\n          ) {\n            window.Sentry?.captureMessage(\n              `Selected preset ${preset_type} is not the same as edited preset ${\n                this.editedPreset(preset_type, editedPresets)?.name\n              }`\n            )\n          }\n        }\n\n        const currentChatId = await this.getCurrentChatId()\n        const response = await this.withCreditCheck(async () => {\n          return api.post(urls.jusprinChatMessages(), this.oauthAccessToken, {\n            messages: this.messages,\n            current_workflow: this.current_workflow,\n            slicing_profiles: {\n              filament_presets: [this.selectedPreset('filament', presets)],\n              print_process_presets: presets.printProcessPresets,\n              filament_overrides: this.overridesFromEditedPreset('filament', editedPresets),\n              print_process_overrides: this.overridesFromEditedPreset('printProcess', editedPresets),\n            },\n            plates: plates,\n            chat_id: currentChatId,\n          })\n        })\n        this.thinking = false\n\n        this.processChatResponse(response.data, presets)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async getCurrentChatId() {\n      if (!this.currentChatId) {\n        const chatsApiUrl = urls.jusprinChats(this.currentChatId)\n        const newChatResponse = await api['post'](chatsApiUrl, this.oauthAccessToken, {\n          messages: JSON.stringify(this.messages),\n        })\n        this.currentChatId = newChatResponse?.data?.id // Assign the new chat ID\n      }\n      return this.currentChatId\n    },\n\n    async processChatResponse(responseData, presets) {\n      const message = responseData.message\n      this.messages.push(message)\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n        machine_name: this.selectedPreset('printer', presets)?.name,\n        filament_name: this.selectedPreset('filament', presets)?.name,\n        print_process_name: this.selectedPreset('printProcess', presets)?.name,\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (this.slicingSettingsInMessage(message)) {\n        this.applySettingsInMessage(message)\n      }\n\n      if (message.agent_actions?.length) {\n        await this.processAgentActions(message)\n      } else {\n        this.populateQuickButtons() // If there are no agent actions, we can populate default quick buttons\n      }\n    },\n\n    async populateDatabaseWithChat(payload = null) {\n      const currentChatId = await this.getCurrentChatId()\n      const chatsApiUrl = urls.jusprinChats(currentChatId)\n      const chatsApiVerb = currentChatId ? 'put' : 'post'\n      await api[chatsApiVerb](chatsApiUrl, this.oauthAccessToken, payload)\n    },\n\n    async processAgentActions(message) {\n      if (!message.agent_actions?.length) return\n      this.clearQuickButtons()\n\n      for (const action of message.agent_actions) {\n        if (action.name === 'slice_model') {\n          await this.doSliceWithCurrentSettings()\n        } else if (action.name === 'start_chat_over') {\n          await this.startOver()\n        } else if (action.name === 'add_printers') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n        } else if (action.name === 'add_filaments') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n        } else if (action.name === 'change_printer') {\n          await this.showPresetOptions('printer')\n        } else if (action.name === 'change_filament') {\n          await this.showPresetOptions('filament')\n        } else if (action.name === 'contact_support') {\n          this.scrollToBottom()\n        } else if (action.name === 'auto_orient_all_models') {\n          await this.autoOrientAllObjects()\n        } else if (action.name === 'auto_arrange_all_models') {\n          await this.autoArrangeAllObjects()\n        } else if (action.name === 'ask_user_to_choose_from_options') {\n          this.showOptionsAsQuickButtons(action.arguments)\n        }\n      }\n    },\n\n    async applySettingsInMessage(message) {\n      if (!this.slicingSettingsInMessage(message)) {\n        // If LLM didn't select a preset, it didn't know how to process the query. Nothing should be assumed in this case.\n        return\n      }\n\n      this.clearQuickButtons()\n\n      try {\n        if (message.slicing_profiles.use_print_process_preset) {\n          await getAgentActionResponse('select_preset', {\n            type: 'print',\n            name: message.slicing_profiles.use_print_process_preset,\n          })\n        }\n\n        let filamentOverrides = message.slicing_profiles?.filament_overrides || {}\n        filamentOverrides = this.fixFilamentParamOverrides(filamentOverrides)\n\n        let param_overrides = [\n          ...this.paramOverridesToApplyConfigPayload(filamentOverrides, 'filament'),\n          ...this.paramOverridesToApplyConfigPayload(\n            message.slicing_profiles?.print_process_overrides || {},\n            'print'\n          ),\n        ]\n\n        if (param_overrides.length > 0) {\n          await getAgentActionResponse('apply_config', param_overrides)\n        }\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return\n      }\n    },\n    async doSliceWithCurrentSettings() {\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      const hasModels = plates.some((plate) => plate.model_objects?.length > 0)\n      if (!hasModels) {\n        this.messages.push(this.cannedMessages.noModelObjects)\n        this.setQuickButtons([this.cannedActions.startOver, this.cannedActions.moreOptions])\n        return\n      }\n\n      if (!this.readyToSlice) {\n        const presets = await getAgentActionResponse('get_presets')\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$i18next.t(\"I have not set any slicing parameters for you. Do you want me to slice your model with these?\")}\\n${this.$i18next.t(\"- Filament:\")} **${\n            this.selectedPreset('filament', presets)?.name\n          }**\\n${this.$i18next.t(\"- Process preset:\")} **${this.selectedPreset('printProcess', presets)?.name}**`,\n        })\n\n        this.pushQuickButtons([\n          {\n            message: this.$t('Yes'),\n            onClick: () => this.doSlice(),\n          },\n          {\n            message: this.$t('No'),\n            onClick: () => this.popQuickButtons(),\n          },\n        ])\n        return\n      } else {\n        this.doSlice()\n      }\n    },\n    async doSlice() {\n      this.clearQuickButtons()\n      this.slicingProgress = { percentage: 0, errors: [] }\n      callAgentAction('start_slicer_all')\n\n      setTimeout(() => {\n        if (this.slicingProgress && this.slicingProgress.percentage < 1.0 - 1e-6) {\n          this.slicingProgress.overrun = true\n          this.setQuickButtons([this.cannedActions.startOver])\n        }\n      }, 1000 * 60 * 2)\n    },\n    async autoOrientAllObjects() {\n      let agentActionName = 'auto_orient_all_objects'\n\n      // TODO: Remove this once 0.4 is no longer supported\n      if (this.supportedActions.includes('auto_orient_object')) {\n        agentActionName = 'auto_orient_object'\n      }\n\n      callAgentAction(agentActionName, {})\n      this.autoOrientInProgress = true\n      this.populateQuickButtons()\n    },\n    async autoArrangeAllObjects() {\n      setTimeout(() => {\n        callAgentAction('arrange_all_objects', {})\n        this.autoArrangeInProgress = true\n      }, 100)\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Models auto-arranged.'),\n      })\n      this.populateQuickButtons()\n      this.setQuickButtons([this.cannedActions.undoAutoArrange, ...this.quickButtons])\n    },\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides ?? {}),\n        ...(message.slicing_profiles?.print_process_overrides ?? {}),\n      }\n    },\n    initMessagesAndQuickButtons() {\n      this.currentChatId = null\n\n      // Reset messages and quick actions\n      this.messages = [this.cannedMessages.greeting]\n      setTimeout(async () => {\n        await this.refreshSelectedPresets()\n        await this.refreshModelObjects()\n        this.populateQuickButtons()\n      }, 10)\n    },\n\n    async refreshModelObjects() {\n      const project = await getAgentActionResponse('get_current_project')\n      this.modelObjects = this.distinctModelObjectsInProject(project)\n      if (this.modelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.currentModelObjects(this.modelObjects.length))\n      } else {\n        this.messages.push(this.cannedMessages.noModelObjects)\n      }\n    },\n    async refreshSelectedPresets() {\n      const presets = await getAgentActionResponse('get_presets')\n      this.messages.push(\n        this.cannedMessages.currentPresetSelections(\n          this.selectedPreset('printer', presets)?.name,\n          this.selectedPreset('filament', presets)?.name\n        )\n      )\n    },\n    fixBrokenMarkdown(text) {\n      // Markdown returned from LLM may be broken.\n      const formattedText = text.replace(/ (\\d\\.) /g, '\\n$1 ')\n      return formattedText\n    },\n    scrollToBottom() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      if (chatMessageContainer) {\n        chatMessageContainer.scrollTop = chatMessageContainer.scrollHeight\n      }\n    },\n    onChatContentChanged() {\n      this.$nextTick(() => {\n        this.scrollToBottom()\n      })\n    },\n    paramOverridesToApplyConfigPayload(params, type) {\n      const param_overrides = []\n      for (const [key, value] of Object.entries(params)) {\n        param_overrides.push({ type, key, value })\n      }\n      return param_overrides\n    },\n    userQueryPreconditionsMet(presets, editedPresets, plates) {\n      if (\n        (presets?.printerPresets && presets.printerPresets?.length < 1) ||\n        presets.printerPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddPrinters)\n        this.setQuickButtons([this.cannedActions.addPrinters])\n        return false\n      } else if (\n        (presets?.filamentPresets && presets.filamentPresets?.length < 1) ||\n        presets.filamentPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddFilaments)\n        this.setQuickButtons([this.cannedActions.addFilaments])\n        return false\n      }\n      return true\n    },\n\n    modelObjectsWithOverhang(modelObjects) {\n      return modelObjects.filter((obj) => (obj.features?.overhang ?? 0) > 0.001)\n    },\n\n    distinctModelObjectsInProject(project) {\n      return project.plates\n        .flatMap((plate) => plate.model_objects)\n        .reduce((unique, obj) => {\n          const exists = unique.find((item) => item.id === obj.id)\n          return exists ? unique : [...unique, obj]\n        }, [])\n    },\n\n    processModelObjectsChangedEvent(event) {\n      const currentProject = event.data\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      const newModelObjects = currentModelObjects.filter(\n        (obj) => !this.modelObjects.some((item) => item.id === obj.id)\n      )\n      this.modelObjects = currentModelObjects\n      if (newModelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.newModelObjects(newModelObjects))\n        this.$refs.chatHeader.popupChatPanelIfNecessary()\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content:\n              this.$i18next.t('I notice some of your models have overhangs. I can try to auto-orient them to minimize the need for supports.'),\n          })\n        }\n        const quickButtons = [this.cannedActions.autoOrient, this.cannedActions.enableSupport]\n        if (this.shouldShowPlateAnalysisQuickButton) {\n          quickButtons.push(this.cannedActions.analyseModel)\n        }\n        this.setQuickButtons([\n          ...quickButtons,\n          this.cannedActions.commonPrintingPrompts,\n          this.cannedActions.moreOptions,\n        ])\n        return\n      }\n\n      this.populateQuickButtons()\n    },\n    processAutoOrientEvent(event) {\n      const currentProject = event.data?.currentProject\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      this.modelObjects = currentModelObjects\n\n      if (!this.autoOrientInProgress) {\n        return\n      }\n\n      this.autoOrientInProgress = false\n      if (event.data?.status === 'completed') {\n        let msg = this.$t('Models auto-oriented.')\n        let quickButtons = [this.cannedActions.undoAutoOrient]\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          msg +=\n            ` ${this.$t('However, some models still have overhangs. I recommend enabling support to make sure they can be printed successfully.')}`\n          quickButtons.push(this.cannedActions.enableSupport)\n        }\n\n        this.messages.push({\n          role: 'assistant',\n          content: msg,\n        })\n        this.removeQuickButtons([\n          this.cannedActions.autoOrient,\n          this.cannedActions.enableSupport,\n          this.cannedActions.undoAutoOrient,\n        ])\n        this.setQuickButtons([...quickButtons, ...this.quickButtons])\n      }\n    },\n    processNativeErrorOccurredEvent(event) {\n      window.Sentry?.captureMessage(event.data?.errorMessage, 'error')\n    },\n    processSlicingProgressEvent(event) {\n      if (!this.slicingProgress) {\n        return\n      }\n\n      const percentage = event.data?.percentage\n      if (percentage !== undefined) {\n        this.slicingProgress.percentage = percentage\n        this.slicingProgress.text = event.data?.text\n      }\n\n      if (percentage && percentage < 1.0 - 1e-6) {\n        return\n      }\n\n      if (this.slicingProgress.fadeOut) {\n        return\n      }\n\n      const quickButtons = [this.cannedActions.startOver, this.cannedActions.moreOptions]\n\n      if (this.slicingProgress.errors && this.slicingProgress.errors.length > 0) {\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$i18next.t(\"My slicing algorithm lord just said:\")}\\n *\"${this.slicingProgress.errors.join(\n            '\\n'\n          )}\"*`,\n        })\n        quickButtons.unshift(this.cannedActions.tellMeWhatNotificationMeans)\n      } else {\n        if (this.supportedActions.includes('switch_to_preview')) {\n          quickButtons.unshift(this.cannedActions.switchToPreview)\n        }\n        quickButtons.unshift(this.cannedActions.exportGCode)\n      }\n\n      this.setQuickButtons(quickButtons)\n\n      // Add fade-out class first\n      this.slicingProgress.fadeOut = true\n\n      // Remove the progress bar after fade out animation completes\n      setTimeout(() => {\n        this.slicingProgress = null\n      }, 2000) // Match the transition duration in CSS\n    },\n\n    async callPlateAnalysis() {\n      const project = await getAgentActionResponse('get_current_project')\n      const plates = project.plates\n      const images = await this.renderPlateForAnalysis()\n      const currentChatId = await this.getCurrentChatId()\n\n      const payload = {\n        images: images,\n        plates: plates,\n        chat_id: currentChatId,\n      }\n\n      try {\n        const response = await this.withCreditCheck(async () => {\n          return api.post(\n            urls.jusprinPlateAnalysisProcess(),\n            this.oauthAccessToken,\n            payload\n          )\n        })\n\n                // Handle credit response structure - if it's a credit message, restructure it for processAnalysisResponse\n        if (response.data && response.data.message && response.data.message.role === 'assistant') {\n          return { message: response.data.message }\n        }\n\n        return response.data\n      } catch (error) {\n        console.error('Error calling plate analysis:', error)\n      }\n    },\n\n    async renderPlateForAnalysis() {\n      // This function now only fetches and renders the plate images,\n      // then returns an array of base64 image strings.\n      const cameraPositionByDegrees = (target, xyPlaneAngle, zPlaneAngle) => {\n        const distanceFromTarget = 1000 // OrcaSlicer default\n        const xyPlaneAngleRadians = xyPlaneAngle * (Math.PI / 180)\n        const zPlaneAngleRadians = zPlaneAngle * (Math.PI / 180)\n        return {\n          x: target.x + distanceFromTarget * Math.sin(xyPlaneAngleRadians),\n          y: target.y - distanceFromTarget * Math.cos(xyPlaneAngleRadians),\n          z: target.z + distanceFromTarget * Math.sin(zPlaneAngleRadians),\n        }\n      }\n\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      if (plates.length === 0) {\n        return []\n      }\n\n      const { index, bounding_box, model_objects } = plates[0]\n      if (!model_objects || model_objects.length === 0) {\n        return []\n      }\n\n      const target = {\n        x: (bounding_box.max.x + bounding_box.min.x) / 2,\n        y: (bounding_box.max.y + bounding_box.min.y) / 2,\n        z: 0,\n      }\n\n      const views = [\n        { camera_position: cameraPositionByDegrees(target, 0, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -30, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -210, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, 0, -45), target: target },\n      ]\n\n      const renderResult = await getAgentActionResponse('render_plate', {\n        plate_index: index,\n        views: views,\n      })\n\n      // Build an array of all images from renderResult and return it.\n      const images = renderResult.filter((result) => result.base64).map((result) => result.base64)\n\n      return images\n    },\n\n    async getAnalysisResult() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      const analysisResponse = await this.callPlateAnalysis()\n      await this.processAnalysisResponse(analysisResponse)\n    },\n\n    async processAnalysisResponse(response) {\n      this.messages.push(response.message)\n      this.thinking = false\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (response.message.suggested_printing_method) {\n        this.pushQuickButtons([\n          this.cannedActions.plateAnalysisLooksGoodToMe,\n          this.cannedActions.plateAnalysisIsNotGood,\n          this.cannedActions.editPlateAnalysis,\n          this.cannedActions.moreOptions,\n        ])\n      } else {\n        this.populateQuickButtons()\n      }\n\n      return\n    },\n\n    ensurePlateAnalysisMessageExists() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      if (!lastMessage?.suggested_printing_method) {\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return false\n      }\n      return true\n    },\n\n    async queryWithSuggestedPrintingMethod() {\n      this.clearQuickButtons()\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const lastMessage = this.messages[this.messages.length - 1]\n      this.messages.push({\n        role: 'user',\n        content: `${this.$i18next.t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${lastMessage.suggested_printing_method}`,\n      })\n      this.sendUserQuery()\n    },\n\n    removePlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      this.messages.pop()\n      this.popQuickButtons()\n      this.populateQuickButtons()\n    },\n\n    editPlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const plateAnalysisMessage = this.messages.pop()\n      this.clearQuickButtons()\n      this.userInput = `${this.$i18next.t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${plateAnalysisMessage.suggested_printing_method}`\n    },\n\n    handleChatScroll() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      const atBottom =\n        chatMessageContainer.scrollHeight - chatMessageContainer.scrollTop <=\n        chatMessageContainer.clientHeight\n      this.showScrollButton = !atBottom\n    },\n    adjustTextareaHeight() {\n      const textarea = this.$refs.chatTextarea\n      const chatMessages = this.$refs.chatMessageContainer\n      if (!textarea || !chatMessages) return\n\n      // Reset height to auto to get correct scrollHeight\n      textarea.style.height = 'auto'\n      // Set new height based on scrollHeight, with max of 150px\n      const newHeight = Math.min(textarea.scrollHeight, 150)\n      textarea.style.height = newHeight + 'px'\n\n      // Update chat messages padding to match input height plus padding\n      const chatInput = textarea.closest('.chat-input')\n      if (chatInput) {\n        const inputTotalHeight = chatInput.offsetHeight\n        chatMessages.style.paddingBottom = `${inputTotalHeight + 8}px`\n      }\n    },\n    handleEnterKey(e) {\n      if (e.shiftKey || e.metaKey || e.ctrlKey || e.altKey) {\n        this.userInput += '\\n'\n        return\n      }\n      this.onUserInput()\n    },\n    handleContactSupportFormDismissed(data) {\n      // Find the index of the message with contact_support agent action\n      const supportMsgIndex = this.messages.findIndex(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some(action => action.name === 'contact_support')\n      )\n\n      // Remove the message if found\n      if (supportMsgIndex !== -1) {\n        this.messages.splice(supportMsgIndex, 1)\n      }\n\n      // Add new assistant message with the response\n      this.messages.push({\n        role: 'assistant',\n        content: data.message,\n      })\n\n      this.populateQuickButtons()\n      this.scrollToBottom()\n    },\n    showContactSupportForm() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: null,\n        agent_actions: [{ name: 'contact_support', arguments: {} }],\n      })\n      this.scrollToBottom()\n    },\n    showDiscordSupportMessage() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Since you are on a Free plan, please join our Discord server to seek support from the community. You can also upgrade to the Unlimited plan to get email support from the Obico team.'),\n        discord_support: {\n          url: 'https://discord.gg/Tx67dHNYH3',\n          qr_code_url: 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=https%3A%2F%2Fdiscord.gg%2FTx67dHNYH3'\n        },\n        has_upgrade_link: true\n      })\n      this.setQuickButtons([this.cannedActions.moreOptions])\n      this.scrollToBottom()\n    },\n\n    showOptionsAsQuickButtons(args) {\n      const options = args?.user_options_to_choose_from || []\n      if (!options || !Array.isArray(options)) return\n\n      const newQuickButtons = options.map((option) => ({\n        message: option,\n        onClick: () => this.onUserQueryQuickButton(option),\n      }))\n\n      // Remove any existing buttons with the same messages\n      this.removeQuickButtons(newQuickButtons)\n\n      // Add the new buttons to the existing ones\n      this.pushQuickButtons([...this.quickButtons, ...newQuickButtons])\n    },\n\n    // Modal methods\n    openUpgradeModal() {\n      this.showUpgradeModal = true\n    },\n    closeUpgradeModal() {\n      this.showUpgradeModal = false\n    },\n    handleQRCodeError(event) {\n      // Hide the QR code if it fails to load\n      event.target.style.display = 'none'\n      console.warn('Failed to load QR code for Discord support')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import './styles/EmbeddedChatPage'\n\n.highlighted-url\n  background: var(--color-surface-primary, #e9ecef)\n  color: var(--color-primary, #007bff)\n  border-radius: var(--border-radius-xs, 4px)\n  padding: 2px 8px\n  margin-left: 6px\n  font-family: monospace\n  font-size: 0.98em\n  word-break: break-all\n  display: inline-block\n  vertical-align: middle\n// icon style for message bubble\n.message-content i.mdi-alert-circle-outline\n  font-size: 1.3em\n  margin-right: 8px\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EmbeddedChatPage.vue?vue&type=template&id=146a1112&scoped=true&\"\nimport script from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nexport * from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EmbeddedChatPage.vue?vue&type=style&index=0&id=146a1112&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"146a1112\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('chat-panel-header',{ref:\"chatHeader\",attrs:{\"should-popup-chat-panel\":Boolean(_vm.oauthAccessToken),\"credits-info\":_vm.creditsInfo},on:{\"action\":_vm.callAgentAction,\"show-contact-support-form\":_vm.showContactSupportForm,\"show-discord-support-message\":_vm.showDiscordSupportMessage,\"show-upgrade-modal\":_vm.openUpgradeModal}}),_c('upgrade-modal',{attrs:{\"show\":_vm.showUpgradeModal,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"close\":_vm.closeUpgradeModal}}),(_vm.oauthAccessToken)?_c('div',{staticClass:\"chat-container mt-3\"},[_c('div',{ref:\"chatMessageContainer\",staticClass:\"chat-messages\",on:{\"scroll\":_vm.handleChatScroll}},[_vm._l((_vm.messages),function(message,index){return _c('div',{key:index,staticClass:\"message\",class:message.role},[(message.content)?_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[(message.has_upgrade_link)?_c('div',{staticClass:\"upgrade-message\"},[_c('div',[_vm._v(_vm._s(_vm.$t('Since you are on a Free plan, please join our Discord server to seek support from the community.')))]),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('You can also {localizedDom} to get email support from the Obico team.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"upgrade-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.openUpgradeModal.apply(null, arguments)}}},[_vm._v(_vm._s(_vm.$t('upgrade to the Unlimited plan')))])]},proxy:true}],null,true)})],1)]):_c('VueMarkdown',[_vm._v(_vm._s(message.content))]),(\n                message.per_override_explanations && message.per_override_explanations.length > 0\n              )?_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Detailed explanations:\")))]),_vm._l((message.per_override_explanations),function(explanation,index){return _c('div',{key:index},[_c('div',[_c('b',[_vm._v(_vm._s(explanation.parameter)+\":\")]),_vm._v(\" \"+_vm._s(explanation.explanation)+\" \")])])})],2):_vm._e()],1)]):_vm._e(),(message.slicing_profiles && _vm.slicingSettingsInMessage(message))?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('gradient-fadable-container',[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I have applied the following settings:\")))]),(message.slicing_profiles.use_print_process_preset)?_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Process preset:\"))+\" \"),_c('b',[_vm._v(_vm._s(message.slicing_profiles.use_print_process_preset))])]):_vm._e(),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"- Additional slicing parameters:\"))+\" \"),(Object.keys(_vm.changedParams(message)).length === 0)?_c('b',[_vm._v(_vm._s(_vm.$t(\"None\")))]):_vm._e(),_vm._l((_vm.changedParams(message)),function(value,key){return _c('div',{key:key},[_vm._v(\"     - \"+_vm._s(key)+\": \"),_c('span',{staticClass:\"font-weight-bold\"},[_vm._v(_vm._s(value))])])})],2)]),(index !== _vm.messages.length - 1)?_c('div',{staticClass:\"quick-button pt-2\"},[_c('quick-button-component',{attrs:{\"message\":_vm.$t('Re-apply settings')},on:{\"click\":function($event){return _vm.applySettingsInMessage(message)}}})],1):_vm._e()],1)]):_vm._e(),(message.suggested_printing_method)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"I suggest the following to achieve the best results:\")))]),_c('VueMarkdown',[_vm._v(_vm._s(message.suggested_printing_method))])],1)]):_vm._e(),(message.jusprinNotification)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"pt-2 pb-1\"},[_vm._v(_vm._s(_vm.$t(\"Oh no! My slicing algorithm lord just said:\")))]),_c('div',{staticClass:\"notification-text\",class:message.jusprinNotification.level},[_c('i',{class:message.jusprinNotification.level === 'error'\n                    ? 'mdi mdi-alert-circle'\n                    : 'mdi mdi-alert'}),_vm._v(\" \"+_vm._s(message.jusprinNotification.text)+\" \")])])]):_vm._e(),(message.discord_support)?_c('div',{staticClass:\"message-block mt-2\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"discord-support-container\"},[_c('div',{staticClass:\"discord-info\"},[_c('div',{staticClass:\"discord-url\"},[_c('strong',[_vm._v(\"Discord Server:\")]),_c('code',[_vm._v(_vm._s(message.discord_support.url))])]),_c('div',{staticClass:\"discord-instructions\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Scan this QR code with your phone to join our Discord server:\"))+\" \")])]),_c('div',{staticClass:\"qr-code-container\"},[_c('img',{staticClass:\"qr-code\",attrs:{\"src\":message.discord_support.qr_code_url,\"alt\":\"Discord QR Code\"},on:{\"error\":_vm.handleQRCodeError}})])])])]):_vm._e()])}),(_vm.thinking)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block align-items-center\"},[_c('div',{staticClass:\"message-content thinking-animation\"},[_c('VueMarkdown',[_vm._v(\"_\"+_vm._s(_vm.$t(\"Thinking...\"))+\"_\")])],1)])]):_vm._e(),(_vm.showContactSupport)?_c('contact-support-form',{attrs:{\"messages\":_vm.messages,\"oauth-access-token\":_vm.oauthAccessToken},on:{\"form-dismissed\":_vm.handleContactSupportFormDismissed}}):_vm._e(),(_vm.slicingProgress)?_c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block slicing-message-block\",class:{ 'fade-out': _vm.slicingProgress.fadeOut }},[_c('div',{staticClass:\"message-content\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.slicingProgress.overrun ? _vm.$t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.') : _vm.slicingProgress.text || _vm.$t('Slicing in progress...'))+\" \")]),_c('div',{staticClass:\"slicing-progress-container\"},[_c('div',{staticClass:\"slicing-progress-bar\",style:({ width: `${_vm.slicingProgress?.percentage * 100}%` })}),_c('div',{staticClass:\"slicing-progress-text\"},[_vm._v(\" \"+_vm._s(Math.round(_vm.slicingProgress?.percentage * 100))+\"% \")])]),(_vm.slicingProgress.errors && _vm.slicingProgress.errors.length > 0)?_c('div',{staticClass:\"slicing-errors\"},_vm._l((_vm.slicingProgress.errors),function(error,index){return _c('div',{key:index,staticClass:\"error-message\"},[_vm._v(\" \"+_vm._s(error)+\" \")])}),0):_vm._e()])])]):_vm._e(),(_vm.quickButtons.length > 0)?_c('div',{staticClass:\"quick-button pt-2\"},_vm._l((_vm.quickButtons),function(action,index){return _c('quick-button-component',{key:index,attrs:{\"message\":action.message},on:{\"click\":action.onClick}})}),1):_vm._e()],2),_c('button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showScrollButton),expression:\"showScrollButton\"}],staticClass:\"scroll-to-bottom\",on:{\"click\":_vm.scrollToBottom}},[_c('i',{staticClass:\"mdi mdi-arrow-down large-icon\"})]),_c('div',{staticClass:\"chat-input\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userInput),expression:\"userInput\"}],ref:\"chatTextarea\",attrs:{\"rows\":\"1\",\"type\":\"text\",\"disabled\":!_vm.readyForUserQuery,\"placeholder\":_vm.readyForUserQuery\n            ? _vm.$t('Type your message here...')\n            : _vm.$t('Select printer, filament, and add models first')},domProps:{\"value\":(_vm.userInput)},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;$event.preventDefault();return _vm.handleEnterKey.apply(null, arguments)},\"input\":function($event){if($event.target.composing)return;_vm.userInput=$event.target.value}}}),_vm._v(\" \"),_c('button',{staticClass:\"send-button\",attrs:{\"disabled\":!_vm.readyForUserQuery},on:{\"click\":_vm.onUserInput}},[_c('i',{staticClass:\"mdi mdi-arrow-up send-icon\"})])])]):_c('div',[_c('div',{staticClass:\"login-container\"},[_c('div',[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"id\":\"signUpSignInBtn\"},on:{\"click\":() => _vm.callAgentAction('show_login')}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Sign Up/Sign In to Get Started\"))+\" \")])])])])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"btn btn-outline-primary\",attrs:{\"href\":\"#\"},on:{\"click\":_vm.handleClick}},[_vm._v(\" \"+_vm._s(_vm.message)+\" \")])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <a href=\"#\" class=\"btn btn-outline-primary\" @click=\"handleClick\">\n    {{ message }}\n  </a>\n</template>\n\n<script>\nexport default {\n  name: 'QuickButtonComponent',\n  props: {\n    message: {\n      type: String,\n      required: true,\n    },\n  },\n  methods: {\n    handleClick(event) {\n      this.$emit('click', event)\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn\n  width: auto\n  max-width: 100%\n  white-space: normal\n  text-align: center\n  padding: 0.5rem 1rem\n  hyphens: auto\n  word-wrap: break-word\n  overflow-wrap: break-word\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuickButtonComponent.vue?vue&type=template&id=79a2bd8c&scoped=true&\"\nimport script from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nexport * from \"./QuickButtonComponent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuickButtonComponent.vue?vue&type=style&index=0&id=79a2bd8c&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"79a2bd8c\",\n  null\n  \n)\n\nexport default component.exports","import axios from 'axios'\nimport i18n from '@src/i18n/i18n'\n\nconst getHeaders = (authToken) => ({\n  Authorization: `Bearer ${authToken}`,\n})\n\nconst getConfig = (authToken) => ({\n  headers: getHeaders(authToken),\n  params: {\n    lang: i18n.language,\n  },\n})\n\nexport default {\n  get: (url, authToken) => {\n    return axios.get(url, getConfig(authToken))\n  },\n  post: (url, authToken, data) => {\n    return axios.post(url, data, getConfig(authToken))\n  },\n  put: (url, authToken, data) => {\n    return axios.put(url, data, getConfig(authToken))\n  },\n}\n","// Global state\nwindow.stubAgentActionResponse = new Map()\nwindow.agentActionCallMap = {}\n\nimport i18next from '@src/i18n/i18n.js'\n\n// Helper functions\nexport function setAgentActionRetVal({ refId, retVal = null, error = null }) {\n  window.agentActionCallMap[refId] = { retVal, error }\n}\n\nexport function callAgentAction(action, payload = null, refId = null) {\n  const message = { action }\n  if (payload !== null) message.payload = payload\n  if (refId !== null) message.refId = refId\n\n  if (window.wx?.postMessage) {\n    window.wx.postMessage(message)\n  } else {\n    console.log(`window.wx.postMessage(${JSON.stringify(message)})`)\n\n    if (refId !== null && refId !== undefined) {\n      setTimeout(() => {\n        const retVal = window.stubAgentActionResponse.get(action) || {}\n        setAgentActionRetVal({ refId, retVal })\n      }, 10)\n    }\n  }\n}\n\nexport function getAgentActionResponse(action, payload = {}, timeout = 10000) {\n  return new Promise((resolve, reject) => {\n    const refId = Math.random().toString(36).substring(2, 15)\n    window.agentActionCallMap[refId] = null // Initialize with null\n\n    callAgentAction(action, payload, refId)\n\n    const timeoutId = setTimeout(() => {\n      if (refId in window.agentActionCallMap) {\n        reject(new Error(i18next.t('Timeout: No response for action \"{action}\" within {timeout}ms', {\n          action,\n          timeout\n        })))\n        delete window.agentActionCallMap[refId] // Clean up\n      }\n    }, timeout)\n\n    // Poll for response\n    const checkResponse = () => {\n      const response = window.agentActionCallMap[refId]\n      if (response !== null && response !== undefined) {\n        clearTimeout(timeoutId)\n        delete window.agentActionCallMap[refId] // Clean up\n        if (response.error) {\n          reject(new Error(response.error))\n        } else {\n          resolve(response.retVal)\n        }\n      } else {\n        setTimeout(checkResponse, 10) // Check again in 10ms\n      }\n    }\n    checkResponse()\n  })\n}\n","import { callAgentAction, getAgentActionResponse } from '../lib/agentAction'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  data() {\n    return {\n      quickButtonsStack: [],\n    }\n  },\n  computed: {\n    quickButtons() {\n      return this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n    },\n    cannedActions() {\n      return {\n        addPrinters: {\n          message: this.$i18next.t('Add printer'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n          },\n        },\n        addFilaments: {\n          message: this.$i18next.t('Add filament'),\n          onClick: () => {\n            this.popQuickButtons()\n            this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n          },\n        },\n        changePrinter: {\n          message: this.$i18next.t('Change printer'),\n          onClick: () => this.showPresetOptions('printer'),\n        },\n        changeFilament: {\n          message: this.$i18next.t('Change filament'),\n          onClick: () => this.showPresetOptions('filament'),\n        },\n        moreOptions: {\n          message: this.$i18next.t('More options'),\n          onClick: () => this.showMoreOptions(),\n        },\n        cancel: {\n          message: this.$i18next.t('Cancel'),\n          onClick: () => this.popQuickButtons(),\n        },\n        sliceWithCurrentSettings: {\n          message: this.$i18next.t('Slice with current settings'),\n          onClick: () => this.doSliceWithCurrentSettings(),\n        },\n        endTroubleshooting: {\n          message: this.$i18next.t('End troubleshooting'),\n          onClick: () => {\n            this.current_workflow = null\n            this.onUserQueryQuickButton(this.$i18next.t('I want to end troubleshooting'))\n          },\n        },\n        stayInTroubleshooting: {\n          message: this.$i18next.t('Stay in troubleshooting'),\n          onClick: () => {\n            this.onUserQueryQuickButton(this.$i18next.t('I want to continue troubleshooting'))\n          },\n        },\n        startOver: {\n          message: this.$i18next.t('Start over'),\n          onClick: () => this.startOver(),\n        },\n        exportGCode: {\n          message: this.$i18next.t('Export G-code'),\n          onClick: () => this.callAgentAction('export_gcode'),\n        },\n        switchToPreview: {\n          message: this.$i18next.t('Switch to preview'),\n          onClick: () => this.callAgentAction('switch_to_preview'),\n        },\n        autoOrient: {\n          message: this.$i18next.t('Auto-orient models'),\n          onClick: () => {\n            this.autoOrientAllObjects()\n          },\n        },\n        undoAutoOrient: {\n          message: this.$i18next.t('Undo auto-orient'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-orient is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoOrient])\n          },\n        },\n        undoAutoArrange: {\n          message: this.$i18next.t('Undo auto-arrange'),\n          onClick: () => {\n            callAgentAction('plater_undo')\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Auto-arrange is undone.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoAutoArrange])\n          },\n        },\n        enableSupport: {\n          message: this.$i18next.t('Enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '1' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Support enabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.enableSupport])\n            this.setQuickButtons([this.cannedActions.undoEnableSupport, ...this.quickButtons])\n          },\n        },\n        undoEnableSupport: {\n          message: this.$i18next.t('Undo enable support'),\n          onClick: async () => {\n            await getAgentActionResponse(\n              'apply_config',\n              this.paramOverridesToApplyConfigPayload({ enable_support: '0' }, 'print')\n            )\n            this.messages.push({\n              role: 'assistant',\n              content: this.$i18next.t('Got it! Support is now disabled.'),\n            })\n            this.removeQuickButtons([this.cannedActions.undoEnableSupport])\n          },\n        },\n        tellMeWhatNotificationMeans: {\n          message: this.$i18next.t('Explain it to me'),\n          onClick: () => {\n            // Find the last assistant message that contains a notification\n            const lastErrorMessage = [...this.messages]\n              .reverse()\n              .find((msg) => msg.role === 'assistant' && msg.jusprinNotification)\n\n            // Get the original error message if found\n            let originalErrorMessage = ''\n            if (lastErrorMessage && lastErrorMessage.jusprinNotification) {\n              originalErrorMessage = lastErrorMessage.jusprinNotification.text\n            }\n\n            // Format the new message\n            const newMessage = this.$i18next.t('JusPrin displays this message: *\"{originalErrorMessage}\"* Explain it to me.', {\n              originalErrorMessage\n            })\n\n            // Send the message\n            this.onUserQueryQuickButton(newMessage)\n          },\n        },\n        acknowledgeError: {\n          message: this.$i18next.t('Okay'),\n          onClick: () => {\n            this.messages.pop()\n            this.popQuickButtons()\n          },\n        },\n        commonPrintingPrompts: {\n          message: this.$i18next.t('Common printing prompts'),\n          onClick: () => this.showCommonPrintingPrompts(),\n        },\n        testRender: {\n          message: this.$i18next.t('Test render'),\n          onClick: () => this.renderPlateForAnalysis(),\n        },\n        analyseModel: {\n          message: this.$i18next.t('✨ Do your magic!'),\n          onClick: () => this.getAnalysisResult(),\n        },\n        plateAnalysisLooksGoodToMe: {\n          message: this.$i18next.t('Looks good to me'),\n          onClick: () => this.queryWithSuggestedPrintingMethod(),\n        },\n        plateAnalysisIsNotGood: {\n          message: this.$i18next.t('You got it wrong. Scratch that.'),\n          onClick: () => this.removePlateAnalysis(),\n        },\n        editPlateAnalysis: {\n          message: this.$i18next.t('Let me change it'),\n          onClick: () => this.editPlateAnalysis(),\n        },\n      }\n    },\n    shouldShowSliceWithCurrentSettingsQuickButton() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      return lastMessage && this.slicingSettingsInMessage(lastMessage)\n    },\n    shouldShowStartOverQuickButton() {\n      return this.messages.some((message) => message.role === 'user')\n    },\n    shouldShowPlateAnalysisQuickButton() {\n      return !this.haveDonePlateAnalysis && this.hasModelObjects\n    },\n  },\n  methods: {\n    pushQuickButtons(actions) {\n      this.quickButtonsStack.push(actions)\n    },\n    popQuickButtons() {\n      this.quickButtonsStack.pop()\n    },\n    removeQuickButtons(actions) {\n      const actionMessages = actions.map((action) => action.message)\n      let topActions = this.quickButtonsStack[this.quickButtonsStack.length - 1] || []\n      topActions = topActions.filter((action) => !actionMessages.includes(action.message))\n      this.$set(this.quickButtonsStack, this.quickButtonsStack.length - 1, topActions)\n    },\n    clearQuickButtons() {\n      this.quickButtonsStack = []\n    },\n    setQuickButtons(actions) {\n      this.clearQuickButtons()\n      this.pushQuickButtons(actions)\n    },\n    initUserQueryHintButtons() {\n      const initQueryHints = [\n        this.$i18next.t('Just do a standard print. Nothing special.'),\n        this.$i18next.t('I want to do a fast print. Draft quality.'),\n        this.$i18next.t('Print a strong part.'),\n        this.$i18next.t('My last print did not stick to the bed. Help me fix it.'),\n      ]\n\n      return initQueryHints.map((hint) => ({\n        message: hint,\n        onClick: () => this.onUserQueryQuickButton(hint),\n      }))\n    },\n    showCommonPrintingPrompts() {\n      this.pushQuickButtons([...this.initUserQueryHintButtons(), this.cannedActions.cancel])\n    },\n    async showPresetOptions(presetType) {\n      const presets = (await getAgentActionResponse('get_presets'))[`${presetType}Presets`] || []\n      const options = presets.map((preset) => ({\n        message: preset.name,\n        onClick: async () => {\n          await getAgentActionResponse(`select_preset`, {\n            type: presetType,\n            name: preset.name,\n          })\n          await this.refreshSelectedPresets(false)\n          this.populateQuickButtons()\n        },\n      }))\n      this.messages.push({\n        role: 'assistant',\n        content: this.$i18next.t('Select a {presetType}. If the {presetType} is not listed, use the \"Add {presetType}\" button to add it first.', {\n          presetType\n        }),\n      })\n      this.pushQuickButtons([\n        ...options,\n        this.cannedActions[`add${presetType.charAt(0).toUpperCase() + presetType.slice(1)}s`],\n        this.cannedActions.cancel,\n      ])\n    },\n    showMoreOptions() {\n      const additionalActions = [\n        this.cannedActions.changePrinter,\n        this.cannedActions.changeFilament,\n        this.cannedActions.addPrinters,\n        this.cannedActions.addFilaments,\n        this.cannedActions.startOver,\n      ]\n      this.removeQuickButtons([this.cannedActions.moreOptions])\n\n      const topActions = this.quickButtons\n      // Filter out actions that are already present in topActions\n      const newActions = additionalActions.filter(\n        (newAction) => !topActions.some((existing) => existing.message === newAction.message)\n      )\n\n      if (newActions.length > 0) {\n        this.popQuickButtons()\n        this.pushQuickButtons([...topActions, ...newActions])\n      }\n    },\n    populateQuickButtons() {\n      const quickButtons = []\n      if (this.shouldShowSliceWithCurrentSettingsQuickButton) {\n        quickButtons.push(this.cannedActions.sliceWithCurrentSettings)\n        quickButtons.push(this.cannedActions.startOver)\n        quickButtons.push(this.cannedActions.moreOptions)\n        this.setQuickButtons(quickButtons)\n        return\n      }\n\n      if (this.shouldShowPlateAnalysisQuickButton) {\n        quickButtons.push(this.cannedActions.analyseModel)\n      }\n\n      if (this.hasModelObjects) {\n        quickButtons.push(this.cannedActions.commonPrintingPrompts)\n      }\n\n      if (this.shouldShowStartOverQuickButton) {\n        quickButtons.push(this.cannedActions.startOver)\n      }\n\n      quickButtons.push(this.cannedActions.moreOptions)\n      this.setQuickButtons(quickButtons)\n    },\n    populateQuickButtonsOnError() {\n      this.setQuickButtons([this.cannedActions.startOver])\n    },\n  },\n}\n","import pluralize from 'pluralize'\nimport i18next from '@src/i18n/i18n.js'\n\nexport default {\n  computed: {\n    cannedMessages() {\n      return {\n        greeting: {\n          role: 'assistant',\n          content: this.$i18next.t(\"🤖 Hi, I'm JusBot, your 3D printing AI assistant.\"),\n        },\n        needToAddPrinters: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any printers yet. You need to add at least one printer before you can use JusPrin.\"\n          ),\n        },\n        needToAddFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you haven't added any filaments yet. You need to add at least one filament before you can use JusPrin.\"\n          ),\n        },\n        noModelObjects: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            \"I notice you don't have any models on your plate.\\n\\nAdd some models to see the magic. 😀\"\n          ),\n        },\n        noSupportForMultiplePlatesOrFilaments: {\n          role: 'assistant',\n          content: this.$i18next.t(\n            'I notice your model uses multiple plates or filaments.\\n\\nJusPrin is still in beta and does not support multiple plates or filaments yet.\\n\\nPlease manually slice your model. Also stay tuned for our product update.'\n          ),\n        },\n        currentPresetSelections: (printerName, filamentName, isFirstTime = false) => ({\n          role: 'assistant',\n          content: `${isFirstTime ? this.$i18next.t('You are currently using:') : this.$i18next.t('You have switched to:')}\\n- ${this.$i18next.t('Printer:')} **${printerName}**\\n- ${this.$i18next.t('Filament:')} **${filamentName}**`,\n        }),\n        currentModelObjects: (modelObjectCount) => ({\n          role: 'assistant',\n          content:\n            modelObjectCount === 1\n              ? this.$i18next.t('You have {num} model on your plate.', {\n                  num: modelObjectCount,\n                })\n              : this.$i18next.t('You have {num} models on your plate.', {\n                  num: modelObjectCount,\n                }),\n        }),\n        newModelObjects: (newModelObjects) => {\n          let content = ''\n          if (newModelObjects.length === 1) {\n            content = this.$i18next.t('I see \"{modelName}\" added to your plate.', {\n              modelName: newModelObjects[0].name\n            })\n          } else if (newModelObjects.length > 1) {\n            content = (newModelObjects.length - 1) === 1 ? this.$i18next.t('I see \"{modelName}\" and {num} other model added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n              : this.$i18next.t('I see \"{modelName}\" and {num} other models added to your plate.', {\n                  modelName: newModelObjects[0].name,\n                  num: newModelObjects.length - 1,\n                })\n          }\n          return {\n            role: 'assistant',\n            content,\n          }\n        },\n        generalError: {\n          role: 'assistant',\n          content: this.$i18next.t('Sorry, there was an error processing your request.'),\n        },\n      }\n    },\n  },\n}\n","export default {\n  methods: {\n    fixFilamentParamOverrides(param_overrides) {\n      // FIXME: No idea how these temps are used in Orca. But for most printers this hack seems to be good enough.\n\n      // Filament params now have an array of values but apply_config still expects a single value\n      Object.keys(param_overrides).forEach((key) => {\n        if (Array.isArray(param_overrides[key]) && param_overrides[key].length > 0) {\n          param_overrides[key] = param_overrides[key][0]; // Unpack to the first value\n        }\n      });\n\n      const plateTemps = [\n        'cool_plate_temp',\n        'eng_plate_temp',\n        'hot_plate_temp',\n        'textured_cool_plate_temp',\n        'textured_plate_temp',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTemp = plateTemps.find((key) => key in param_overrides)\n\n      if (existingTemp) {\n        const tempValue = param_overrides[existingTemp]\n        // Set the same temperature for all plate types\n        plateTemps.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      const plateTempsInitialLayer = [\n        'cool_plate_temp_initial_layer',\n        'eng_plate_temp_initial_layer',\n        'hot_plate_temp_initial_layer',\n        'textured_cool_plate_temp_initial_layer',\n        'textured_plate_temp_initial_layer',\n      ]\n\n      // Check if any plate temp parameter exists\n      const existingTempInitialLayer = plateTempsInitialLayer.find((key) => key in param_overrides)\n\n      if (existingTempInitialLayer) {\n        const tempValue = param_overrides[existingTempInitialLayer]\n        // Set the same temperature for all plate types\n        plateTempsInitialLayer.forEach((key) => {\n          param_overrides[key] = tempValue\n        })\n      }\n\n      return param_overrides\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:\"container\",staticClass:\"gradient-fade-wrapper\",class:{ 'is-unfaded': _vm.isUnfaded },on:{\"click\":_vm.toggleFade}},[_vm._t(\"default\"),(_vm.hasFade && !_vm.isUnfaded)?_c('div',{staticClass:\"fade-overlay\"}):_vm._e()],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div\n    ref=\"container\"\n    class=\"gradient-fade-wrapper\"\n    :class=\"{ 'is-unfaded': isUnfaded }\"\n    @click=\"toggleFade\"\n  >\n    <slot></slot>\n    <div v-if=\"hasFade && !isUnfaded\" class=\"fade-overlay\"></div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'GradientFadableContainer',\n  data() {\n    return {\n      isUnfaded: false,\n      hasFade: false,\n    }\n  },\n  mounted() {\n    this.checkIfNeedsFade()\n  },\n  updated() {\n    this.checkIfNeedsFade()\n  },\n  methods: {\n    toggleFade() {\n      this.isUnfaded = !this.isUnfaded\n\n      // Wait for transition to complete before rechecking\n      setTimeout(() => {\n        this.checkIfNeedsFade()\n      }, 300)\n    },\n    checkIfNeedsFade() {\n      this.$nextTick(() => {\n        const el = this.$refs.container\n        if (!this.isUnfaded) {\n          this.hasFade = el.scrollHeight > el.clientHeight\n        } else {\n          this.hasFade = false\n        }\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.gradient-fade-wrapper\n  position: relative\n  max-height: 8rem\n  overflow: hidden\n  transition: max-height 0.3s ease-out\n  cursor: pointer\n\n  &.is-unfaded\n    max-height: 1000px\n\n.fade-overlay\n  position: absolute\n  bottom: 0\n  left: 0\n  right: 0\n  height: 3rem\n  background: linear-gradient(transparent, var(--message-bg, white))\n  pointer-events: none\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GradientFadableContainer.vue?vue&type=template&id=411f3522&scoped=true&\"\nimport script from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./GradientFadableContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./GradientFadableContainer.vue?vue&type=style&index=0&id=411f3522&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"411f3522\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"chat-header\"},[_c('div',{staticClass:\"header-left\"},[_c('div',{staticClass:\"custom-control custom-checkbox\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.chatPanelPopUpOnErrors),expression:\"chatPanelPopUpOnErrors\"}],staticClass:\"custom-control-input\",attrs:{\"id\":\"dont-show-checkbox\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.chatPanelPopUpOnErrors)?_vm._i(_vm.chatPanelPopUpOnErrors,null)>-1:(_vm.chatPanelPopUpOnErrors)},on:{\"change\":function($event){var $$a=_vm.chatPanelPopUpOnErrors,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.chatPanelPopUpOnErrors=$$a.concat([$$v]))}else{$$i>-1&&(_vm.chatPanelPopUpOnErrors=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.chatPanelPopUpOnErrors=$$c}}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":\"dont-show-checkbox\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Pop up on errors\"))+\" \")])])]),(_vm.creditsInfo && _vm.isEnt)?_c('div',{staticClass:\"credit-display\",class:_vm.creditStatusClass,attrs:{\"title\":_vm.creditTooltipText},on:{\"click\":function($event){return _vm.$emit('show-upgrade-modal')}}},[(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('i',{staticClass:\"mdi mdi-crown credit-icon\"}):_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credits\"}}),(_vm.creditsInfo.ai_credit_free_monthly_quota === -1)?_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited Account'))+\" \")]):_c('span',{staticClass:\"credit-text\"},[_vm._v(\" \"+_vm._s(_vm.remainingCredits)+\"/\"+_vm._s(_vm.creditsInfo.ai_credit_free_monthly_quota)+\" \")])]):_vm._e(),_c('div',{staticClass:\"header-actions\"},[_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Contact Support')},on:{\"click\":_vm.handleSupportButtonClick}},[_c('i',{staticClass:\"mdi mdi-message-question-outline large-icon\"})]),_c('div',{staticClass:\"header-divider\"},[_vm._v(\"|\")]),(_vm.curChatPanelViewMode !== 'large')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Large Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('large', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-expand large-icon\"})]):_vm._e(),(_vm.curChatPanelViewMode !== 'small')?_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Small Chat Window')},on:{\"click\":function($event){return _vm.changeChatPanelViewMode('small', true)}}},[_c('i',{staticClass:\"mdi mdi-arrow-collapse large-icon\"})]):_vm._e(),_c('button',{staticClass:\"header-button\",attrs:{\"title\":_vm.$t('Close')},on:{\"click\":function($event){return _vm.changeChatPanelVisibility(false)}}},[_c('i',{staticClass:\"mdi mdi-close large-icon\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatPanelHeader.vue?vue&type=template&id=33cffac1&scoped=true&\"\nimport script from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatPanelHeader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ChatPanelHeader.vue?vue&type=style&index=0&id=33cffac1&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"33cffac1\",\n  null\n  \n)\n\nexport default component.exports","export default {\n  data() {\n    return {\n      processedNotifications: new Set(),\n    }\n  },\n  methods: {\n    processNotificationPushedEvent(event) {\n      if (!event.data?.text) return\n\n      const { level, text } = event.data\n      const notificationKey = `${level}:${text}`\n\n      if (this.processedNotifications.has(notificationKey)) return\n\n      this.processedNotifications.add(notificationKey)\n\n      if (!['error', 'warning'].includes(level)) {\n        return\n      }\n\n      if (this.slicingProgress) {\n        this.slicingProgress.errors.push(text)\n        return\n      }\n\n      this.messages.push({\n        role: 'assistant',\n        content: '', // jusprinNotification message is constructed from jusprinNotification field\n        jusprinNotification: {\n          level,\n          text,\n        },\n      })\n\n      this.pushQuickButtons([this.cannedActions.tellMeWhatNotificationMeans, this.cannedActions.acknowledgeError])\n      this.$refs.chatHeader.popupChatPanelIfNecessary(level)\n    },\n  },\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"message assistant\"},[_c('div',{staticClass:\"message-block\"},[_c('div',{staticClass:\"message-content\"},[_c('div',{staticClass:\"contact-support-form\"},[_c('p',[_vm._v(_vm._s(_vm.$t(\"Would you like to send a support request?\")))]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.supportMessage),expression:\"supportMessage\"}],staticClass:\"form-control mb-3\",attrs:{\"rows\":\"4\",\"placeholder\":_vm.$t('Describe your issue here...')},domProps:{\"value\":(_vm.supportMessage)},on:{\"input\":function($event){if($event.target.composing)return;_vm.supportMessage=$event.target.value}}}),_c('div',{staticClass:\"d-flex justify-content-between\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.sendSupportRequest}},[_c('i',{staticClass:\"mdi mdi-message-question-outline mr-1\"}),_vm._v(\" \"+_vm._s(_vm.isSubmitting ? _vm.$t('Sending...') : _vm.$t('Ask for tech support'))+\" \")]),_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"disabled\":_vm.isSubmitting},on:{\"click\":_vm.cancelSupportRequest}},[_vm._v(\" \"+_vm._s(_vm.$t(\"Nah, I'm good\"))+\" \")])]),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-3\"},[_vm._v(\" \"+_vm._s(_vm.error)+\" \")]):_vm._e()])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"message assistant\">\n    <div class=\"message-block\">\n      <div class=\"message-content\">\n        <div class=\"contact-support-form\">\n          <p>{{ $t(\"Would you like to send a support request?\") }}</p>\n          <textarea\n            v-model=\"supportMessage\"\n            class=\"form-control mb-3\"\n            rows=\"4\"\n            :placeholder=\"$t('Describe your issue here...')\"\n          ></textarea>\n          <div class=\"d-flex justify-content-between\">\n            <button class=\"btn btn-primary\" @click=\"sendSupportRequest\" :disabled=\"isSubmitting\">\n              <i class=\"mdi mdi-message-question-outline mr-1\"></i>\n              {{ isSubmitting ? $t('Sending...') : $t('Ask for tech support') }}\n            </button>\n            <button\n              class=\"btn btn-secondary\"\n              @click=\"cancelSupportRequest\"\n              :disabled=\"isSubmitting\"\n            >\n              {{ $t(\"Nah, I'm good\") }}\n            </button>\n          </div>\n          <div v-if=\"error\" class=\"alert alert-danger mt-3\">\n            {{ error }}\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'ContactSupportForm',\n  props: {\n    messages: {\n      type: Array,\n      required: true,\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      supportMessage: '',\n      isSubmitting: false,\n      error: null,\n    }\n  },\n  computed: {\n    lastUserMessage() {\n      // Find the last user message in the messages array using higher-order function\n      const lastUserMsg = [...this.messages].reverse().find((message) => message.role === 'user')\n\n      return lastUserMsg ? lastUserMsg.content : ''\n    },\n  },\n  created() {\n    // Pre-fill with the last user message\n    this.supportMessage = this.lastUserMessage\n  },\n  methods: {\n    async sendSupportRequest() {\n      if (!this.supportMessage.trim()) {\n        this.error = this.$t('Please enter a message before submitting.')\n        return\n      }\n\n      this.isSubmitting = true\n      this.error = null\n\n      try {\n        await api.post(urls.jusprinContactSupport(), this.oauthAccessToken, {\n          message: this.supportMessage,\n        })\n\n        this.$emit('form-dismissed', {\n          message:\n            this.$t('Your support request has been sent. Our team will get back to you as soon as possible.'),\n        })\n      } catch (error) {\n        console.error('Failed to send support request:', error)\n        this.error = this.$t('Failed to send your support request. Please try again later.')\n        this.isSubmitting = false\n      }\n    },\n    cancelSupportRequest() {\n      this.$emit('form-dismissed', {\n        message: this.$t(\"No problem! Let me know if there's anything else I can help you with.\"),\n      })\n    },\n  },\n}\n</script>\n\n<style scoped>\n.contact-support-form {\n  width: 100%;\n}\n</style>\n","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContactSupportForm.vue?vue&type=template&id=d1933d3e&scoped=true&\"\nimport script from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nexport * from \"./ContactSupportForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ContactSupportForm.vue?vue&type=style&index=0&id=d1933d3e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"d1933d3e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.show)?_c('div',{staticClass:\"upgrade-modal-backdrop\",on:{\"click\":_vm.closeModal}},[_c('div',{staticClass:\"upgrade-modal surface\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"close-button icon-btn\",on:{\"click\":_vm.closeModal}},[_c('i',{staticClass:\"mdi mdi-close\"})]),_c('h2',{staticClass:\"modal-title\"},[_vm._v(_vm._s(_vm.$t(\"Your JusPrin Account\")))]),(!_vm.loading && !_vm.isUnlimitedPlan && _vm.remainingCredits <= 0)?_c('div',{staticClass:\"credit-exhausted-banner\"},[_c('i',{staticClass:\"mdi mdi-alert-circle\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"You have run out of AI credits!\")))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"text-center\"},[_c('i',{staticClass:\"mdi mdi-loading mdi-spin\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Loading...\"))+\" \")]):_c('div',[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"user-details\"},[(_vm.userInfo.first_name || _vm.userInfo.last_name)?_c('h3',{staticClass:\"user-name\"},[_vm._v(_vm._s(_vm.userDisplayName))]):_vm._e(),_c('div',{staticClass:\"user-email\"},[_vm._v(_vm._s(_vm.userInfo.email))])]),_c('span',{staticClass:\"plan-badge\",class:{ 'pro-badge': _vm.isUnlimitedPlan }},[_vm._v(\" \"+_vm._s(_vm.isUnlimitedPlan ? _vm.$t('Unlimited') : _vm.$t('FREE Plan'))+\" \")])]),(_vm.isUnlimitedPlan)?[_c('div',{staticClass:\"body-section text-center\"},[_vm._m(0),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Yay! You are on the Unlimited Plan!'))+\" \")]),_c('div',{staticClass:\"unlimited-text\",staticStyle:{\"font-size\":\"1.2rem\",\"font-weight\":\"bold\",\"margin-bottom\":\"3rem\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),_c('button',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.showPricingPlan}},[_vm._v(\" \"+_vm._s(_vm.$t('Manage Subscription Plan'))+\" \")])])]:[_c('div',{staticClass:\"body-section\"},[_c('div',{staticClass:\"ai-credits-header\"},[_c('img',{staticClass:\"credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"JusPrin Credit Icon\"}}),_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"AI Credits\")))])]),_c('div',{staticClass:\"progress-bar-container\"},[_c('div',{staticClass:\"progress-bar\",class:_vm.creditStatusClass,style:({ width: `${_vm.progressPercentage}%` })})]),_c('div',{staticClass:\"progress-info\"},[_c('span',{staticClass:\"usage-text\"},[_vm._v(\" You've used \"+_vm._s(_vm.credits.ai_credit_used_current_month)+\" AI credits of \"+_vm._s(_vm.isUnlimitedPlan ? 'unlimited' : _vm.credits.ai_credit_free_monthly_quota)+\" this month \")]),_c('span',{staticClass:\"reset-date\"},[_vm._v(_vm._s(_vm.$t(\"Reset on {resetDate}\", { resetDate: _vm.nextMonthResetDate })))])])]),_c('div',{staticClass:\"text-muted small\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\"))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\"))+\" \")]),_c('muted-alert',{staticClass:\"mt-2 feature-notice\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"AI credit limit is reset at the beginning of each month.\"))+\" \")]),_c('div',{staticClass:\"body-section\"},[_c('h4',{staticClass:\"modal-section-title\"},[_vm._v(_vm._s(_vm.$t(\"Get More AI Credits\")))]),_c('div',{staticClass:\"section-description\"},[_vm._v(_vm._s(_vm.$t(\"If you are running short on AI credits, there are two ways to get more.\")))]),_c('div',{staticClass:\"upgrade-option\"},[_c('div',{staticClass:\"upgrade-details\"},[_c('div',{staticClass:\"upgrade-title\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Upgrade to Unlimited Plan\"))+\" \"),(_vm.userInfo.has_active_subscription)?_c('span',{staticClass:\"discount\"},[_vm._v(_vm._s(_vm.$t(\"30% OFF\")))]):_vm._e()]),_c('div',{staticClass:\"text-primary small\"},[_vm._v(_vm._s(_vm.$t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\")))])]),_c('button',{staticClass:\"btn btn-primary upgrade-button\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.showPricingPlan}},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade'))+\" \")])]),_c('div',{staticClass:\"mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Alternatively, you can host your own JusPrin server and get unlimited AI credits using your own OpenAI API key.'))+\" \")])])]],2)])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"celebration\",staticStyle:{\"font-size\":\"2.5rem\",\"margin\":\"1.5rem 0\"}},[_vm._v(\" 🎉 \"),_c('i',{staticClass:\"mdi mdi-crown\",staticStyle:{\"color\":\"gold\",\"font-size\":\"2.5rem\"}}),_vm._v(\" 🎉 \")])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"show\" class=\"upgrade-modal-backdrop\" @click=\"closeModal\">\n    <div class=\"upgrade-modal surface\" @click.stop>\n      <button class=\"close-button icon-btn\" @click=\"closeModal\">\n        <i class=\"mdi mdi-close\"></i>\n      </button>\n\n      <h2 class=\"modal-title\">{{ $t(\"Your JusPrin Account\") }}</h2>\n\n      <!-- Red banner for zero credits -->\n      <div v-if=\"!loading && !isUnlimitedPlan && remainingCredits <= 0\" class=\"credit-exhausted-banner\">\n        <i class=\"mdi mdi-alert-circle\"></i>\n        <span>{{ $t(\"You have run out of AI credits!\") }}</span>\n      </div>\n\n      <div v-if=\"loading\" class=\"text-center\">\n        <i class=\"mdi mdi-loading mdi-spin\"></i> {{ $t(\"Loading...\") }}\n      </div>\n\n      <div v-else>\n        <div class=\"user-info\">\n          <div class=\"user-details\">\n            <h3 v-if=\"userInfo.first_name || userInfo.last_name\" class=\"user-name\">{{ userDisplayName }}</h3>\n            <div class=\"user-email\">{{ userInfo.email }}</div>\n          </div>\n          <span class=\"plan-badge\" :class=\"{ 'pro-badge': isUnlimitedPlan }\">\n            {{ isUnlimitedPlan ? $t('Unlimited') : $t('FREE Plan') }}\n          </span>\n        </div>\n\n        <template v-if=\"isUnlimitedPlan\">\n          <div class=\"body-section text-center\">\n            <div class=\"celebration\" style=\"font-size: 2.5rem; margin: 1.5rem 0;\">\n              🎉 <i class=\"mdi mdi-crown\" style=\"color: gold; font-size: 2.5rem;\"></i> 🎉\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold;\">\n              {{ $t('Yay! You are on the Unlimited Plan!') }}\n            </div>\n            <div class=\"unlimited-text\" style=\"font-size: 1.2rem; font-weight: bold; margin-bottom: 3rem;\">\n              {{ $t('Enjoy unlimited AI credits!') }}\n            </div>\n            <button\n              type=\"button\"\n              class=\"btn btn-primary upgrade-button\"\n              @click=\"showPricingPlan\"\n            >\n              {{ $t('Manage Subscription Plan') }}\n            </button>\n          </div>\n        </template>\n        <template v-else>\n          <div class=\"body-section\">\n            <div class=\"ai-credits-header\">\n              <img src=\"/static/img/jusprin-credit.png\" alt=\"JusPrin Credit Icon\" class=\"credit-icon\" />\n              <h4 class=\"modal-section-title\">{{ $t(\"AI Credits\") }}</h4>\n            </div>\n            <div class=\"progress-bar-container\">\n              <div class=\"progress-bar\" :class=\"creditStatusClass\" :style=\"{ width: `${progressPercentage}%` }\"></div>\n            </div>\n            <div class=\"progress-info\">\n              <span class=\"usage-text\">\n                You've used {{ credits.ai_credit_used_current_month }} AI credits of {{ isUnlimitedPlan ? 'unlimited' : credits.ai_credit_free_monthly_quota }} this month\n              </span>\n              <span class=\"reset-date\">{{ $t(\"Reset on {resetDate}\", { resetDate: nextMonthResetDate }) }}</span>\n            </div>\n          </div>\n\n          <div class=\"text-muted small\">\n           {{ $t(\"\\\"AI credit\\\" is the currency for using JusPrin AI. Every time you ask JusPrin to determine the best way to slice the model, you will use 1 AI credit.\") }}\n           <br>\n           {{ $t(\"We set a limit on the number of AI credits per month for free users because OpenAI charges us for each API call.\") }}\n          </div>\n\n          <muted-alert class=\"mt-2 feature-notice\">\n            {{ $t(\"AI credit limit is reset at the beginning of each month.\") }}\n          </muted-alert>\n\n          <div class=\"body-section\">\n            <h4 class=\"modal-section-title\">{{ $t(\"Get More AI Credits\") }}</h4>\n            <div class=\"section-description\">{{ $t(\"If you are running short on AI credits, there are two ways to get more.\") }}</div>\n            <div class=\"upgrade-option\">\n              <div class=\"upgrade-details\">\n                <div class=\"upgrade-title\">\n                  {{ $t(\"Upgrade to Unlimited Plan\") }}\n                  <span v-if=\"userInfo.has_active_subscription\" class=\"discount\">{{ $t(\"30% OFF\") }}</span>\n                </div>\n                <div class=\"text-primary small\">{{ $t(\"If your account is an Obico Pro account, you can get a 30% discount on the upgrade. Discount automatically applied at checkout.\") }}</div>\n              </div>\n              <button\n                type=\"button\"\n                class=\"btn btn-primary upgrade-button\"\n                @click=\"showPricingPlan\"\n              >\n                {{ $t('Upgrade') }}\n              </button>\n            </div>\n            <div class=\"mt-4\">\n              {{ $t('Alternatively, you can host your own JusPrin server and get unlimited AI credits using your own OpenAI API key.') }}\n            </div>\n          </div>\n        </template>\n\n        <div class=\"body-section\" v-else>\n          <h4 class=\"modal-section-title\">{{ $t(\"Your Active Subscription\") }}</h4>\n          <div class=\"subscription-info\">\n            <div class=\"subscription-details\">\n              <div class=\"subscription-plan\">\n                <i class=\"mdi mdi-crown\"></i>\n                {{ $t(\"You have an active {plan} subscription\", { plan: userInfo.subscription_plan || 'Pro' }) }}\n              </div>\n              <div class=\"text-muted small\">{{ $t(\"Your subscription gives you access to enhanced features and higher AI credit limits.\") }}</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport MutedAlert from '@src/components/MutedAlert.vue'\nimport api from '../lib/api'\nimport urls from '@config/server-urls'\nimport { callAgentAction } from '../lib/agentAction'\n\nexport default {\n  name: 'UpgradeModal',\n  components: {\n    MutedAlert,\n  },\n  props: {\n    show: {\n      type: Boolean,\n      default: false\n    },\n    oauthAccessToken: {\n      type: String,\n      default: null\n    }\n  },\n  data() {\n    return {\n      loading: false,\n      userInfo: null,\n      credits: null,\n      error: null\n    }\n  },\n  computed: {\n    progressPercentage() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota === -1) return 100\n      if (this.credits.ai_credit_free_monthly_quota === 0) return 0\n      return Math.min(100, (this.credits.ai_credit_used_current_month / this.credits.ai_credit_free_monthly_quota) * 100)\n    },\n    isUnlimitedPlan() {\n      return this.credits?.ai_credit_free_monthly_quota === -1\n    },\n    remainingCredits() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return 0\n      }\n      return Math.max(0, this.credits.ai_credit_free_monthly_quota - (this.credits.ai_credit_used_current_month || 0))\n    },\n    creditStatusClass() {\n      if (!this.credits || this.credits.ai_credit_free_monthly_quota <= 0) {\n        return ''\n      }\n      const remaining = this.remainingCredits\n      const total = this.credits.ai_credit_free_monthly_quota\n      const ratio = total === 0 ? 0 : remaining / total\n      if (remaining === 0) {\n        return 'credit-exhausted'\n      } else if (ratio < 1/3) {\n        return 'credit-warning'\n      } else {\n        return 'credit-success'\n      }\n    },\n    userDisplayName() {\n      if (!this.userInfo) return ''\n      return `${this.userInfo.first_name || ''} ${this.userInfo.last_name || ''}`.trim()\n    },\n    nextMonthResetDate() {\n      const now = new Date()\n      const nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1)\n      return nextMonth.toLocaleDateString('en-US', {\n        month: 'short',\n        day: 'numeric'\n      })\n    }\n  },\n  watch: {\n    show(newValue) {\n      if (newValue) {\n        this.fetchAICreditsData()\n      }\n    }\n  },\n  mounted() {\n    if (this.show) {\n      this.fetchAICreditsData()\n    }\n  },\n  methods: {\n    async fetchAICreditsData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      this.loading = true\n      this.error = null\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      if (response.data) {\n        this.userInfo = response.data.user\n        this.credits = response.data.ai_credits\n      }\n      this.loading = false\n    },\n    closeModal() {\n      this.$emit('close')\n    },\n    showPricingPlan() {\n      callAgentAction('show_pricing_plan')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import '../../../../styles/theme';\n@import '../../../../styles/mixin';\n\n// Upgrade Modal Styles\n.upgrade-modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: var(--color-overlay);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 1050;\n}\n\n.upgrade-modal {\n  background-color: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2rem;\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n  position: relative;\n  box-shadow: var(--shadow-top-nav);\n\n  @include respond-below(md) {\n    padding: 1.5rem;\n    margin: 0 1rem;\n    width: calc(100% - 2rem);\n  }\n\n  .close-button {\n    position: absolute;\n    top: 1rem;\n    right: 1rem;\n    width: 2rem;\n    height: 2rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 1.5rem;\n\n    &:hover, &:focus {\n      background-color: var(--color-hover) !important;\n      color: var(--color-text-primary) !important;\n    }\n  }\n\n  .modal-title {\n    color: var(--color-text-primary);\n    font-size: 1.5rem;\n    font-weight: 600;\n    margin: 0 0 1.5rem 0;\n    text-align: center;\n\n    @include respond-below(md) {\n      font-size: 1.25rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  .user-info {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n\n    @media (max-width: 400px) {\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 1rem;\n      margin-bottom: 1.5rem;\n    }\n\n    .user-details {\n      .user-name {\n        color: var(--color-text-primary);\n        font-size: 1.25rem;\n        font-weight: 600;\n        margin: 0 0 0.25rem 0;\n\n        @include respond-below(md) {\n          font-size: 1.125rem;\n        }\n      }\n\n      .user-email {\n        color: var(--color-text-secondary);\n        font-size: 0.875rem;\n        text-decoration: underline;\n      }\n    }\n\n    .plan-badge {\n      color: var(--color-text-primary);\n      padding: 0.25rem 0.75rem;\n      border-radius: var(--border-radius-sm);\n      border: 1px dashed var(--color-divider);\n      font-size: 0.75rem;\n      font-weight: 600;\n      text-transform: uppercase;\n\n      &.pro-badge {\n        color: var(--color-primary);\n        border: 1px dashed var(--color-primary);\n      }\n    }\n  }\n\n  .body-section {\n    margin-bottom: 1rem;\n\n    @include respond-below(md) {\n      margin-bottom: 1.5rem;\n    }\n\n    .ai-credits-header {\n      display: flex;\n      align-items: baseline;\n      gap: 0.5rem;\n      margin-bottom: 1rem;\n\n      .credit-icon {\n        width: 1.5rem;\n        height: 1.5rem;\n        flex-shrink: 0;\n      }\n    }\n\n    .progress-bar-container {\n      width: 100%;\n      height: 8px;\n      background-color: var(--color-surface-primary);\n      border-radius: var(--border-radius-xs);\n      overflow: hidden;\n      border: 1px solid var(--color-divider-muted);\n\n      .progress-bar {\n        height: 100%;\n        background-color: var(--color-primary);\n        border-radius: var(--border-radius-xs);\n        transition: width 0.3s ease;\n\n        &.credit-success {\n          background-color: var(--color-success);\n        }\n\n        &.credit-warning {\n          background-color: var(--color-warning);\n        }\n\n        &.credit-exhausted {\n          background-color: var(--color-danger);\n        }\n      }\n    }\n\n    .progress-info {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-top: 0.5rem;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 0.25rem;\n      }\n\n      .usage-text {\n        color: var(--color-text-primary);\n        font-size: 0.875rem;\n        font-weight: 500;\n        flex: 1;\n        min-width: 0;\n      }\n\n      .reset-date {\n        color: var(--color-text-secondary);\n        font-size: 0.75rem;\n        font-weight: 400;\n        flex-shrink: 0;\n        white-space: nowrap;\n      }\n    }\n\n    .modal-section-title {\n      color: var(--color-text-primary);\n      font-size: 1.5rem;\n      font-weight: 600;\n      margin-bottom: 0.5rem;\n      margin-top: 2rem;\n      text-decoration: none;\n    }\n\n    .section-description {\n      color: var(--color-text-secondary);\n      font-size: 0.875rem;\n      margin-bottom: 1rem;\n    }\n\n    .upgrade-option {\n      border: 1px solid var(--color-divider);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n\n      @media (max-width: 400px) {\n        flex-direction: column;\n        align-items: stretch;\n        gap: 1rem;\n        padding: 0.875rem;\n      }\n\n      .upgrade-details {\n        flex: 1;\n        min-width: 0;\n\n        @media (min-width: 401px) {\n          min-width: 200px;\n        }\n\n        .upgrade-title {\n          color: var(--color-text-primary);\n          font-size: 1.2rem;\n          font-weight: 500;\n          margin-bottom: 0.25rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          .discount {\n            background-color: var(--color-primary);\n            color: var(--color-on-primary);\n            padding: 0.125rem 0.5rem;\n            border-radius: var(--border-radius-lg);\n            font-size: 0.75rem;\n            font-weight: 600;\n          }\n        }\n      }\n\n      .upgrade-button {\n        padding: 0.75rem 2rem;\n        font-size: 0.875rem;\n        font-weight: 600;\n        white-space: nowrap;\n        flex-shrink: 0;\n\n        @media (max-width: 400px) {\n          width: 100%;\n          white-space: normal;\n        }\n\n        &:hover {\n          background-color: var(--color-primary-hover);\n        }\n      }\n    }\n\n    .subscription-info {\n      border: 1px solid var(--color-primary);\n      border-radius: var(--border-radius-md);\n      padding: 1rem;\n      background-color: var(--color-surface-primary);\n\n      .subscription-details {\n        .subscription-plan {\n          color: var(--color-primary);\n          font-size: 1.1rem;\n          font-weight: 600;\n          margin-bottom: 0.5rem;\n          display: flex;\n          align-items: center;\n          gap: 0.5rem;\n\n          i {\n            color: var(--color-primary);\n          }\n        }\n      }\n    }\n  }\n\n  .credit-exhausted-banner {\n    background-color: var(--color-danger);\n    color: white;\n    padding: 1rem;\n    border-radius: var(--border-radius-md);\n    margin-bottom: 1.5rem;\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n    font-weight: 700;\n    font-size: 1rem;\n    text-align: center;\n    justify-content: center;\n    border: 2px solid var(--color-danger);\n    animation: pulse-danger 2s ease-in-out infinite;\n\n    i {\n      font-size: 1.25rem;\n      flex-shrink: 0;\n    }\n\n    span {\n      font-weight: 700;\n    }\n\n    @media (max-width: 400px) {\n      font-size: 0.875rem;\n      padding: 0.875rem;\n      margin-bottom: 1rem;\n    }\n  }\n\n  @keyframes pulse-danger {\n    0%, 100% {\n      box-shadow: 0 0 0 0 rgba(var(--color-danger-rgb, 220, 53, 69), 0.4);\n    }\n    50% {\n      box-shadow: 0 0 0 8px rgba(var(--color-danger-rgb, 220, 53, 69), 0);\n    }\n  }\n}\n</style>","import mod from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./UpgradeModal.vue?vue&type=template&id=429c0503&scoped=true&\"\nimport script from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./UpgradeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UpgradeModal.vue?vue&type=style&index=0&id=429c0503&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"429c0503\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <chat-panel-header\n      ref=\"chatHeader\"\n      @action=\"callAgentAction\"\n      :should-popup-chat-panel=\"Boolean(oauthAccessToken)\"\n      @show-contact-support-form=\"showContactSupportForm\"\n      @show-discord-support-message=\"showDiscordSupportMessage\"\n      @show-upgrade-modal=\"openUpgradeModal\"\n      :credits-info=\"creditsInfo\"\n    />\n\n    <!-- Upgrade Modal -->\n    <upgrade-modal\n      :show=\"showUpgradeModal\"\n      :oauth-access-token=\"oauthAccessToken\"\n      @close=\"closeUpgradeModal\"\n    />\n\n\n\n    <div v-if=\"oauthAccessToken\" class=\"chat-container mt-3\">\n      <div ref=\"chatMessageContainer\" class=\"chat-messages\" @scroll=\"handleChatScroll\">\n        <div\n          v-for=\"(message, index) in messages\"\n          :key=\"index\"\n          class=\"message\"\n          :class=\"message.role\"\n        >\n          <div v-if=\"message.content\" class=\"message-block\">\n            <div class=\"message-content\">\n              <div v-if=\"message.has_upgrade_link\" class=\"upgrade-message\">\n                <div>{{ $t('Since you are on a Free plan, please join our Discord server to seek support from the community.') }}</div>\n                <div>\n                  <i18next :translation=\"$t('You can also {localizedDom} to get email support from the Obico team.')\">\n                    <template #localizedDom>\n                      <a href=\"#\" @click.prevent=\"openUpgradeModal\" class=\"upgrade-link\">{{ $t('upgrade to the Unlimited plan') }}</a>\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <VueMarkdown v-else>{{ message.content }}</VueMarkdown>\n              <gradient-fadable-container\n                v-if=\"\n                  message.per_override_explanations && message.per_override_explanations.length > 0\n                \"\n              >\n                <div class=\"pt-2 pb-1\">{{ $t(\"Detailed explanations:\") }}</div>\n                <div v-for=\"(explanation, index) in message.per_override_explanations\" :key=\"index\">\n                  <div>\n                    <b>{{ explanation.parameter }}:</b> {{ explanation.explanation }}\n                  </div>\n                </div>\n              </gradient-fadable-container>\n            </div>\n          </div>\n          <div\n            v-if=\"message.slicing_profiles && slicingSettingsInMessage(message)\"\n            class=\"message-block mt-2\"\n          >\n            <div class=\"message-content\">\n              <gradient-fadable-container>\n                <div class=\"pt-2 pb-1\">{{ $t(\"I have applied the following settings:\") }}</div>\n                <div v-if=\"message.slicing_profiles.use_print_process_preset\">\n                  {{ $t(\"- Process preset:\") }} <b>{{ message.slicing_profiles.use_print_process_preset }}</b>\n                </div>\n                <div>\n                  {{ $t(\"- Additional slicing parameters:\") }}\n                  <b v-if=\"Object.keys(changedParams(message)).length === 0\">{{ $t(\"None\") }}</b>\n                  <div v-for=\"(value, key) in changedParams(message)\" :key=\"key\">\n                    &nbsp;&nbsp;&nbsp;&nbsp;- {{ key }}:\n                    <span class=\"font-weight-bold\">{{ value }}</span>\n                  </div>\n                </div>\n              </gradient-fadable-container>\n              <div v-if=\"index !== messages.length - 1\" class=\"quick-button pt-2\">\n                <quick-button-component\n                  :message=\"$t('Re-apply settings')\"\n                  @click=\"applySettingsInMessage(message)\"\n                />\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.suggested_printing_method\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"I suggest the following to achieve the best results:\") }}</div>\n              <VueMarkdown>{{ message.suggested_printing_method }}</VueMarkdown>\n            </div>\n          </div>\n          <div v-if=\"message.jusprinNotification\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"pt-2 pb-1\">{{ $t(\"Oh no! My slicing algorithm lord just said:\") }}</div>\n              <div class=\"notification-text\" :class=\"message.jusprinNotification.level\">\n                <i\n                  :class=\"\n                    message.jusprinNotification.level === 'error'\n                      ? 'mdi mdi-alert-circle'\n                      : 'mdi mdi-alert'\n                  \"\n                ></i>\n                {{ message.jusprinNotification.text }}\n              </div>\n            </div>\n          </div>\n          <div v-if=\"message.discord_support\" class=\"message-block mt-2\">\n            <div class=\"message-content\">\n              <div class=\"discord-support-container\">\n                <div class=\"discord-info\">\n                  <div class=\"discord-url\">\n                    <strong>Discord Server:</strong>\n                    <code>{{ message.discord_support.url }}</code>\n                  </div>\n                  <div class=\"discord-instructions\">\n                    {{ $t(\"Scan this QR code with your phone to join our Discord server:\") }}\n                  </div>\n                </div>\n                <div class=\"qr-code-container\">\n                  <img\n                    :src=\"message.discord_support.qr_code_url\"\n                    alt=\"Discord QR Code\"\n                    class=\"qr-code\"\n                    @error=\"handleQRCodeError\"\n                  />\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"thinking\" class=\"message assistant\">\n          <div class=\"message-block align-items-center\">\n            <div class=\"message-content thinking-animation\">\n              <VueMarkdown>_{{ $t(\"Thinking...\") }}_</VueMarkdown>\n            </div>\n          </div>\n        </div>\n        <contact-support-form\n          v-if=\"showContactSupport\"\n          :messages=\"messages\"\n          :oauth-access-token=\"oauthAccessToken\"\n          @form-dismissed=\"handleContactSupportFormDismissed\"\n        />\n        <div v-if=\"slicingProgress\" class=\"message assistant\">\n          <div\n            class=\"message-block slicing-message-block\"\n            :class=\"{ 'fade-out': slicingProgress.fadeOut }\"\n          >\n            <div class=\"message-content\">\n              <p>\n                {{\n                  slicingProgress.overrun\n                    ? $t('It seems to be taking awfully long to slice. Maybe something went wrong...? You can start over, or continue waiting.')\n                    : slicingProgress.text || $t('Slicing in progress...')\n                }}\n              </p>\n              <div class=\"slicing-progress-container\">\n                <div\n                  class=\"slicing-progress-bar\"\n                  :style=\"{ width: `${slicingProgress?.percentage * 100}%` }\"\n                ></div>\n                <div class=\"slicing-progress-text\">\n                  {{ Math.round(slicingProgress?.percentage * 100) }}%\n                </div>\n              </div>\n              <div\n                v-if=\"slicingProgress.errors && slicingProgress.errors.length > 0\"\n                class=\"slicing-errors\"\n              >\n                <div\n                  v-for=\"(error, index) in slicingProgress.errors\"\n                  :key=\"index\"\n                  class=\"error-message\"\n                >\n                  {{ error }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div v-if=\"quickButtons.length > 0\" class=\"quick-button pt-2\">\n          <quick-button-component\n            v-for=\"(action, index) in quickButtons\"\n            :key=\"index\"\n            :message=\"action.message\"\n            @click=\"action.onClick\"\n          />\n        </div>\n      </div>\n      <button v-show=\"showScrollButton\" class=\"scroll-to-bottom\" @click=\"scrollToBottom\">\n        <i class=\"mdi mdi-arrow-down large-icon\"></i>\n      </button>\n\n      <div class=\"chat-input\">\n        <textarea\n          ref=\"chatTextarea\"\n          rows=\"1\"\n          v-model=\"userInput\"\n          type=\"text\"\n          :disabled=\"!readyForUserQuery\"\n          :placeholder=\"\n            readyForUserQuery\n              ? $t('Type your message here...')\n              : $t('Select printer, filament, and add models first')\n          \"\n          @keydown.enter.prevent=\"handleEnterKey\"\n        />\n        <button class=\"send-button\" :disabled=\"!readyForUserQuery\" @click=\"onUserInput\">\n          <i class=\"mdi mdi-arrow-up send-icon\"></i>\n        </button>\n      </div>\n    </div>\n    <div v-else>\n      <div class=\"login-container\">\n        <div>\n          <button\n            id=\"signUpSignInBtn\"\n            class=\"btn btn-primary\"\n            @click=\"() => callAgentAction('show_login')\"\n          >\n            {{ $t(\"Sign Up/Sign In to Get Started\") }}\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport VueMarkdown from 'vue-markdown'\nimport urls from '@config/server-urls'\nimport QuickButtonComponent from './components/QuickButtonComponent.vue'\nimport api from './lib/api'\nimport QuickButtonsMixin from './mixins/quickButtonsMixin'\nimport MessagesMixin from './mixins/messagesMixin'\nimport SlicingParamFixerMixin from './mixins/slicingParamFixerMixin'\nimport GradientFadableContainer from './components/GradientFadableContainer.vue'\nimport ChatPanelHeader from './components/ChatPanelHeader.vue'\nimport userNotificationMixin from './mixins/userNotificationMixin'\nimport { callAgentAction, getAgentActionResponse, setAgentActionRetVal } from './lib/agentAction'\nimport ContactSupportForm from './components/ContactSupportForm'\nimport UpgradeModal from './components/UpgradeModal'\n\nexport default {\n  name: 'EmbeddedChatPage',\n  components: {\n    VueMarkdown,\n    QuickButtonComponent,\n    GradientFadableContainer,\n    ChatPanelHeader,\n    ContactSupportForm,\n    UpgradeModal,\n  },\n  mixins: [QuickButtonsMixin, MessagesMixin, SlicingParamFixerMixin, userNotificationMixin],\n  data() {\n    return {\n      oauthAccessToken: null,\n      currentChatId: null,\n      userInput: '',\n      thinking: false,\n      messages: [],\n      modelObjects: [],\n      supportedActions: [],\n      autoOrientInProgress: false,\n      isDevMode: false,\n      haveDonePlateAnalysis: false,\n      showScrollButton: false,\n      slicingProgress: null,\n      slicingProgressCompletionTimeout: null,\n      current_workflow: null,\n      showUpgradeModal: false,\n      creditsInfo: null, // Will be populated from API responses\n      userInfo: null, // Will be populated from /jusprin/api/me/\n    }\n  },\n  computed: {\n    readyForUserQuery() {\n      if (this.slicingProgress || this.thinking) {\n        return false\n      }\n      return true\n    },\n    readyToSlice() {\n      return this.messages.some(\n        (message) => message.role === 'assistant' && this.slicingSettingsInMessage(message)\n      )\n    },\n    hasModelObjects() {\n      return this.modelObjects.length > 0\n    },\n    showContactSupport() {\n      // Check if any message has a contact_support agent action using higher-order function\n      return this.messages.some(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some((action) => action.name === 'contact_support')\n      )\n    },\n  },\n  watch: {\n    messages: 'onChatContentChanged',\n    quickButtons: 'onChatContentChanged',\n    userInput() {\n      this.$nextTick(() => {\n        this.adjustTextareaHeight()\n      })\n    },\n    oauthAccessToken(newValue, oldValue) {\n      // When token becomes available (changes from null to non-null), fetch user data\n      if (newValue && !oldValue) {\n        this.fetchUserData()\n      }\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.isDevMode = urlParams.get('devmode') === 'true'\n  },\n  mounted() {\n    this.initMessagesAndQuickButtons()\n  },\n  methods: {\n    callAgentAction,\n    setAgentActionRetVal, // For JusPrin CallEmbeddedChatMethod\n    async fetchUserData() {\n      if (!this.oauthAccessToken) {\n        return\n      }\n      const response = await api.get(urls.jusprinMe(), this.oauthAccessToken)\n      this.userInfo = response.data.user\n      this.creditsInfo = response.data.ai_credits\n    },\n    async withCreditCheck(apiCall) {\n      // Check if balance is 0 before making the call\n      if (this.creditsInfo && this.creditsInfo.ai_credit_free_monthly_quota !== -1) {\n        const remainingCredits = Math.max(0, this.creditsInfo.ai_credit_free_monthly_quota - (this.creditsInfo.ai_credit_used_current_month || 0))\n        if (remainingCredits <= 0) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n      }\n\n      try {\n        const result = await apiCall()\n\n        // Refresh user data after successful call\n        await this.fetchUserData()\n\n        return result\n      } catch (error) {\n        // Catch 402 errors and show UpgradeModal\n        if (error.response && error.response.status === 402) {\n          this.openUpgradeModal()\n          return {\n            data: {\n              message: {\n                role: 'assistant',\n                content: this.$t(\"You're on a free plan and your account has run out of AI credits.\")\n              }\n            }\n          }\n        }\n\n        // Let all other errors bubble up to Sentry\n        throw error\n      }\n    },\n    async callLongRunningAgentActionThenRefreshPresets(action, payload = null) {\n      await getAgentActionResponse(action, payload, 1000 * 60 * 60 * 24) // Make timeout super long as it's hard to know how long it takes user to finish things like adding a printer\n      this.refreshSelectedPresets(false)\n      this.populateQuickButtons()\n    },\n    processAgentEvent(event) {\n      if (event.type === 'modelObjectsChanged') {\n        this.processModelObjectsChangedEvent(event)\n      } else if (event.type === 'autoOrient') {\n        this.processAutoOrientEvent(event)\n      } else if (event.type === 'nativeErrorOccurred') {\n        this.processNativeErrorOccurredEvent(event)\n      } else if (event.type === 'notificationPushed') {\n        this.processNotificationPushedEvent(event)\n      } else if (event.type === 'chatPanelFocus') {\n        this.$refs.chatHeader.processChatPanelFocusEvent(event)\n      } else if (event.type === 'slicingProgress') {\n        this.processSlicingProgressEvent(event)\n      }\n    },\n\n    editedPreset(presetType, editedPresets = {}) {\n      return editedPresets[\n        `edited${presetType.charAt(0).toUpperCase() + presetType.slice(1)}Preset`\n      ]\n    },\n\n    overridesFromEditedPreset(presetType, editedPresets = {}) {\n      const editedPreset = this.editedPreset(presetType, editedPresets)\n      const { config, dirty_options } = editedPreset\n\n      if (!dirty_options || dirty_options.length === 0) {\n        return {}\n      }\n\n      const overrides = {}\n      dirty_options.forEach((option) => {\n        if (Object.prototype.hasOwnProperty.call(config, option)) {\n          overrides[option] = config[option]\n        }\n      })\n\n      return overrides\n    },\n\n    selectedPreset(presetType, presets) {\n      return presets[`${presetType}Presets`]?.find((preset) => preset.is_selected) || null\n    },\n\n    slicingSettingsInMessage(message) {\n      return (\n        message.slicing_profiles?.use_print_process_preset ||\n        message.slicing_profiles?.filament_overrides ||\n        message.slicing_profiles?.print_process_overrides\n      )\n    },\n\n    async onUserQueryQuickButton(msg) {\n      this.messages.push({ role: 'user', content: msg })\n      await this.sendUserQuery()\n    },\n\n    async onUserInput() {\n      if (this.userInput.trim()) {\n        this.clearQuickButtons()\n        this.messages.push({ role: 'user', content: this.userInput })\n        this.userInput = ''\n        // Reset textarea height to one line after clearing input\n        const textarea = this.$refs.chatTextarea\n        if (textarea) {\n          textarea.style.height = 'auto'\n        }\n        await this.sendUserQuery()\n      }\n    },\n    startOver() {\n      if (this.slicingProgressCompletionTimeout) {\n        clearTimeout(this.slicingProgressCompletionTimeout)\n        this.slicingProgressCompletionTimeout = null\n      }\n      this.slicingProgress = null\n      this.processedNotifications = new Set()\n      this.current_workflow = null\n      this.initMessagesAndQuickButtons()\n    },\n\n    async sendUserQuery() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const presets = await getAgentActionResponse('get_presets')\n        const editedPresets = await getAgentActionResponse('get_edited_presets')\n        const currentProject = await getAgentActionResponse('get_current_project')\n        const plates = currentProject.plates\n        if (!this.userQueryPreconditionsMet(presets, editedPresets, plates)) {\n          this.thinking = false\n          return\n        }\n\n        // TODO: It's an important assumption that selected preset should be the same as edited preset\n        // Remove this check once it's in production for a while with no messages captured in sentry\n        for (const preset_type of ['filament', 'printProcess', 'printer']) {\n          if (\n            this.editedPreset(preset_type, editedPresets)?.name !==\n            this.selectedPreset(preset_type, presets)?.name\n          ) {\n            window.Sentry?.captureMessage(\n              `Selected preset ${preset_type} is not the same as edited preset ${\n                this.editedPreset(preset_type, editedPresets)?.name\n              }`\n            )\n          }\n        }\n\n        const currentChatId = await this.getCurrentChatId()\n        const response = await this.withCreditCheck(async () => {\n          return api.post(urls.jusprinChatMessages(), this.oauthAccessToken, {\n            messages: this.messages,\n            current_workflow: this.current_workflow,\n            slicing_profiles: {\n              filament_presets: [this.selectedPreset('filament', presets)],\n              print_process_presets: presets.printProcessPresets,\n              filament_overrides: this.overridesFromEditedPreset('filament', editedPresets),\n              print_process_overrides: this.overridesFromEditedPreset('printProcess', editedPresets),\n            },\n            plates: plates,\n            chat_id: currentChatId,\n          })\n        })\n        this.thinking = false\n\n        this.processChatResponse(response.data, presets)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async getCurrentChatId() {\n      if (!this.currentChatId) {\n        const chatsApiUrl = urls.jusprinChats(this.currentChatId)\n        const newChatResponse = await api['post'](chatsApiUrl, this.oauthAccessToken, {\n          messages: JSON.stringify(this.messages),\n        })\n        this.currentChatId = newChatResponse?.data?.id // Assign the new chat ID\n      }\n      return this.currentChatId\n    },\n\n    async processChatResponse(responseData, presets) {\n      const message = responseData.message\n      this.messages.push(message)\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n        machine_name: this.selectedPreset('printer', presets)?.name,\n        filament_name: this.selectedPreset('filament', presets)?.name,\n        print_process_name: this.selectedPreset('printProcess', presets)?.name,\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (this.slicingSettingsInMessage(message)) {\n        this.applySettingsInMessage(message)\n      }\n\n      if (message.agent_actions?.length) {\n        await this.processAgentActions(message)\n      } else {\n        this.populateQuickButtons() // If there are no agent actions, we can populate default quick buttons\n      }\n    },\n\n    async populateDatabaseWithChat(payload = null) {\n      const currentChatId = await this.getCurrentChatId()\n      const chatsApiUrl = urls.jusprinChats(currentChatId)\n      const chatsApiVerb = currentChatId ? 'put' : 'post'\n      await api[chatsApiVerb](chatsApiUrl, this.oauthAccessToken, payload)\n    },\n\n    async processAgentActions(message) {\n      if (!message.agent_actions?.length) return\n      this.clearQuickButtons()\n\n      for (const action of message.agent_actions) {\n        if (action.name === 'slice_model') {\n          await this.doSliceWithCurrentSettings()\n        } else if (action.name === 'start_chat_over') {\n          await this.startOver()\n        } else if (action.name === 'add_printers') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_printers')\n        } else if (action.name === 'add_filaments') {\n          await this.callLongRunningAgentActionThenRefreshPresets('add_filaments')\n        } else if (action.name === 'change_printer') {\n          await this.showPresetOptions('printer')\n        } else if (action.name === 'change_filament') {\n          await this.showPresetOptions('filament')\n        } else if (action.name === 'contact_support') {\n          this.scrollToBottom()\n        } else if (action.name === 'auto_orient_all_models') {\n          await this.autoOrientAllObjects()\n        } else if (action.name === 'auto_arrange_all_models') {\n          await this.autoArrangeAllObjects()\n        } else if (action.name === 'ask_user_to_choose_from_options') {\n          this.showOptionsAsQuickButtons(action.arguments)\n        }\n      }\n    },\n\n    async applySettingsInMessage(message) {\n      if (!this.slicingSettingsInMessage(message)) {\n        // If LLM didn't select a preset, it didn't know how to process the query. Nothing should be assumed in this case.\n        return\n      }\n\n      this.clearQuickButtons()\n\n      try {\n        if (message.slicing_profiles.use_print_process_preset) {\n          await getAgentActionResponse('select_preset', {\n            type: 'print',\n            name: message.slicing_profiles.use_print_process_preset,\n          })\n        }\n\n        let filamentOverrides = message.slicing_profiles?.filament_overrides || {}\n        filamentOverrides = this.fixFilamentParamOverrides(filamentOverrides)\n\n        let param_overrides = [\n          ...this.paramOverridesToApplyConfigPayload(filamentOverrides, 'filament'),\n          ...this.paramOverridesToApplyConfigPayload(\n            message.slicing_profiles?.print_process_overrides || {},\n            'print'\n          ),\n        ]\n\n        if (param_overrides.length > 0) {\n          await getAgentActionResponse('apply_config', param_overrides)\n        }\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return\n      }\n    },\n    async doSliceWithCurrentSettings() {\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      const hasModels = plates.some((plate) => plate.model_objects?.length > 0)\n      if (!hasModels) {\n        this.messages.push(this.cannedMessages.noModelObjects)\n        this.setQuickButtons([this.cannedActions.startOver, this.cannedActions.moreOptions])\n        return\n      }\n\n      if (!this.readyToSlice) {\n        const presets = await getAgentActionResponse('get_presets')\n        this.messages.push({\n          role: 'assistant',\n          content: `${this.$t(\"I have not set any slicing parameters for you. Do you want me to slice your model with these?\")}\\n${this.$t(\"- Filament:\")} **${\n            this.selectedPreset('filament', presets)?.name\n          }**\\n${this.$t(\"- Process preset:\")} **${this.selectedPreset('printProcess', presets)?.name}**`,\n        })\n\n        this.pushQuickButtons([\n          {\n            message: this.$t('Yes'),\n            onClick: () => this.doSlice(),\n          },\n          {\n            message: this.$t('No'),\n            onClick: () => this.popQuickButtons(),\n          },\n        ])\n        return\n      } else {\n        this.doSlice()\n      }\n    },\n    async doSlice() {\n      this.clearQuickButtons()\n      this.slicingProgress = { percentage: 0, errors: [] }\n      callAgentAction('start_slicer_all')\n\n      setTimeout(() => {\n        if (this.slicingProgress && this.slicingProgress.percentage < 1.0 - 1e-6) {\n          this.slicingProgress.overrun = true\n          this.setQuickButtons([this.cannedActions.startOver])\n        }\n      }, 1000 * 60 * 2)\n    },\n    async autoOrientAllObjects() {\n      let agentActionName = 'auto_orient_all_objects'\n\n      // TODO: Remove this once 0.4 is no longer supported\n      if (this.supportedActions.includes('auto_orient_object')) {\n        agentActionName = 'auto_orient_object'\n      }\n\n      callAgentAction(agentActionName, {})\n      this.autoOrientInProgress = true\n      this.populateQuickButtons()\n    },\n    async autoArrangeAllObjects() {\n      setTimeout(() => {\n        callAgentAction('arrange_all_objects', {})\n        this.autoArrangeInProgress = true\n      }, 100)\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Models auto-arranged.'),\n      })\n      this.populateQuickButtons()\n      this.setQuickButtons([this.cannedActions.undoAutoArrange, ...this.quickButtons])\n    },\n    changedParams(message) {\n      return {\n        ...(message.slicing_profiles?.filament_overrides ?? {}),\n        ...(message.slicing_profiles?.print_process_overrides ?? {}),\n      }\n    },\n    initMessagesAndQuickButtons() {\n      this.currentChatId = null\n\n      // Reset messages and quick actions\n      this.messages = [this.cannedMessages.greeting]\n      setTimeout(async () => {\n        await this.refreshSelectedPresets(true)\n        await this.refreshModelObjects()\n        this.populateQuickButtons()\n      }, 10)\n    },\n\n    async refreshModelObjects() {\n      const project = await getAgentActionResponse('get_current_project')\n      this.modelObjects = this.distinctModelObjectsInProject(project)\n      if (this.modelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.currentModelObjects(this.modelObjects.length))\n      } else {\n        this.messages.push(this.cannedMessages.noModelObjects)\n      }\n    },\n    async refreshSelectedPresets(isFirstTime = false) {\n      const presets = await getAgentActionResponse('get_presets')\n      this.messages.push(\n        this.cannedMessages.currentPresetSelections(\n          this.selectedPreset('printer', presets)?.name,\n          this.selectedPreset('filament', presets)?.name,\n          isFirstTime\n        )\n      )\n    },\n    fixBrokenMarkdown(text) {\n      // Markdown returned from LLM may be broken.\n      const formattedText = text.replace(/ (\\d\\.) /g, '\\n$1 ')\n      return formattedText\n    },\n    scrollToBottom() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      if (chatMessageContainer) {\n        chatMessageContainer.scrollTop = chatMessageContainer.scrollHeight\n      }\n    },\n    onChatContentChanged() {\n      this.$nextTick(() => {\n        this.scrollToBottom()\n      })\n    },\n    paramOverridesToApplyConfigPayload(params, type) {\n      const param_overrides = []\n      for (const [key, value] of Object.entries(params)) {\n        param_overrides.push({ type, key, value })\n      }\n      return param_overrides\n    },\n    userQueryPreconditionsMet(presets, editedPresets, plates) {\n      if (\n        (presets?.printerPresets && presets.printerPresets?.length < 1) ||\n        presets.printerPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddPrinters)\n        this.setQuickButtons([this.cannedActions.addPrinters])\n        return false\n      } else if (\n        (presets?.filamentPresets && presets.filamentPresets?.length < 1) ||\n        presets.filamentPresets?.every((preset) => preset.is_default)\n      ) {\n        this.messages.push(this.cannedMessages.needToAddFilaments)\n        this.setQuickButtons([this.cannedActions.addFilaments])\n        return false\n      }\n      return true\n    },\n\n    modelObjectsWithOverhang(modelObjects) {\n      return modelObjects.filter((obj) => (obj.features?.overhang ?? 0) > 0.001)\n    },\n\n    distinctModelObjectsInProject(project) {\n      return project.plates\n        .flatMap((plate) => plate.model_objects)\n        .reduce((unique, obj) => {\n          const exists = unique.find((item) => item.id === obj.id)\n          return exists ? unique : [...unique, obj]\n        }, [])\n    },\n\n    processModelObjectsChangedEvent(event) {\n      const currentProject = event.data\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      const newModelObjects = currentModelObjects.filter(\n        (obj) => !this.modelObjects.some((item) => item.id === obj.id)\n      )\n      this.modelObjects = currentModelObjects\n      if (newModelObjects.length > 0) {\n        this.messages.push(this.cannedMessages.newModelObjects(newModelObjects))\n        this.$refs.chatHeader.popupChatPanelIfNecessary()\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content:\n              this.$t('I notice some of your models have overhangs. I can try to auto-orient them to minimize the need for supports.'),\n          })\n        }\n        const quickButtons = [this.cannedActions.autoOrient, this.cannedActions.enableSupport]\n        if (this.shouldShowPlateAnalysisQuickButton) {\n          quickButtons.push(this.cannedActions.analyseModel)\n        }\n        this.setQuickButtons([\n          ...quickButtons,\n          this.cannedActions.commonPrintingPrompts,\n          this.cannedActions.moreOptions,\n        ])\n        return\n      }\n\n      this.populateQuickButtons()\n    },\n    processAutoOrientEvent(event) {\n      const currentProject = event.data?.currentProject\n      const currentModelObjects = this.distinctModelObjectsInProject(currentProject)\n      this.modelObjects = currentModelObjects\n\n      if (!this.autoOrientInProgress) {\n        return\n      }\n\n      this.autoOrientInProgress = false\n      if (event.data?.status === 'completed') {\n        let msg = this.$t('Models auto-oriented.')\n        let quickButtons = [this.cannedActions.undoAutoOrient]\n        if (this.modelObjectsWithOverhang(currentModelObjects).length > 0) {\n          msg +=\n            ` ${this.$t('However, some models still have overhangs. I recommend enabling support to make sure they can be printed successfully.')}`\n          quickButtons.push(this.cannedActions.enableSupport)\n        }\n\n        this.messages.push({\n          role: 'assistant',\n          content: msg,\n        })\n        this.removeQuickButtons([\n          this.cannedActions.autoOrient,\n          this.cannedActions.enableSupport,\n          this.cannedActions.undoAutoOrient,\n        ])\n        this.setQuickButtons([...quickButtons, ...this.quickButtons])\n      }\n    },\n    processNativeErrorOccurredEvent(event) {\n      window.Sentry?.captureMessage(event.data?.errorMessage, 'error')\n    },\n    processSlicingProgressEvent(event) {\n      if (!this.slicingProgress) {\n        return\n      }\n\n      const percentage = event.data?.percentage\n      if (percentage !== undefined) {\n        this.slicingProgress.percentage = percentage\n        this.slicingProgress.text = event.data?.text\n      }\n\n      if (percentage && percentage < 1.0 - 1e-6) {\n        return\n      }\n\n      if (this.slicingProgress.fadeOut) {\n        return\n      }\n\n      // Add fade-out class first\n      this.slicingProgress.fadeOut = true\n\n      // Remove the progress bar after fade out animation completes\n      this.slicingProgressCompletionTimeout = setTimeout(() => {\n        this.slicingProgressCompletionTimeout = null\n        const progress = this.slicingProgress\n        if (!progress) {\n          return\n        }\n\n        const quickButtons = [this.cannedActions.startOver, this.cannedActions.moreOptions]\n\n        if (progress.errors && progress.errors.length > 0) {\n          this.messages.push({\n            role: 'assistant',\n            content: `${this.$t(\"My slicing algorithm lord just said:\")}\\n *\"${progress.errors.join(\n              '\\n'\n            )}\"*`,\n          })\n          quickButtons.unshift(this.cannedActions.tellMeWhatNotificationMeans)\n        } else {\n          if (this.supportedActions.includes('switch_to_preview')) {\n            quickButtons.unshift(this.cannedActions.switchToPreview)\n          }\n          quickButtons.unshift(this.cannedActions.exportGCode)\n        }\n\n        this.setQuickButtons(quickButtons)\n\n        this.slicingProgress = null\n      }, 2000) // Match the transition duration in CSS\n    },\n\n    async callPlateAnalysis() {\n      const project = await getAgentActionResponse('get_current_project')\n      const plates = project.plates\n      const images = await this.renderPlateForAnalysis()\n      const currentChatId = await this.getCurrentChatId()\n\n      const payload = {\n        images: images,\n        plates: plates,\n        chat_id: currentChatId,\n      }\n\n      const response = await this.withCreditCheck(async () => {\n        return api.post(\n          urls.jusprinPlateAnalysisProcess(),\n          this.oauthAccessToken,\n          payload\n        )\n      })\n\n      // Handle credit response structure - if it's a credit message, restructure it for processAnalysisResponse\n      if (response.data && response.data.message && response.data.message.role === 'assistant') {\n        return { message: response.data.message }\n      }\n\n      return response.data\n    },\n\n    async renderPlateForAnalysis() {\n      // This function now only fetches and renders the plate images,\n      // then returns an array of base64 image strings.\n      const cameraPositionByDegrees = (target, xyPlaneAngle, zPlaneAngle) => {\n        const distanceFromTarget = 1000 // OrcaSlicer default\n        const xyPlaneAngleRadians = xyPlaneAngle * (Math.PI / 180)\n        const zPlaneAngleRadians = zPlaneAngle * (Math.PI / 180)\n        return {\n          x: target.x + distanceFromTarget * Math.sin(xyPlaneAngleRadians),\n          y: target.y - distanceFromTarget * Math.cos(xyPlaneAngleRadians),\n          z: target.z + distanceFromTarget * Math.sin(zPlaneAngleRadians),\n        }\n      }\n\n      const currentProject = await getAgentActionResponse('get_current_project')\n      const plates = currentProject.plates\n      if (plates.length === 0) {\n        return []\n      }\n\n      const { index, bounding_box, model_objects } = plates[0]\n      if (!model_objects || model_objects.length === 0) {\n        return []\n      }\n\n      const target = {\n        x: (bounding_box.max.x + bounding_box.min.x) / 2,\n        y: (bounding_box.max.y + bounding_box.min.y) / 2,\n        z: 0,\n      }\n\n      const views = [\n        { camera_position: cameraPositionByDegrees(target, 0, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -30, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, -210, 45), target: target },\n        { camera_position: cameraPositionByDegrees(target, 0, -45), target: target },\n      ]\n\n      const renderResult = await getAgentActionResponse('render_plate', {\n        plate_index: index,\n        views: views,\n      })\n\n      // Build an array of all images from renderResult and return it.\n      const images = renderResult.filter((result) => result.base64).map((result) => result.base64)\n\n      return images\n    },\n\n    async getAnalysisResult() {\n      this.thinking = true\n      this.clearQuickButtons()\n\n      try {\n        const analysisResponse = await this.callPlateAnalysis()\n        await this.processAnalysisResponse(analysisResponse)\n      } catch (error) {\n        window.Sentry?.captureException(error)\n        this.thinking = false\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n      }\n    },\n\n    async processAnalysisResponse(response) {\n      this.messages.push(response.message)\n      this.thinking = false\n\n      const payload = {\n        messages: JSON.stringify(this.messages),\n      }\n      this.populateDatabaseWithChat(payload)\n\n      if (response.message.suggested_printing_method) {\n        this.pushQuickButtons([\n          this.cannedActions.plateAnalysisLooksGoodToMe,\n          this.cannedActions.plateAnalysisIsNotGood,\n          this.cannedActions.editPlateAnalysis,\n          this.cannedActions.moreOptions,\n        ])\n      } else {\n        this.populateQuickButtons()\n      }\n\n      return\n    },\n\n    ensurePlateAnalysisMessageExists() {\n      const lastMessage = this.messages[this.messages.length - 1]\n      if (!lastMessage?.suggested_printing_method) {\n        this.messages.push(this.cannedMessages.generalError)\n        this.populateQuickButtonsOnError()\n        return false\n      }\n      return true\n    },\n\n    async queryWithSuggestedPrintingMethod() {\n      this.clearQuickButtons()\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const lastMessage = this.messages[this.messages.length - 1]\n      this.messages.push({\n        role: 'user',\n        content: `${this.$t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${lastMessage.suggested_printing_method}`,\n      })\n      this.sendUserQuery()\n    },\n\n    removePlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      this.messages.pop()\n      this.popQuickButtons()\n      this.populateQuickButtons()\n    },\n\n    editPlateAnalysis() {\n      if (!this.ensurePlateAnalysisMessageExists()) {\n        return\n      }\n\n      const plateAnalysisMessage = this.messages.pop()\n      this.clearQuickButtons()\n      this.userInput = `${this.$t(\"Please set the slicing settings based on the suggested strategy:\")}\\n\\n${plateAnalysisMessage.suggested_printing_method}`\n    },\n\n    handleChatScroll() {\n      const chatMessageContainer = this.$refs.chatMessageContainer\n      const atBottom =\n        chatMessageContainer.scrollHeight - chatMessageContainer.scrollTop <=\n        chatMessageContainer.clientHeight\n      this.showScrollButton = !atBottom\n    },\n    adjustTextareaHeight() {\n      const textarea = this.$refs.chatTextarea\n      const chatMessages = this.$refs.chatMessageContainer\n      if (!textarea || !chatMessages) return\n\n      // Reset height to auto to get correct scrollHeight\n      textarea.style.height = 'auto'\n      // Set new height based on scrollHeight, with max of 150px\n      const newHeight = Math.min(textarea.scrollHeight, 150)\n      textarea.style.height = newHeight + 'px'\n\n      // Update chat messages padding to match input height plus padding\n      const chatInput = textarea.closest('.chat-input')\n      if (chatInput) {\n        const inputTotalHeight = chatInput.offsetHeight\n        chatMessages.style.paddingBottom = `${inputTotalHeight + 8}px`\n      }\n    },\n    handleEnterKey(e) {\n      if (e.shiftKey || e.metaKey || e.ctrlKey || e.altKey) {\n        this.userInput += '\\n'\n        return\n      }\n      this.onUserInput()\n    },\n    handleContactSupportFormDismissed(data) {\n      // Find the index of the message with contact_support agent action\n      const supportMsgIndex = this.messages.findIndex(\n        (message) =>\n          message.role === 'assistant' &&\n          message.agent_actions?.some(action => action.name === 'contact_support')\n      )\n\n      // Remove the message if found\n      if (supportMsgIndex !== -1) {\n        this.messages.splice(supportMsgIndex, 1)\n      }\n\n      // Add new assistant message with the response\n      this.messages.push({\n        role: 'assistant',\n        content: data.message,\n      })\n\n      this.populateQuickButtons()\n      this.scrollToBottom()\n    },\n    showContactSupportForm() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: null,\n        agent_actions: [{ name: 'contact_support', arguments: {} }],\n      })\n      this.scrollToBottom()\n    },\n    showDiscordSupportMessage() {\n      this.clearQuickButtons()\n      this.messages.push({\n        role: 'assistant',\n        content: this.$t('Since you are on a Free plan, please join our Discord server to seek support from the community. You can also upgrade to the Unlimited plan to get email support from the Obico team.'),\n        discord_support: {\n          url: 'https://discord.gg/Tx67dHNYH3',\n          qr_code_url: 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=https%3A%2F%2Fdiscord.gg%2FTx67dHNYH3'\n        },\n        has_upgrade_link: true\n      })\n      this.setQuickButtons([this.cannedActions.moreOptions])\n      this.scrollToBottom()\n    },\n\n    showOptionsAsQuickButtons(args) {\n      const options = args?.user_options_to_choose_from || []\n      if (!options || !Array.isArray(options)) return\n\n      const newQuickButtons = options.map((option) => ({\n        message: option,\n        onClick: () => this.onUserQueryQuickButton(option),\n      }))\n\n      // Remove any existing buttons with the same messages\n      this.removeQuickButtons(newQuickButtons)\n\n      // Add the new buttons to the existing ones\n      this.pushQuickButtons([...this.quickButtons, ...newQuickButtons])\n    },\n\n    // Modal methods\n    openUpgradeModal() {\n      this.showUpgradeModal = true\n    },\n    closeUpgradeModal() {\n      this.showUpgradeModal = false\n    },\n    handleQRCodeError(event) {\n      // Hide the QR code if it fails to load\n      event.target.style.display = 'none'\n      console.warn('Failed to load QR code for Discord support')\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n@import './styles/EmbeddedChatPage'\n</style>\n","import mod from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EmbeddedChatPage.vue?vue&type=template&id=7ae7d3b0&scoped=true&\"\nimport script from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nexport * from \"./EmbeddedChatPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EmbeddedChatPage.vue?vue&type=style&index=0&id=7ae7d3b0&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7ae7d3b0\",\n  null\n  \n)\n\nexport default component.exports","import VueRouter from 'vue-router'\nimport prefRoutes from '@config/user-preferences/pref-routes'\n\nimport NewOctoPrintTunnelPage from '@src/views/NewOctoPrintTunnelPage.vue'\nimport OctoPrintTunnelPage from '@src/views/OctoPrintTunnelPage.vue'\nimport PrintShotFeedbackApp from '@src/views/PrintShotFeedbackApp.vue'\nimport PrintHistoryPage from '@src/views/PrintHistoryPage.vue'\nimport StatsPage from '@src/views/StatsPage.vue'\nimport PrintPage from '@src/views/PrintPage.vue'\nimport PrinterListPage from '@src/views/PrinterListPage.vue'\nimport SharedPrinterPage from '@src/views/SharedPrinterPage.vue'\nimport PrinterSettingsPage from '@src/views/PrinterSettingsPage.vue'\nimport PrinterLinkingPage from '@src/views/printer-wizard/PrinterLinkingPage.vue'\nimport TargetPlatformSelectionPage from '@src/views/printer-wizard/TargetPlatformSelectionPage.vue'\nimport ObicoInstallationGuidePage from '@src/views/printer-wizard/ObicoInstallationGuidePage.vue'\nimport AddPrinterSuccessPage from '@src/views/printer-wizard/AddPrinterSuccessPage.vue'\nimport PrinterControlPage from '@src/views/PrinterControlPage.vue'\nimport GCodeFoldersPage from '@src/views/GCodeFoldersPage.vue'\nimport GCodeFilePage from '@src/views/GCodeFilePage.vue'\nimport UserPreferencesPage from '@src/views/UserPreferencesPage.vue'\nimport PrinterEventsPage from '@src/views/PrinterEventsPage.vue'\nimport PrinterTerminalPage from '@src/views/PrinterTerminalPage.vue'\nimport FirstLayerInspectionImagePage from '@src/views/FirstLayerInspectionImagePage.vue'\nimport { EmbeddedChatV10Page, EmbeddedChatV12Page } from '@src/views/jusprin'\n\n\n  const routes = [\n    {\n      path: '/g_code_folders/cloud/:parentFolder/',\n      component: GCodeFoldersPage,\n    },\n    {\n      path: '/g_code_folders/local/:printerId/:parentFolder?/',\n      component: GCodeFoldersPage,\n    },\n    {\n      path: '/g_code_files/cloud/:fileId/',\n      component: GCodeFilePage,\n    },\n    {\n      path: '/g_code_files/local/:printerId/:fileId/',\n      component: GCodeFilePage,\n    },\n    {\n      path: '/user_preferences/',\n      component: UserPreferencesPage,\n    },\n    {\n      path: '/printers/wizard/',\n      component: TargetPlatformSelectionPage,\n    },\n    {\n      path: '/printers/wizard/guide/:targetPlatform/',\n      component: ObicoInstallationGuidePage,\n    },\n    {\n      path: '/printers/wizard/link/:targetPlatform/',\n      component: PrinterLinkingPage,\n    },\n    {\n      path: '/printers/wizard/success/:printerId/',\n      component: AddPrinterSuccessPage,\n    },\n    ...Object.values(prefRoutes).map((route) => ({\n      path: route,\n      component: UserPreferencesPage,\n    })),\n  ]\n\nconst components = {\n  NewOctoPrintTunnelPage,\n  OctoPrintTunnelPage,\n  PrintShotFeedbackApp,\n  PrinterListPage,\n  SharedPrinterPage,\n  PrinterSettingsPage,\n  PrinterLinkingPage,\n  PrinterControlPage,\n  GCodeFoldersPage,\n  GCodeFilePage,\n  PrintPage,\n  PrintHistoryPage,\n  StatsPage,\n  UserPreferencesPage,\n  PrinterEventsPage,\n  PrinterTerminalPage,\n  FirstLayerInspectionImagePage,\n  EmbeddedChatV10Page,\n  EmbeddedChatV12Page,\n}\n\nexport { routes, components }\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing\"},[_c('nav-bar',{attrs:{\"view-name\":\"pricing\"}}),(!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('h1',{staticClass:\"text-center mt-5\"},[_vm._v(_vm._s(_vm.$t('Obico Cloud Plans')))]),(_vm.couponCode && !_vm.hasSubscription)?_c('div',{staticClass:\"alert alert-info text-center\",attrs:{\"role\":\"status\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Referral code: {code}. Your discount will appear at checkout. Prices below exclude discounts.', { code: _vm.couponCode }))+\" \")]):_vm._e(),_c('div',{staticClass:\"text-center py-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('Thinking about self-hosting Obico Server instead?'))+\" \"),_c('a',{attrs:{\"href\":\"https://obico.io/obico-cloud-vs-self-hosted.html\"}},[_vm._v(_vm._s(_vm.$t('Check out self-hosting vs Obico Cloud.')))])]),_c('div',{staticClass:\"container text-center py-4\",attrs:{\"id\":\"pricing-selections\"}},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual },attrs:{\"id\":\"sub-annual-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual },attrs:{\"id\":\"sub-monthly-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row price-matrix\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Print occasionally.')))]),_vm._m(0),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('Limited to 1 printer.')))])]),_c('div',{staticClass:\"price-action\"},[(!_vm.isAuthenticated)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Get Started')))]):_vm._e()]),_c('div',[_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"first-gen-ai-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('First-gen AI failure detection technology'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-free-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('10 free AI Detection Hours/month included'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"basic-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"basic-streaming-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Basic webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"tunneling-cap-per-month\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-free-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo tunnel data'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('G-Code cloud storage up to 50MB per file, 1GB total')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Notifications via Email, mobile push notification, Telegram, and more.'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"3rd-party-app-integration-free-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo integration with your favorite 3rd-party mobile apps'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Community technical support')))])])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(\"AI Premium\")]),_c('div',[_vm._v(_vm._s(_vm.$t('Print every day. 2+ printers.')))]),_c('div',{staticClass:\"plan-price\"},[_c('span',[_vm._v(_vm._s(_vm.$t('$')))]),_c('span',{attrs:{\"id\":\"monthly-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePlanPrice))]),_c('span',{staticClass:\"price-unit\"},[_vm._v(\" / \"+_vm._s(_vm.$t('month')))]),(_vm.isAnnual)?_c('span',{staticStyle:{\"font-size\":\"0.95rem\",\"font-weight\":\"100\"},attrs:{\"id\":\"annual-bill\"}},[_vm._v(\" \"+_vm._s(_vm.$t('(Billed {name} annually)', { name: _vm.priceTable.totalPlanPrice })))]):_vm._e()]),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('1st printer included')))]),_c('div',{staticClass:\"price-sub\"},[_c('span',[_vm._v(_vm._s(_vm.$t('2+ printers at $')))]),_c('span',{attrs:{\"id\":\"addl-printer-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePrinterPrice))]),_vm._v(\" / \"+_vm._s(_vm.$t('month / printer'))+\" \")]),_c('div',{staticClass:\"price-sub\"},[_c('a',{staticClass:\"price-calculator-trigger link\",on:{\"click\":_vm.calc}},[_vm._v(_vm._s(_vm.$t('Calculate cost'))+\" >>>\")])])]),_c('div',{staticClass:\"price-action\"},[(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{directives:[{name:\"b-popover\",rawName:\"v-b-popover.hover\",value:({\n                  placement: 'top',\n                  content: _vm.$t('Full refund within 30 days if you are not happy.'),\n                }),expression:\"{\\n                  placement: 'top',\\n                  content: $t('Full refund within 30 days if you are not happy.'),\\n                }\",modifiers:{\"hover\":true}}],staticClass:\"btn btn-primary btn-block\",attrs:{\"id\":\"subscribe-pro\",\"role\":\"button\"},on:{\"click\":_vm.upgrade}},[_vm._v(_vm._s(_vm.$t('Upgrade (30-Day Money Back Guarantee)')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":_vm.signupUrl}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial')))])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"next-gen-ai-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Next-gen AI failure detection technology'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-pro-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('50 free AI Detection Hours/month included'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"premium-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"premium-streaming-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Premium webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"unlimited-tunnling-for-pro\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-pro-plan-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited tunnel data'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('G-Code cloud storage up to 500MB per file, 50GB total')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Notifications via Email, mobile push notification, Telegram, and more.'))+\" \")])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"3rd-party-app-integration-pro-on-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited integration with your favorite 3rd-party mobile apps'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Email technical support')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Printer feed sharing with premium streaming quality')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Failure alerts via SMS (text message)')))])])])])]),_c('div',{attrs:{\"id\":\"need-more\"}},[_c('h1',{staticClass:\"text-center mt-3\"},[_vm._v(_vm._s(_vm.$t('AI Detection Hour Packs')))]),_c('div',{staticClass:\"text-center\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Need more AI Detection Hours? Add the right amount of AI Detection Hours without burning a hole on your wallet.' ))+\" \")])]),_c('div',{staticClass:\"row price-matrix mt-5\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header dh-pack-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Pre-paid Pack')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Turn on AI failure detection only for the prints.')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Available to all plans.')))])]),_c('div',[_c('div',{staticClass:\"features dh-pack\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Pre-paid AI Detection Hours never expire.')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('One Time Purchase.')))])])])]),_c('div',[_c('div',{staticClass:\"form-group\"},_vm._l((Object.values(_vm.PrepaidDHPacks)),function({ hours, price }){return _c('div',{key:hours,staticClass:\"custom-control custom-radio\",staticStyle:{\"margin\":\"0.5rem 0px\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedPrepaidPack),expression:\"selectedPrepaidPack\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":'dh-single-pack-selected-' + hours,\"type\":\"radio\"},domProps:{\"value\":hours,\"checked\":_vm._q(_vm.selectedPrepaidPack,hours)},on:{\"change\":function($event){_vm.selectedPrepaidPack=hours}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'dh-single-pack-selected-' + hours}},[_c('strong',[_vm._v(_vm._s(hours)+\" \"+_vm._s(_vm.$t('AI Detection Hours')))]),_vm._v(\" \"+_vm._s(_vm.$t('for'))+\" $\"+_vm._s(price)+\" \")])])}),0)]),_c('div',{staticStyle:{\"margin-top\":\"1rem\"}},[(!_vm.isAuthenticated)?_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial + 250 FREE AI Detection Hours')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.purchasePrepaidPack}},[_vm._v(_vm._s(_vm.$t('Purchase Selected AI Detection Hour Pack')))])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header dh-pack-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Subscribe&Save Packs')))]),_c('div',[_vm._v(_vm._s(_vm.$t('AI failure detection for all prints.')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Available only as add-on to the'))+\" AI Premium \"+_vm._s(_vm.$t('plan.')))])]),_c('div',[_c('div',{staticClass:\"features dh-pack\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Subscribed AI Detection Hours roll over month to month.')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Subscribed AI Detection Hours expire when subscription ends.'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('You can change AI Detection Hour Pack or remove it from your'))+\" AI Premium \"+_vm._s(_vm.$t('plan any time you want.'))+\" \")])])])]),_c('div',[_c('div',{staticClass:\"form-group\",attrs:{\"id\":\"sns-dh-packs\"}},_vm._l((Object.keys(_vm.DHPacks)),function(key){return _c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(key != 0),expression:\"key != 0\"}],key:key,staticClass:\"custom-control custom-radio\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.dhPackKey),expression:\"dhPackKey\"}],staticClass:\"custom-control-input field_required\",attrs:{\"id\":'dh-pack-selected-' + key,\"type\":\"radio\",\"name\":\"dh-pack-selected\",\"autocomplete\":\"off\"},domProps:{\"value\":key,\"checked\":_vm._q(_vm.dhPackKey,key)},on:{\"change\":function($event){_vm.dhPackKey=key}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'dh-pack-selected-' + key}},[_c('strong',[_vm._v(_vm._s(_vm.getDHPackLabel(key))+\":\")]),_vm._v(\" \"+_vm._s(_vm.getDHPackSubLabel(key))+\" \")])])}),0),(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{class:{\n                  'py-2 btn btn-primary btn-block': true,\n                  disabled: _vm.dhPackKey == '0',\n                },attrs:{\"id\":\"upgrade-with-selected-dh-pack\",\"role\":\"button\"},on:{\"click\":_vm.upgradeWithDHPack}},[_vm._v(_vm._s(_vm.$t('Upgrade to'))+\" AI Premium \"+_vm._s(_vm.$t('with selected AI Detection Hour Pack')))])]):_c('div',[_c('a',{staticClass:\"py-2 btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial + 250 FREE AI Detection Hours')))])]),_c('a',{staticClass:\"py-2 btn btn-block price-calculator-trigger link\",attrs:{\"id\":\"cal-with-selected-dh-pack\",\"role\":\"button\"},on:{\"click\":_vm.calcWithDHPack}},[_vm._v(_vm._s(_vm.$t('Calculate Cost >>>')))])])])])]),_c('QuestionsSection',{on:{\"calc\":_vm.calc}})],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_vm._v(\" $0 \"),_c('span',{staticClass:\"price-unit\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"row justify-content-center py-4\"},[_c('div',{staticClass:\"col-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Questions You May Have')))])])]),_c('div',{staticClass:\"row justify-content-center pb-5\"},[_c('div',{staticClass:\"col-lg-10 col-md-12\",attrs:{\"id\":\"accordion\",\"role\":\"tablist\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-1\",modifiers:{\"accordion-1\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What currency are your prices in?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-1\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('They’re in US dollars.')))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-2\",modifiers:{\"accordion-2\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-2\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Which plan is right for me?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-2\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('It depends on how many 3D printers you have, and how often you print.')))]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The Free plan is for users with only 1 printer and print very in-frequently. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 5 FPS). The Free plan even comes with 10 free AI Detection Hours per month. And you can get {localizedDom} if you need more.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t('additional AI Detection Hours')))])]},proxy:true}])})],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The {planName} plan is for users who want to enjoy watching the webcam feed at the slick 25 FPS rate. It also comes with 50 AI Detection Hours every month. If you occasionally print more than 50 hours a month, you will most likely be ok because the {localizedDom}. When you upgrade to the {planName} plan, you are also eligible to the {localizedDom2} at favorable rates.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.getDocUrl(\n                        '/user-guides/how-does-detective-hour-work/#what-happens-to-the-balance-of-my-dhs-when-i-cancel-my-subscription-plan'\n                      )}},[_vm._v(\"AI Detection Hours roll over month to month\")])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"#need-more\"}},[_vm._v(_vm._s(_vm.$t('Subscribe&Save AI Detection Hour Packs')))])]},proxy:true},{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-3\",modifiers:{\"accordion-3\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-3\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have X printers and I print Y hours a month. Tell me exactly how much the'))+\" AI Premium \"+_vm._s(_vm.$t('plan will cost me.'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-3\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Oops. We forgot to mention we have built a {localizedDom} for you.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"price-calculator-trigger link\",on:{\"click\":function($event){return _vm.$emit('calc')}}},[_vm._v(_vm._s(_vm.$t('price calculator')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-4\",modifiers:{\"accordion-4\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-4\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I change my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-4\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.' ))+\" \")]),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'You will keep the unused AI Detection Hours when you change your subscription plan.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-5\",modifiers:{\"accordion-5\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-5\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I cancel my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-5\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('Yes again! You can cancel your subscription any time.')))]),_c('b-card-text',[_vm._v(_vm._s(_vm.$t( 'However, the AI Detection Hours included in the plan and Subscribe&Save pack will expire at the end of your subscription period.' )))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-6\",modifiers:{\"accordion-6\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-6\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What is your refund policy?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-6\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`We offer a {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t('30-Day Full Refund Policy')))])]},proxy:true}])}),_vm._v(\" . \")],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\" ))+\" \")]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-7\",modifiers:{\"accordion-7\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-7\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Is it safe to give my credit card number to the {brandName} Cloud?', { brandName: _vm.$syndicateText.brandName, }))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-7\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":\"https://www.chargebee.com/security/\"}},[_vm._v(_vm._s(_vm.$t('a fully compliant billing service provider')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Under no circumstances will the {brandName} Cloud process or store your payment information.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-8\",modifiers:{\"accordion-8\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-8\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have many printers and print a lot. The'))+\" AI Premium \"+_vm._s(_vm.$t('plan becomes really expensive. Can I still use the'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \"+_vm._s(_vm.$t('Cloud?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-8\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Please {localizedDom} to customize a plan that works for your budget.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('contact us')))])]},proxy:true}])})],1)],1)],1)],1)],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div class=\"row justify-content-center py-4\">\n      <div class=\"col-12 text-center\">\n        <h1>{{ $t('Questions You May Have') }}</h1>\n      </div>\n    </div>\n    <div class=\"row justify-content-center pb-5\">\n      <div id=\"accordion\" class=\"col-lg-10 col-md-12\" role=\"tablist\">\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-1\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-1\"\n            >\n              {{ $t('What currency are your prices in?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-1\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{ $t('They’re in US dollars.') }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-2\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-2\"\n            >\n              {{ $t('Which plan is right for me?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-2\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('It depends on how many 3D printers you have, and how often you print.')\n              }}</b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The Free plan is for users with only 1 printer and print very in-frequently. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 5 FPS). The Free plan even comes with 10 free AI Detection Hours per month. And you can get {localizedDom} if you need more.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a href=\"#need-more\">{{ $t('additional AI Detection Hours') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The {planName} plan is for users who want to enjoy watching the webcam feed at the slick 25 FPS rate. It also comes with 50 AI Detection Hours every month. If you occasionally print more than 50 hours a month, you will most likely be ok because the {localizedDom}. When you upgrade to the {planName} plan, you are also eligible to the {localizedDom2} at favorable rates.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a\n                      class=\"link\"\n                      :href=\"\n                        getDocUrl(\n                          '/user-guides/how-does-detective-hour-work/#what-happens-to-the-balance-of-my-dhs-when-i-cancel-my-subscription-plan'\n                        )\n                      \"\n                      >AI Detection Hours roll over month to month</a\n                    >\n                  </template>\n                  <template #localizedDom2>\n                    <a href=\"#need-more\">{{ $t('Subscribe&Save AI Detection Hour Packs') }}</a>\n                  </template>\n                  <template #planName>AI Premium</template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-3\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-3\"\n            >\n              {{ $t('I have X printers and I print Y hours a month. Tell me exactly how much the') }}\n              AI Premium\n              {{ $t('plan will cost me.') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-3\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Oops. We forgot to mention we have built a {localizedDom} for you.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"price-calculator-trigger link\" @click=\"$emit('calc')\">{{\n                      $t('price calculator')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-4\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-4\"\n            >\n              {{ $t('Can I change my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-4\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.'\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'You will keep the unused AI Detection Hours when you change your subscription plan.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-5\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-5\"\n            >\n              {{ $t('Can I cancel my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-5\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('Yes again! You can cancel your subscription any time.')\n              }}</b-card-text>\n              <b-card-text>{{\n                $t(\n                  'However, the AI Detection Hours included in the plan and Subscribe&Save pack will expire at the end of your subscription period.'\n                )\n              }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-6\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-6\"\n            >\n              {{ $t('What is your refund policy?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-6\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next :translation=\"$t(`We offer a {localizedDom}`)\">\n                  <template #localizedDom>\n                    <strong>{{ $t('30-Day Full Refund Policy') }}</strong>\n                  </template>\n                </i18next>\n                .\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                  <template #localizedDom>\n                    <a :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\"\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-7\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-7\"\n            >\n              {{\n                $t('Is it safe to give my credit card number to the {brandName} Cloud?', {\n                  brandName: $syndicateText.brandName,\n                })\n              }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-7\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" href=\"https://www.chargebee.com/security/\">{{\n                      $t('a fully compliant billing service provider')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'Under no circumstances will the {brandName} Cloud process or store your payment information.',\n                    { brandName: $syndicateText.brandName }\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-8\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-8\"\n            >\n              {{ $t('I have many printers and print a lot. The') }}\n              AI Premium\n              {{ $t('plan becomes really expensive. Can I still use the') }}\n              {{ $syndicateText.brandName }} {{ $t('Cloud?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-8\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Please {localizedDom} to customize a plan that works for your budget.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('contact us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { SupportEmail } from '@entSrc/lib/consts.js'\n\nexport default {\n  name: 'QuestionsSection',\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-link\n  cursor: pointer\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuestionsSection.vue?vue&type=template&id=13bcafb3&scoped=true&\"\nimport script from \"./QuestionsSection.vue?vue&type=script&lang=js&\"\nexport * from \"./QuestionsSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuestionsSection.vue?vue&type=style&index=0&id=13bcafb3&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"13bcafb3\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing\">\n    <nav-bar view-name=\"pricing\"></nav-bar>\n\n    <div v-if=\"!loaded\" class=\"text-center my-5\">\n      <b-spinner></b-spinner>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <h1 class=\"text-center mt-5\">{{ $t('Obico Cloud Plans') }}</h1>\n      <div v-if=\"couponCode && !hasSubscription\" class=\"alert alert-info text-center\" role=\"status\">\n        {{ $t('Referral code: {code}. Your discount will appear at checkout. Prices below exclude discounts.', { code: couponCode }) }}\n      </div>\n      <div class=\"text-center py-1\">\n        {{ $t('Thinking about self-hosting Obico Server instead?') }}\n        <a href=\"https://obico.io/obico-cloud-vs-self-hosted.html\">{{\n          $t('Check out self-hosting vs Obico Cloud.')\n        }}</a>\n      </div>\n      <div id=\"pricing-selections\" class=\"container text-center py-4\">\n        <div class=\"btn-group btn-group-toggle\">\n          <label\n            id=\"sub-annual-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Annual\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Annual (SAVE 33%)') }}\n          </label>\n          <label\n            id=\"sub-monthly-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Monthly\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Monthly') }}\n          </label>\n        </div>\n      </div>\n      <div class=\"container\">\n        <div class=\"row price-matrix\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">{{ $t('Free') }}</div>\n              <div>{{ $t('Print occasionally.') }}</div>\n              <div class=\"plan-price\">\n                $0\n                <span class=\"price-unit\" />\n              </div>\n              <div class=\"price-sub\">{{ $t('Limited to 1 printer.') }}</div>\n            </div>\n            <div class=\"price-action\">\n              <a\n                v-if=\"!isAuthenticated\"\n                role=\"button\"\n                class=\"btn btn-primary btn-block\"\n                href=\"/accounts/signup/\"\n                >{{ $t('Get Started') }}</a\n              >\n            </div>\n            <div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"first-gen-ai-on-pricing-page\">\n                      {{ $t('First-gen AI failure detection technology') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"detective-hours-free-plan-on-pricing-page\">\n                      {{ $t('10 free AI Detection Hours/month included') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"basic-webcam-streaming\">\n                    <help-widget id=\"basic-streaming-on-pricing-page\">\n                      {{ $t('Basic webcam streaming') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"tunneling-cap-per-month\">\n                    <help-widget id=\"tunneling-free-plan-on-pricing-page\">\n                      {{ $t('300MB /mo tunnel data') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('G-Code cloud storage up to 50MB per file, 1GB total') }}</div>\n                </div>\n              </div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <i18next\n                      :translation=\"\n                        $t('Companion mobile app for {localizedDom} and {localizedDom2}')\n                      \"\n                    >\n                      <template #localizedDom>\n                        <a\n                          href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                          >{{ $t('Android') }}</a\n                        >\n                      </template>\n                      <template #localizedDom2>\n                        <a\n                          href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                          >{{ $t('iOS') }}</a\n                        >\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Remote printer access and control') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{\n                      $t('Notifications via Email, mobile push notification, Telegram, and more.')\n                    }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"3rd-party-app-integration-free-on-pricing-page\">\n                      {{ $t('300MB /mo integration with your favorite 3rd-party mobile apps') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Community technical support') }}</div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">AI Premium</div>\n              <div>{{ $t('Print every day. 2+ printers.') }}</div>\n              <div class=\"plan-price\">\n                <span>{{ $t('$') }}</span>\n                <span id=\"monthly-price\">{{ priceTable.basePlanPrice }}</span>\n                <span class=\"price-unit\">&nbsp;/ {{ $t('month') }}</span>\n                <span v-if=\"isAnnual\" id=\"annual-bill\" style=\"font-size: 0.95rem; font-weight: 100\"\n                  >&nbsp;{{\n                    $t('(Billed {name} annually)', { name: priceTable.totalPlanPrice })\n                  }}</span\n                >\n              </div>\n              <div class=\"price-sub\">{{ $t('1st printer included') }}</div>\n              <div class=\"price-sub\">\n                <span>{{ $t('2+ printers at $') }}</span>\n                <span id=\"addl-printer-price\">{{ priceTable.basePrinterPrice }}</span>\n                / {{ $t('month / printer') }}\n              </div>\n              <div class=\"price-sub\">\n                <a class=\"price-calculator-trigger link\" @click=\"calc\"\n                  >{{ $t('Calculate cost') }} &gt;&gt;&gt;</a\n                >\n              </div>\n            </div>\n            <div class=\"price-action\">\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"subscribe-pro\"\n                  v-b-popover.hover=\"{\n                    placement: 'top',\n                    content: $t('Full refund within 30 days if you are not happy.'),\n                  }\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  @click=\"upgrade\"\n                  >{{ $t('Upgrade (30-Day Money Back Guarantee)') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" :href=\"signupUrl\">{{\n                  $t('Start 1 month FREE trial')\n                }}</a>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"next-gen-ai-on-pricing-page\">\n                    {{ $t('Next-gen AI failure detection technology') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"detective-hours-pro-plan-on-pricing-page\">\n                    {{ $t('50 free AI Detection Hours/month included') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"premium-webcam-streaming\">\n                  <help-widget id=\"premium-streaming-on-pricing-page\">\n                    {{ $t('Premium webcam streaming') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"unlimited-tunnling-for-pro\">\n                  <help-widget id=\"tunneling-pro-plan-on-pricing-page\">\n                    {{ $t('Unlimited tunnel data') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('G-Code cloud storage up to 500MB per file, 50GB total') }}</div>\n              </div>\n            </div>\n            <div class=\"features\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <i18next\n                    :translation=\"$t('Companion mobile app for {localizedDom} and {localizedDom2}')\"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                        >{{ $t('Android') }}</a\n                      >\n                    </template>\n                    <template #localizedDom2>\n                      <a\n                        href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                        >{{ $t('iOS') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Remote printer access and control') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  {{ $t('Notifications via Email, mobile push notification, Telegram, and more.') }}\n                </div>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"3rd-party-app-integration-pro-on-pricing-page\">\n                    {{ $t('Unlimited integration with your favorite 3rd-party mobile apps') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Email technical support') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Printer feed sharing with premium streaming quality') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Failure alerts via SMS (text message)') }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div id=\"need-more\">\n          <h1 class=\"text-center mt-3\">{{ $t('AI Detection Hour Packs') }}</h1>\n          <div class=\"text-center\">\n            {{\n              $t(\n                'Need more AI Detection Hours? Add the right amount of AI Detection Hours without burning a hole on your wallet.'\n              )\n            }}\n          </div>\n        </div>\n        <div class=\"row price-matrix mt-5\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header dh-pack-header\">\n              <div class=\"plan-name\">{{ $t('Pre-paid Pack') }}</div>\n              <div>{{ $t('Turn on AI failure detection only for the prints.') }}</div>\n              <div>{{ $t('Available to all plans.') }}</div>\n            </div>\n            <div>\n              <div class=\"features dh-pack\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Pre-paid AI Detection Hours never expire.') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('One Time Purchase.') }}</div>\n                </div>\n              </div>\n            </div>\n            <div>\n              <div class=\"form-group\">\n                <div\n                  v-for=\"{ hours, price } in Object.values(PrepaidDHPacks)\"\n                  :key=\"hours\"\n                  class=\"custom-control custom-radio\"\n                  style=\"margin: 0.5rem 0px\"\n                >\n                  <input\n                    :id=\"'dh-single-pack-selected-' + hours\"\n                    v-model=\"selectedPrepaidPack\"\n                    type=\"radio\"\n                    :value=\"hours\"\n                    class=\"custom-control-input field_required\"\n                  />\n                  <label class=\"custom-control-label\" :for=\"'dh-single-pack-selected-' + hours\">\n                    <strong>{{ hours }} {{ $t('AI Detection Hours') }}</strong> {{ $t('for') }} ${{\n                      price\n                    }}\n                  </label>\n                </div>\n              </div>\n            </div>\n            <div style=\"margin-top: 1rem\">\n              <div v-if=\"!isAuthenticated\">\n                <a role=\"button\" class=\"btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial + 250 FREE AI Detection Hours')\n                }}</a>\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" @click=\"purchasePrepaidPack\">{{\n                  $t('Purchase Selected AI Detection Hour Pack')\n                }}</a>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header dh-pack-header\">\n              <div class=\"plan-name\">{{ $t('Subscribe&Save Packs') }}</div>\n              <div>{{ $t('AI failure detection for all prints.') }}</div>\n              <div>{{ $t('Available only as add-on to the') }} AI Premium {{ $t('plan.') }}</div>\n            </div>\n            <div>\n              <div class=\"features dh-pack\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Subscribed AI Detection Hours roll over month to month.') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{ $t('Subscribed AI Detection Hours expire when subscription ends.') }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{ $t('You can change AI Detection Hour Pack or remove it from your') }}\n                    AI Premium\n                    {{ $t('plan any time you want.') }}\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div>\n              <div id=\"sns-dh-packs\" class=\"form-group\">\n                <div\n                  v-for=\"key in Object.keys(DHPacks)\"\n                  v-show=\"key != 0\"\n                  :key=\"key\"\n                  class=\"custom-control custom-radio\"\n                >\n                  <input\n                    :id=\"'dh-pack-selected-' + key\"\n                    v-model=\"dhPackKey\"\n                    type=\"radio\"\n                    name=\"dh-pack-selected\"\n                    :value=\"key\"\n                    class=\"custom-control-input field_required\"\n                    autocomplete=\"off\"\n                  />\n                  <label class=\"custom-control-label\" :for=\"'dh-pack-selected-' + key\">\n                    <strong>{{ getDHPackLabel(key) }}:</strong>\n                    {{ getDHPackSubLabel(key) }}\n                  </label>\n                </div>\n              </div>\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"upgrade-with-selected-dh-pack\"\n                  role=\"button\"\n                  :class=\"{\n                    'py-2 btn btn-primary btn-block': true,\n                    disabled: dhPackKey == '0',\n                  }\"\n                  @click=\"upgradeWithDHPack\"\n                  >{{ $t('Upgrade to') }} AI Premium {{ $t('with selected AI Detection Hour Pack') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"py-2 btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial + 250 FREE AI Detection Hours')\n                }}</a>\n              </div>\n              <a\n                id=\"cal-with-selected-dh-pack\"\n                role=\"button\"\n                class=\"py-2 btn btn-block price-calculator-trigger link\"\n                @click=\"calcWithDHPack\"\n                >{{ $t('Calculate Cost &gt;&gt;&gt;') }}</a\n              >\n            </div>\n          </div>\n        </div>\n      </div>\n      <QuestionsSection @calc=\"calc\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport {\n  BillingCycle,\n  DHPacks,\n  PrepaidDHPacks,\n  CalcPeriod,\n  calcPriceTable,\n  calcDHPackPrice,\n} from '@entSrc/lib/pricing.js'\n\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { SupportEmail } from '@entSrc/lib/consts.js'\nimport NavBar from '@src/components/NavBar.vue'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport axios from '@src/lib/axios-csrf'\nimport urls from '@config/server-urls'\n\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport QuestionsSection from '@entSrc/components/pricing/QuestionsSection.vue'\n\nexport default {\n  name: 'PricingPage',\n  components: {\n    QuestionsSection,\n    NavBar,\n    HelpWidget,\n  },\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    annualAsDefault: {\n      type: Boolean,\n      default() {\n        return true\n      },\n    },\n    couponCode: {\n      type: String,\n      default: '',\n    },\n  },\n  data() {\n    return {\n      initialCBSubscription: null,\n      loaded: false,\n      billingCycle: this.annualAsDefault ? BillingCycle.Annual : BillingCycle.Monthly,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      isCalcOpen: false,\n      selectedPrepaidPack: null,\n    }\n  },\n  computed: {\n    signupUrl() {\n      return this.couponCode\n        ? '/accounts/signup/?next=' + encodeURIComponent(window.location.pathname)\n        : '/accounts/signup/'\n    },\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n    this.PrepaidDHPacks = PrepaidDHPacks\n    this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        this.initialCBSubscription = data ? data.cb_subscription : null\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n  mounted() {\n    // Google Optimize\n    let googleOptimizeScript = document.createElement('script')\n    googleOptimizeScript.setAttribute(\n      'src',\n      'https://www.googleoptimize.com/optimize.js?id=OPT-NVC4QPD'\n    )\n    document.head.appendChild(googleOptimizeScript)\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackSubLabel(key) {\n      const year = calcDHPackPrice(this.billingCycle, CalcPeriod.Year, key)\n      const month = calcDHPackPrice(this.billingCycle, CalcPeriod.Month, key)\n      const hour = (month / DHPacks[key].hours).toFixed(4)\n\n      if (key > 0) {\n        return this.billingCycle == BillingCycle.Annual\n          ? `${this.$i18next.t(\n              ' for ${month} / month (${hour} / AI Detection Hour). Billed ${year} annually.',\n              { month, hour, year }\n            )}`\n          : `${this.$i18next.t(' for ${month} / month (${hour} / AI Detection Hour).', {\n              month,\n              hour,\n            })}`\n      }\n      return ''\n    },\n    calc() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    calcWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    upgrade() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    upgradeWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    checkoutPrepaidDHPack(level) {\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_prepaid_dhpack_checkout_url/', {\n        dhpack_level: level,\n      })\n    },\n    purchasePrepaidPack() {\n      if (this.selectedPrepaidPack === null) {\n        return\n      } else {\n        this.checkoutPrepaidDHPack(this.selectedPrepaidPack)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped></style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PricingPage.vue?vue&type=template&id=155dc778&scoped=true&\"\nimport script from \"./PricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PricingPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"155dc778\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',{staticClass:\"archived-printers\"},[(_vm.overSubscribed === null)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('b-row',{staticClass:\"justify-content-center detective-hour-log\"},[_c('b-col',{attrs:{\"sm\":\"11\",\"md\":\"10\",\"lg\":\"8\"}},[(_vm.archivedPrinters.length > 0)?_c('div',{staticClass:\"form-container full-on-mobile\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Archived Printers')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'The following printers have been archived because you have more printers than your plan allows.' ))+\" \")]),_c('table',{staticClass:\"archived-printers-list table table-striped table-borderless my-4\"},[_c('tbody',_vm._l((_vm.archivedPrinters),function(printer){return _c('tr',{key:printer.id},[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(printer.name))]),_c('td',{staticClass:\"text-right\"},[(_vm.overSubscribed)?_c('a',{staticClass:\"btn link mr-0 mr-md-2 printer-action\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.unarchivePrinter(printer)}}},[_vm._v(_vm._s(_vm.$t('Un-archive')))]):_c('a',{directives:[{name:\"b-tooltip\",rawName:\"v-b-tooltip.hover\",modifiers:{\"hover\":true}}],staticClass:\"btn disabled link mr-0 mr-md-2 printer-action\",attrs:{\"title\":\"Your subscription plan doesn't allow more printers.\",\"href\":\"#\"}},[_vm._v(_vm._s(_vm.$t('Un-archive')))]),_c('a',{staticClass:\"btn link printer-action\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.deletePrinter(printer)}}},[_vm._v(_vm._s(_vm.$t('Delete')))])])])}),0)]),_c('p',[_vm._v(_vm._s(_vm.$t('You have a few options to un-archive printer(s)'))+\":\")]),_c('ul',[_c('li',[_vm._v(_vm._s(_vm.$t('Delete or archive the printers you no longer need.')))]),_c('li',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                      `Upgrade to the {planName} plan. Please remember the Free plan is limited to only 1 printer. Check out {localizedDom}.`\n                    )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('the'))+\" AI Premium \"+_vm._s(_vm.$t('plan pricing')))])]},proxy:true}],null,false,1971554533)})],1),_c('li',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                      `If you are already on the {planName} plan, you can change the number of printers on {localizedDom}.`\n                    )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('your subscription page')))])]},proxy:true}],null,false,2400451523)})],1)]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Once your account is set up to allow for more printers, come back and un-archive the printers here.' ))+\" \")]),_c('p',{staticClass:\"font-weight-light font-italic\"},[_vm._v(\" \"+_vm._s(_vm.$t('Questions on why your printers are archived?'))+\" \"),_c('a',{attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('Contact us.')))])])]):_c('div',{staticClass:\"form-container m-0\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Archived Printers')))]),_c('p',[_vm._v(_vm._s(_vm.$t('You have no archived printers.')))]),_c('p',[_c('a',{attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Go back to the printer page.')))])])])])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container class=\"archived-printers\">\n        <div v-if=\"overSubscribed === null\" class=\"text-center my-5\">\n          <b-spinner></b-spinner>\n        </div>\n        <b-row v-else class=\"justify-content-center detective-hour-log\">\n          <b-col sm=\"11\" md=\"10\" lg=\"8\">\n            <div v-if=\"archivedPrinters.length > 0\" class=\"form-container full-on-mobile\">\n              <h2>{{ $t('Archived Printers') }}</h2>\n              <p>\n                {{\n                  $t(\n                    'The following printers have been archived because you have more printers than your plan allows.'\n                  )\n                }}\n              </p>\n              <table class=\"archived-printers-list table table-striped table-borderless my-4\">\n                <tbody>\n                  <tr v-for=\"printer in archivedPrinters\" :key=\"printer.id\">\n                    <td class=\"align-middle\">{{ printer.name }}</td>\n                    <td class=\"text-right\">\n                      <a\n                        v-if=\"overSubscribed\"\n                        class=\"btn link mr-0 mr-md-2 printer-action\"\n                        href=\"#\"\n                        @click.prevent=\"unarchivePrinter(printer)\"\n                        >{{ $t('Un-archive') }}</a\n                      >\n                      <a\n                        v-else\n                        v-b-tooltip.hover\n                        class=\"btn disabled link mr-0 mr-md-2 printer-action\"\n                        title=\"Your subscription plan doesn't allow more printers.\"\n                        href=\"#\"\n                        >{{ $t('Un-archive') }}</a\n                      >\n                      <a\n                        class=\"btn link printer-action\"\n                        href=\"#\"\n                        @click.prevent=\"deletePrinter(printer)\"\n                        >{{ $t('Delete') }}</a\n                      >\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n              <p>{{ $t('You have a few options to un-archive printer(s)') }}:</p>\n              <ul>\n                <li>{{ $t('Delete or archive the printers you no longer need.') }}</li>\n                <li>\n                  <i18next\n                    :translation=\"\n                      $t(\n                        `Upgrade to the {planName} plan. Please remember the Free plan is limited to only 1 printer. Check out {localizedDom}.`\n                      )\n                    \"\n                  >\n                    <template #planName>AI Premium</template>\n                    <template #localizedDom>\n                      <a href=\"/ent_pub/pricing/\">{{ $t('the') }} AI Premium {{ $t('plan pricing') }}</a>\n                    </template>\n                  </i18next>\n                </li>\n                <li>\n                  <i18next\n                    :translation=\"\n                      $t(\n                        `If you are already on the {planName} plan, you can change the number of printers on {localizedDom}.`\n                      )\n                    \"\n                  >\n                    <template #planName>AI Premium</template>\n                    <template #localizedDom>\n                      <a href=\"/user_preferences/subscription/\">{{\n                        $t('your subscription page')\n                      }}</a>\n                    </template>\n                  </i18next>\n                </li>\n              </ul>\n              <p>\n                {{\n                  $t(\n                    'Once your account is set up to allow for more printers, come back and un-archive the printers here.'\n                  )\n                }}\n              </p>\n              <p class=\"font-weight-light font-italic\">\n                {{ $t('Questions on why your printers are archived?') }}\n                <a href=\"mailto:support@obico.io\">{{ $t('Contact us.') }}</a>\n              </p>\n            </div>\n            <div v-else class=\"form-container m-0\">\n              <h2>{{ $t('Archived Printers') }}</h2>\n              <p>{{ $t('You have no archived printers.') }}</p>\n              <p>\n                <a href=\"/printers/\">{{ $t('Go back to the printer page.') }}</a>\n              </p>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  name: 'ArchivedPrintersPage',\n\n  components: {\n    PageLayout,\n  },\n\n  data() {\n    return {\n      archivedPrinters: [],\n      overSubscribed: null,\n    }\n  },\n\n  created() {\n    this.fetchData()\n  },\n\n  methods: {\n    deletePrinter(printer) {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Are you sure?')}`,\n        text: `${this.$i18next.t(`Delete {name} printer? This action can not be undone.`, {\n          name: printer.name,\n        })}`,\n        showCancelButton: true,\n        confirmButtonText: `${this.$i18next.t('Yes')}`,\n        cancelButtonText: `${this.$i18next.t('No')}`,\n      }).then((userAction) => {\n        if (userAction.isConfirmed) {\n          axios.delete(urls.printer(printer.id) + '?with_archived=true').then(() => {\n            this.$swal.Toast.fire({\n              title: `${this.$i18next.t('Printer deleted')}`,\n              text: `${this.$i18next.t(`{name} has been permanently deleted`, { name: printer.name })}`,\n            })\n            this.fetchData()\n          })\n        }\n      })\n    },\n\n    unarchivePrinter(printer) {\n      if (!this.overSubscribed) {\n        return\n      }\n\n      const href = `/ent/printers/${printer.id}/unarchive/`\n      window.location.href = href\n    },\n\n    fetchData() {\n      this.archivedPrinters = []\n      this.overSubscribed = null\n      axios.get(urls.printers() + '?with_archived=true').then((response) => {\n        for (const printer of response.data) {\n          if (printer.archived_at) {\n            this.archivedPrinters.push(printer)\n          }\n        }\n      })\n      axios.get(urls.activeSubscription()).then((response) => {\n        const data = response.data\n        this.overSubscribed = data.over_subscribed\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\ntable.archived-printers-list td\n  white-space: normal\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ArchivedPrintersPage.vue?vue&type=template&id=b5b4a9e6&scoped=true&\"\nimport script from \"./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"\nexport * from \"./ArchivedPrintersPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ArchivedPrintersPage.vue?vue&type=style&index=0&id=b5b4a9e6&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b5b4a9e6\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_vm._v(\"\\\"> \"),(_vm.loading)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',{attrs:{\"sm\":\"11\",\"md\":\"10\",\"lg\":\"8\"}},[(_vm.lastRedeemedCode)?_c('div',{staticClass:\"form-container full-on-mobile mb-4 detective-hour-coupon-codes\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('Last redeemed Detective Hours')))]),_c('table',{staticClass:\"coupon-codes-list table table-striped table-borderless my-4\"},[_c('thead',[_c('tr',[_c('th',[_vm._v(_vm._s(_vm.$t('Code')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Hours')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Description')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Redeemed at')))])])]),_c('tbody',[_c('tr',[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.code))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.hours))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.lastRedeemedCode.description))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(_vm.formatDate(_vm.lastRedeemedCode.redeemed_at)))])])])])]):_vm._e(),(_vm.couponCodes.length > 0)?_c('div',{staticClass:\"form-container full-on-mobile\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('AI Hour Coupon Codes')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Here are your AI Hour coupon codes and their redemption status.'))+\" \")]),_c('table',{staticClass:\"coupon-codes-list table table-striped table-borderless my-4\"},[_c('thead',[_c('tr',[_c('th',[_vm._v(_vm._s(_vm.$t('Code')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Hours')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Description')))]),_c('th',[_vm._v(_vm._s(_vm.$t('Redeemed at')))])])]),_c('tbody',_vm._l((_vm.couponCodes),function(code){return _c('tr',{key:code.id},[_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.code))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.hours))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(_vm._s(code.description))]),_c('td',{staticClass:\"align-middle\"},[_vm._v(\" \"+_vm._s(code.redeemed_at ? _vm.formatDate(code.redeemed_at) : _vm.$t('Available'))+\" \")])])}),0)])]):_c('div',{staticClass:\"form-container m-0\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('AI Hour Coupon Codes')))]),_c('p',[_vm._v(_vm._s(_vm.$t('You have no AI Hour coupon codes.')))]),_c('p',[_c('a',{attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Go back to the printer page.')))])])])])],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container\">\n        <div v-if=\"loading\" class=\"text-center my-5\">\n          <b-spinner></b-spinner>\n        </div>\n        <b-row v-else class=\"justify-content-center\">\n          <b-col sm=\"11\" md=\"10\" lg=\"8\">\n            <div v-if=\"lastRedeemedCode\" class=\"form-container full-on-mobile mb-4 detective-hour-coupon-codes\">\n              <h2>{{ $t('Last redeemed Detective Hours') }}</h2>\n              <table class=\"coupon-codes-list table table-striped table-borderless my-4\">\n                <thead>\n                  <tr>\n                    <th>{{ $t('Code') }}</th>\n                    <th>{{ $t('Hours') }}</th>\n                    <th>{{ $t('Description') }}</th>\n                    <th>{{ $t('Redeemed at') }}</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.code }}</td>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.hours }}</td>\n                    <td class=\"align-middle\">{{ lastRedeemedCode.description }}</td>\n                    <td class=\"align-middle\">{{ formatDate(lastRedeemedCode.redeemed_at) }}</td>\n                  </tr>\n                </tbody>\n              </table>\n            </div>\n            <div v-if=\"couponCodes.length > 0\" class=\"form-container full-on-mobile\">\n              <h2>{{ $t('AI Hour Coupon Codes') }}</h2>\n              <p>\n                {{ $t('Here are your AI Hour coupon codes and their redemption status.') }}\n              </p>\n              <table class=\"coupon-codes-list table table-striped table-borderless my-4\">\n                <thead>\n                  <tr>\n                    <th>{{ $t('Code') }}</th>\n                    <th>{{ $t('Hours') }}</th>\n                    <th>{{ $t('Description') }}</th>\n                    <th>{{ $t('Redeemed at') }}</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr v-for=\"code in couponCodes\" :key=\"code.id\">\n                    <td class=\"align-middle\">{{ code.code }}</td>\n                    <td class=\"align-middle\">{{ code.hours }}</td>\n                    <td class=\"align-middle\">{{ code.description }}</td>\n                    <td class=\"align-middle\">\n                      {{ code.redeemed_at ? formatDate(code.redeemed_at) : $t('Available') }}\n                    </td>\n                  </tr>\n                </tbody>\n              </table>\n            </div>\n            <div v-else class=\"form-container m-0\">\n              <h2>{{ $t('AI Hour Coupon Codes') }}</h2>\n              <p>{{ $t('You have no AI Hour coupon codes.') }}</p>\n              <p>\n                <a href=\"/printers/\">{{ $t('Go back to the printer page.') }}</a>\n              </p>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  name: 'DetectiveHourCouponCodesPage',\n\n  components: {\n    PageLayout,\n  },\n\n  data() {\n    return {\n      couponCodes: [],\n      loading: true,\n    }\n  },\n\n  created() {\n    this.fetchData()\n  },\n\n  methods: {\n    fetchData() {\n      this.loading = true\n      axios.get(urls.detectiveHourCouponCodes()).then((response) => {\n        this.couponCodes = response.data\n        this.loading = false\n      })\n    },\n\n    formatDate(dateString) {\n      if (!dateString) return ''\n      const date = new Date(dateString)\n      const locale = this.$i18n?.locale || 'en-US'\n      return new Intl.DateTimeFormat(locale, {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n        hour: '2-digit',\n        minute: '2-digit',\n      }).format(date)\n    },\n  },\n\n  computed: {\n    lastRedeemedCode() {\n      return this.couponCodes.length > 0 ? this.couponCodes[0] : null\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\ntable.coupon-codes-list\n  td, th\n    white-space: normal\n\n// Add styling for the first table's body only\n.detective-hour-coupon-codes table:first-of-type tbody\n  color: var(--color-success)\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DetectiveHourCouponCodesPage.vue?vue&type=template&id=3931bb0f&scoped=true&\"\nimport script from \"./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./DetectiveHourCouponCodesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DetectiveHourCouponCodesPage.vue?vue&type=style&index=0&id=3931bb0f&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3931bb0f\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"publictimelapse_list\"}}),_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"timelapse-gallery\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-sm-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('The Spaghetti Gallery')))])])]),_c('div',{staticClass:\"row\"},_vm._l((_vm.pageTimelapses),function(timelapse){return _c('print-card',{key:timelapse.id,attrs:{\"print\":timelapse,\"is-public\":true},on:{\"fullscreen\":_vm.openFullScreen}})}),1),_c('mugen-scroll',{staticClass:\"text-center p-4\",attrs:{\"handler\":_vm.fetchMoreData,\"should-handle\":!_vm.loading}},[(_vm.noMoreData)?_c('div',{staticClass:\"text-center p-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('End of public time-lapse list.'))+\" \")]):_vm._e(),(!_vm.noMoreData)?_c('b-spinner',{attrs:{\"label\":_vm.$t('Loading...')}}):_vm._e()],1),_c('b-modal',{attrs:{\"id\":\"tl-fullscreen-modal\",\"size\":\"full\",\"title\":_vm.fullScreenPrintTitle,\"hide-footer\":true},on:{\"hidden\":_vm.fullScreenClosed}},[_c('full-screen-print-card',{attrs:{\"print\":_vm.fullScreenPrint,\"video-url\":_vm.fullScreenPrintVideoUrl,\"autoplay\":true,\"is-public\":true}})],1)],1)])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-sm-12 col-md-6 col-lg-4 print-card\"},[_c('div',{staticClass:\"card vld-parent\"},[(_vm.isPublic)?_c('div',{staticClass:\"card-header\"},[_vm._v(\"- By \"+_vm._s(_vm.print.creator_name))]):_c('div',{staticClass:\"card-header\"},[_c('div',{style:({ visibility: _vm.hasSelectedChangedListener ? 'visible' : 'hidden' })},[_c('b-form-checkbox',{staticClass:\"text-decoration-none\",attrs:{\"size\":\"lg\"},model:{value:(_vm.isSelected),callback:function ($$v) {_vm.isSelected=$$v},expression:\"isSelected\"}})],1),_c('b-form-radio-group',{attrs:{\"buttons\":\"\",\"button-variant\":\"outline-primary\",\"name\":\"radio-btn-outline\"},model:{value:(_vm.selectedCardView),callback:function ($$v) {_vm.selectedCardView=$$v},expression:\"selectedCardView\"}},[_c('b-form-radio',{staticClass:\"no-corner no-shadow\",attrs:{\"value\":\"detective\",\"disabled\":!_vm.canShowDetectiveView}},[_c('i',{staticClass:\"fas fa-balance-scale\"})]),_c('b-form-radio',{staticClass:\"no-corner no-shadow\",attrs:{\"value\":\"info\"}},[_c('i',{staticClass:\"fas fa-info\"})])],1),_c('b-dropdown',{attrs:{\"right\":\"\",\"no-caret\":\"\",\"toggle-class\":\"icon-btn\"},scopedSlots:_vm._u([{key:\"button-content\",fn:function(){return [_c('i',{staticClass:\"fas fa-ellipsis-v\"})]},proxy:true}])},[(_vm.print.video_url && !_vm.print.video_archived_at)?_c('b-dropdown-item',{attrs:{\"href\":_vm.print.video_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"fas fa-download\"}),_vm._v(_vm._s(_vm.$t(\"Download Original Time-lapse\"))+\" \")]):_vm._e(),(_vm.print.tagged_video_url && !_vm.print.video_archived_at)?_c('b-dropdown-item',{attrs:{\"href\":_vm.print.tagged_video_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"fas fa-download\"}),_vm._v(_vm._s(_vm.$t(\"Download Detective Time-lapse\"))+\" \")]):_vm._e(),_c('b-dropdown-divider'),_c('b-dropdown-item',{on:{\"click\":_vm.deleteVideo}},[_c('span',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.$t(\" \"))),_c('i',{staticClass:\"fas fa-trash-alt\"}),_vm._v(_vm._s(_vm.$t(\"Delete\"))+\" \")])])],1)],1),_c('div',[(_vm.print.video_archived_at)?_c('div',{staticClass:\"position-relative\"},[_c('div',{staticClass:\"poster-placeholder-wrapper\"},[_c('svg',{staticClass:\"poster-placeholder\"},[_c('use',{attrs:{\"href\":_vm.posterSrc}})])]),_c('div',{staticClass:\"archived-info\"},[_c('div',{staticClass:\"text\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Video file is deleted.\"))+\" \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.showVideoArchivedDescription($event)}}},[_vm._v(_vm._s(_vm.$t(\"Why?\")))])])])]):_c('div',[(_vm.videoUrl)?_c('video-box',{attrs:{\"video-url\":_vm.videoUrl,\"poster-url\":_vm.print.poster_url,\"fluid\":true,\"fullscreen-btn\":_vm.hasFullscreenListener},on:{\"timeupdate\":_vm.onTimeUpdate,\"fullscreen\":function($event){return _vm.$emit('fullscreen', _vm.print.id, _vm.videoUrl)}}}):_c('div',[_c('detective-working')],1)],1),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.cardView == 'info' && !_vm.isPublic),expression:\"cardView == 'info' && !isPublic\"}]},[_c('div',{staticClass:\"card-body\"},[_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"File\"))+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.print.filename))])]),_c('div',{directives:[{name:\"b-tooltip\",rawName:\"v-b-tooltip.hover\",modifiers:{\"hover\":true}}],staticClass:\"row\",attrs:{\"title\":_vm.humanizedPrintedOrUploadedTime((_vm.longFormat = true))}},[_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.wasTimelapseUploaded ? 'Uploaded' : 'Printed')+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.humanizedPrintedOrUploadedTime())+\" \"+_vm._s(_vm.endStatus))])]),(!_vm.wasTimelapseUploaded && _vm.duration)?_c('div',{staticClass:\"row\",attrs:{\"id\":'dur-' + _vm.print.id}},[_c('b-tooltip',{attrs:{\"target\":'dur-' + _vm.print.id,\"triggers\":\"hover\"}},[_vm._v(\" \"+_vm._s(_vm._f(\"floor\")(_vm._f(\"duration\")(_vm.duration,'asHours')))+\":\"+_vm._s(_vm._f(\"duration\")(_vm.duration,'minutes'))+\":\"+_vm._s(_vm._f(\"duration\")(_vm.duration,'seconds'))+\" \")]),_c('div',{staticClass:\"text-muted col-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Duration\"))+\" \"),_c('span',{staticClass:\"float-right\"},[_vm._v(\":\")])]),_c('div',{staticClass:\"col-8\"},[_vm._v(_vm._s(_vm.duration.humanize()))])],1):_vm._e()])])]),(_vm.isPublic)?_c('div',{staticClass:\"bg-warning alert-banner text-center\",style:({ opacity: _vm.normalizedP > 0.4 ? 1 : 0 })},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Possible failure detected!\"))+\" \")]):_vm._e(),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.cardView == 'detective' || _vm.isPublic),expression:\"cardView == 'detective' || isPublic\"}]},[(_vm.print.prediction_json_url)?_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}}):_vm._e(),(!_vm.isPublic)?_c('div',{staticClass:\"feedback-section\"},[_c('div',{staticClass:\"text-center py-2 px-3\"},[_c('div',{staticClass:\"lead\",class:[_vm.print.alerted_at ? 'text-danger' : 'text-success']},[_vm._v(\" \"+_vm._s(_vm.print.alerted_at ? 'Failure detected' : 'No failure detected')+\" \")]),_c('div',{staticClass:\"py-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Did we get it right?\"))+\" \"),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedUp ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbUpClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-up\"})],1),_c('b-button',{staticClass:\"mx-2 btn-sm\",attrs:{\"variant\":_vm.thumbedDown ? 'primary' : 'outline'},on:{\"click\":_vm.onThumbDownClick}},[(_vm.inflightAlertOverwrite)?_c('b-spinner',{attrs:{\"type\":\"grow\",\"small\":\"\"}}):_c('i',{staticClass:\"fas fa-thumbs-down\"})],1)],1),_c('transition',{attrs:{\"name\":\"bounce\"}},[(_vm.print.printShotFeedbackEligible)?_c('div',{staticClass:\"pt-2\"},[_c('a',{staticClass:\"btn btn-sm btn-outline-primary px-4\",attrs:{\"role\":\"button\",\"href\":_vm.focusedFeedbackLink}},[_vm._v(\" F \"),_c('i',{staticClass:\"fas fa-search focused-feedback-icon\"}),_vm._v(_vm._s(_vm.$t(\"CUSED FEEDBACK\"))+\" \"),(_vm.print.need_print_shot_feedback)?_c('svg',{staticClass:\"seg-control-icon ml-1 double-hours-icon\"},[_c('use',{attrs:{\"href\":\"#svg-hour-double\"}})]):_vm._e()])]):_vm._e()])],1),_c('div',{staticClass:\"text-muted py-2 px-3 help-text\"},[(_vm.print.printShotFeedbackEligible)?_c('small',[(!_vm.print.need_print_shot_feedback)?_c('span',[_vm._v(_vm._s(_vm.$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")))]):_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')}},[_vm._v(_vm._s(_vm.$t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\")))]),_vm._v(\". \")])]):_c('small',[_vm._v(\" \"+_vm._s(_vm.$t(\"Every time you give us feedback,\"))+\" \"),_c('a',{attrs:{\"href\":_vm.getDocUrl('/user-guides/how-does-credits-work/')}},[_vm._v(_vm._s(_vm.$t(\"you help us get better at detecting failures\")))]),_vm._v(\". \")])])]):_vm._e()],1)])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"col-sm-12 col-md-6 col-lg-4 print-card\">\n    <div class=\"card vld-parent\">\n      <div v-if=\"isPublic\" class=\"card-header\">- By {{ print.creator_name }}</div>\n      <div v-else class=\"card-header\">\n        <div :style=\"{ visibility: hasSelectedChangedListener ? 'visible' : 'hidden' }\">\n          <b-form-checkbox\n            v-model=\"isSelected\"\n            size=\"lg\"\n            class=\"text-decoration-none\"\n          ></b-form-checkbox>\n        </div>\n        <b-form-radio-group\n          v-model=\"selectedCardView\"\n          buttons\n          button-variant=\"outline-primary\"\n          name=\"radio-btn-outline\"\n        >\n          <b-form-radio\n            value=\"detective\"\n            class=\"no-corner no-shadow\"\n            :disabled=\"!canShowDetectiveView\"\n          >\n            <i class=\"fas fa-balance-scale\"></i>\n          </b-form-radio>\n          <b-form-radio value=\"info\" class=\"no-corner no-shadow\">\n            <i class=\"fas fa-info\"></i>\n          </b-form-radio>\n        </b-form-radio-group>\n        <b-dropdown right no-caret toggle-class=\"icon-btn\">\n          <template #button-content>\n            <i class=\"fas fa-ellipsis-v\"></i>\n          </template>\n          <b-dropdown-item\n            v-if=\"print.video_url && !print.video_archived_at\"\n            :href=\"print.video_url\"\n            target=\"_blank\"\n          >\n            <i class=\"fas fa-download\"></i>{{$t(\"Download Original Time-lapse\")}}\n          </b-dropdown-item>\n          <b-dropdown-item\n            v-if=\"print.tagged_video_url && !print.video_archived_at\"\n            :href=\"print.tagged_video_url\"\n            target=\"_blank\"\n          >\n            <i class=\"fas fa-download\"></i>{{$t(\"Download Detective Time-lapse\")}}\n          </b-dropdown-item>\n          <b-dropdown-divider></b-dropdown-divider>\n          <b-dropdown-item @click=\"deleteVideo\">\n            <span class=\"text-danger\">{{ $t(\" \") }}<i class=\"fas fa-trash-alt\"></i>{{$t(\"Delete\")}} </span>\n          </b-dropdown-item>\n        </b-dropdown>\n      </div>\n      <div>\n        <div v-if=\"print.video_archived_at\" class=\"position-relative\">\n          <div class=\"poster-placeholder-wrapper\">\n            <svg class=\"poster-placeholder\">\n              <use :href=\"posterSrc\" />\n            </svg>\n          </div>\n          <div class=\"archived-info\">\n            <div class=\"text\">\n              {{$t(\"Video file is deleted.\")}}\n              <a href=\"#\" @click=\"showVideoArchivedDescription($event)\">{{ $t(\"Why?\") }}</a>\n            </div>\n          </div>\n        </div>\n        <div v-else>\n          <video-box\n            v-if=\"videoUrl\"\n            :video-url=\"videoUrl\"\n            :poster-url=\"print.poster_url\"\n            :fluid=\"true\"\n            :fullscreen-btn=\"hasFullscreenListener\"\n            @timeupdate=\"onTimeUpdate\"\n            @fullscreen=\"$emit('fullscreen', print.id, videoUrl)\"\n          />\n          <div v-else>\n            <detective-working />\n          </div>\n        </div>\n        <div v-show=\"cardView == 'info' && !isPublic\">\n          <div class=\"card-body\">\n            <div class=\"container\">\n              <div class=\"row\">\n                <div class=\"text-muted col-4\">\n                  {{$t(\"File\")}}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ print.filename }}</div>\n              </div>\n              <div\n                v-b-tooltip.hover\n                class=\"row\"\n                :title=\"humanizedPrintedOrUploadedTime((longFormat = true))\"\n              >\n                <div class=\"text-muted col-4\">\n                  {{ wasTimelapseUploaded ? 'Uploaded' : 'Printed' }}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ humanizedPrintedOrUploadedTime() }} {{ endStatus }}</div>\n              </div>\n              <div v-if=\"!wasTimelapseUploaded && duration\" :id=\"'dur-' + print.id\" class=\"row\">\n                <b-tooltip :target=\"'dur-' + print.id\" triggers=\"hover\">\n                  {{ duration | duration('asHours') | floor }}:{{\n                    duration | duration('minutes')\n                  }}:{{ duration | duration('seconds') }}\n                </b-tooltip>\n                <div class=\"text-muted col-4\">\n                  {{$t(\"Duration\")}}\n                  <span class=\"float-right\">:</span>\n                </div>\n                <div class=\"col-8\">{{ duration.humanize() }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div\n          v-if=\"isPublic\"\n          class=\"bg-warning alert-banner text-center\"\n          :style=\"{ opacity: normalizedP > 0.4 ? 1 : 0 }\"\n        >\n          <!-- v-show=\"normalizedP > 0.4\" -->\n          <i class=\"fas fa-exclamation-triangle\"></i> {{$t(\"Possible failure detected!\")}}\n        </div>\n\n        <div v-show=\"cardView == 'detective' || isPublic\">\n          <failure-detection-gauge v-if=\"print.prediction_json_url\" :normalized-p=\"normalizedP\" />\n          <div v-if=\"!isPublic\" class=\"feedback-section\">\n            <div class=\"text-center py-2 px-3\">\n              <div class=\"lead\" :class=\"[print.alerted_at ? 'text-danger' : 'text-success']\">\n                {{ print.alerted_at ? 'Failure detected' : 'No failure detected' }}\n              </div>\n              <div class=\"py-2\">\n                {{$t(\"Did we get it right?\")}}\n                <b-button\n                  :variant=\"thumbedUp ? 'primary' : 'outline'\"\n                  class=\"mx-2 btn-sm\"\n                  @click=\"onThumbUpClick\"\n                >\n                  <b-spinner v-if=\"inflightAlertOverwrite\" type=\"grow\" small></b-spinner>\n                  <i v-else class=\"fas fa-thumbs-up\"></i>\n                </b-button>\n                <b-button\n                  :variant=\"thumbedDown ? 'primary' : 'outline'\"\n                  class=\"mx-2 btn-sm\"\n                  @click=\"onThumbDownClick\"\n                >\n                  <b-spinner v-if=\"inflightAlertOverwrite\" type=\"grow\" small></b-spinner>\n                  <i v-else class=\"fas fa-thumbs-down\"></i>\n                </b-button>\n              </div>\n              <transition name=\"bounce\">\n                <div v-if=\"print.printShotFeedbackEligible\" class=\"pt-2\">\n                  <a\n                    role=\"button\"\n                    class=\"btn btn-sm btn-outline-primary px-4\"\n                    :href=\"focusedFeedbackLink\"\n                  >\n                    F\n                    <i class=\"fas fa-search focused-feedback-icon\"></i>{{$t(\"CUSED FEEDBACK\")}}\n                    <svg\n                      v-if=\"print.need_print_shot_feedback\"\n                      class=\"seg-control-icon ml-1 double-hours-icon\"\n                    >\n                      <use href=\"#svg-hour-double\" />\n                    </svg>\n                  </a>\n                </div>\n              </transition>\n            </div>\n            <div class=\"text-muted py-2 px-3 help-text\">\n              <small v-if=\"print.printShotFeedbackEligible\">\n                <span v-if=\"!print.need_print_shot_feedback\"\n                  >{{$t(\"Thank you for completing the Focused Feedback. You have earned 2 non-expirable AI Detection Hours. You can click the button again to change your feedback.\")}}</span\n                >\n                <span v-else> {{$t(\"With Focused Feedback, you can tell us exactly where we got it wrong. This is the most effective way to help us improve.\")}}\n                  <a\n                    :href=\"getDocUrl('/user-guides/how-does-credits-work#you-earn-detective-hours-for-giving-focused-feedback')\"\n                    >{{ $t(\"You will earn 2 AI Detection Hours once you finish the Focused Feedback\") }}</a\n                  >.\n                </span>\n              </small>\n\n              <small v-else>\n                {{$t(\"Every time you give us feedback,\")}}\n                <a :href=\"getDocUrl('/user-guides/how-does-credits-work/')\"\n                  >{{ $t(\"you help us get better at detecting failures\") }}</a\n                >.\n              </small>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport moment from 'moment'\nimport { getNormalizedP } from '@src/lib/utils'\nimport urls from '@config/server-urls'\nimport VideoBox from '@src/components/VideoBox'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\nimport DetectiveWorking from '@src/components/DetectiveWorking'\n\nexport default {\n  name: 'PrintCard',\n\n  components: {\n    VideoBox,\n    FailureDetectionGauge,\n    DetectiveWorking,\n  },\n\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    isPublic: {\n      type: Boolean,\n      default: false,\n    },\n    selected: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data: function () {\n    return {\n      ALERT_THRESHOLD: 0.4,\n      currentPosition: 0,\n      predictions: [],\n      selectedCardView: 'detective',\n      inflightAlertOverwrite: null,\n      isSelected: this.selected,\n    }\n  },\n\n  computed: {\n    wasTimelapseUploaded() {\n      return this.print.uploaded_at !== null\n    },\n\n    endStatus() {\n      return this.print.cancelled_at ? `${this.$i18next.t('(Cancelled)')}` : ''\n    },\n\n    duration() {\n      return this.print.ended_at && this.print.started_at\n        ? moment.duration(this.print.ended_at.diff(this.print.started_at))\n        : null\n    },\n\n    canShowDetectiveView() {\n      if (this.print.prediction_json_url !== null && this.print.tagged_video_url !== null) {\n        return true\n      }\n      // Time-lapses that was uploaded within the past 24 hours are presumably still be processed\n      if (this.print.uploaded_at && moment().diff(this.print.uploaded_at, 'hours') < 24) {\n        return true\n      }\n      return false\n    },\n\n    cardView() {\n      return this.canShowDetectiveView ? this.selectedCardView : 'info'\n    },\n\n    videoUrl() {\n      return this.cardView == 'info' ? this.print.video_url : this.print.tagged_video_url\n    },\n\n    thumbedUp() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'NOT_FAILED')\n    },\n\n    thumbedDown() {\n      if (!this.print.alert_overwrite) {\n        return false\n      }\n      return this.print.has_alerts ^ (this.print.alert_overwrite === 'FAILED')\n    },\n\n    focusedFeedbackLink() {\n      return `/prints/shot-feedback/${this.print.id}/`\n    },\n\n    hasSelectedChangedListener() {\n      return Boolean(this.$listeners && this.$listeners.selectedChanged)\n    },\n\n    hasFullscreenListener() {\n      return Boolean(this.$listeners && this.$listeners.fullscreen)\n    },\n\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, this.isPublic)\n    },\n\n    posterSrc() {\n      return this.print.poster_url || '#svg-3d-printer'\n    },\n  },\n\n  watch: {\n    isSelected(newValue) {\n      this.$emit('selectedChanged', this.print.id, newValue)\n    },\n  },\n\n  mounted() {\n    if (this.print.prediction_json_url) {\n      this.fetchPredictions()\n    }\n\n    if (!this.print.tagged_video_url) {\n      this.selectedCardView = 'info'\n    }\n  },\n\n  methods: {\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    deleteVideo() {\n      axios.delete(urls.print(this.print.id)).then(() => {\n        this.$emit('printDeleted', this.print.id)\n      })\n    },\n\n    onThumbUpClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'FAILED' : 'NOT_FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n\n    onThumbDownClick() {\n      this.inflightAlertOverwrite = this.print.has_alerts ? 'NOT_FAILED' : 'FAILED'\n      this.alertOverwrite(this.inflightAlertOverwrite)\n    },\n\n    alertOverwrite(value) {\n      axios\n        .patch(urls.print(this.print.id), {\n          alert_overwrite: value,\n        })\n        .then((response) => {\n          this.$emit('printDataChanged', response.data)\n          this.inflightAlertOverwrite = null\n        })\n    },\n\n    fetchPredictions() {\n      axios.get(this.print.prediction_json_url).then((response) => {\n        this.predictions = response.data\n      })\n    },\n\n    humanizedPrintedOrUploadedTime(longFormat = false) {\n      if (!this.print.uploaded_at && !this.print.ended_at) {\n        return '-'\n      }\n      const ts = this.wasTimelapseUploaded ? this.print.uploaded_at : this.print.ended_at\n      if (longFormat) {\n        return ts.format('LLLL')\n      } else {\n        return ts.fromNow()\n      }\n    },\n    showVideoArchivedDescription(event) {\n      event.preventDefault()\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Time-lapse video deleted')}`,\n        html: `\n          <p>${this.$i18next.t(\"Time-lapse videos older than 6-months are deleted from the {brandName} app server as they are rarely needed and cost significant amount to store in the cloud.\",{brandName:this.$syndicateText.brandName})}</p>\n          <p>${this.$i18next.t(\"If you are a Pro subscriber and you don't want your time-lapse videos to be deleted, please \")}<a href=\"mailto:support@obico.io?subject=Please%20keep%20my%20timelapse%20videos\">${this.$i18next.t(\"contact us\")}</a>.</p>\n          `,\n        showCloseButton: true,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.print-card\n  margin-top: var(--gap-between-blocks)\n\n  .card\n    border-radius: var(--border-radius-lg)\n    overflow: hidden\n\n.card-header\n  display: flex\n  flex-flow: row nowrap\n  justify-content: space-between\n  align-items: center\n\n.seg-control-icon\n  height: 1.2rem\n  width: 1.2rem\n  &.double-hours-icon\n    width: 1.5rem\n\n.feedback-section\n  background-color: var(--color-surface-secondary)\n\n.bounce-enter-active\n  animation: bounce-in .5s\n\n.bounce-leave-active\n  animation: bounce-in .5s reverse\n\n@keyframes bounce-in\n  0%\n    transform: scale(0)\n  50%\n    transform: scale(1.5)\n  100%\n    transform: scale(1)\n\n.help-text\n  line-height: 1.2\n\n.bg-warning.alert-banner\n  position: static\n  display: block\n\n.archived-info\n  position: absolute\n  width: 100%\n  z-index: 10\n  bottom: 0\n  left: 0\n  background-color: rgba(0,0,0,.6)\n  text-align: center\n  padding: 10px 0\n\n::v-deep .vjs-poster, ::v-deep .video-js\n  background-color: #000\n\n.poster-placeholder-wrapper\n  height: 250px\n  background-color: #000\n\n  .poster-placeholder\n    $size: 100px\n    color: rgb(255 255 255 / .2)\n    width: $size\n    height: $size\n    position: absolute\n    left: calc(50% - $size / 2)\n    top: calc(50% - $size / 2 - 20px)\n\ni.fas\n  width: 1em\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PrintCard.vue?vue&type=template&id=514d0214&scoped=true&\"\nimport script from \"./PrintCard.vue?vue&type=script&lang=js&\"\nexport * from \"./PrintCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PrintCard.vue?vue&type=style&index=0&id=514d0214&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"514d0214\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('video-box',{attrs:{\"video-url\":_vm.videoUrl,\"poster-url\":_vm.print.poster_url,\"fluid\":false,\"autoplay\":_vm.autoplay,\"fullscreen-btn\":false},on:{\"timeupdate\":_vm.onTimeUpdate}}),(_vm.isPublic)?_c('div',{staticClass:\"bg-warning alert-banner text-center\",style:({ opacity: _vm.normalizedP > 0.4 ? 1 : 0 })},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t(\"Possible failure detected!\"))+\" \")]):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <video-box\n      :video-url=\"videoUrl\"\n      :poster-url=\"print.poster_url\"\n      :fluid=\"false\"\n      :autoplay=\"autoplay\"\n      :fullscreen-btn=\"false\"\n      @timeupdate=\"onTimeUpdate\"\n    />\n\n    <div\n      v-if=\"isPublic\"\n      :style=\"{ opacity: normalizedP > 0.4 ? 1 : 0 }\"\n      class=\"bg-warning alert-banner text-center\"\n    >\n      <i class=\"fas fa-exclamation-triangle\"></i> {{$t(\"Possible failure detected!\")}}\n    </div>\n\n    <failure-detection-gauge :normalized-p=\"normalizedP\" />\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport { getNormalizedP } from '@src/lib/utils'\nimport VideoBox from '@src/components/VideoBox'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge'\n\nexport default {\n  name: 'FullScreenPrintCard',\n  components: {\n    VideoBox,\n    FailureDetectionGauge,\n  },\n  props: {\n    print: {\n      type: Object,\n      required: true,\n    },\n    videoUrl: {\n      type: String,\n      required: true,\n    },\n    initialPosition: {\n      type: Number,\n      default: () => 0,\n    },\n    autoplay: {\n      type: Boolean,\n      default: () => false,\n    },\n    isPublic: {\n      type: Boolean,\n      default: false,\n    },\n  },\n  data() {\n    return {\n      currentPosition: 0,\n      predictions: [],\n    }\n  },\n  computed: {\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, this.isPublic)\n    },\n  },\n  mounted() {\n    if (this.print.prediction_json_url) {\n      this.fetchPredictions()\n    }\n  },\n  methods: {\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    fetchPredictions() {\n      axios.get(this.print.prediction_json_url).then((response) => {\n        this.predictions = response.data\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.bg-warning.alert-banner\n  position: static\n  display: block\n  padding: 0.3rem\n</style>\n","import mod from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./FullScreenPrintCard.vue?vue&type=template&id=be9465e8&scoped=true&\"\nimport script from \"./FullScreenPrintCard.vue?vue&type=script&lang=js&\"\nexport * from \"./FullScreenPrintCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./FullScreenPrintCard.vue?vue&type=style&index=0&id=be9465e8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"be9465e8\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div>\n    <nav-bar view-name=\"publictimelapse_list\"></nav-bar>\n\n    <div id=\"content-wrapper\" class=\"container\">\n      <div class=\"timelapse-gallery\">\n        <!-- Header -->\n        <div class=\"row\">\n          <div class=\"col-sm-12 text-center\">\n            <h1>{{ $t('The Spaghetti Gallery') }}</h1>\n          </div>\n        </div>\n        <!-- Timelapses -->\n        <div class=\"row\">\n          <print-card\n            v-for=\"timelapse of pageTimelapses\"\n            :key=\"timelapse.id\"\n            :print=\"timelapse\"\n            :is-public=\"true\"\n            @fullscreen=\"openFullScreen\"\n          ></print-card>\n        </div>\n\n        <!-- Timelapses loader on scroll down -->\n        <mugen-scroll :handler=\"fetchMoreData\" :should-handle=\"!loading\" class=\"text-center p-4\">\n          <div v-if=\"noMoreData\" class=\"text-center p-2\">\n            {{ $t('End of public time-lapse list.') }}\n          </div>\n          <b-spinner v-if=\"!noMoreData\" :label=\"$t('Loading...')\"></b-spinner>\n        </mugen-scroll>\n\n        <!-- Full-screen timelapse -->\n        <b-modal\n          id=\"tl-fullscreen-modal\"\n          size=\"full\"\n          :title=\"fullScreenPrintTitle\"\n          :hide-footer=\"true\"\n          @hidden=\"fullScreenClosed\"\n        >\n          <full-screen-print-card\n            :print=\"fullScreenPrint\"\n            :video-url=\"fullScreenPrintVideoUrl\"\n            :autoplay=\"true\"\n            :is-public=\"true\"\n          />\n        </b-modal>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport NavBar from '@src/components/NavBar.vue'\nimport PrintCard from '@src/components/prints/PrintCard.vue'\nimport FullScreenPrintCard from '@src/components/prints/FullScreenPrintCard.vue'\nimport findIndex from 'lodash/findIndex'\nimport MugenScroll from 'vue-mugen-scroll'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'PublicTimelapsesPage',\n\n  components: {\n    NavBar,\n    PrintCard,\n    FullScreenPrintCard,\n    MugenScroll,\n  },\n\n  data() {\n    return {\n      perLoad: 6,\n      loadsNumber: 1,\n      timelapses: [],\n      fullScreenPrint: null,\n      fullScreenPrintVideoUrl: null,\n      noMoreData: false,\n      loading: false,\n    }\n  },\n\n  computed: {\n    pageTimelapses() {\n      const end = (this.loadsNumber - 1) * this.perLoad + this.perLoad\n      return this.timelapses.slice(0, end)\n    },\n\n    fullScreenPrintTitle() {\n      if (this.fullScreenPrint) {\n        return `- By ${this.fullScreenPrint.creator_name}`\n      }\n\n      return ''\n    },\n  },\n\n  created() {\n    axios.get(urls.publicTimelapses()).then((response) => {\n      for (const timelapse of response.data) {\n        this.timelapses.push(this.adaptTimelapseToPrint(timelapse))\n      }\n    })\n  },\n\n  methods: {\n    openFullScreen(printId, videoUrl) {\n      const i = findIndex(this.timelapses, (p) => p.id == printId)\n      if (i != -1) {\n        this.fullScreenPrint = this.timelapses[i]\n        this.fullScreenPrintVideoUrl = videoUrl\n        this.$bvModal.show('tl-fullscreen-modal')\n      }\n    },\n\n    fullScreenClosed() {\n      this.fullScreenPrint = null\n      this.fullScreenPrintVideoUrl = null\n    },\n\n    fetchMoreData() {\n      if (this.noMoreData) {\n        return\n      }\n\n      this.loading = true\n      setTimeout(() => {\n        this.loadsNumber++\n        this.loading = false\n        if (this.timelapses.length <= this.loadsNumber * this.perLoad) {\n          this.noMoreData = true\n        }\n      }, 500)\n    },\n\n    // TODO: remove after API fix\n    adaptTimelapseToPrint(timelapse) {\n      timelapse.prediction_json_url = timelapse.p_json_url\n      delete timelapse.p_json_url\n      return timelapse\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .pagination-wrapper button\n  border-radius: 0\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PublicTimelapsesPage.vue?vue&type=template&id=3118e4a9&scoped=true&\"\nimport script from \"./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PublicTimelapsesPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PublicTimelapsesPage.vue?vue&type=style&index=0&id=3118e4a9&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3118e4a9\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('nav-bar',{attrs:{\"view-name\":\"timelapse_upload\"}}),_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"timelapse-upload\"},[_c('div',{staticClass:\"hero-section text-center\"},[_c('h1',{staticClass:\"hero-title\"},[_c('i',{staticClass:\"fas fa-magic\"}),_vm._v(\" \"+_vm._s(_vm.$t('The Spaghetti Detective (Re-)Invented'))+\" \")]),_c('p',{staticClass:\"hero-subtitle\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Back in 2020, we pioneered AI-powered failure detection for 3D printing. We called it 'The Spaghetti Detective'. Today, we're reinventing it with a next-generation AI model that's more accurate and smarter.\" ))+\" \")]),_c('div',{staticClass:\"hero-cta\"},[_c('div',{staticClass:\"announcement-badge\"},[_c('i',{staticClass:\"fas fa-rocket\"}),_vm._v(\" \"+_vm._s(_vm.$t('The next-gen AI failure detection technology is now live for everyone!'))+\" \")]),_c('a',{staticClass:\"learn-more-link\",attrs:{\"href\":\"https://www.obico.io/blog/next-gen-ai-failure-detection-general-release/\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Read the announcement'))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt\"})])])]),_c('div',{staticClass:\"video-upload-row\"},[_c('div',{staticClass:\"upload-section\"},[_c('div',{staticClass:\"upload-card\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('Try It Now: Upload Your Time-lapse')))]),_c('p',{staticClass:\"upload-intro\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Already have a time-lapse? Test our new AI right away and see the difference.' ))+\" \")]),_c('vue-dropzone',{ref:\"dropzone\",staticClass:\"upload-dropzone\",attrs:{\"id\":\"dropzone\",\"options\":_vm.dropzoneOptions,\"use-custom-slot\":true},on:{\"vdropzone-success\":_vm.onUploadSuccess,\"vdropzone-error\":_vm.onUploadError}},[_c('div',{staticClass:\"dropzone-content\"},[_c('div',{staticClass:\"upload-icon\"},[_c('i',{staticClass:\"fas fa-arrow-up\"})]),_c('p',{staticClass:\"upload-text\"},[_vm._v(_vm._s(_vm.$t('Drag and drop your time-lapse video here')))]),_c('p',{staticClass:\"upload-or\"},[_vm._v(_vm._s(_vm.$t('or')))]),_c('button',{staticClass:\"btn btn-outline-secondary browse-btn\",attrs:{\"type\":\"button\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Browse Files'))+\" \")]),_c('p',{staticClass:\"upload-formats\"},[_vm._v(\" \"+_vm._s(_vm.$t('*.mp4 or *.mpg files only. Up to 100MB each.'))+\" \")])])])],1)]),_c('div',{staticClass:\"video-section\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('See the Difference')))]),_vm._m(0),_c('p',{staticClass:\"video-caption text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t('Watch how to capture your time-lapse and see our old vs. new AI in action'))+\" \")])])]),_c('hr',{staticClass:\"section-divider\"}),_c('div',{staticClass:\"analyses-section\"},[_c('h2',{staticClass:\"section-heading\"},[_vm._v(_vm._s(_vm.$t('Your Analyses')))]),(_vm.timelapses.length === 0)?_c('div',{staticClass:\"empty-state text-center\"},[_c('i',{staticClass:\"fas fa-film empty-icon\"}),_c('p',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm.$t('No timelapses uploaded yet. Upload one above to get started.'))+\" \")])]):_c('div',{staticClass:\"analyses-grid\"},_vm._l((_vm.timelapses),function(timelapse){return _c('div',{key:timelapse.id,staticClass:\"analysis-card\",class:{ clickable: timelapse.status === 'completed' },on:{\"click\":function($event){return _vm.openTimelapse(timelapse)}}},[_c('div',{staticClass:\"card-thumbnail\"},[(timelapse.poster_url)?_c('img',{staticClass:\"poster-img\",attrs:{\"src\":timelapse.poster_url,\"alt\":timelapse.filename}}):_c('i',{staticClass:\"fas fa-clock thumbnail-icon\"}),(timelapse.status === 'completed')?_c('div',{staticClass:\"play-overlay\"},[_c('i',{staticClass:\"fas fa-play-circle play-icon\"})]):_vm._e(),(timelapse.issue_severity)?_c('div',{staticClass:\"issues-badge\"},[_vm._v(\" \"+_vm._s(_vm.$t('Issues Detected!'))+\" \")]):_vm._e()]),_c('div',{staticClass:\"card-info\"},[_c('div',{staticClass:\"card-filename truncated\",attrs:{\"title\":timelapse.filename}},[_vm._v(\" \"+_vm._s(timelapse.filename)+\" \")]),_c('div',{staticClass:\"card-date text-muted\"},[_c('i',{staticClass:\"far fa-clock\"}),_vm._v(\" \"+_vm._s(_vm.formatDate(timelapse.created_at))+\" \")]),_c('div',{staticClass:\"card-status\",class:_vm.statusClass(timelapse)},[_c('i',{class:_vm.statusIcon(timelapse)}),_vm._v(\" \"+_vm._s(_vm.statusText(timelapse))+\" \")])])])}),0)]),_c('b-modal',{attrs:{\"id\":\"results-modal\",\"size\":\"xl\",\"title\":_vm.selectedTimelapse ? _vm.selectedTimelapse.filename : '',\"hide-footer\":true},on:{\"hidden\":_vm.onModalHidden}},[(_vm.selectedTimelapse)?_c('div',{staticClass:\"timelapse-viewer\"},[_c('b-tabs',{attrs:{\"content-class\":\"mt-3\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},[_c('b-tab',{attrs:{\"title\":_vm.$t('Detective Time-Lapse'),\"active\":\"\"}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[(_vm.selectedTimelapse.tagged_video_url)?_c('video-box',{attrs:{\"video-url\":_vm.selectedTimelapse.tagged_video_url,\"poster-url\":_vm.selectedTimelapse.poster_url,\"fluid\":false,\"autoplay\":false,\"fullscreen-btn\":false},on:{\"timeupdate\":_vm.onTimeUpdate}}):_vm._e()],1)]),(_vm.warningTriggered)?_c('div',{staticClass:\"alert alert-warning text-center mt-3\"},[_c('i',{staticClass:\"fas fa-exclamation-triangle\"}),_vm._v(\" \"+_vm._s(_vm.$t('Possible failure detected!'))+\" \")]):_vm._e(),_c('failure-detection-gauge',{attrs:{\"normalized-p\":_vm.normalizedP}})],1),_c('b-tab',{attrs:{\"title\":_vm.$t('Original Time-Lapse')}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[(_vm.selectedTimelapse.original_video_url)?_c('video-box',{attrs:{\"video-url\":_vm.selectedTimelapse.original_video_url,\"poster-url\":_vm.selectedTimelapse.poster_url,\"fluid\":false,\"autoplay\":false,\"fullscreen-btn\":false}}):_vm._e()],1)])])],1)],1):_vm._e()])],1)])],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"video-wrapper\"},[_c('iframe',{attrs:{\"src\":\"https://www.youtube.com/embed/lASpilGUKKs?rel=0\",\"title\":\"Spaghetti Detective 2nd Gen Demo\",\"frameborder\":\"0\",\"allow\":\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\",\"referrerpolicy\":\"strict-origin-when-cross-origin\",\"allowfullscreen\":\"\"}})])\n}]\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <nav-bar view-name=\"timelapse_upload\"></nav-bar>\n\n    <div id=\"content-wrapper\" class=\"container\">\n      <div class=\"timelapse-upload\">\n        <!-- Hero Section -->\n        <div class=\"hero-section text-center\">\n          <h1 class=\"hero-title\">\n            <i class=\"fas fa-magic\"></i>\n            {{ $t('The Spaghetti Detective (Re-)Invented') }}\n          </h1>\n          <p class=\"hero-subtitle\">\n            {{\n              $t(\n                \"Back in 2020, we pioneered AI-powered failure detection for 3D printing. We called it 'The Spaghetti Detective'. Today, we're reinventing it with a next-generation AI model that's more accurate and smarter.\"\n              )\n            }}\n          </p>\n          <div class=\"hero-cta\">\n            <div class=\"announcement-badge\">\n              <i class=\"fas fa-rocket\"></i>\n              {{ $t('The next-gen AI failure detection technology is now live for everyone!') }}\n            </div>\n            <a\n              href=\"https://www.obico.io/blog/next-gen-ai-failure-detection-general-release/\"\n              class=\"learn-more-link\"\n              target=\"_blank\"\n              rel=\"noopener\"\n            >\n              {{ $t('Read the announcement') }}\n              <i class=\"fas fa-external-link-alt\"></i>\n            </a>\n          </div>\n        </div>\n\n        <!-- Video and Upload Row -->\n        <div class=\"video-upload-row\">\n          <!-- Upload Section (Left) -->\n          <div class=\"upload-section\">\n            <div class=\"upload-card\">\n              <h2 class=\"section-heading\">{{ $t('Try It Now: Upload Your Time-lapse') }}</h2>\n              <p class=\"upload-intro\">\n                {{\n                  $t(\n                    'Already have a time-lapse? Test our new AI right away and see the difference.'\n                  )\n                }}\n              </p>\n              <vue-dropzone\n                id=\"dropzone\"\n                ref=\"dropzone\"\n                class=\"upload-dropzone\"\n                :options=\"dropzoneOptions\"\n                :use-custom-slot=\"true\"\n                @vdropzone-success=\"onUploadSuccess\"\n                @vdropzone-error=\"onUploadError\"\n              >\n                <div class=\"dropzone-content\">\n                  <div class=\"upload-icon\">\n                    <i class=\"fas fa-arrow-up\"></i>\n                  </div>\n                  <p class=\"upload-text\">{{ $t('Drag and drop your time-lapse video here') }}</p>\n                  <p class=\"upload-or\">{{ $t('or') }}</p>\n                  <button type=\"button\" class=\"btn btn-outline-secondary browse-btn\">\n                    {{ $t('Browse Files') }}\n                  </button>\n                  <p class=\"upload-formats\">\n                    {{ $t('*.mp4 or *.mpg files only. Up to 100MB each.') }}\n                  </p>\n                </div>\n              </vue-dropzone>\n            </div>\n          </div>\n\n          <!-- YouTube Video Section (Right) -->\n          <div class=\"video-section\">\n            <h2 class=\"section-heading\">{{ $t('See the Difference') }}</h2>\n            <div class=\"video-wrapper\">\n              <iframe\n                src=\"https://www.youtube.com/embed/lASpilGUKKs?rel=0\"\n                title=\"Spaghetti Detective 2nd Gen Demo\"\n                frameborder=\"0\"\n                allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n                referrerpolicy=\"strict-origin-when-cross-origin\"\n                allowfullscreen\n              ></iframe>\n            </div>\n            <p class=\"video-caption text-muted\">\n              {{ $t('Watch how to capture your time-lapse and see our old vs. new AI in action') }}\n            </p>\n          </div>\n        </div>\n\n        <hr class=\"section-divider\" />\n\n        <!-- Your Analyses Section -->\n        <div class=\"analyses-section\">\n          <h2 class=\"section-heading\">{{ $t('Your Analyses') }}</h2>\n\n          <div v-if=\"timelapses.length === 0\" class=\"empty-state text-center\">\n            <i class=\"fas fa-film empty-icon\"></i>\n            <p class=\"text-muted\">\n              {{ $t('No timelapses uploaded yet. Upload one above to get started.') }}\n            </p>\n          </div>\n\n          <div v-else class=\"analyses-grid\">\n            <div\n              v-for=\"timelapse in timelapses\"\n              :key=\"timelapse.id\"\n              class=\"analysis-card\"\n              :class=\"{ clickable: timelapse.status === 'completed' }\"\n              @click=\"openTimelapse(timelapse)\"\n            >\n              <!-- Thumbnail Area -->\n              <div class=\"card-thumbnail\">\n                <img\n                  v-if=\"timelapse.poster_url\"\n                  :src=\"timelapse.poster_url\"\n                  :alt=\"timelapse.filename\"\n                  class=\"poster-img\"\n                />\n                <i v-else class=\"fas fa-clock thumbnail-icon\"></i>\n                <!-- Play Button Overlay -->\n                <div v-if=\"timelapse.status === 'completed'\" class=\"play-overlay\">\n                  <i class=\"fas fa-play-circle play-icon\"></i>\n                </div>\n                <!-- Issues Badge -->\n                <div v-if=\"timelapse.issue_severity\" class=\"issues-badge\">\n                  {{ $t('Issues Detected!') }}\n                </div>\n              </div>\n\n              <!-- Card Info -->\n              <div class=\"card-info\">\n                <div class=\"card-filename truncated\" :title=\"timelapse.filename\">\n                  {{ timelapse.filename }}\n                </div>\n                <div class=\"card-date text-muted\">\n                  <i class=\"far fa-clock\"></i>\n                  {{ formatDate(timelapse.created_at) }}\n                </div>\n                <div class=\"card-status\" :class=\"statusClass(timelapse)\">\n                  <i :class=\"statusIcon(timelapse)\"></i>\n                  {{ statusText(timelapse) }}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <!-- Results Modal -->\n        <b-modal\n          id=\"results-modal\"\n          size=\"xl\"\n          :title=\"selectedTimelapse ? selectedTimelapse.filename : ''\"\n          :hide-footer=\"true\"\n          @hidden=\"onModalHidden\"\n        >\n          <div v-if=\"selectedTimelapse\" class=\"timelapse-viewer\">\n            <!-- Video Type Tabs -->\n            <b-tabs v-model=\"activeTab\" content-class=\"mt-3\">\n              <b-tab :title=\"$t('Detective Time-Lapse')\" active>\n                <div class=\"row\">\n                  <div class=\"col-12\">\n                    <video-box\n                      v-if=\"selectedTimelapse.tagged_video_url\"\n                      :video-url=\"selectedTimelapse.tagged_video_url\"\n                      :poster-url=\"selectedTimelapse.poster_url\"\n                      :fluid=\"false\"\n                      :autoplay=\"false\"\n                      :fullscreen-btn=\"false\"\n                      @timeupdate=\"onTimeUpdate\"\n                    />\n                  </div>\n                </div>\n                <div v-if=\"warningTriggered\" class=\"alert alert-warning text-center mt-3\">\n                  <i class=\"fas fa-exclamation-triangle\"></i>\n                  {{ $t('Possible failure detected!') }}\n                </div>\n                <failure-detection-gauge :normalized-p=\"normalizedP\" />\n              </b-tab>\n              <b-tab :title=\"$t('Original Time-Lapse')\">\n                <div class=\"row\">\n                  <div class=\"col-12\">\n                    <video-box\n                      v-if=\"selectedTimelapse.original_video_url\"\n                      :video-url=\"selectedTimelapse.original_video_url\"\n                      :poster-url=\"selectedTimelapse.poster_url\"\n                      :fluid=\"false\"\n                      :autoplay=\"false\"\n                      :fullscreen-btn=\"false\"\n                    />\n                  </div>\n                </div>\n              </b-tab>\n            </b-tabs>\n          </div>\n        </b-modal>\n\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport vue2Dropzone from 'vue2-dropzone'\nimport 'vue2-dropzone/dist/vue2Dropzone.min.css'\nimport NavBar from '@src/components/NavBar.vue'\nimport VideoBox from '@src/components/VideoBox.vue'\nimport FailureDetectionGauge from '@src/components/FailureDetectionGauge.vue'\nimport { getNormalizedP } from '@src/lib/utils'\nimport urls from '@config/server-urls'\n\nexport default {\n  name: 'TimelapseUploadPage',\n\n  components: {\n    NavBar,\n    VideoBox,\n    FailureDetectionGauge,\n    vueDropzone: vue2Dropzone,\n  },\n\n  props: {\n    csrf: {\n      type: String,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      default: false,\n    },\n  },\n\n  data() {\n    return {\n      dropzoneOptions: {\n        withCredentials: true,\n        maxFilesize: 100, // MB\n        timeout: 60 * 60 * 1000, // 1 hour for large files\n        acceptedFiles: 'video/mp4,video/mpeg',\n        url: urls.uploadedTimelapses(),\n        headers: { 'X-CSRFToken': this.csrf },\n        paramName: 'file',\n      },\n      timelapses: [],\n      selectedTimelapse: null,\n      pollInterval: null,\n      activeTab: 0,\n      currentPosition: 0,\n      predictions: [],\n      warningTriggered: false,\n    }\n  },\n\n  computed: {\n    normalizedP() {\n      return getNormalizedP(this.predictions, this.currentPosition, true)\n    },\n  },\n\n  watch: {\n    normalizedP(newVal) {\n      if (newVal > 0.33) {\n        this.warningTriggered = true\n      }\n    },\n  },\n\n  created() {\n    if (this.isAuthenticated) {\n      this.fetchTimelapses()\n      this.pollInterval = setInterval(this.fetchTimelapses, 10000)\n    }\n  },\n\n  beforeDestroy() {\n    if (this.pollInterval) {\n      clearInterval(this.pollInterval)\n    }\n  },\n\n  methods: {\n    computeIssueFromPredictions(predictions) {\n      const MINOR_THRESHOLD = 0.33\n      const MAJOR_THRESHOLD = 0.66\n      let firstIssueFrame = null\n      let issueSeverity = null\n\n      for (const pred of predictions) {\n        if (firstIssueFrame === null) {\n          if (pred.p >= MAJOR_THRESHOLD) {\n            firstIssueFrame = pred.frame\n            issueSeverity = 'major'\n          } else if (pred.p >= MINOR_THRESHOLD) {\n            firstIssueFrame = pred.frame\n            issueSeverity = 'minor'\n          }\n        } else if (issueSeverity === 'minor' && pred.p >= MAJOR_THRESHOLD) {\n          issueSeverity = 'major'\n        }\n      }\n      return { firstIssueFrame, issueSeverity }\n    },\n\n    fetchTimelapses() {\n      axios.get(urls.uploadedTimelapses()).then((response) => {\n        this.timelapses = response.data\n        // Compute issue values from predictions (not stored in DB, computed client-side)\n        this.timelapses.forEach((timelapse) => {\n          if (timelapse.status === 'completed' && timelapse.predictions_json_url) {\n            axios.get(timelapse.predictions_json_url).then((predResponse) => {\n              const { firstIssueFrame, issueSeverity } = this.computeIssueFromPredictions(\n                predResponse.data\n              )\n              this.$set(timelapse, 'first_issue_frame', firstIssueFrame)\n              this.$set(timelapse, 'issue_severity', issueSeverity)\n            })\n          }\n        })\n      })\n    },\n\n    onUploadSuccess(file) {\n      this.$refs.dropzone.removeFile(file)\n      this.fetchTimelapses()\n    },\n\n    onUploadError(file, message) {\n      console.error('Upload failed:', message)\n      alert(this.$t('Upload failed. Please try again.'))\n    },\n\n    openTimelapse(timelapse) {\n      if (timelapse.status !== 'completed') return\n\n      this.selectedTimelapse = timelapse\n      this.currentPosition = 0\n      this.predictions = []\n      this.activeTab = 0\n      this.warningTriggered = false\n\n      // Fetch predictions for gauge\n      if (timelapse.predictions_json_url) {\n        axios.get(timelapse.predictions_json_url).then((response) => {\n          this.predictions = response.data\n        })\n      }\n\n      this.$bvModal.show('results-modal')\n    },\n\n    onTimeUpdate(currentPosition) {\n      this.currentPosition = currentPosition\n    },\n\n    onModalHidden() {\n      this.selectedTimelapse = null\n      this.predictions = []\n      this.currentPosition = 0\n      this.warningTriggered = false\n    },\n\n    formatDate(dateString) {\n      const date = new Date(dateString)\n      return date.toLocaleDateString(undefined, {\n        month: 'numeric',\n        day: 'numeric',\n        year: 'numeric',\n      })\n    },\n\n    statusClass(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity === 'major') return 'major-issue'\n        if (timelapse.issue_severity === 'minor') return 'minor-issue'\n        return 'no-issue'\n      }\n      if (timelapse.status === 'processing') return 'processing'\n      if (timelapse.status === 'failed') return 'failed'\n      return 'pending'\n    },\n\n    statusIcon(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity) return 'fas fa-exclamation-triangle'\n        return 'fas fa-check-circle'\n      }\n      if (timelapse.status === 'processing') return 'fas fa-spinner fa-spin'\n      if (timelapse.status === 'failed') return 'fas fa-times-circle'\n      return 'far fa-clock'\n    },\n\n    statusText(timelapse) {\n      if (timelapse.status === 'completed') {\n        if (timelapse.issue_severity === 'major') {\n          return `${this.$t('Major problems at frame')} #${timelapse.first_issue_frame}`\n        }\n        if (timelapse.issue_severity === 'minor') {\n          return `${this.$t('Minor problems at frame')} #${timelapse.first_issue_frame}`\n        }\n        return this.$t('No problems detected')\n      }\n      if (timelapse.status === 'processing') return this.$t('Processing...')\n      if (timelapse.status === 'failed') return this.$t('Processing failed')\n      return this.$t('Pending...')\n    },\n\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.timelapse-upload\n  padding: 2rem 0\n  max-width: 1100px\n  margin: 0 auto\n\n// Hero Section\n.hero-section\n  padding: 1rem 0 2rem\n\n.hero-title\n  font-size: 2rem\n  font-weight: bold\n  margin-bottom: 1rem\n  i\n    color: var(--color-primary)\n    margin-right: 0.5rem\n\n.hero-subtitle\n  color: var(--color-text-secondary)\n  font-size: 1rem\n  line-height: 1.6\n  max-width: 800px\n  margin: 0 auto\n\n.hero-cta\n  margin-top: 1.5rem\n  display: flex\n  flex-direction: column\n  align-items: center\n  gap: 0.75rem\n\n.learn-more-link\n  color: var(--color-text-secondary)\n  font-size: 0.875rem\n  text-decoration: none\n  display: inline-flex\n  align-items: center\n  gap: 0.375rem\n  &:hover\n    color: var(--color-primary)\n    text-decoration: underline\n  i\n    font-size: 0.75rem\n\n// Section Divider\n.section-divider\n  border: none\n  border-top: 1px solid var(--color-divider-muted)\n  margin: 2rem 0\n\n// Section Heading\n.section-heading\n  font-size: 1.25rem\n  font-weight: bold\n  margin-bottom: 1rem\n\n// Video and Upload Row\n.video-upload-row\n  display: grid\n  grid-template-columns: 1fr 1fr\n  gap: 2rem\n  align-items: start\n  @media (max-width: 768px)\n    grid-template-columns: 1fr\n    gap: 2rem\n\n// Upload Section (Left)\n.upload-section\n  padding: 0\n\n.upload-card\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  padding: 1.5rem\n\n.upload-intro\n  color: var(--color-text-secondary)\n  font-size: 0.9375rem\n  margin-bottom: 1.25rem\n  line-height: 1.5\n\n.upload-dropzone\n  border: 2px dashed var(--color-divider)\n  border-radius: var(--border-radius-md)\n  background: transparent\n  padding: 2rem 1.5rem\n  text-align: center\n  cursor: pointer\n  transition: border-color 0.2s, background-color 0.2s\n  &:hover\n    border-color: var(--color-primary)\n    background: var(--color-hover)\n\n// Video Section (Right)\n.video-section\n  padding: 0\n\n.video-wrapper\n  position: relative\n  width: 100%\n  padding-bottom: 56.25% // 16:9 aspect ratio\n  background: var(--color-surface-primary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  iframe\n    position: absolute\n    top: 0\n    left: 0\n    width: 100%\n    height: 100%\n\n.video-caption\n  margin-top: 0.75rem\n  font-size: 0.875rem\n  line-height: 1.5\n\n.dropzone-content\n  pointer-events: none\n\n.upload-icon\n  font-size: 2rem\n  color: var(--color-text-secondary)\n  margin-bottom: 1rem\n\n.upload-text\n  font-size: 1rem\n  color: var(--color-text-primary)\n  margin-bottom: 0.5rem\n\n.upload-or\n  color: var(--color-text-secondary)\n  font-size: 0.875rem\n  margin-bottom: 0.75rem\n\n.browse-btn\n  pointer-events: none\n  padding: 0.5rem 1.5rem\n\n.upload-formats\n  font-size: 0.75rem\n  color: var(--color-text-secondary)\n  margin-top: 1rem\n  margin-bottom: 0\n\n// Analyses Section\n.analyses-section\n  padding: 0.5rem 0\n\n.empty-state\n  padding: 3rem\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n\n.empty-icon\n  font-size: 3rem\n  color: var(--color-divider)\n  margin-bottom: 1rem\n\n// Analyses Grid\n.analyses-grid\n  display: grid\n  grid-template-columns: repeat(3, 1fr)\n  gap: 1.25rem\n  @media (max-width: 992px)\n    grid-template-columns: repeat(2, 1fr)\n  @media (max-width: 576px)\n    grid-template-columns: 1fr\n\n// Analysis Card\n.analysis-card\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  overflow: hidden\n  position: relative\n  transition: transform 0.2s, box-shadow 0.2s\n  &.clickable\n    cursor: pointer\n    &:hover\n      transform: translateY(-2px)\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3)\n\n.card-thumbnail\n  background: var(--color-surface-primary)\n  height: 140px\n  display: flex\n  align-items: center\n  justify-content: center\n  overflow: hidden\n  position: relative\n\n.poster-img\n  width: 100%\n  height: 100%\n  object-fit: cover\n\n.thumbnail-icon\n  font-size: 3rem\n  color: var(--color-divider)\n\n.play-overlay\n  position: absolute\n  top: 0\n  left: 0\n  right: 0\n  bottom: 0\n  background: rgba(0, 0, 0, 0.2)\n  display: flex\n  align-items: center\n  justify-content: center\n  transition: background 0.2s\n\n.play-icon\n  font-size: 3.5rem\n  color: rgba(255, 255, 255, 0.8)\n  text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3)\n  transition: transform 0.2s\n\n.issues-badge\n  position: absolute\n  top: 0.5rem\n  right: 0.5rem\n  background: var(--color-danger)\n  color: white\n  font-size: 0.75rem\n  font-weight: bold\n  padding: 0.25rem 0.625rem\n  border-radius: var(--border-radius-sm)\n\n.analysis-card.clickable:hover\n  .play-overlay\n    background: rgba(0, 0, 0, 0.35)\n  .play-icon\n    transform: scale(1.1)\n\n.card-info\n  padding: 1rem\n\n.card-filename\n  font-weight: bold\n  font-size: 0.9375rem\n  margin-bottom: 0.375rem\n  white-space: nowrap\n  overflow: hidden\n  text-overflow: ellipsis\n\n.card-date\n  font-size: 0.8125rem\n  margin-bottom: 0.5rem\n  i\n    margin-right: 0.375rem\n\n.card-status\n  font-size: 0.8125rem\n  display: flex\n  align-items: center\n  gap: 0.375rem\n  &.no-issue\n    color: var(--color-success, #28a745)\n  &.minor-issue\n    color: var(--color-warning, #ffc107)\n  &.major-issue\n    color: var(--color-danger)\n  &.processing\n    color: var(--color-text-secondary)\n  &.failed\n    color: var(--color-danger)\n  &.pending\n    color: var(--color-text-secondary)\n\n// Results Modal\n.timelapse-viewer\n  .alert\n    border-radius: var(--border-radius-sm)\n\n  // Set video player height like the print page does\n  ::v-deep .video-js\n    height: calc(100vh - 350px)\n\n::v-deep .nav-tabs\n  margin-bottom: 1rem\n\n::v-deep .vue-dropzone\n  min-height: auto !important\n  .dz-message\n    margin: 0\n\n::v-deep .dz-preview\n  display: none !important\n\n// Announcement Badge\n.announcement-badge\n  display: inline-flex\n  align-items: center\n  gap: 0.5rem\n  padding: 0.625rem 1.25rem\n  background: var(--color-surface-secondary)\n  border-radius: var(--border-radius-md)\n  color: var(--color-success, #28a745)\n  font-weight: 600\n  i\n    font-size: 1.25rem\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TimelapseUploadPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TimelapseUploadPage.vue?vue&type=template&id=3178e435&scoped=true&\"\nimport script from \"./TimelapseUploadPage.vue?vue&type=script&lang=js&\"\nexport * from \"./TimelapseUploadPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TimelapseUploadPage.vue?vue&type=style&index=0&id=3178e435&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3178e435\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[(_vm.trialDaysLeft >= 29)?_c('h3',{staticClass:\"py-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Your 30-Day {localizedDom} Free Trial Has Started!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('Plan')))])]},proxy:true}],null,false,996614776)})],1):_c('h3',{staticClass:\"pt-3\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"target\":\"_blank\",\"href\":_vm.getDocUrl('/user-guides/upgrade-to-pro/')}},[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('Plan'))+\" \")])]},proxy:true},{key:\"trialDaysLeft\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.trialDaysLeft)+\" \")]},proxy:true}])})],1),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited, 25 FPS Premium Webcam Streaming')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('250 Hours Watched by AI for Failure Detection')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Upload and Printing')))])]),_c('div',{staticClass:\"pb-1\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"lead py-4\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Link your 3D printer now so that you can fully enjoy the 30-Day Free Trial' ))+\"! \")]),_c('div',{staticClass:\"d-flex flex-column align-center justify-content-center\"},[_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/wizard/\"}},[_vm._v(_vm._s(_vm.$t('Link Printer')))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"It's as easy as 1-2-3\"))+\". \")])]),_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-block mx-auto\",attrs:{\"href\":\"/printers/\"}},[_vm._v(_vm._s(_vm.$t('Just Checking Out')))])]),_c('div',[_c('div',{staticClass:\"text-muted mx-auto text-center font-weight-light\"},[_vm._v(\" \"+_vm._s(_vm.$t('Not a whole lot you can see without your printer linked'))+\". \")])])])])]),_c('div',{staticClass:\"footer-note small\"},[_c('i18next',{attrs:{\"translation\":_vm.$t('Not ready to start yet? {localizedDom} to pause your free trial.')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"}},[_vm._v(_vm._s(_vm.$t('Email us')))])]},proxy:true}])})],1)],1)],1)])],1)],1)]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #content>\n      <b-container>\n        <b-row class=\"justify-content-center\">\n          <b-col>\n            <div class=\"wizard-container full-on-mobile\">\n              <b-container>\n                <b-row>\n                  <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                    <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                      <use href=\"#svg-logo-compact\" />\n                    </svg>\n                  </div>\n                </b-row>\n                <b-row>\n                  <h1 class=\"mx-auto mt-4\">\n                    {{ $t('Welcome To') }} {{ $syndicateText.brandName }}\n                  </h1>\n                </b-row>\n                <b-row>\n                  <b-col>\n                    <hr />\n                  </b-col>\n                </b-row>\n                <b-row>\n                  <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                    <h3 v-if=\"trialDaysLeft >= 29\" class=\"py-3\">\n                      <i18next\n                        :translation=\"$t('Your 30-Day {localizedDom} Free Trial Has Started!')\"\n                      >\n                        <template #localizedDom>\n                          <a class=\"link\" :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\">AI Premium {{ $t('Plan') }}</a>\n                        </template>\n                      </i18next>\n                    </h3>\n                    <h3 v-else class=\"pt-3\">\n                      <i18next\n                        :translation=\"\n                          $t('{trialDaysLeft} Days Left on Your {localizedDom} Free Trial!')\n                        \"\n                      >\n                        <template #localizedDom>\n                          <a\n                            class=\"link\"\n                            target=\"_blank\"\n                            :href=\"getDocUrl('/user-guides/upgrade-to-pro/')\"\n                            >AI Premium {{ $t('Plan') }}\n                          </a>\n                        </template>\n                        <template #trialDaysLeft>\n                          {{ trialDaysLeft }}\n                        </template>\n                      </i18next>\n                    </h3>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">\n                        {{ $t('Unlimited, 25 FPS Premium Webcam Streaming') }}</span\n                      >\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('250 Hours Watched by AI for Failure Detection')\n                      }}</span>\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('G-Code Remote Upload and Printing')\n                      }}</span>\n                    </div>\n                    <div class=\"pb-1\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                      }}</span>\n                    </div>\n                    <div class=\"lead py-4\">\n                      {{\n                        $t(\n                          'Link your 3D printer now so that you can fully enjoy the 30-Day Free Trial'\n                        )\n                      }}!\n                    </div>\n                    <div class=\"d-flex flex-column align-center justify-content-center\">\n                      <div class=\"mt-5\">\n                        <a\n                          href=\"/printers/wizard/\"\n                          class=\"btn btn-primary btn-block mx-auto btn-lg\"\n                          >{{ $t('Link Printer') }}</a\n                        >\n                      </div>\n                      <div>\n                        <div class=\"text-muted mx-auto text-center font-weight-light\">\n                          {{ $t(\"It's as easy as 1-2-3\") }}.\n                        </div>\n                      </div>\n                      <div class=\"mt-4\">\n                        <a href=\"/printers/\" class=\"btn btn-outline-secondary btn-block mx-auto\">{{\n                          $t('Just Checking Out')\n                        }}</a>\n                      </div>\n                      <div>\n                        <div class=\"text-muted mx-auto text-center font-weight-light\">\n                          {{ $t('Not a whole lot you can see without your printer linked') }}.\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </b-row>\n                <div class=\"footer-note small\">\n                  <i18next\n                    :translation=\"\n                      $t('Not ready to start yet? {localizedDom} to pause your free trial.')\n                    \"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"mailto:support@obico.io?subject=Please%20pause%20my%20free%20trial\"\n                        >{{ $t('Email us') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </b-container>\n            </div>\n          </b-col>\n        </b-row>\n      </b-container>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport PageLayout from '@src/components/PageLayout.vue'\n\nexport default {\n  components: {\n    PageLayout,\n  },\n\n  props: {\n    trialDaysLeft: {\n      type: Number,\n      required: true,\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding: 1.5rem 0.6rem 3rem\n  background: var(--color-surface-secondary)\n  -webkit-box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.3) !important\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.3) !important\n  border: none !important\n  border-radius: var(--border-radius-lg)\n\n.btn-link\n  color: var(--color-text-primary)\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 0.5em\n\n.success\n  width: 12rem\n\n.footer-note\n  margin: 3rem 0 -1.5rem\n  text-align: right\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WelcomePage.vue?vue&type=template&id=34f8280e&scoped=true&\"\nimport script from \"./WelcomePage.vue?vue&type=script&lang=js&\"\nexport * from \"./WelcomePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WelcomePage.vue?vue&type=style&index=0&id=34f8280e&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"34f8280e\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('page-layout',{scopedSlots:_vm._u([{key:\"topBarLeft\",fn:function(){return [_c('div',{staticClass:\"page-name truncated\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja AI Configuration')))])]},proxy:true},{key:\"content\",fn:function(){return [_c('div',{staticClass:\"body-wrap\"},[_c('div',{staticClass:\"heading-wrap\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Nozzle Ninja AI Configuration')))])]),_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Nozzle Ninja, {brandName}’s First Layer AI, Is Here!', { brandName: _vm.$syndicateText.brandName, }))+\" \")]),_c('p',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Configure a compatible nozzle camera to get started'))+\" \")])]),(!_vm.selectedPrinter)?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" 🔄 \"+_vm._s(_vm.$t('Update the {brandName} Plugin in OctoPrint or Fluidd/Mainsail', { brandName: _vm.$syndicateText.brandName, }))+\" \")]),_c('p',{staticStyle:{\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t( 'Before you configure Nozzle Ninja, Update the {brandName} plugin in OctoPrint or Fluidd/Mainsail. Once the plugin is up-to-date, restart your printer or Raspberry, and then come back here.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])]):_vm._e(),_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Select the Printer You Want to Configure')))]),(!_vm.printers)?_c('loading-placeholder'):_c('div',{staticStyle:{\"display\":\"flex\",\"min-width\":\"100%\"}},[(_vm.printers.length > 0)?_c('div',{staticClass:\"has-printers-wrap\"},[_c('p',[_vm._v(_vm._s(_vm.printers.length)+\" \"+_vm._s(_vm.$t('Printers Found')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Select which printer(s) you want to configure. Note: AI detection hours are currently not impacted by first layer AI.' ))+\" \")]),_c('b-form-select',{staticClass:\"form-control printer-select\",model:{value:(_vm.selectedPrinter),callback:function ($$v) {_vm.selectedPrinter=$$v},expression:\"selectedPrinter\"}},[_c('option',{attrs:{\"selected\":\"\",\"disabled\":\"\"},domProps:{\"value\":null}},[_vm._v(\" \"+_vm._s(_vm.$t('Please select a printer to configure'))+\" \")]),_vm._l((_vm.printers),function(printer){return _c('option',{key:printer.name,domProps:{\"value\":printer}},[_vm._v(\" \"+_vm._s(printer.name)+\" \")])})],2),(_vm.showSuccess)?_c('p',{staticClass:\"text-success\",staticStyle:{\"text-align\":\"center\",\"margin\":\"0\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Nozzle camera URL saved!'))+\" \")]):_vm._e(),(_vm.selectedPrinter)?_c('div',{staticClass:\"selected-printer-content\"},[(_vm.selectedPrinter.agent_name === 'octoprint_obico')?_c('div',{staticClass:\"selected-text-wrap\"},[_c('p',[_c('span',{staticClass:\"system-text\"},[_vm._v(_vm._s(_vm.$t('System: ')))]),_vm._v(\" OctoPrint \")])]):_c('div',{staticClass:\"selected-text-wrap\"},[_c('p',[_c('span',{staticClass:\"system-text\"},[_vm._v(_vm._s(_vm.$t('System: ')))]),_vm._v(\" Klipper \")])]),(_vm.selectedPrinter.agent_name === 'moonraker_obico')?_c('div',{staticStyle:{\"text-align\":\"left\"}},[_c('h5',[_vm._v(_vm._s(_vm.$t('Post first layer scan')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Scan your print after your first layer is done at a lower speed. The scan will produce better images more in focus and with less motion blur. This is opted in by default but you can opt out of it.' ))+\" \")]),_c('p',{staticClass:\"text-warning\"},[_vm._v(\" \"+_vm._s(_vm.$t('Note: Please make sure'))+\" \"),_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl(\n                        '/user-guides/slicer-configuration-for-first-layer-ai-klipper-only/'\n                      ),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('the slicer correctly configured'))+\" \"),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})]),_vm._v(\". \"+_vm._s(_vm.$t(\"Otherwise it won't scan.\"))+\" \")]),_c('div',{staticClass:\"checkbox-wrapper\"},[_c('b-form-checkbox',{attrs:{\"size\":\"md\",\"checked\":_vm.firstLayerOptedIn},on:{\"change\":_vm.updateFirstLayerOptedIn}},[_vm._v(_vm._s(_vm.$t('Enable post first layer scan')))])],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Scan at height'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":0.1},on:{\"input\":_vm.updateFirstLayerZhop},model:{value:(_vm.firstLayerScanZhop),callback:function ($$v) {_vm.firstLayerScanZhop=$$v},expression:\"firstLayerScanZhop\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Cooldown extruder'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":5,\"unit\":\"°C\"},on:{\"input\":_vm.updateFirstLayerCooldownTemp},model:{value:(_vm.firstLayerCooldownTemp),callback:function ($$v) {_vm.firstLayerCooldownTemp=$$v},expression:\"firstLayerCooldownTemp\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Retract before scan'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":0.5},on:{\"input\":_vm.updateFirstLayerRetract},model:{value:(_vm.firstLayerScanRetract),callback:function ($$v) {_vm.firstLayerScanRetract=$$v},expression:\"firstLayerScanRetract\"}})],1),_c('div',{staticClass:\"my-2\",staticStyle:{\"display\":\"flex\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Retraction speed'))+\": \")]),_c('number-input',{staticStyle:{\"max-width\":\"20rem\"},attrs:{\"step\":1,\"unit\":\"mm/s\"},on:{\"input\":_vm.updateFirstLayerScanRetractSpeed},model:{value:(_vm.firstLayerScanRetractSpeed),callback:function ($$v) {_vm.firstLayerScanRetractSpeed=$$v},expression:\"firstLayerScanRetractSpeed\"}})],1)]):_vm._e()]):_vm._e()],1):_c('div',{staticClass:\"no-printers-wrap\"},[_c('i',{staticClass:\"fas fa-times-circle fa-2x\"}),_c('h3',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('No printers found!')))])])])],1),(_vm.selectedPrinter)?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja Configuration')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Follow the camera configuration guide to configure your nozzle camera with {brandName}', { brandName: _vm.$syndicateText.brandName } ))+\" \")]),(_vm.selectedPrinter.agent_name !== 'octoprint_obico')?_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja configuration guide for Klipper '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})]):_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration-octoprint/'),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja configuration guide for Octoprint '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})])]):_vm._e(),(_vm.selectedPrinter && _vm.selectedPrinter.agent_name !== 'octoprint_obico')?_c('div',{staticClass:\"body-section\"},[_c('h2',{staticStyle:{\"margin\":\"0\"}},[_vm._v(_vm._s(_vm.$t('Slicer Configuration')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Configure your slicer to send first layer information to {brandName} and optionally enable first layer scanning. First layer scanning is an experimental feature that enables a slow scan of the first layer. This feature requires some configureation to avoid impacting print quality.', { brandName: _vm.$syndicateText.brandName } ))),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('Currently, PrusaSlicer, SuperSlicer and OrcaSlicer are supported.'))+\" \")]),_c('a',{staticStyle:{\"font-weight\":\"bold\"},attrs:{\"href\":_vm.getDocUrl(\n              '/user-guides/first_layer_ai/slicer-configuration-for-first-layer-ai-klipper-only/'\n            ),\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.$t('Slicer configuration guide '))),_c('i',{staticClass:\"fas fa-external-link-alt fa-xs\"})])]):_vm._e()])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <page-layout>\n    <template #topBarLeft>\n      <div class=\"page-name truncated\">{{ $t('Nozzle Ninja AI Configuration') }}</div>\n    </template>\n\n    <template #content>\n      <div class=\"body-wrap\">\n        <div class=\"heading-wrap\">\n          <h1>{{ $t('Nozzle Ninja AI Configuration') }}</h1>\n        </div>\n        <div class=\"body-section\">\n          <h2 style=\"margin: 0\">\n            {{\n              $t('Nozzle Ninja, {brandName}’s First Layer AI, Is Here!', {\n                brandName: $syndicateText.brandName,\n              })\n            }}\n          </h2>\n          <p style=\"margin: 0\">\n            {{ $t('Configure a compatible nozzle camera to get started') }}\n          </p>\n        </div>\n        <div v-if=\"!selectedPrinter\" class=\"body-section\">\n          <h2 style=\"margin: 0\">\n            🔄\n            {{\n              $t('Update the {brandName} Plugin in OctoPrint or Fluidd/Mainsail', {\n                brandName: $syndicateText.brandName,\n              })\n            }}\n          </h2>\n          <p style=\"margin: 0\">\n            {{\n              $t(\n                'Before you configure Nozzle Ninja, Update the {brandName} plugin in OctoPrint or Fluidd/Mainsail. Once the plugin is up-to-date, restart your printer or Raspberry, and then come back here.',\n                { brandName: $syndicateText.brandName }\n              )\n            }}\n          </p>\n        </div>\n        <div class=\"body-section\">\n          <h2 style=\"margin: 0\">{{ $t('Select the Printer You Want to Configure') }}</h2>\n          <loading-placeholder v-if=\"!printers\" />\n          <div v-else style=\"display: flex; min-width: 100%\">\n            <!-- Printer selection -->\n            <div v-if=\"printers.length > 0\" class=\"has-printers-wrap\">\n              <p>{{ printers.length }} {{ $t('Printers Found') }}</p>\n              <p>\n                {{\n                  $t(\n                    'Select which printer(s) you want to configure. Note: AI detection hours are currently not impacted by first layer AI.'\n                  )\n                }}\n              </p>\n              <b-form-select v-model=\"selectedPrinter\" class=\"form-control printer-select\">\n                <option :value=\"null\" selected disabled>\n                  {{ $t('Please select a printer to configure') }}\n                </option>\n                <option v-for=\"printer in printers\" :key=\"printer.name\" :value=\"printer\">\n                  {{ printer.name }}\n                </option>\n              </b-form-select>\n              <p v-if=\"showSuccess\" class=\"text-success\" style=\"text-align: center; margin: 0\">\n                {{ $t('Nozzle camera URL saved!') }}\n              </p>\n              <!-- Opened when select printer -->\n              <div v-if=\"selectedPrinter\" class=\"selected-printer-content\">\n                <div\n                  v-if=\"selectedPrinter.agent_name === 'octoprint_obico'\"\n                  class=\"selected-text-wrap\"\n                >\n                  <p>\n                    <span class=\"system-text\">{{ $t('System: ') }}</span> OctoPrint\n                  </p>\n                </div>\n                <div v-else class=\"selected-text-wrap\">\n                  <p>\n                    <span class=\"system-text\">{{ $t('System: ') }}</span> Klipper\n                  </p>\n                </div>\n                <div\n                  v-if=\"selectedPrinter.agent_name === 'moonraker_obico'\"\n                  style=\"text-align: left\"\n                >\n                  <h5>{{ $t('Post first layer scan') }}</h5>\n                  <p>\n                    {{\n                      $t(\n                        'Scan your print after your first layer is done at a lower speed. The scan will produce better images more in focus and with less motion blur. This is opted in by default but you can opt out of it.'\n                      )\n                    }}\n                  </p>\n\n                  <p class=\"text-warning\">\n                    {{ $t('Note: Please make sure') }}\n                    <a\n                      :href=\"\n                        getDocUrl(\n                          '/user-guides/slicer-configuration-for-first-layer-ai-klipper-only/'\n                        )\n                      \"\n                      target=\"_blank\"\n                      style=\"font-weight: bold\"\n                      >{{ $t('the slicer correctly configured') }}\n                      <i class=\"fas fa-external-link-alt fa-xs\"></i></a\n                    >. {{ $t(\"Otherwise it won't scan.\") }}\n                  </p>\n\n                  <div class=\"checkbox-wrapper\">\n                    <b-form-checkbox\n                      size=\"md\"\n                      :checked=\"firstLayerOptedIn\"\n                      @change=\"updateFirstLayerOptedIn\"\n                      >{{ $t('Enable post first layer scan') }}</b-form-checkbox\n                    >\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Scan at height') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanZhop\"\n                      :step=\"0.1\"\n                      style=\"max-width: 20rem\"\n                      @input=\"updateFirstLayerZhop\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Cooldown extruder') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerCooldownTemp\"\n                      :step=\"5\"\n                      style=\"max-width: 20rem\"\n                      unit=\"°C\"\n                      @input=\"updateFirstLayerCooldownTemp\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Retract before scan') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanRetract\"\n                      :step=\"0.5\"\n                      style=\"max-width: 20rem\"\n                      @input=\"updateFirstLayerRetract\"\n                    ></number-input>\n                  </div>\n                  <div style=\"display: flex\" class=\"my-2\">\n                    <div>{{ $t('Retraction speed') }}:&nbsp;</div>\n                    <number-input\n                      v-model=\"firstLayerScanRetractSpeed\"\n                      :step=\"1\"\n                      style=\"max-width: 20rem\"\n                      unit=\"mm/s\"\n                      @input=\"updateFirstLayerScanRetractSpeed\"\n                    ></number-input>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <!-- No printers found scenario -->\n            <div v-else class=\"no-printers-wrap\">\n              <i class=\"fas fa-times-circle fa-2x\"></i>\n              <h3 style=\"margin: 0\">{{ $t('No printers found!') }}</h3>\n            </div>\n          </div>\n        </div>\n\n        <div v-if=\"selectedPrinter\" class=\"body-section\">\n          <h2 style=\"margin: 0\">{{ $t('Nozzle Ninja Configuration') }}</h2>\n          <p>\n            {{\n              $t(\n                'Follow the camera configuration guide to configure your nozzle camera with {brandName}',\n                { brandName: $syndicateText.brandName }\n              )\n            }}\n          </p>\n          <a\n            v-if=\"selectedPrinter.agent_name !== 'octoprint_obico'\"\n            :href=\"getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration/')\"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Nozzle Ninja configuration guide for Klipper ')\n            }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n          <a\n            v-else\n            :href=\"getDocUrl('/user-guides/first_layer_ai/nozzle-camera-configuration-octoprint/')\"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Nozzle Ninja configuration guide for Octoprint ')\n            }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n        </div>\n        <div\n          v-if=\"selectedPrinter && selectedPrinter.agent_name !== 'octoprint_obico'\"\n          class=\"body-section\"\n        >\n          <h2 style=\"margin: 0\">{{ $t('Slicer Configuration') }}</h2>\n          <p>\n            {{\n              $t(\n                'Configure your slicer to send first layer information to {brandName} and optionally enable first layer scanning. First layer scanning is an experimental feature that enables a slow scan of the first layer. This feature requires some configureation to avoid impacting print quality.',\n                { brandName: $syndicateText.brandName }\n              )\n            }}<br />\n            {{ $t('Currently, PrusaSlicer, SuperSlicer and OrcaSlicer are supported.') }}\n          </p>\n          <a\n            :href=\"\n              getDocUrl(\n                '/user-guides/first_layer_ai/slicer-configuration-for-first-layer-ai-klipper-only/'\n              )\n            \"\n            target=\"_blank\"\n            style=\"font-weight: bold\"\n            >{{ $t('Slicer configuration guide ') }}<i class=\"fas fa-external-link-alt fa-xs\"></i\n          ></a>\n        </div>\n      </div>\n    </template>\n  </page-layout>\n</template>\n\n<script>\nimport urls from '@config/server-urls'\nimport axios from 'axios'\nimport { user } from '@src/lib/page-context'\nimport LoadingPlaceholder from '@src/components/LoadingPlaceholder.vue'\nimport PageLayout from '@src/components/PageLayout.vue'\nimport { printerCommManager } from '@src/lib/printer-comm'\nimport { getMoonrakerWebcams } from '@src/lib/printer-local-comm'\nimport { requestSnapshot } from '@src/lib/printer-local-comm'\nimport { normalizedPrinter } from '@src/lib/normalizers'\nimport NumberInput from '@src/components/NumberInput.vue'\n\nexport default {\n  name: 'CelestriusConfigurePage',\n\n  components: { LoadingPlaceholder, PageLayout, NumberInput },\n\n  data() {\n    return {\n      user: null,\n      printers: null,\n      selectedPrinter: null,\n      selectedPrinterComm: null,\n      inputValue: '',\n      showSuccess: false,\n      showFetchingWebcamLoader: false,\n      testSnapshotString: '',\n      urlPlaceHolder: 'Nozzle Camera Snapshot URL',\n      firstLayerOptedIn: true,\n      firstLayerScanZhop: 4,\n      firstLayerScanRetract: 6.5,\n      firstLayerScanRetractSpeed: 15,\n      firstLayerCooldownTemp: 170,\n    }\n  },\n\n  computed: {},\n\n  watch: {\n    selectedPrinter: {\n      async handler(newValue, oldValue) {\n        if (newValue == null) {\n          return\n        } else {\n          this.showSuccess = false\n        }\n        this.inputValue = newValue.ext.nozzlecam_url\n        this.firstLayerOptedIn = newValue.ext.first_layer_scan_opted_in\n        this.firstLayerScanZhop = newValue.ext.first_layer_scan_zhop\n        this.firstLayerScanRetract = newValue.ext.first_layer_scan_retract\n        this.firstLayerScanRetractSpeed = newValue.ext.first_layer_scan_retract_speed\n        this.firstLayerCooldownTemp = newValue.ext.first_layer_scan_cooldown_temp\n        if (newValue.status !== null) {\n          this.selectedPrinterComm = await printerCommManager.getOrCreatePrinterComm(\n            newValue.id,\n            urls.printerWebSocket(newValue.id)\n          )\n          if (newValue.agent_name !== 'octoprint_obico') {\n            this.showFetchingWebcamLoader = true\n            await this.selectedPrinterComm.connect(async () => {\n              await getMoonrakerWebcams(this.selectedPrinterComm)\n                .then((resp) => {\n                  newValue.webcamUrls = resp\n                  this.showFetchingWebcamLoader = false\n                })\n                .catch(() => {\n                  newValue.webcamUrls = undefined\n                  this.showFetchingWebcamLoader = false\n                })\n            })\n          } else {\n            await this.selectedPrinterComm.connect()\n          }\n        }\n      },\n    },\n  },\n\n  async created() {\n    this.user = user()\n    this.printers = await this.fetchPrinters()\n  },\n\n  mounted() {},\n\n  methods: {\n    async updateFirstLayerOptedIn(newValue) {\n      this.patchPrinter({ first_layer_scan_opted_in: newValue })\n    },\n    async updateFirstLayerRetract(newValue) {\n      this.patchPrinter({ first_layer_scan_retract: newValue })\n    },\n    async updateFirstLayerZhop(newValue) {\n      this.patchPrinter({ first_layer_scan_zhop: newValue })\n    },\n    async updateFirstLayerCooldownTemp(newValue) {\n      this.patchPrinter({ first_layer_scan_cooldown_temp: newValue })\n    },\n    async updateFirstLayerScanRetractSpeed(newValue) {\n      this.patchPrinter({ first_layer_scan_retract_speed: newValue })\n    },\n    async patchPrinter(data) {\n      return axios.patch(`/ent/api/printers/${this.selectedPrinter.id}/ext/`, data)\n    },\n    async onUpdateSettings() {\n      if (!this.inputValue.length) return\n\n      await this.patchPrinter({\n        nozzlecam_url: this.inputValue,\n      })\n        .then(async () => {\n          this.inputValue = ''\n          this.showSuccess = true\n          this.printers = await this.fetchPrinters()\n          this.selectedPrinter = null\n        })\n        .catch((err) => {\n          console.error('Failed to update printer settings: ', err)\n          this.showSuccess = false\n        })\n    },\n    async fetchPrinters() {\n      return await axios.get(urls.printers()).then((response) => {\n        response.data.map(async (p) => {\n          p.more = normalizedPrinter(p)\n          p.ext = await axios.get(`/ent/api/printers/${p.id}/ext/`).then((r) => r.data.ext)\n        })\n        return response.data\n      })\n    },\n    async testSnapshotUrl() {\n      if (this.selectedPrinter.status === null) {\n        this.$swal.Reject.fire({\n          html: `<h3 style=\"text-align: center\">Printer is offline!</h3>`,\n          customClass: {\n            container: 'dark-backdrop',\n          },\n        })\n        return\n      } else if (!this.selectedPrinter.more.isAgentVersionGte('2.4.6', '1.4.11')) {\n        this.$swal.Reject.fire({\n          html: `<h3 style=\"text-align: center\">\n            ${this.$i18next.t(\n              'The {brandName} plugin version is too old to use this function. Please update it to the latest version to test camera!',\n              { brandName: this.$syndicateText.brandName }\n            )}</h3>`,\n          customClass: {\n            container: 'dark-backdrop',\n          },\n        })\n        return\n      }\n\n      this.testSnapshotString = 'load'\n      requestSnapshot(this.selectedPrinterComm, this.inputValue)\n        .then((resp) => {\n          this.testSnapshotString = resp\n          this.$swal.fire({\n            html: `\n            <div style=\"display: flex; flex: 1; align-items: center; justify-content: center; flex-direction: column;\">\n              <p class=\"my-4 text-warning\">${this.$i18next.t(\n                'Please confirm the snapshot below came from a'\n              )} <b>${this.$i18next.t('nozzle camera')}</b>, ${this.$i18next.t(\n              'not a regular webcam. The AI will NOT function correctly on a regular camera.'\n            )}</p>\n              <img src='data:image/jpeg;base64,${\n                this.testSnapshotString\n              }' alt='test-image' width=400 height=300></img>\n            </div>\n          `,\n            customClass: {\n              container: 'dark-backdrop',\n            },\n          })\n        })\n        .catch((e) => {\n          this.testSnapshotString = ''\n          this.$swal.Reject.fire({\n            html: `<h3 style=\"text-align: center\">${this.$i18next.t(\n              'Unable to connect to your nozzle camera using the URL you entered!'\n            )}</h3><p>${this.$i18next.t(\n              'Please check the instruction for how to find the correct URL for your nozzle camera.'\n            )}`,\n            customClass: {\n              container: 'dark-backdrop',\n            },\n          })\n        })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.page-name\n  font-size: 1rem\n  max-width: 360px\n  font-weight: bold\n  @media (max-width: 768px)\n    max-width: 200px\n\nh1, h4\n  text-align: center\n\n.no-printers-wrap\n  display: flex\n  flex: 1\n  flex-direction: row\n  align-items: center\n  justify-content: center\n  gap: 10px\n\n.has-printers-wrap\n text-align: center\n flex-direction: column\n width: 100%\n\n.selected-printer-content\n  margin-top: var(--gap-between-blocks)\n  gap: var(--gap-between-blocks)\n\n\n.body-wrap\n  display: flex\n  align-items: center\n  justify-content: center\n  text-align: center\n  flex-direction: column\n  padding: var(--gap-between-blocks) calc(var(--gap-between-blocks) * 3)\n  gap: var(--gap-between-blocks)\n\n.heading-wrap\n display: flex\n flex-direction: column\n text-align: center\n margin-bottom: var(--gap-between-blocks)\n\n.body-section\n display: flex\n text-align: center\n flex-direction: column\n align-items: center\n justify-content: center\n min-width: 100%\n border-radius: var(--border-radius-md)\n background-color: var(--color-surface-primary)\n padding: var(--gap-between-blocks)\n gap: var(--gap-between-blocks)\n\n.note-text\n color: var(--color-warning)\n\n.printer-select\n  cursor: pointer\n  min-width: 100%\n  flex: 1\n  border: none\n  background-color: var(--color-surface-secondary)\n\n.webcam-select\n  cursor: pointer\n  border: none\n  background-color: var(--color-surface-secondary)\n\n.selected-text-wrap\n text-align: left\n\n.system-text\n color: var(--color-text-secondary)\n\n.primary-span\n  color: var(--color-primary)\n\n.input-save-wrap\n  display: flex\n  flex: 1\n  flex-direction: row\n  flex-wrap: wrap\n  justify-content: center\n  align-items: center\n  gap: var(--gap-between-blocks)\n  margin-bottom: var(--gap-between-blocks)\n\n.nozzle-input\n  background-color: var(--color-surface-secondary)\n\n.save-btn\n  background-color: var(--color-surface-secondary)\n  border: solid var(--color-surface-secondary) 2px\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n\n.test-btn\n  background-color: var(--color-surface-primary)\n  border: solid var(--color-text-primary) 2px\n  border-radius: var(--border-radius-sm)\n  color: var(--color-text-primary)\n  white-space: nowrap\n\n.config-help-wrap\n width: 100%\n display: flex\n flex-direction: column\n text-align: left\n\n.input-width\n flex: 1\n min-width: 200px\n\n.select-label\n color: var(--color-text-secondary)\n text-align: left\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CelestriusConfigurePage.vue?vue&type=template&id=e62ff952&scoped=true&\"\nimport script from \"./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"\nexport * from \"./CelestriusConfigurePage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CelestriusConfigurePage.vue?vue&type=style&index=0&id=e62ff952&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e62ff952\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[(_vm.redeemPeriod === 3)?[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico Pro Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Mintion customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Mintion customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")])]:_vm._e(),(_vm.redeemPeriod === 6)?[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your One Year Obico Pro Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Mintion customer, you are eligible for an exclusive life-time Pro Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.' ))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.' ))+\" \")])]:_vm._e(),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])],2),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mintion-obico-logo.png')}})])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your Pro Plan\")))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),_c('div',{staticClass:\"mintion-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[(_vm.redeemPeriod === 3)?_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month Pro Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'When your three-month plan expires, you will have the chance to upgrade to one of Obico’s Pro Plans at a special discounted rate. Learn more about the plan options' ))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])]):_vm._e(),(_vm.redeemPeriod === 6)?_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t( 'I already paid for the Pro Plan. Why do I need to enter my credit card information again?' ))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Your plan is fully covered for the first one year. After the first one year, the plan will renew with a special discount available exclusively for Mintion customers. You are free to cancel the plan at any time in the “Subscription” section of the Obico mobile or web app.' ))+\" \")])]):_vm._e(),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[(_vm.isPlanAdded)?_c('h2',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sign Up or Sign in to Your Obico Account'))+\" \")]):_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[(_vm.isPlanAdded)?[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('And get instant access to')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Signup/Sign In'))+\" \")])])])]:[_c('div',{staticClass:\"col-sm-12\"},[_c('h3',{staticClass:\"title d-flex justify-content-center\"},[_vm._v(\" \"+_vm._s(_vm.$t('Create an account or Sign in to Choose Your plan'))+\" \")]),_c('div',{staticClass:\"plan-not-added-features offset-md-1 offset-lg-2\"},[_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(\" \"+_vm._s(_vm.isPlanAdded ? _vm.$t('Unlimited AI Failure Detection') : _vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])])]),_c('div',{staticClass:\"col-md-10 offset-md-1 col-lg-8 offset-lg-2 p-0\"},[_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Create Account/Sign In'))+\" \")])])])])]],2)],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h2 v-if=\"isPlanAdded\" class=\"mx-auto mt-4\">\n                {{ $t('Sign Up or Sign in to Your Obico Account') }}\n              </h2>\n              <h1 v-else class=\"text-center mx-auto mt-4\">\n                {{ $t('Welcome To') }}\n                {{ $syndicateText.brandName }}\n              </h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <template v-if=\"isPlanAdded\">\n                <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                  <h3 class=\"title\">{{ $t('And get instant access to') }}</h3>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('Unlimited Premium Webcam Streaming')\n                    }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{ $t('Unlimited AI Failure Detection') }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('G-Code Remote Uploading and Printing')\n                    }}</span>\n                  </div>\n                  <div class=\"feature\">\n                    <i class=\"feature-check fas fa-check-circle\"></i\n                    ><span class=\"feature-text\">{{\n                      $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                    }}</span>\n                  </div>\n                  <div\n                    class=\"redirect-button d-flex flex-column align-center justify-content-center\"\n                  >\n                    <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                      {{ $t('Signup/Sign In') }}\n                    </a>\n                  </div>\n                </div>\n              </template>\n              <template v-else>\n                <div class=\"col-sm-12\">\n                  <h3 class=\"title d-flex justify-content-center\">\n                    {{ $t('Create an account or Sign in to Choose Your plan') }}\n                  </h3>\n                  <div class=\"plan-not-added-features offset-md-1 offset-lg-2\">\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Premium Webcam Streaming')\n                      }}</span>\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">\n                        {{\n                          isPlanAdded\n                            ? $t('Unlimited AI Failure Detection')\n                            : $t('AI Failure Detection')\n                        }}</span\n                      >\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('G-Code Remote Uploading and Printing')\n                      }}</span>\n                    </div>\n                    <div class=\"feature\">\n                      <i class=\"feature-check fas fa-check-circle\"></i\n                      ><span class=\"feature-text\">{{\n                        $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                      }}</span>\n                    </div>\n                  </div>\n                  <div class=\"col-md-10 offset-md-1 col-lg-8 offset-lg-2 p-0\">\n                    <div\n                      class=\"redirect-button d-flex flex-column align-center justify-content-center\"\n                    >\n                      <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                        {{ $t('Create Account/Sign In') }}\n                      </a>\n                    </div>\n                  </div>\n                </div>\n              </template>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'BttUserNotAuthenticatedModal',\n  props: {\n    isPlanAdded: {\n      type: Boolean,\n      required: true,\n    },\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttUserNotAuthenticatedModal.vue?vue&type=template&id=0f963e48&scoped=true&\"\nimport script from \"./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./BttUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=0f963e48&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0f963e48\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <!-- OR -->\n      <!-- Block Upgrade to  an Obico Pro Plan and get a 25% discount as a valued BTT customer! -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <template v-if=\"redeemPeriod === 3\">\n              <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico Pro Plan') }}</div>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'As a valued Mintion customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Mintion customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                  )\n                }}\n              </p>\n            </template>\n            <template v-if=\"redeemPeriod === 6\">\n              <div class=\"title pb-3\">{{ $t('Activate Your One Year Obico Pro Plan') }}</div>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'As a valued Mintion customer, you are eligible for an exclusive life-time Pro Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.'\n                  )\n                }}\n              </p>\n              <p class=\"pb-3\">\n                {{\n                  $t(\n                    'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.'\n                  )\n                }}\n              </p>\n            </template>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/mintion-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your Pro Plan\") }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"mintion-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div v-if=\"redeemPeriod === 3\" class=\"question\">\n              <h6>{{ $t('What happens when the three-month Pro Plan expires?') }}</h6>\n              <p>\n                {{\n                  $t(\n                    'When your three-month plan expires, you will have the chance to upgrade to one of Obico’s Pro Plans at a special discounted rate. Learn more about the plan options'\n                  )\n                }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n            <div v-if=\"redeemPeriod === 6\" class=\"question\">\n              <h6>\n                {{\n                  $t(\n                    'I already paid for the Pro Plan. Why do I need to enter my credit card information again?'\n                  )\n                }}\n              </h6>\n              <p>\n                {{\n                  $t(\n                    'Your plan is fully covered for the first one year. After the first one year, the plan will renew with a special discount available exclusively for Mintion customers. You are free to cancel the plan at any time in the “Subscription” section of the Obico mobile or web app.'\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport BttRedeemCompletedModal from './components/BttRedeemCompletedModal.vue'\nimport BttUserNotAuthenticatedModal from './components/BttUserNotAuthenticatedModal.vue'\nimport { SupportEmail } from '../../../src/lib/consts.js'\n\nexport default {\n  name: 'MintionRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      free3mCouponCodePrefix: 'M58293',\n      free6mCouponCodePrefix: 'MINTION',\n      redirectUrlWhenNotAuthenticated: '',\n      redeemPeriod: '',\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    if (couponCode.startsWith(this.free3mCouponCodePrefix)) {\n      this.isValidCouponCode = true\n      this.redeemPeriod = 3\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/mintion/?coupon_code=' + couponCode + '&redirect=' + true\n      )\n    } else if (couponCode.startsWith(this.free6mCouponCodePrefix)) {\n      this.isValidCouponCode = true\n      this.redeemPeriod = 6\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/mintion/?coupon_code=' + couponCode + '&redirect=' + true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              this.handlePlanAdded()\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    openBttUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        BttUserNotAuthenticatedModal,\n        {\n          isPlanAdded: true,\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanAdded() {\n      const urlParams = new URLSearchParams(window.location.search)\n      const couponCode = urlParams.get('coupon_code')\n\n      if (this.redeemPeriod === 3) {\n        axios\n          .post(urls.redeemMintion3mUnlimited(), {\n            coupon_code: couponCode,\n          })\n          .then(() => {\n            this.$swal.openModalWithComponent(\n              BttRedeemCompletedModal,\n              {},\n              {\n                showConfirmButton: false,\n                allowOutsideClick: false,\n                width: '55em',\n              }\n            )\n          })\n          .catch((error) => {\n            const resp = error.response\n            if (resp.status === 412) {\n              const reason = resp.data.reason\n              // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n              if (reason === 'already_redeemed') {\n                this.$swal.Prompt.fire({\n                  title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                  html: `\n                    <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                      'Please contact Obico Support at'\n                    )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                    `,\n                  width: 600,\n                })\n              } else if (reason === 'not_in_pro_trial.') {\n                this.openAlreadyHaveProPlanModal()\n              }\n            } else {\n              this.$swal.fire({\n                title: this.$i18next.t('Error'),\n                html: `<p style=\"text-align: center;\">${this.$i18next.t(\n                  'Failed to redeem the coupon code. Please try again later.'\n                )}</p>`,\n                icon: 'error',\n              })\n            }\n          })\n      } else {\n        // for 6 months\n        chargeBee.checkout(\n          this.chargeBeeInstance,\n          '/ent/generate_pro_checkout_url/',\n          {\n            plan: 'pro',\n            annual: true,\n            printers: this.numPrinters,\n            dhpack_level: '0',\n            coupon: couponCode,\n          },\n          () => {\n            this.$swal.fire({\n              type: 'error',\n              title: `${this.$i18next.t('Oops...')}`,\n              html: `${this.$i18next.t(\n                'Invalid coupon code. Please make sure the coupon code has not been used, and has not expired. If you believe you have a valid coupon code, please '\n              )} <a href=\"mailto:${SupportEmail}\">${this.$i18next.t(\n                'contact us'\n              )}</a> ${this.$i18next.t('for help.')}`,\n            })\n          }\n        )\n      }\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an Obico Pro Plan...`)}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.mintion-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MintionRedeemPage.vue?vue&type=template&id=456f3cd8&scoped=true&\"\nimport script from \"./MintionRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./MintionRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MintionRedeemPage.vue?vue&type=style&index=0&id=456f3cd8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"456f3cd8\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[(_vm.isPlanAdded)?_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued Big Tree Tech customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Big Tree Tech customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])]):_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Upgrade to an Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan and get a 25% discount as a valued BTT customer!'))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Obico has partnered with Big Tree Tech to give you an exclusive discount on an Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan. Get instant access to AI failure detection, first layer AI, webcam streaming, a highly rated mobile app and more for your 3D printer.'))+\" \")]),_c('button',{staticClass:\"btn choose-plan-btn\",on:{\"click\":_vm.choosePlanClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Choose Plan'))+\" \")])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/bigtree-tech-obico-logo.png')}})])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your\"))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),(!_vm.isPlanAdded)?_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn choose-plan-btn\",on:{\"click\":_vm.choosePlanClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Choose Plan'))+\" \")])]):_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),(_vm.isPlanAdded)?_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s'))+\" AI Premium \"+_vm._s(_vm.$t('Plans at a special discounted rate. Learn more about the plan options'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])])])])]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <!-- OR -->\n      <!-- Block Upgrade to  an Obico Pro Plan and get a 25% discount as a valued BTT customer! -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div v-if=\"isPlanAdded\" class=\"text pl-3\">\n            <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico') }} AI Premium {{ $t('Plan') }}</div>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'As a valued Big Tree Tech customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for Big Tree Tech customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div v-else class=\"text pl-3\">\n            <div class=\"title pb-3\">\n              {{ $t('Upgrade to an Obico') }} AI Premium {{ $t('Plan and get a 25% discount as a valued BTT customer!') }}\n            </div>\n            <p class=\"pb-3\">\n              {{ $t('Obico has partnered with Big Tree Tech to give you an exclusive discount on an Obico') }}\n              AI Premium\n              {{ $t('Plan. Get instant access to AI failure detection, first layer AI, webcam streaming, a highly rated mobile app and more for your 3D printer.') }}\n            </p>\n            <button class=\"btn choose-plan-btn\" @click=\"choosePlanClicked\">\n              {{ $t('Choose Plan') }}\n            </button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/bigtree-tech-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your\") }} AI Premium {{ $t('Plan') }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div v-if=\"!isPlanAdded\" class=\"mt-5\">\n            <button class=\"btn choose-plan-btn\" @click=\"choosePlanClicked\">\n              {{ $t('Choose Plan') }}\n            </button>\n          </div>\n          <div v-else class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div v-if=\"isPlanAdded\" class=\"btt-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>{{ $t('What happens when the three-month') }} AI Premium {{ $t('Plan expires?') }}</h6>\n              <p>\n                {{ $t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s') }}\n                AI Premium\n                {{ $t('Plans at a special discounted rate. Learn more about the plan options') }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport BttRedeemCompletedModal from './components/BttRedeemCompletedModal.vue'\nimport BttUserNotAuthenticatedModal from './components/BttUserNotAuthenticatedModal.vue'\n\nexport default {\n  name: 'BttRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      isPlanAdded: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      free3mCouponCode: 'btt_3m_free_266647882870',\n      discount25pctCouponCode: 'btt_25_pct_off_759920223081',\n      discount25pctCodeOnly: '759920223081',\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    if (this.free3mCouponCode === couponCode) {\n      this.isPlanAdded = true\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/btt/?coupon_code=' + this.free3mCouponCode + '&redirect=' + true\n      )\n    } else if (this.discount25pctCouponCode === couponCode) {\n      this.isPlanAdded = false\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/btt/?coupon_code=' +\n          this.discount25pctCouponCode +\n          '&redirect=' +\n          true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            const subscription = data.subscription || {}\n            this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              if (this.isPlanAdded) {\n                this.handlePlanAdded()\n              } else {\n                this.handlePlanNotAdded()\n              }\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    choosePlanClicked() {\n      if (!this.isAuthenticated) {\n        this.openBttUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanNotAdded()\n      }\n    },\n    openBttUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        BttUserNotAuthenticatedModal,\n        {\n          isPlanAdded: this.isPlanAdded,\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanNotAdded() {\n      if (!this.hasFreePlan) {\n        this.openAlreadyHaveProPlanModal()\n      } else {\n        this.$swal.openModalWithComponent(\n          ConfigureSubscription,\n          {\n            calculateOnly: false,\n            initialNumPrinters: this.numPrinters,\n            initialDHPackKey: '0',\n            initialBillingCycle: this.billingCycle,\n            primaryEmailVerified: true,\n            chargeBeeInstance: this.chargeBeeInstance,\n            couponCode: this.discount25pctCodeOnly,\n          },\n          {\n            title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n            showConfirmButton: false,\n          }\n        )\n      }\n    },\n    handlePlanAdded() {\n      axios\n        .post(urls.redeemBtt3mUnlimited(), {\n          coupon_code: this.free3mCouponCode,\n        })\n        .then(() => {\n          this.$swal.openModalWithComponent(\n            BttRedeemCompletedModal,\n            {},\n            {\n              showConfirmButton: false,\n              allowOutsideClick: false,\n              width: '55em',\n            }\n          )\n        })\n        .catch((error) => {\n          const resp = error.response\n          if (resp.status === 412) {\n            const reason = resp.data.reason\n            // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n            if (reason === 'already_redeemed') {\n              this.$swal.Prompt.fire({\n                title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                html: `\n                  <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                    'Please contact Obico Support at'\n                  )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                  `,\n                width: 600,\n              })\n            } else if (reason === 'not_in_pro_trial.') {\n              this.openAlreadyHaveProPlanModal()\n            }\n          } else {\n            this.$swal.fire({\n              title: this.$i18next.t('Error'),\n              text: this.$i18next.t('Failed to redeem the coupon code. Please try again later.'),\n              icon: 'error',\n            })\n          }\n        })\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t('Oops! You already have an Obico')} AI Premium ${this.$i18next.t('Plan...')}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.btt-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./BttRedeemPage.vue?vue&type=template&id=7c122ccc&scoped=true&\"\nimport script from \"./BttRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./BttRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./BttRedeemPage.vue?vue&type=style&index=0&id=7c122ccc&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c122ccc\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t('Activate Your'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" AI Premium \"+_vm._s(_vm.$t('Plan'))+\" \")]),_c('p',{staticClass:\"pb-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('As a valued Sovol customer, you are eligible for an exclusive'))+\" AI Premium \"+_vm._s(_vm.$t('Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.'))+\" \")]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Redeem Plan'))+\" \")])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/sovol-obico-logo.png')}})])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your\"))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(\" \"+_vm._s(_vm.$t('Redeem Plan'))+\" \")])])])]),_c('div',{staticClass:\"redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('I already paid for the'))+\" AI Premium \"+_vm._s(_vm.$t('Plan. Why do I need to enter my credit card information again?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t( 'Your plan is fully covered for the first year. After the first year, the plan will renew with a special discount available exclusively for Sovol customers. You are free to cancel the plan at any time in the “Subscription” section of the {brandname} mobile or web app.', { brandName: _vm.$syndicateText.brandName } ))+\" \")])]),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticStyle:{\"width\":\"100%\",\"text-align\":\"center\"}},[_c('h3',{staticClass:\"title\"},[_vm._v(\" \"+_vm._s(_vm.$t('Create an account or Sign in to Choose Your plan and get'))+\" \")])]),_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Create Account/Sign In'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h1 class=\"text-center mx-auto mt-4\">\n                {{ $t('Welcome To') }}\n                {{ $syndicateText.brandName }}\n              </h1>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <div style=\"width: 100%; text-align: center\">\n                <h3 class=\"title\">\n                  {{ $t('Create an account or Sign in to Choose Your plan and get') }}\n                </h3>\n              </div>\n              <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Unlimited Premium Webcam Streaming') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('AI Failure Detection') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('G-Code Remote Uploading and Printing')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                  }}</span>\n                </div>\n                <div class=\"redirect-button d-flex flex-column align-center justify-content-center\">\n                  <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                    {{ $t('Create Account/Sign In') }}\n                  </a>\n                </div>\n              </div>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'SovolUserNotAuthenticatedModal',\n  props: {\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SovolUserNotAuthenticatedModal.vue?vue&type=template&id=c7179f58&scoped=true&\"\nimport script from \"./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./SovolUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SovolUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=c7179f58&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"c7179f58\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <div class=\"title pb-3\">\n              {{ $t('Activate Your') }} {{ $syndicateText.brandName }} AI Premium {{ $t('Plan') }}\n            </div>\n            <p class=\"pb-2\">\n              {{ $t('As a valued Sovol customer, you are eligible for an exclusive') }}\n              AI Premium\n              {{ $t('Plan discount. When you redeem your plan, you’ll be asked to enter your credit card so we can give you the exclusive 20% discount when your plan renews.') }}\n            </p>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'If you don’t want your plan to renew, you can cancel the plan after the plan is activated so that it will not automatically renew after one year.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">\n              {{ $t('Redeem Plan') }}\n            </button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/sovol-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your\") }} AI Premium {{ $t('Plan') }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">\n              {{ $t('Redeem Plan') }}\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>\n                {{ $t('I already paid for the') }} AI Premium\n                {{ $t('Plan. Why do I need to enter my credit card information again?') }}\n              </h6>\n              <p>\n                {{\n                  $t(\n                    'Your plan is fully covered for the first year. After the first year, the plan will renew with a special discount available exclusively for Sovol customers. You are free to cancel the plan at any time in the “Subscription” section of the {brandname} mobile or web app.',\n                    { brandName: $syndicateText.brandName }\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { BillingCycle, DHPacks, PrepaidDHPacks } from '@entSrc/lib/pricing.js'\nimport urls from '@config/server-urls'\nimport SovolUserNotAuthenticatedModal from './components/SovolUserNotAuthenticatedModal.vue'\nimport { SupportEmail } from '../../../src/lib/consts.js'\n\nexport default {\n  name: 'SovolRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      billingCycle: BillingCycle.Annual,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      couponPrefix: 'sovol_pro_plan_',\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    const couponCodeParam = urlParams.get('coupon_code') || ''\n    this.couponCode = couponCodeParam.substring(this.couponPrefix.length)\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    // Verify Coupon Code\n    this.isValidCouponCode = this.validateSovolCode(this.couponCode)\n    this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n      '/ent/partners/redeem/sovol/?coupon_code=' + couponCodeParam + '&redirect=' + true\n    )\n\n    if (this.isAuthenticated) {\n      this.$loadScript('https://js.chargebee.com/v2/chargebee.js')\n        .then(() => {\n          this.BillingCycle = BillingCycle\n          this.DHPacks = DHPacks\n          this.PrepaidDHPacks = PrepaidDHPacks\n          this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n          axios.get(urls.activeSubscription()).then((response) => {\n            this.loaded = true\n            const data = response.data\n            const subscription = data.subscription || {}\n            this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n            this.initialCBSubscription = data ? data.cb_subscription : null\n            if (isRedirectedAfterLoginOrSignup) {\n              this.handlePlanNotAdded()\n            }\n          })\n        })\n        .catch(() => {\n          console.error('Failed to load ChargeBee script')\n        })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    validateSovolCode(code) {\n      // Check if the code has 11 characters\n      if (code.length !== 11) {\n        console.log('length mistake')\n        return false\n      }\n\n      // Check if the code starts with \"SOVOL\"\n      if (code.substring(0, 5) !== 'SOVOL') {\n        console.log('not started with sovol')\n        return false\n      }\n\n      return true\n    },\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.openUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanNotAdded()\n      }\n    },\n    openUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        SovolUserNotAuthenticatedModal,\n        {\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanNotAdded() {\n      if (!this.hasFreePlan) {\n        this.openAlreadyHaveProPlanModal()\n      } else {\n        // Open chargebee automatically\n        chargeBee.checkout(\n          this.chargeBeeInstance,\n          '/ent/generate_pro_checkout_url/',\n          {\n            plan: 'pro',\n            annual: true,\n            printers: this.numPrinters,\n            dhpack_level: '0',\n            coupon: this.couponCode,\n            // coupon: 'sovolj4323hfd93',\n          },\n          () => {\n            this.$swal.fire({\n              type: 'error',\n              title: `${this.$i18next.t('Oops...')}`,\n              html: `${this.$i18next.t(\n                'Invalid coupon code. Please make sure the coupon code has not been used, and has not expired. If you believe you have a valid coupon code, please '\n              )} <a href=\"mailto:${SupportEmail}\">${this.$i18next.t(\n                'contact us'\n              )}</a> ${this.$i18next.t('for help.')}`,\n            })\n          }\n        )\n      }\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an {brandName} Pro Plan...`, {\n          brandName: this.$syndicateText.brandName,\n        })}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact {brandName} support at',\n            { brandName: this.$syndicateText.brandName }\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SovolRedeemPage.vue?vue&type=template&id=580015d4&scoped=true&\"\nimport script from \"./SovolRedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./SovolRedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SovolRedeemPage.vue?vue&type=style&index=0&id=580015d4&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"580015d4\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',[(!_vm.isValidCouponCode)?_c('div',{staticClass:\"container d-flex flex-column align-items-center justify-content-center\",staticStyle:{\"height\":\"100vh\"},attrs:{\"id\":\"content-wrapper\"}},[_c('h1',[_vm._v(_vm._s(_vm.$t('Oops! Invalid Coupon!')))])]):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-1\"},[_c('div',{staticClass:\"text pl-3\"},[_c('div',{staticClass:\"title pb-3\"},[_vm._v(_vm._s(_vm.$t('Activate Your Three-Month Obico'))+\" AI Premium \"+_vm._s(_vm.$t('Plan')))]),_c('p',{staticClass:\"pb-3\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'As a valued 3DO Nozzle Camera customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for 3DO customers to ensure you continue to enjoy the benefits of Obico without interruption.' ))+\" \")]),_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])]),_c('div',{staticClass:\"logo\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/3do-obico-logo.png')}})])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-3\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t(\"What's Included with Your Plan\")))]),_c('div',{staticClass:\"features\"},[_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/ai-failure-detection.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('AI Failure Detection')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/webcam-streaming.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Webcam Streaming')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/full-remote-access.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Full Remote Access')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/mobile-web-app.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Mobile & Web App')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/printer-management.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Printer Management')))])]),_c('div',{staticClass:\"item\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/compatible-with-favorite-software.png')}}),_c('h6',[_vm._v(_vm._s(_vm.$t('Compatible with Your Favorite Software')))])])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-4\"},[_c('div',{staticClass:\"title mb-1\"},[_vm._v(_vm._s(_vm.$t('Highly Rated Mobile App')))]),_c('div',{staticClass:\"sub-title mb-3\"},[_vm._v(_vm._s(_vm.$t('Available for iOS and Android')))]),_c('div',{staticClass:\"images\"},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-1.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-2.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-3.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-4.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-5.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-6.webp')}}),_c('img',{staticClass:\"border-left-none\",attrs:{\"src\":require('@entstatic/img/partners/app-screenshot-7.png')}})]),_c('div',{staticClass:\"links\"},[_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"app-store-logo\",attrs:{\"src\":require('@entstatic/img/partners/download-on-app-store.png')}})]),_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\",\"target\":\"_blank\"}},[_c('img',{attrs:{\"src\":require('@entstatic/img/partners/get-on-google-play.png')}})])]),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn redeem-btn\",on:{\"click\":_vm.redeemClicked}},[_vm._v(_vm._s(_vm.$t('Redeem Plan')))])])])]),_c('div',{staticClass:\"btt-redeem-card p-3\"},[_c('div',{staticClass:\"block-5\"},[_c('div',{staticClass:\"title mb-3\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"questions\"},[_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(_vm._s(_vm.$t('What happens when the three-month'))+\" AI Premium \"+_vm._s(_vm.$t('Plan expires?')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s'))+\" AI Premium \"+_vm._s(_vm.$t('Plans at a special discounted rate. Learn more about the plan options'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t('here')))]),_vm._v(\". \"+_vm._s(_vm.$t( 'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.' ))+\" \")])]),_c('div',{staticClass:\"question\"},[_c('h6',[_vm._v(\" \"+_vm._s(_vm.$t('Still have questions?'))+\" \")]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('Contact'))+\" \"),_c('a',{staticClass:\"underline\",attrs:{\"href\":\"mailto:support@obico.io\"}},[_vm._v(_vm._s(_vm.$t('{brandName} support.', { brandName: _vm.$syndicateText.brandName })))])])])])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h2',{staticClass:\"mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Sign Up or Sign in to Your Obico Account'))+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('And get instant access to')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Webcam-Based AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja First Layer AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":_vm.url}},[_vm._v(\" \"+_vm._s(_vm.$t('Signup/Sign In'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <b-container>\n    <b-row class=\"justify-content-center\">\n      <b-col>\n        <div class=\"wizard-container full-on-mobile\">\n          <b-container>\n            <b-row>\n              <div class=\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\">\n                <svg viewBox=\"0 0 1965 240\" class=\"logo-img\">\n                  <use href=\"#svg-logo-compact\" />\n                </svg>\n              </div>\n            </b-row>\n            <b-row>\n              <h2 class=\"mx-auto mt-4\">\n                {{ $t('Sign Up or Sign in to Your Obico Account') }}\n              </h2>\n            </b-row>\n            <b-row>\n              <b-col>\n                <hr />\n              </b-col>\n            </b-row>\n            <b-row>\n              <div class=\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\">\n                <h3 class=\"title\">{{ $t('And get instant access to') }}</h3>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Unlimited Premium Webcam Streaming') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{ $t('Webcam-Based AI Failure Detection') }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Nozzle Ninja First Layer AI Failure Detection')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('G-Code Remote Uploading and Printing')\n                  }}</span>\n                </div>\n                <div class=\"feature\">\n                  <i class=\"feature-check fas fa-check-circle\"></i\n                  ><span class=\"feature-text\">{{\n                    $t('Unlimited Secure Tunnel to OctoPrint/Klipper')\n                  }}</span>\n                </div>\n                <div class=\"redirect-button d-flex flex-column align-center justify-content-center\">\n                  <a :href=\"url\" class=\"btn btn-primary btn-block mx-auto btn-lg\">\n                    {{ $t('Signup/Sign In') }}\n                  </a>\n                </div>\n              </div>\n            </b-row>\n          </b-container>\n        </div>\n      </b-col>\n    </b-row>\n  </b-container>\n</template>\n\n<script>\nexport default {\n  name: 'BttUserNotAuthenticatedModal',\n  props: {\n    redirectUrl: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      url: '/accounts/signup/?next=' + this.redirectUrl,\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wizard-container\n  padding-top: 1em\n\n.title\n  margin-top: 0.5em\n  margin-bottom: 1em\n\n.feature\n  line-height: 2em\n\n.feature-check\n  color: var(--color-primary)\n\n.feature-text\n  margin-left: 1.1em\n\n.redirect-button\n  margin-top: 9em\n  margin-bottom: 6em\n\nhr\n  background-color: var(--color-divider)\n\n.logo-img\n  width: 100%\n  color: var(--color-primary)\n</style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=template&id=217c34d2&scoped=true&\"\nimport script from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDOUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=217c34d2&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"217c34d2\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div v-if=\"!loaded\" class=\"text-center my-5\">\n    <b-spinner></b-spinner>\n  </div>\n  <div v-else>\n    <div\n      v-if=\"!isValidCouponCode\"\n      id=\"content-wrapper\"\n      class=\"container d-flex flex-column align-items-center justify-content-center\"\n      style=\"height: 100vh\"\n    >\n      <h1>{{ $t('Oops! Invalid Coupon!') }}</h1>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <!-- Block Activate Your Three-Month Obico Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-1\">\n          <div class=\"text pl-3\">\n            <div class=\"title pb-3\">{{ $t('Activate Your Three-Month Obico') }} AI Premium {{ $t('Plan') }}</div>\n            <p class=\"pb-3\">\n              {{\n                $t(\n                  'As a valued 3DO Nozzle Camera customer, once your included plan expires, you can upgrade to a more advanced plan at a special discounted price. This offer is exclusively available for 3DO customers to ensure you continue to enjoy the benefits of Obico without interruption.'\n                )\n              }}\n            </p>\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n          <div class=\"logo\">\n            <img :src=\"require('@entstatic/img/partners/3do-obico-logo.png')\" />\n          </div>\n        </div>\n      </div>\n\n      <!-- Block What's Included with Your Pro Plan -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-3\">\n          <div class=\"title mb-3\">{{ $t(\"What's Included with Your Plan\") }}</div>\n          <div class=\"features\">\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/ai-failure-detection.png')\" />\n              <h6>{{ $t('AI Failure Detection') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/webcam-streaming.png')\" />\n              <h6>{{ $t('Webcam Streaming') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/full-remote-access.png')\" />\n              <h6>{{ $t('Full Remote Access') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/mobile-web-app.png')\" />\n              <h6>{{ $t('Mobile & Web App') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img :src=\"require('@entstatic/img/partners/printer-management.png')\" />\n              <h6>{{ $t('Printer Management') }}</h6>\n            </div>\n            <div class=\"item\">\n              <img\n                :src=\"require('@entstatic/img/partners/compatible-with-favorite-software.png')\"\n              />\n              <h6>{{ $t('Compatible with Your Favorite Software') }}</h6>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Highly Rated Mobile App -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-4\">\n          <div class=\"title mb-1\">{{ $t('Highly Rated Mobile App') }}</div>\n          <div class=\"sub-title mb-3\">{{ $t('Available for iOS and Android') }}</div>\n          <div class=\"images\">\n            <img :src=\"require('@entstatic/img/partners/app-screenshot-1.webp')\" />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-2.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-3.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-4.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-5.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-6.webp')\"\n            />\n            <img\n              class=\"border-left-none\"\n              :src=\"require('@entstatic/img/partners/app-screenshot-7.png')\"\n            />\n          </div>\n          <div class=\"links\">\n            <a\n              href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n              target=\"_blank\"\n              ><img\n                class=\"app-store-logo\"\n                :src=\"require('@entstatic/img/partners/download-on-app-store.png')\"\n            /></a>\n            <a\n              href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n              target=\"_blank\"\n              ><img :src=\"require('@entstatic/img/partners/get-on-google-play.png')\"\n            /></a>\n          </div>\n          <div class=\"mt-5\">\n            <button class=\"btn redeem-btn\" @click=\"redeemClicked\">{{ $t('Redeem Plan') }}</button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Block Frequently Asked Questions -->\n      <div class=\"btt-redeem-card p-3\">\n        <div class=\"block-5\">\n          <div class=\"title mb-3\">{{ $t('Frequently Asked Questions') }}</div>\n          <div class=\"questions\">\n            <div class=\"question\">\n              <h6>{{ $t('What happens when the three-month') }} AI Premium {{ $t('Plan expires?') }}</h6>\n              <p>\n                {{ $t('When your three-month plan expires, you will have the chance to upgrade to one of Obico’s') }}\n                AI Premium\n                {{ $t('Plans at a special discounted rate. Learn more about the plan options') }}\n                <a href=\"/ent_pub/pricing/\" class=\"underline\">{{ $t('here') }}</a\n                >.\n                {{\n                  $t(\n                    'If you choose not to upgrade, your plan will be automatically reverted to an Obico Free Plan.'\n                  )\n                }}\n              </p>\n            </div>\n            <div class=\"question\">\n              <h6>\n                {{ $t('Still have questions?') }}\n              </h6>\n              <p>\n                {{ $t('Contact') }}\n                <a href=\"mailto:support@obico.io\" class=\"underline\">{{\n                  $t('{brandName} support.', { brandName: $syndicateText.brandName })\n                }}</a>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from 'axios'\nimport urls from '@config/server-urls'\nimport ThreeDORedeemCompletedModal from './components/ThreeDORedeemCompletedModal.vue'\nimport ThreeDOUserNotAuthenticatedModal from './components/ThreeDOUserNotAuthenticatedModal.vue'\n\nexport default {\n  name: 'BttRedeemPage',\n  components: {},\n  props: {\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      isValidCouponCode: false,\n      initialCBSubscription: null,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      cbSubscription: null,\n      chargeBeeInstance: null,\n      loaded: false,\n      couponCode: null,\n      redirectUrlWhenNotAuthenticated: '',\n      hasFreePlan: true,\n    }\n  },\n  computed: {\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n  },\n  created() {\n    const urlParams = new URLSearchParams(window.location.search)\n    this.couponCode = urlParams.get('coupon_code')\n    const isRedirectedAfterLoginOrSignup = urlParams.get('redirect')\n\n    // Check if coupon code is valid\n    // Add logic if necessary\n    if (this.couponCode) {\n      this.isValidCouponCode = true\n      this.redirectUrlWhenNotAuthenticated = encodeURIComponent(\n        '/ent/partners/redeem/3do/?coupon_code=' + this.couponCode + '&redirect=' + true\n      )\n    } else {\n      this.isValidCouponCode = false\n    }\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        const subscription = data.subscription || {}\n        this.hasFreePlan = !subscription.plan_id || subscription.plan_id == 'pro-trial'\n        this.initialCBSubscription = data ? data.cb_subscription : null\n        if (isRedirectedAfterLoginOrSignup) {\n          this.handlePlanAdded()\n        }\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n\n  methods: {\n    redeemClicked() {\n      if (!this.isAuthenticated) {\n        this.open3doUserNotAuthenticatedModal()\n      } else {\n        this.handlePlanAdded()\n      }\n    },\n    open3doUserNotAuthenticatedModal() {\n      this.$swal.openModalWithComponent(\n        ThreeDOUserNotAuthenticatedModal,\n        {\n          redirectUrl: this.redirectUrlWhenNotAuthenticated,\n        },\n        {\n          showConfirmButton: false,\n          width: '55em',\n        }\n      )\n    },\n    handlePlanAdded() {\n      axios\n        .post(urls.redeemThreeDO3mUnlimited(), {\n          coupon_code: this.couponCode,\n        })\n        .then(() => {\n          this.$swal.openModalWithComponent(\n            ThreeDORedeemCompletedModal,\n            {},\n            {\n              showConfirmButton: false,\n              allowOutsideClick: false,\n              width: '55em',\n            }\n          )\n        })\n        .catch((error) => {\n          const resp = error.response\n          if (resp.status === 412) {\n            const reason = resp.data.reason\n            // error may be {'reason': 'not_in_pro_trial.' or {'reason': 'already_redeemed'\n            if (reason === 'already_redeemed') {\n              this.$swal.Prompt.fire({\n                title: `${this.$i18next.t(`You have already redeemed this coupon.`)}`,\n                html: `\n                  <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n                    'Please contact Obico Support at'\n                  )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n                  `,\n                width: 600,\n              })\n            } else if (reason === 'not_in_pro_trial.') {\n              this.openAlreadyHaveProPlanModal()\n            }\n          } else {\n            this.$swal.fire({\n              title: this.$i18next.t('Error'),\n              text: this.$i18next.t('Failed to redeem the coupon code. Please try again later.'),\n              icon: 'error',\n            })\n          }\n        })\n    },\n    openAlreadyHaveProPlanModal() {\n      this.$swal.Prompt.fire({\n        title: `${this.$i18next.t(`Oops! You already have an Obico`)} AI Premium ${this.$i18next.t('Plan...')}`,\n        html: `\n          <p style=\"text-align: center; margin-top: 1em\">${this.$i18next.t(\n            'Contact obico support at'\n          )} <a href=\"mailto:support@obico.io\">support@obico.io</a></p>\n          `,\n        width: 600,\n      })\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.underline\n  &:hover\n    text-decoration: underline\nh4\n  font-weight: 800\n\n.border-left-none\n  border-left: none !important\n\n.redeem-btn, .choose-plan-btn\n  color: white !important\n  background: #01A299\n  width: 17rem\n  &:hover\n    background: #33ada6\n\n.btt-redeem-card\n  margin-top: 2em\n  &:last-child\n    margin-bottom: 2em\n  .title\n    font-weight: 700\n    font-size: 23px\n  .step-title\n    line-height: 27px\n    font-weight: 700\n    font-size: 23px\n    height: 4em\n    display: flex\n    align-items: center\n    justify-content: center\n    @media (max-width: 991px)\n      height: 3em\n  display: flex\n  background-color: var(--color-surface-secondary)\n  .block-1\n    display: flex\n    gap: 6em\n    @media (max-width: 991px)\n      flex-direction: column-reverse\n      margin-bottom: 1em\n    .text\n      display: flex\n      flex-direction: column\n      justify-content: center\n    .logo\n      padding-right: 3em\n      padding-top: 3em\n      padding-bottom: 3em\n      @media (max-width: 991px)\n        padding: 0\n        display: flex\n        justify-content: center\n\n      img\n        width: 23em\n        @media (max-width: 576px)\n          width: 15em\n        @media (max-width: 767px) and (min-width: 577px)\n          width: 21em\n        @media (max-width: 991px) and (min-width: 768px)\n          width: 20em\n        @media (max-width: 1198px) and (min-width: 992px)\n          width: 19em\n  .block-2\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    margin-bottom: 1em\n    text-align: center\n    .steps\n      margin-top: 3em\n      display: flex\n      gap: 7em\n      margin-bottom: 4em\n      .header\n        display: flex\n        align-items: center\n        gap: 4em\n      .detail\n        font-size: 12px\n        display: flex\n        gap: 4em\n      .step-1\n        flex: 2\n      .step-2\n        flex: 3\n      .step-3\n        flex: 2\n      p\n       font-size: 13px\n      @media (max-width: 991px)\n        flex-direction: column\n        gap: 0\n    .discount-now\n      text-decoration: underline\n      cursor: pointer\n  .block-3\n    display: flex\n    flex-direction: column\n    align-items: center\n    padding-top: 2em\n    padding-left: 5em\n    padding-right: 5em\n    text-align: center\n    margin-bottom: 3em\n    width: 100%\n    .features\n      display: flex\n      flex-wrap: wrap\n      line-height: 8em\n      row-gap: 2em\n      .item\n        flex-basis: calc(100% / 3)\n        @media (max-width: 991px) and (min-width: 768px)\n          flex-basis: calc(100% / 2)\n        @media (max-width: 767px)\n          flex-basis: calc(100% / 1)\n        img\n          width: 6em\n        h6\n          font-size: 0.8rem\n  .block-4\n    display: flex\n    flex-direction: column\n    align-items: center\n    text-align: center\n    padding-top: 1em\n    margin-bottom: 1em\n    width: 100%\n    .images\n      display: flex\n      margin-top: 2em\n      margin-bottom: 2em\n      max-width: 94%\n      overflow: scroll\n      img\n        width: 9em\n        border: 2px dashed gray\n    .links\n      display: flex\n      @media (max-width: 460px)\n        flex-direction: column\n      img\n        width: 13em\n      .app-store-logo\n        @media (max-width: 460px)\n          width: 15em\n          height: 5.5em\n\n  .block-5\n    padding-top: 1em\n    padding-left: 2em\n    padding-right: 2em\n    .questions\n      margin-top: 2em\n      .question\n        margin-bottom: 2em\n        h6\n          font-weight: 800\n          margin-bottom: 1em\n        p\n          font-size: 13px\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThreeDORedeemPage.vue?vue&type=template&id=7d1ec790&scoped=true&\"\nimport script from \"./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDORedeemPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDORedeemPage.vue?vue&type=style&index=0&id=7d1ec790&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7d1ec790\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing\"},[_c('nav-bar',{attrs:{\"view-name\":\"pricing\"}}),(!_vm.loaded)?_c('div',{staticClass:\"text-center my-5\"},[_c('b-spinner')],1):_c('div',{staticClass:\"container\",attrs:{\"id\":\"content-wrapper\"}},[_c('h1',{staticClass:\"text-center mt-5\"},[_vm._v(_vm._s(_vm.$t('Kingroon Connect Plans')))]),_c('div',{staticClass:\"container text-center py-4\",attrs:{\"id\":\"pricing-selections\"}},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual },attrs:{\"id\":\"sub-annual-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual },attrs:{\"id\":\"sub-monthly-plan\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"row price-matrix\"},[_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('div',[_vm._v(_vm._s(_vm.$t('Print occasionally.')))]),_vm._m(0),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('Unlimited Kingroon printers allowed')))])]),_c('div',{staticClass:\"price-action\"},[(!_vm.isAuthenticated)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Get Started')))]):_vm._e()]),_c('div',[_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"basic-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"basic-streaming-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Basic webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-free-plan-on-kingroon-pricing-page\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t('100 {localizedDom} AI Detection Hours/month, 30s detection interval')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('b',[_vm._v(_vm._s(_vm.$t('Basic')))])]},proxy:true}])})],1)],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"tunneling-cap-per-month\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-free-plan-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('300MB /mo tunnel data - Access Mainsail or Fluidd remotely'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('200MB total G-code cloud storage')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.kingroon.android\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/app/id6499243573\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Failure alerts and print status updates sent through push notification'))+\" \")])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Community technical support')))])])])])]),_c('div',{staticClass:\"col-sm-12 col-lg-6 pb-5 mb-5\"},[_c('div',{staticClass:\"price-header\"},[_c('div',{staticClass:\"plan-name\"},[_vm._v(\"AI Premium\")]),_c('div',[_vm._v(_vm._s(_vm.$t('Print every day. 2+ printers.')))]),_c('div',{staticClass:\"plan-price\"},[_c('span',[_vm._v(_vm._s(_vm.$t('$')))]),_c('span',{attrs:{\"id\":\"monthly-price\"}},[_vm._v(\"3.17\")]),_c('span',{staticClass:\"price-unit\"},[_vm._v(\" / \"+_vm._s(_vm.$t('month')))]),(_vm.isAnnual)?_c('span',{staticStyle:{\"font-size\":\"0.95rem\",\"font-weight\":\"100\"},attrs:{\"id\":\"annual-bill\"}},[_vm._v(\" \"+_vm._s(_vm.$t('(Billed {name} annually)', { name: 38 })))]):_vm._e()]),_c('div',{staticClass:\"price-sub\"},[_vm._v(_vm._s(_vm.$t('1st printer included')))]),_c('div',{staticClass:\"price-sub\"},[_c('span',[_vm._v(_vm._s(_vm.$t('2+ printers at $')))]),_c('span',{attrs:{\"id\":\"addl-printer-price\"}},[_vm._v(_vm._s(_vm.priceTable.basePrinterPrice))]),_vm._v(\" / \"+_vm._s(_vm.$t('month / printer'))+\" \")])]),_c('div',{staticClass:\"price-action\"},[(_vm.isAuthenticated)?_c('div',[(_vm.hasSubscription)?_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/user_preferences/subscription/\"}},[_vm._v(_vm._s(_vm.$t('View/Change Subscription')))]):_c('a',{directives:[{name:\"b-popover\",rawName:\"v-b-popover.hover\",value:({\n                  placement: 'top',\n                  content: _vm.$t('Full refund within 30 days if you are not happy.'),\n                }),expression:\"{\\n                  placement: 'top',\\n                  content: $t('Full refund within 30 days if you are not happy.'),\\n                }\",modifiers:{\"hover\":true}}],staticClass:\"btn btn-primary btn-block\",attrs:{\"id\":\"subscribe-pro\",\"role\":\"button\"},on:{\"click\":_vm.upgrade}},[_vm._v(_vm._s(_vm.$t('Upgrade (30-Day Money Back Guarantee)')))])]):_c('div',[_c('a',{staticClass:\"btn btn-primary btn-block\",attrs:{\"role\":\"button\",\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t('Start 1 month FREE trial')))])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"premium-webcam-streaming\"}},[_c('help-widget',{attrs:{\"id\":\"premium-streaming-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Premium webcam streaming'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('help-widget',{attrs:{\"id\":\"detective-hours-pro-plan-on-kingroon-pricing-page\"}},[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                        '100 {localizedDom} AI Detection Hours per month, 10s detection interval'\n                      )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('b',[_vm._v(_vm._s(_vm.$t('Advanced')))])]},proxy:true}])})],1)],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',{attrs:{\"id\":\"unlimited-tunnling-for-pro\"}},[_c('help-widget',{attrs:{\"id\":\"tunneling-pro-plan-on-kingroon-pricing-page\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited tunnel data - Access Mainsail or fluidd remotely'))+\" \")])],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('5GB total G-Code cloud storage')))])])]),_c('div',{staticClass:\"features\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_c('i18next',{attrs:{\"translation\":_vm.$t('Companion mobile app for {localizedDom} and {localizedDom2}')},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"}},[_vm._v(_vm._s(_vm.$t('Android')))])]},proxy:true},{key:\"localizedDom2\",fn:function(){return [_c('a',{attrs:{\"href\":\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"}},[_vm._v(_vm._s(_vm.$t('iOS')))])]},proxy:true}])})],1)]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Remote printer access and control')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t('Failure alerts and print status updates sent through push notification'))+\" \")])])]),_c('div',{staticClass:\"features keyfeatures\"},[_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Email technical support')))])]),_c('div',[_c('i',{staticClass:\"fas fa-check fa-sm\"}),_c('div',[_vm._v(_vm._s(_vm.$t('Printer feed sharing with premium streaming quality')))])])])])])]),_c('QuestionsKingroonSection',{on:{\"calc\":_vm.calc}})],1)],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_vm._v(\" $0 \"),_c('span',{staticClass:\"price-unit\"})])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:\"row justify-content-center py-4\"},[_c('div',{staticClass:\"col-12 text-center\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('Questions You May Have')))])])]),_c('div',{staticClass:\"row justify-content-center pb-5\"},[_c('div',{staticClass:\"col-lg-10 col-md-12\",attrs:{\"id\":\"accordion\",\"role\":\"tablist\"}},[_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-1\",modifiers:{\"accordion-1\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-1\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What currency are your prices in?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-1\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('They’re in US dollars.')))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-2\",modifiers:{\"accordion-2\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-2\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Which plan is right for me?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-2\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('It depends on how many 3D printers you have, and how often you print.')))]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The Free plan is for users who print occasionally. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 1 FPS). The Free plan even comes with 100 free Basic AI Detection Hours per month. Hours don't roll over month to month.`\n                  )}})],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `The {planName} plan is for users who print more often and want to enjoy additional features like watching the webcam feed at the slick 25 FPS rate. It also comes with 100 Advanced AI Detection Hours every month - giving you the ability to detect failures faster and more reliably. If you occasionally print more than 100 hours a month, you will most likely be ok because the Advanced AI Detection Hours roll over month to month.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-4\",modifiers:{\"accordion-4\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-4\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I change my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-4\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.' ))+\" \")]),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'You will keep the unused AI Detection Hours when you change your subscription plan.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-5\",modifiers:{\"accordion-5\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-5\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Can I cancel my plan?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-5\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(_vm._s(_vm.$t('Yes again! You can cancel your subscription any time.')))]),_c('b-card-text',[_vm._v(_vm._s(_vm.$t( 'However, the AI Detection Hours included in the plan will expire at the end of your subscription period.' )))])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-6\",modifiers:{\"accordion-6\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-6\"}},[_vm._v(\" \"+_vm._s(_vm.$t('What is your refund policy?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-6\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`We offer a {localizedDom}`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('strong',[_vm._v(_vm._s(_vm.$t('30-Day Full Refund Policy')))])]},proxy:true}])}),_vm._v(\" . \")],1),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                  )},scopedSlots:_vm._u([{key:\"planName\",fn:function(){return [_vm._v(\"AI Premium\")]},proxy:true},{key:\"localizedDom\",fn:function(){return [_c('a',{attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\" ))+\" \")]),_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('email us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-7\",modifiers:{\"accordion-7\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-7\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Is it safe to give my credit card number to the Kingroon?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-7\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(\n                    `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                  )},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":\"https://www.chargebee.com/security/\"}},[_vm._v(_vm._s(_vm.$t('a fully compliant billing service provider')))])]},proxy:true}])})],1),_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( 'Under no circumstances will Kingroon process or store your payment information.' ))+\" \")])],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-8\",modifiers:{\"accordion-8\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-8\"}},[_vm._v(\" \"+_vm._s(_vm.$t('I have many printers and print a lot. The'))+\" AI Premium \"+_vm._s(_vm.$t('plan becomes really expensive. Can I still use the Kingroon app?'))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-8\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_c('i18next',{attrs:{\"translation\":_vm.$t(`Please {localizedDom} to customize a plan that works for your budget.`)},scopedSlots:_vm._u([{key:\"localizedDom\",fn:function(){return [_c('a',{staticClass:\"link\",attrs:{\"href\":_vm.mailto}},[_vm._v(_vm._s(_vm.$t('contact us')))])]},proxy:true}])})],1)],1)],1)],1),_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('b-card-header',{attrs:{\"role\":\"tab\"}},[_c('a',{directives:[{name:\"b-toggle\",rawName:\"v-b-toggle.accordion-9\",modifiers:{\"accordion-9\":true}}],staticClass:\"card-link btn-block\",attrs:{\"aria-expanded\":\"false\",\"aria-controls\":\"accordion-9\"}},[_vm._v(\" \"+_vm._s(_vm.$t( 'I saw {brandName} mentioned somewhere. What does {brandName} have to do with Kingroon?', { brandName: _vm.$syndicateText.brandName, } ))+\" \"),_c('span',{staticClass:\"collapsed\"},[_c('p',[_c('b',[_vm._v(\">\")])])]),_c('span',{staticClass:\"expanded\"},[_c('p',[_c('b',[_vm._v(\"<\")])])])])]),_c('b-collapse',{attrs:{\"id\":\"accordion-9\",\"accordion\":\"my-accordion\",\"role\":\"tabpanel\"}},[_c('b-card-body',[_c('b-card-text',[_vm._v(\" \"+_vm._s(_vm.$t( '{brandName} has partnered with Kingroon to provide Kingroon users with AI and a mobile app for Kingroon 3D printers. {brandName}, a US based company is the developer of the Kingroon App.', { brandName: _vm.$syndicateText.brandName, } ))+\" \")])],1)],1)],1)],1)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div class=\"row justify-content-center py-4\">\n      <div class=\"col-12 text-center\">\n        <h1>{{ $t('Questions You May Have') }}</h1>\n      </div>\n    </div>\n    <div class=\"row justify-content-center pb-5\">\n      <div id=\"accordion\" class=\"col-lg-10 col-md-12\" role=\"tablist\">\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-1\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-1\"\n            >\n              {{ $t('What currency are your prices in?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-1\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{ $t('They’re in US dollars.') }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-2\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-2\"\n            >\n              {{ $t('Which plan is right for me?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-2\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('It depends on how many 3D printers you have, and how often you print.')\n              }}</b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The Free plan is for users who print occasionally. Another reason why you may want to choose the Free plan is you don't mind slow webcam streaming (up to 1 FPS). The Free plan even comes with 100 free Basic AI Detection Hours per month. Hours don't roll over month to month.`\n                    )\n                  \"\n                >\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `The {planName} plan is for users who print more often and want to enjoy additional features like watching the webcam feed at the slick 25 FPS rate. It also comes with 100 Advanced AI Detection Hours every month - giving you the ability to detect failures faster and more reliably. If you occasionally print more than 100 hours a month, you will most likely be ok because the Advanced AI Detection Hours roll over month to month.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-4\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-4\"\n            >\n              {{ $t('Can I change my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-4\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    'Of course! You can change the number of printers, add/change/remove Subcribe&Save AI Detection Hour Pack, or between annual and monthly, at any time as long as your subscription is still active.'\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'You will keep the unused AI Detection Hours when you change your subscription plan.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-5\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-5\"\n            >\n              {{ $t('Can I cancel my plan?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-5\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>{{\n                $t('Yes again! You can cancel your subscription any time.')\n              }}</b-card-text>\n              <b-card-text>{{\n                $t(\n                  'However, the AI Detection Hours included in the plan will expire at the end of your subscription period.'\n                )\n              }}</b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-6\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-6\"\n            >\n              {{ $t('What is your refund policy?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-6\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next :translation=\"$t(`We offer a {localizedDom}`)\">\n                  <template #localizedDom>\n                    <strong>{{ $t('30-Day Full Refund Policy') }}</strong>\n                  </template>\n                </i18next>\n                .\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `If you are not happy with the {planName} plan, just {localizedDom} within 30 days and we will give you a full refund.`\n                    )\n                  \"\n                >\n                  <template #planName>AI Premium</template>\n                  <template #localizedDom>\n                    <a :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    \"After 30 days, you can still cancel the subscription at any time. However, we usually don't refund the payment, due to the nature of a subscription service. Instead, we will keep your subscription active until the end of the current billing cycle. This is also a common practice for virtually all other subscription services such as Netflix.\"\n                  )\n                }}\n              </b-card-text>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `However, we are all human and we want to be reasonable. If you have a good reason why we should refund to you after 30 days, {localizedDom} and we will consider your request.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('email us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-7\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-7\"\n            >\n              {{ $t('Is it safe to give my credit card number to the Kingroon?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-7\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(\n                      `Wrong question! You will not give credit number to us. Instead, it's Chargebee, {localizedDom}, that takes your credit card number and safely stores it.`\n                    )\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" href=\"https://www.chargebee.com/security/\">{{\n                      $t('a fully compliant billing service provider')\n                    }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n              <b-card-text>\n                {{\n                  $t(\n                    'Under no circumstances will Kingroon process or store your payment information.'\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-8\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-8\"\n            >\n              {{ $t('I have many printers and print a lot. The') }}\n              AI Premium\n              {{ $t('plan becomes really expensive. Can I still use the Kingroon app?') }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-8\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                <i18next\n                  :translation=\"\n                    $t(`Please {localizedDom} to customize a plan that works for your budget.`)\n                  \"\n                >\n                  <template #localizedDom>\n                    <a class=\"link\" :href=\"mailto\">{{ $t('contact us') }}</a>\n                  </template>\n                </i18next>\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n\n        <b-card no-body>\n          <b-card-header role=\"tab\">\n            <a\n              v-b-toggle.accordion-9\n              class=\"card-link btn-block\"\n              aria-expanded=\"false\"\n              aria-controls=\"accordion-9\"\n            >\n              {{\n                $t(\n                  'I saw {brandName} mentioned somewhere. What does {brandName} have to do with Kingroon?',\n                  {\n                    brandName: $syndicateText.brandName,\n                  }\n                )\n              }}\n              <span class=\"collapsed\"\n                ><p><b>&gt;</b></p></span\n              ><span class=\"expanded\"\n                ><p><b>&lt;</b></p></span\n              >\n            </a>\n          </b-card-header>\n          <b-collapse id=\"accordion-9\" accordion=\"my-accordion\" role=\"tabpanel\">\n            <b-card-body>\n              <b-card-text>\n                {{\n                  $t(\n                    '{brandName} has partnered with Kingroon to provide Kingroon users with AI and a mobile app for Kingroon 3D printers. {brandName}, a US based company is the developer of the Kingroon App.',\n                    {\n                      brandName: $syndicateText.brandName,\n                    }\n                  )\n                }}\n              </b-card-text>\n            </b-card-body>\n          </b-collapse>\n        </b-card>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { SupportEmail } from '@entSrc/lib/consts.js'\n\nexport default {\n  name: 'QuestionsKingroonSection',\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.card-link\n  cursor: pointer\n#accordion .card\n  background: #000000\na.link\n  color: #ED7100 !important\na\n  color: #ED7100\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./QuestionsKingroonSection.vue?vue&type=template&id=84449caa&scoped=true&\"\nimport script from \"./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"\nexport * from \"./QuestionsKingroonSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./QuestionsKingroonSection.vue?vue&type=style&index=0&id=84449caa&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"84449caa\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.inMobileWebView)?_c('b-navbar',{class:{\n      'navbar-dark': _vm.theme === _vm.themes.Dark,\n      'navbar-light': _vm.theme === _vm.themes.Light,\n    },attrs:{\"toggleable\":\"xl\"}},[_c('b-container',{staticClass:\"p-0\"},[_c('b-navbar-brand',{attrs:{\"href\":\"https://kingroon.com/\"}},[_c('SyndicateAwareSVG',{attrs:{\"href\":\"#svg-kingroon-logo-compact\",\"width\":\"100\",\"height\":\"30\"}})],1),_c('b-navbar-toggle',{attrs:{\"target\":\"navbar-toggle-collapse\"}},[_c('span',{staticClass:\"navbar-toggler-icon\"})]),_c('b-collapse',{attrs:{\"id\":\"navbar-toggle-collapse\",\"is-nav\":\"\"},model:{value:(_vm.showMainMenu),callback:function ($$v) {_vm.showMainMenu=$$v},expression:\"showMainMenu\"}},[_c('b-navbar-nav',[(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('printers') },attrs:{\"href\":\"https://app.kingroon.com/printers/\"}},[_vm._v(_vm._s(_vm.$t(\"Printers\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('print_history') },attrs:{\"href\":\"https://app.kingroon.com/print_history/\"}},[_vm._v(_vm._s(_vm.$t(\"Print History\")))]):_vm._e(),(_vm.user)?_c('b-nav-item',{class:{ active: _vm.viewName.includes('g_code_folders') },attrs:{\"href\":\"https://app.kingroon.com/g_code_folders/cloud/\"}},[_vm._v(_vm._s(_vm.$t(\"G-Codes\")))]):_vm._e(),(_vm.isEnt)?_c('b-nav-item',{class:{ active: _vm.viewName === 'pricing' },attrs:{\"href\":\"https://app.kingroon.com/ent_pub/pricing/\"}},[_vm._v(_vm._s(_vm.$t(\"Pricing\")))]):_vm._e(),_c('b-nav-item',{attrs:{\"href\":\"https://docs.kingroon.com/\"}},[_vm._v(_vm._s(_vm.$t(\"Help\")))])],1),_c('b-navbar-nav',{staticClass:\"ml-auto\"},[(!_vm.user)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/login/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN IN\")))]):_vm._e(),(!_vm.user && _vm.allowSignUp)?_c('b-nav-item',{attrs:{\"href\":\"/accounts/signup/\"}},[_vm._v(_vm._s(_vm.$t(\"SIGN UP\")))]):_vm._e(),(_vm.user)?_c('b-nav-item-dropdown',{ref:\"accountDropdown\",attrs:{\"right\":\"\",\"toggle-class\":\"user-menu\",\"text\":_vm.user.first_name || _vm.user.email}},[_c('b-dropdown-item',{attrs:{\"href\":\"/user_preferences/\"}},[_c('i',{staticClass:\"fas fa-cog mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Preferences\"))+\" \")]),_c('b-dropdown-divider'),_c('b-dropdown-item',{attrs:{\"href\":\"/accounts/logout/\"}},[_c('i',{staticClass:\"fas fa-sign-out-alt mr-2\"}),_vm._v(_vm._s(_vm.$t(\"Log out\"))+\" \")])],1):_vm._e()],1)],1)],1)],1):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <b-navbar\n      v-if=\"!inMobileWebView\"\n      toggleable=\"xl\"\n      :class=\"{\n        'navbar-dark': theme === themes.Dark,\n        'navbar-light': theme === themes.Light,\n      }\"\n    >\n      <b-container class=\"p-0\">\n        <b-navbar-brand href=\"https://kingroon.com/\">\n          <SyndicateAwareSVG href=\"#svg-kingroon-logo-compact\" width=\"100\" height=\"30\" />\n        </b-navbar-brand>\n\n        <b-navbar-toggle target=\"navbar-toggle-collapse\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </b-navbar-toggle>\n\n        <b-collapse id=\"navbar-toggle-collapse\" v-model=\"showMainMenu\" is-nav>\n          <b-navbar-nav>\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/printers/\"\n              :class=\"{ active: viewName.includes('printers') }\"\n              >{{ $t(\"Printers\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/print_history/\"\n              :class=\"{ active: viewName.includes('print_history') }\"\n              >{{ $t(\"Print History\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"user\"\n              href=\"https://app.kingroon.com/g_code_folders/cloud/\"\n              :class=\"{ active: viewName.includes('g_code_folders') }\"\n              >{{ $t(\"G-Codes\") }}</b-nav-item\n            >\n            <b-nav-item\n              v-if=\"isEnt\"\n              href=\"https://app.kingroon.com/ent_pub/pricing/\"\n              :class=\"{ active: viewName === 'pricing' }\"\n              >{{ $t(\"Pricing\") }}</b-nav-item\n            >\n            <b-nav-item href=\"https://docs.kingroon.com/\">{{ $t(\"Help\") }}</b-nav-item>\n          </b-navbar-nav>\n\n          <b-navbar-nav class=\"ml-auto\">\n            <b-nav-item v-if=\"!user\" href=\"/accounts/login/\">{{ $t(\"SIGN IN\") }}</b-nav-item>\n            <b-nav-item v-if=\"!user && allowSignUp\" href=\"/accounts/signup/\">{{ $t(\"SIGN UP\") }}</b-nav-item>\n            <b-nav-item-dropdown\n              v-if=\"user\"\n              ref=\"accountDropdown\"\n              right\n              toggle-class=\"user-menu\"\n              :text=\"user.first_name || user.email\"\n            >\n              <b-dropdown-item href=\"/user_preferences/\">\n                <i class=\"fas fa-cog mr-2\"></i>{{$t(\"Preferences\")}}\n              </b-dropdown-item>\n              <b-dropdown-divider></b-dropdown-divider>\n              <b-dropdown-item href=\"/accounts/logout/\">\n                <i class=\"fas fa-sign-out-alt mr-2\"></i>{{$t(\"Log out\")}}\n              </b-dropdown-item>\n            </b-nav-item-dropdown>\n          </b-navbar-nav>\n        </b-collapse>\n      </b-container>\n    </b-navbar>\n  </div>\n</template>\n\n<script>\nimport { inMobileWebView, user, settings } from '@src/lib/page-context'\nimport { Themes } from '@static/js/color-scheme'\nimport { currentThemeValue } from '@src/lib/color-scheme-controller'\n\nexport default {\n  name: 'KingroonNavBar',\n\n  components: {},\n\n  props: {\n    viewName: {\n      default() {\n        return ''\n      },\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      user: null,\n      allowSignUp: false,\n      isEnt: false,\n      themes: Themes,\n      showMainMenu: false,\n    }\n  },\n\n  computed: {\n    inMobileWebView() {\n      return inMobileWebView()\n    },\n\n    theme() {\n      return currentThemeValue()\n    },\n  },\n\n  created() {\n    const { ACCOUNT_ALLOW_SIGN_UP, IS_ENT } = settings()\n    this.allowSignUp = !!ACCOUNT_ALLOW_SIGN_UP\n    this.isEnt = !!IS_ENT\n    this.user = user()\n  },\n\n  methods: {\n    hideDropdowns() {\n      this.showMainMenu = false\n\n      // Check account dropdown (preferences and logout)\n      const accountDropdown = this.$refs.accountDropdown\n      if (accountDropdown) {\n        accountDropdown.hide()\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n::v-deep .navbar\n  padding: 0.5rem 1rem\n  background: #131920 !important\n\n  a.navbar-brand\n    margin-top: -3px\n\n  .navbar-toggler\n    color: var(--color-text-primary)\n\n  .nav-item\n    text-transform: uppercase\n\n  .user-menu\n    text-transform: none\n\n  .badge-btn\n    position: relative\n    height: 1.8rem\n    margin-right: 1.5em\n\n    img\n      height: 1.3rem\n\n    .badge\n      position: absolute\n      left: 22px\n      top: 1px\n      height: 18px\n      border-radius: 4px\n      transition: transform 0.2s\n\n      /* Animation */\n      &:hover\n        transform: scale(1.3)\n\n  @media (min-width: 1200px)\n    padding: 0rem 1rem\n\n    .nav-item\n      padding: 0.5rem 0.24rem\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonNavBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KingroonNavBar.vue?vue&type=template&id=3e53836d&scoped=true&\"\nimport script from \"./KingroonNavBar.vue?vue&type=script&lang=js&\"\nexport * from \"./KingroonNavBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KingroonNavBar.vue?vue&type=style&index=0&id=3e53836d&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3e53836d\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing\">\n    <nav-bar view-name=\"pricing\"></nav-bar>\n\n    <div v-if=\"!loaded\" class=\"text-center my-5\">\n      <b-spinner></b-spinner>\n    </div>\n    <div v-else id=\"content-wrapper\" class=\"container\">\n      <h1 class=\"text-center mt-5\">{{ $t('Kingroon Connect Plans') }}</h1>\n      <!-- <div class=\"text-center py-1\">\n        {{ $t('Powered by {obico}', { obico: $syndicateText.brandName }) }}\n      </div> -->\n      <div id=\"pricing-selections\" class=\"container text-center py-4\">\n        <div class=\"btn-group btn-group-toggle\">\n          <label\n            id=\"sub-annual-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Annual\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Annual (SAVE 33%)') }}\n          </label>\n          <label\n            id=\"sub-monthly-plan\"\n            :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\"\n          >\n            <input\n              v-model=\"billingCycle\"\n              type=\"radio\"\n              :value=\"BillingCycle.Monthly\"\n              autocomplete=\"off\"\n            />\n            {{ $t('Monthly') }}\n          </label>\n        </div>\n      </div>\n      <div class=\"container\">\n        <div class=\"row price-matrix\">\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">{{ $t('Free') }}</div>\n              <div>{{ $t('Print occasionally.') }}</div>\n              <div class=\"plan-price\">\n                $0\n                <span class=\"price-unit\" />\n              </div>\n              <div class=\"price-sub\">{{ $t('Unlimited Kingroon printers allowed') }}</div>\n            </div>\n            <div class=\"price-action\">\n              <a\n                v-if=\"!isAuthenticated\"\n                role=\"button\"\n                class=\"btn btn-primary btn-block\"\n                href=\"/accounts/signup/\"\n                >{{ $t('Get Started') }}</a\n              >\n            </div>\n            <div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"basic-webcam-streaming\">\n                    <help-widget id=\"basic-streaming-on-kingroon-pricing-page\">\n                      {{ $t('Basic webcam streaming') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <help-widget id=\"detective-hours-free-plan-on-kingroon-pricing-page\">\n                      <i18next\n                        :translation=\"\n                          $t('100 {localizedDom} AI Detection Hours/month, 30s detection interval')\n                        \"\n                      >\n                        <template #localizedDom>\n                          <b>{{ $t('Basic') }}</b>\n                        </template>\n                      </i18next>\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div id=\"tunneling-cap-per-month\">\n                    <help-widget id=\"tunneling-free-plan-on-kingroon-pricing-page\">\n                      {{ $t('300MB /mo tunnel data - Access Mainsail or Fluidd remotely') }}\n                    </help-widget>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('200MB total G-code cloud storage') }}</div>\n                </div>\n              </div>\n              <div class=\"features\">\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    <i18next\n                      :translation=\"\n                        $t('Companion mobile app for {localizedDom} and {localizedDom2}')\n                      \"\n                    >\n                      <template #localizedDom>\n                        <a\n                          href=\"https://play.google.com/store/apps/details?id=com.kingroon.android\"\n                          >{{ $t('Android') }}</a\n                        >\n                      </template>\n                      <template #localizedDom2>\n                        <a href=\"https://apps.apple.com/app/id6499243573\">{{ $t('iOS') }}</a>\n                      </template>\n                    </i18next>\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Remote printer access and control') }}</div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>\n                    {{\n                      $t('Failure alerts and print status updates sent through push notification')\n                    }}\n                  </div>\n                </div>\n                <div>\n                  <i class=\"fas fa-check fa-sm\" />\n                  <div>{{ $t('Community technical support') }}</div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-sm-12 col-lg-6 pb-5 mb-5\">\n            <div class=\"price-header\">\n              <div class=\"plan-name\">AI Premium</div>\n              <div>{{ $t('Print every day. 2+ printers.') }}</div>\n              <div class=\"plan-price\">\n                <span>{{ $t('$') }}</span>\n                <span id=\"monthly-price\">3.17</span>\n                <span class=\"price-unit\">&nbsp;/ {{ $t('month') }}</span>\n                <span v-if=\"isAnnual\" id=\"annual-bill\" style=\"font-size: 0.95rem; font-weight: 100\"\n                  >&nbsp;{{ $t('(Billed {name} annually)', { name: 38 }) }}</span\n                >\n              </div>\n              <div class=\"price-sub\">{{ $t('1st printer included') }}</div>\n              <div class=\"price-sub\">\n                <span>{{ $t('2+ printers at $') }}</span>\n                <span id=\"addl-printer-price\">{{ priceTable.basePrinterPrice }}</span>\n                / {{ $t('month / printer') }}\n              </div>\n            </div>\n            <div class=\"price-action\">\n              <div v-if=\"isAuthenticated\">\n                <a\n                  v-if=\"hasSubscription\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  href=\"/user_preferences/subscription/\"\n                  >{{ $t('View/Change Subscription') }}</a\n                >\n                <a\n                  v-else\n                  id=\"subscribe-pro\"\n                  v-b-popover.hover=\"{\n                    placement: 'top',\n                    content: $t('Full refund within 30 days if you are not happy.'),\n                  }\"\n                  role=\"button\"\n                  class=\"btn btn-primary btn-block\"\n                  @click=\"upgrade\"\n                  >{{ $t('Upgrade (30-Day Money Back Guarantee)') }}</a\n                >\n              </div>\n              <div v-else>\n                <a role=\"button\" class=\"btn btn-primary btn-block\" href=\"/accounts/signup/\">{{\n                  $t('Start 1 month FREE trial')\n                }}</a>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"premium-webcam-streaming\">\n                  <help-widget id=\"premium-streaming-on-kingroon-pricing-page\">\n                    {{ $t('Premium webcam streaming') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <help-widget id=\"detective-hours-pro-plan-on-kingroon-pricing-page\">\n                    <i18next\n                      :translation=\"\n                        $t(\n                          '100 {localizedDom} AI Detection Hours per month, 10s detection interval'\n                        )\n                      \"\n                    >\n                      <template #localizedDom>\n                        <b>{{ $t('Advanced') }}</b>\n                      </template>\n                    </i18next>\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div id=\"unlimited-tunnling-for-pro\">\n                  <help-widget id=\"tunneling-pro-plan-on-kingroon-pricing-page\">\n                    {{ $t('Unlimited tunnel data - Access Mainsail or fluidd remotely') }}\n                  </help-widget>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('5GB total G-Code cloud storage') }}</div>\n              </div>\n            </div>\n            <div class=\"features\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  <i18next\n                    :translation=\"$t('Companion mobile app for {localizedDom} and {localizedDom2}')\"\n                  >\n                    <template #localizedDom>\n                      <a\n                        href=\"https://play.google.com/store/apps/details?id=com.thespaghettidetective.android&hl=en_US&gl=US\"\n                        >{{ $t('Android') }}</a\n                      >\n                    </template>\n                    <template #localizedDom2>\n                      <a\n                        href=\"https://apps.apple.com/sg/app/the-spaghetti-detective/id1540646623\"\n                        >{{ $t('iOS') }}</a\n                      >\n                    </template>\n                  </i18next>\n                </div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Remote printer access and control') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>\n                  {{ $t('Failure alerts and print status updates sent through push notification') }}\n                </div>\n              </div>\n            </div>\n            <div class=\"features keyfeatures\">\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Email technical support') }}</div>\n              </div>\n              <div>\n                <i class=\"fas fa-check fa-sm\" />\n                <div>{{ $t('Printer feed sharing with premium streaming quality') }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <QuestionsKingroonSection @calc=\"calc\" />\n    </div>\n  </div>\n</template>\n\n<script>\nimport {\n  BillingCycle,\n  DHPacks,\n  PrepaidDHPacks,\n  CalcPeriod,\n  calcPriceTable,\n  calcDHPackPrice,\n} from '@entSrc/lib/pricing.js'\n\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport { SupportEmail } from '@entSrc/lib/consts.js'\nimport HelpWidget from '@src/components/HelpWidget.vue'\nimport axios from '@src/lib/axios-csrf'\nimport urls from '@config/server-urls'\n\nimport ConfigureSubscription from '@entSrc/components/pricing/ConfigureSubscription.vue'\nimport QuestionsKingroonSection from '@entSrc/components/pricing/QuestionsKingroonSection.vue'\nimport NavBar from '@entSrc/components/KingroonNavBar.vue'\n\nexport default {\n  name: 'KingroonPricingPage',\n  components: {\n    QuestionsKingroonSection,\n    NavBar,\n    HelpWidget,\n  },\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    initialNumPrinters: {\n      type: Number,\n      required: true,\n    },\n    annualAsDefault: {\n      type: Boolean,\n      default() {\n        return true\n      },\n    },\n  },\n  data() {\n    return {\n      initialCBSubscription: null,\n      loaded: false,\n      billingCycle: this.annualAsDefault ? BillingCycle.Annual : BillingCycle.Monthly,\n      numPrinters: Math.max(this.initialNumPrinters, 1),\n      dhPackKey: '0',\n      isCalcOpen: false,\n      selectedPrepaidPack: null,\n    }\n  },\n  computed: {\n    mailto() {\n      return `mailto:${SupportEmail}`\n    },\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    hasSubscription() {\n      return Boolean(this.initialCBSubscription)\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n    this.PrepaidDHPacks = PrepaidDHPacks\n    this.chargeBeeInstance = chargeBee.init(this.chargeBeeSite)\n\n    if (this.isAuthenticated) {\n      axios.get(urls.activeSubscription()).then((response) => {\n        this.loaded = true\n        const data = response.data\n        this.initialCBSubscription = data ? data.cb_subscription : null\n      })\n    } else {\n      this.loaded = true\n    }\n  },\n  mounted() {\n    // Google Optimize\n    let googleOptimizeScript = document.createElement('script')\n    googleOptimizeScript.setAttribute(\n      'src',\n      'https://www.googleoptimize.com/optimize.js?id=OPT-NVC4QPD'\n    )\n    document.head.appendChild(googleOptimizeScript)\n    document.body.classList.add('kingroon-page')\n  },\n  beforeDestroy() {\n    document.body.classList.remove('kingroon-page')\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackSubLabel(key) {\n      const year = calcDHPackPrice(this.billingCycle, CalcPeriod.Year, key)\n      const month = calcDHPackPrice(this.billingCycle, CalcPeriod.Month, key)\n      const hour = (month / DHPacks[key].hours).toFixed(4)\n\n      if (key > 0) {\n        return this.billingCycle == BillingCycle.Annual\n          ? `${this.$i18next.t(\n              ' for ${month} / month (${hour} / AI Detection Hour). Billed ${year} annually.',\n              { month, hour, year }\n            )}`\n          : `${this.$i18next.t(' for ${month} / month (${hour} / AI Detection Hour).', {\n              month,\n              hour,\n            })}`\n      }\n      return ''\n    },\n    calc() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    calcWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: true,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Calculate Plan Cost')}`,\n          showConfirmButton: true,\n        }\n      )\n    },\n    upgrade() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: '0',\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    upgradeWithDHPack() {\n      this.$swal.openModalWithComponent(\n        ConfigureSubscription,\n        {\n          calculateOnly: false,\n          initialNumPrinters: this.numPrinters,\n          initialDHPackKey: this.dhPackKey,\n          initialBillingCycle: this.billingCycle,\n          primaryEmailVerified: this.primaryEmailVerified,\n          chargeBeeInstance: this.chargeBeeInstance,\n        },\n        {\n          title: `${this.$i18next.t('Build Your')} AI Premium ${this.$i18next.t('Plan')}`,\n          showConfirmButton: false,\n        }\n      )\n    },\n    checkoutPrepaidDHPack(level) {\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_prepaid_dhpack_checkout_url/', {\n        dhpack_level: level,\n      })\n    },\n    purchasePrepaidPack() {\n      if (this.selectedPrepaidPack === null) {\n        return\n      } else {\n        this.checkoutPrepaidDHPack(this.selectedPrepaidPack)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-primary\n  background-color: #ED7100\n  border-color: #ED7100\n.keyfeatures\n  color: #ED7100 !important\na\n  color: #ED7100\n.pricing .price-matrix div[class^=col-] .price-header, .pricing .price-matrix div[class^=col-] .price-action, .pricing .price-matrix div[class^=col-] > div, .pricing .price-matrix div[class^=col-]\n  background: #000000\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KingroonPricingPage.vue?vue&type=template&id=0cc96e90&scoped=true&\"\nimport script from \"./KingroonPricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./KingroonPricingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KingroonPricingPage.vue?vue&type=style&index=0&id=0cc96e90&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"0cc96e90\",\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"pricing-page\"},[(_vm.canGoBackToChat)?_c('div',{staticClass:\"pricing-header\"},[_c('div',{staticClass:\"header-left\"},[_c('a',{staticClass:\"header-button\",attrs:{\"href\":\"/jusprin/v1.0/embedded_chat/\",\"title\":_vm.$t('Back to Chat')}},[_c('i',{staticClass:\"mdi mdi-arrow-left large-icon\"}),_c('span',{staticClass:\"button-text\"},[_vm._v(_vm._s(_vm.$t('Back to Chat')))])])])]):_vm._e(),_c('div',{staticClass:\"container content-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[(!_vm.loading)?_c('div',{staticClass:\"pricing-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-5 col-md-6 mb-4\"},[_c('div',{staticClass:\"pricing-card\"},[_c('div',{staticClass:\"plan-header\"},[_c('h2',{staticClass:\"plan-title\"},[_vm._v(_vm._s(_vm.$t('Free')))]),_c('p',{staticClass:\"plan-subtitle\"},[_vm._v(_vm._s(_vm.$t('Free for everyone')))])]),_vm._m(0),_c('div',{staticClass:\"plan-action\"},[_c('button',{staticClass:\"btn current-plan-btn\",class:_vm.hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary',attrs:{\"disabled\":!_vm.hasActiveSubscription},on:{\"click\":_vm.downgradeToFree}},[_vm._v(\" \"+_vm._s(_vm.freeButtonText)+\" \")])]),_c('div',{staticClass:\"plan-features\"},[_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('50 AI credits per month. Reset on the first day of each month')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('Community support')))])])])])]),_c('div',{staticClass:\"col-lg-5 col-md-6 mb-4\"},[_c('div',{staticClass:\"pricing-card\"},[_c('div',{staticClass:\"plan-header\"},[_c('h2',{staticClass:\"plan-title\"},[_vm._v(_vm._s(_vm.$t('JusPrin Unlimited')))]),_c('div',{staticClass:\"billing-toggle\"},[_c('span',{staticClass:\"billing-text\"},[_vm._v(_vm._s(_vm.$t('Billed annually')))]),_c('div',{staticClass:\"toggle-switch\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.isAnnual),expression:\"isAnnual\"}],staticClass:\"toggle-input\",attrs:{\"id\":\"billing-toggle\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.isAnnual)?_vm._i(_vm.isAnnual,null)>-1:(_vm.isAnnual)},on:{\"change\":function($event){var $$a=_vm.isAnnual,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.isAnnual=$$a.concat([$$v]))}else{$$i>-1&&(_vm.isAnnual=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.isAnnual=$$c}}}}),_vm._m(1)])])]),_c('div',{staticClass:\"plan-price\"},[_c('div',{staticClass:\"price-container\"},[(_vm.hasActiveObicoProSubscription)?_c('span',{staticClass:\"original-price\"},[_vm._v(\" $\"+_vm._s(_vm.originalPriceDollars)),_c('span',{staticClass:\"original-price-cents\"},[_vm._v(\".\"+_vm._s(_vm.originalPriceCents))])]):_vm._e(),_c('span',{staticClass:\"price\"},[_vm._v(\" $\"+_vm._s(_vm.discountedPriceDollars)),_c('span',{staticClass:\"price-cents\"},[_vm._v(\".\"+_vm._s(_vm.discountedPriceCents))])]),_c('span',{staticClass:\"price-period\"},[_vm._v(_vm._s(_vm.isAnnual ? _vm.$t('per year') : _vm.$t('per month')))])]),(_vm.hasActiveObicoProSubscription)?_c('div',{staticClass:\"obico-discount-banner\"},[_c('i',{staticClass:\"fas fa-star\"}),_c('span',[_vm._v(_vm._s(_vm.$t('{percentage}% off for Obico Pro subscribers, Yay!', { percentage: _vm.obicoProDiscountPercentage, })))])]):_vm._e()]),_c('div',{staticClass:\"plan-action\"},[_c('button',{staticClass:\"btn upgrade-btn\",class:_vm.hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary',on:{\"click\":_vm.upgradeToProPlan}},[_vm._v(\" \"+_vm._s(_vm.upgradeButtonText)+\" \")])]),_c('div',{staticClass:\"plan-features\"},[_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',{staticClass:\"important-feature\"},[_vm._v(\" \"+_vm._s(_vm.$t('Unlimited AI credits'))+\" \"),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}}),_c('img',{staticClass:\"feature-credit-icon\",attrs:{\"src\":\"/static/img/jusprin-credit.png\",\"alt\":\"Credit\"}})])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',{staticClass:\"important-feature\"},[_vm._v(_vm._s(_vm.$t('Unlimited \"Do Your Magic\" AI generations')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('AI memory: remember your slicing preferences')))])]),_c('div',{staticClass:\"feature-item\"},[_c('i',{staticClass:\"fas fa-check feature-check\"}),_c('span',[_vm._v(_vm._s(_vm.$t('Email support. 24 hours response time')))])])])])])])]):_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"text-center\"},[_c('div',{staticClass:\"spinner-border text-primary\",attrs:{\"role\":\"status\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.$t('Loading...')))])]),_c('p',{staticClass:\"mt-2\"},[_vm._v(_vm._s(_vm.$t('Loading subscription information...')))])])])])]),_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[_c('div',{staticClass:\"faq-container\"},[_c('div',{staticClass:\"row justify-content-center\"},[_c('div',{staticClass:\"col-lg-10\"},[_c('div',{staticClass:\"faq-section\"},[_c('h2',{staticClass:\"faq-title\"},[_vm._v(_vm._s(_vm.$t('Frequently Asked Questions')))]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'I am an Obico Pro Plan subscriber. Am I eligible for a discount on the Unlimited Plan?' ))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Yes! You'll receive 30% off the Unlimited Plan. By the way, thank you for supporting the Obico project! 😊\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"I'm an Obico Pro Plan subscriber. Why don't I see the 30% discount?\"))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"First, make sure you're signed into the Obico account with an active Pro subscription. If you still don't see the discount on this page, it should appear at checkout. If it doesn't show up there either, please contact us at support@obico.io for assistance.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Am I able to cancel the Unlimited Plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"Yes, you can cancel at any time by clicking 'Downgrade to Free.'\"))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('What happens after I downgrade to the Free plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"Your Unlimited Plan won't renew when your current term ends, and your account won't be charged. You'll still have access to unlimited AI credits until the end of your current term.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Can I get a refund for the Unlimited Plan?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( \"By default, no. This is to prevent abuse, as processing refunds incurs significant fees that we're unable to absorb.\" ))+\" \")])]),_c('div',{staticClass:\"faq-item\"},[_c('h3',{staticClass:\"faq-question\"},[_vm._v(\" \"+_vm._s(_vm.$t('Is it possible to request an exception for a refund?'))+\" \")]),_c('p',{staticClass:\"faq-answer\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'We handle these requests on a case-by-case basis. You can contact support@obico.io to request an exception and provide your reason for the request.' ))+\" \")])])])])])])])])]),(_vm.showSuccessPopup)?_c('div',{staticClass:\"success-popup-overlay\"},[_c('div',{staticClass:\"success-popup-modal\"},[_c('div',{staticClass:\"success-popup-content\"},[_c('h3',{staticClass:\"success-title\"},[_vm._v(\"🎉 \"+_vm._s(_vm.$t('Unlimited Plan Activated!')))]),_c('p',{staticClass:\"success-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('Enjoy unlimited AI credits!'))+\" \")]),(_vm.canGoBackToChat)?_c('div',{staticClass:\"countdown-container\"},[_c('div',{staticClass:\"circular-progress\"},[_c('svg',{staticClass:\"progress-circle\",attrs:{\"viewBox\":\"0 0 120 120\"}},[_c('circle',{staticClass:\"progress-track\",attrs:{\"cx\":\"60\",\"cy\":\"60\",\"r\":\"50\",\"fill\":\"none\",\"stroke\":\"var(--color-divider)\",\"stroke-width\":\"8\"}}),_c('circle',{staticClass:\"progress-bar\",attrs:{\"cx\":\"60\",\"cy\":\"60\",\"r\":\"50\",\"fill\":\"none\",\"stroke\":\"var(--color-primary)\",\"stroke-width\":\"8\",\"stroke-linecap\":\"round\",\"stroke-dasharray\":_vm.circleCircumference,\"stroke-dashoffset\":_vm.circleOffset}})]),_c('div',{staticClass:\"countdown-text\"},[_c('span',{staticClass:\"countdown-number\"},[_vm._v(_vm._s(_vm.countdownSeconds))])])]),_c('p',{staticClass:\"redirect-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('Redirecting to chat window in'))+\" \"),_c('strong',[_vm._v(_vm._s(_vm.countdownSeconds))]),_vm._v(\" \"+_vm._s(_vm.countdownSeconds === 1 ? _vm.$t('second') : _vm.$t('seconds'))+\" \")])]):_vm._e(),(!_vm.canGoBackToChat)?_c('div',{staticClass:\"no-redirect-message\"},[_c('p',{staticClass:\"close-app-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('You can now close the JusPrin app to make sure the new plan will be effective.'))+\" \")])]):_vm._e(),(_vm.canGoBackToChat)?_c('div',{staticClass:\"popup-actions\"},[_c('button',{staticClass:\"btn btn-outline-secondary cancel-btn\",on:{\"click\":_vm.cancelRedirect}},[_vm._v(\" \"+_vm._s(_vm.$t('Cancel'))+\" \")]),_c('button',{staticClass:\"btn btn-primary redirect-btn\",on:{\"click\":_vm.redirectToChat}},[_vm._v(\" \"+_vm._s(_vm.$t('Go to Chat Now'))+\" \")])]):_vm._e(),(!_vm.canGoBackToChat)?_c('div',{staticClass:\"popup-actions\"},[_c('button',{staticClass:\"btn btn-primary close-btn\",on:{\"click\":_vm.closeSuccessPopup}},[_vm._v(\" \"+_vm._s(_vm.$t('OK'))+\" \")])]):_vm._e()])])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"plan-price\"},[_c('span',{staticClass:\"price\"},[_vm._v(\"$0\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('label',{staticClass:\"toggle-label\",attrs:{\"for\":\"billing-toggle\"}},[_c('span',{staticClass:\"toggle-slider\"})])\n}]\n\nexport { render, staticRenderFns }","import axios from 'axios'\n\nconst init = (site) => {\n  return window.Chargebee.init({ site })\n}\n\nconst checkout = (chargebeeInstance, data, errorHandler = null) => {\n  chargebeeInstance.openCheckout({\n    hostedPage: function () {\n      return axios\n        .get('/ent/jusprin/generate_checkout_url/', {\n          params: data,\n          headers: {\n            Accept: 'application/json',\n            'Content-Type': 'application/json',\n          },\n        })\n        .then((result) => result.data)\n    },\n    error: function () {\n      if (errorHandler) {\n        errorHandler()\n      }\n    },\n  })\n}\n\nconst portal = (chargebeeInstance) => {\n  chargebeeInstance.setPortalSession(function () {\n    return axios\n      .get('/ent/jusprin/generate_portal_session/', {\n        headers: {\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n        },\n      })\n      .then((result) => result.data)\n  })\n\n  const cbPortal = chargebeeInstance.createChargebeePortal()\n  cbPortal.open({\n    close() {},\n  })\n}\n\nexport { init, checkout, portal }\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t( 'Your JusPrin Unlimited subscription will be cancelled at the end of the billing cycle and you will downgrade to the Free plan.' ))+\" \")]),_c('br'),_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t('You will lose unlimited AI credits and return to 50 AI credits per month.'))+\" \")]),_c('br'),_c('div',{staticClass:\"lead\"},[_vm._v(\" \"+_vm._s(_vm.$t('Are you sure you want to proceed?'))+\" \")]),_c('div',{staticClass:\"mt-2 text-center\"},[_c('button',{staticClass:\"btn btn-primary border m-2\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.cancel}},[_vm._v(\" \"+_vm._s(_vm.$t(\"I changed my mind. I'll keep my subscription\"))+\" \")]),_c('button',{staticClass:\"btn btn-secondary border m-2\",attrs:{\"type\":\"submit\"},on:{\"click\":_vm.confirm}},[_vm._v(\" \"+_vm._s(_vm.$t('Yes, downgrade to Free plan'))+\" \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"p-2\">\n    <div class=\"lead\">\n      {{\n        $t(\n          'Your JusPrin Unlimited subscription will be cancelled at the end of the billing cycle and you will downgrade to the Free plan.'\n        )\n      }}\n    </div>\n    <br />\n    <div class=\"lead\">\n      {{ $t('You will lose unlimited AI credits and return to 50 AI credits per month.') }}\n    </div>\n    <br />\n    <div class=\"lead\">\n      {{ $t('Are you sure you want to proceed?') }}\n    </div>\n    <div class=\"mt-2 text-center\">\n      <button type=\"button\" class=\"btn btn-primary border m-2\" @click=\"cancel\">\n        {{ $t(\"I changed my mind. I'll keep my subscription\") }}\n      </button>\n      <button type=\"submit\" class=\"btn btn-secondary border m-2\" @click=\"confirm\">\n        {{ $t('Yes, downgrade to Free plan') }}\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nimport axios from '@src/lib/axios-csrf'\n\nexport default {\n  name: 'DowngradeConfirmation',\n\n  props: {\n    subscription: {\n      type: Object,\n      required: true,\n    },\n  },\n\n  methods: {\n    cancel() {\n      this.$swal.close()\n    },\n    confirm() {\n      axios\n        .post(`/ent/jusprin/api/subscription_plan/${this.subscription.id}/cancel/`)\n        .then(() => {\n          // Reload the page to reflect the changes\n          window.location.reload()\n        })\n        .catch((error) => {\n          console.error('Failed to downgrade subscription:', error)\n          this.$swal.Reject.fire({\n            title: this.$i18next.t('Error'),\n            text: this.$i18next.t('Failed to downgrade subscription. Please try again.'),\n          })\n        })\n    },\n  },\n}\n</script>\n\n<style></style>\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DowngradeConfirmation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DowngradeConfirmation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DowngradeConfirmation.vue?vue&type=template&id=4e56219c&\"\nimport script from \"./DowngradeConfirmation.vue?vue&type=script&lang=js&\"\nexport * from \"./DowngradeConfirmation.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"pricing-page\">\n    <!-- Header -->\n    <div class=\"pricing-header\" v-if=\"canGoBackToChat\">\n      <div class=\"header-left\">\n        <a href=\"/jusprin/v1.0/embedded_chat/\" class=\"header-button\" :title=\"$t('Back to Chat')\">\n          <i class=\"mdi mdi-arrow-left large-icon\"></i>\n          <span class=\"button-text\">{{ $t('Back to Chat') }}</span>\n        </a>\n      </div>\n    </div>\n\n    <div class=\"container content-container\">\n      <div class=\"row justify-content-center\">\n        <div class=\"col-lg-10\">\n          <div class=\"pricing-container\" v-if=\"!loading\">\n            <div class=\"row justify-content-center\">\n              <!-- Free Plan Card -->\n              <div class=\"col-lg-5 col-md-6 mb-4\">\n                <div class=\"pricing-card\">\n                  <div class=\"plan-header\">\n                    <h2 class=\"plan-title\">{{ $t('Free') }}</h2>\n                    <p class=\"plan-subtitle\">{{ $t('Free for everyone') }}</p>\n                  </div>\n\n                  <div class=\"plan-price\">\n                    <span class=\"price\">$0</span>\n                  </div>\n\n                  <div class=\"plan-action\">\n                    <button\n                      class=\"btn current-plan-btn\"\n                      :class=\"hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary'\"\n                      :disabled=\"!hasActiveSubscription\"\n                      @click=\"downgradeToFree\"\n                    >\n                      {{ freeButtonText }}\n                    </button>\n                  </div>\n\n                  <div class=\"plan-features\">\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{\n                        $t('50 AI credits per month. Reset on the first day of each month')\n                      }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('Community support') }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <!-- Pro Plan Card -->\n              <div class=\"col-lg-5 col-md-6 mb-4\">\n                <div class=\"pricing-card\">\n                  <div class=\"plan-header\">\n                    <h2 class=\"plan-title\">{{ $t('JusPrin Unlimited') }}</h2>\n                    <div class=\"billing-toggle\">\n                      <span class=\"billing-text\">{{ $t('Billed annually') }}</span>\n                      <div class=\"toggle-switch\">\n                        <input\n                          id=\"billing-toggle\"\n                          type=\"checkbox\"\n                          v-model=\"isAnnual\"\n                          class=\"toggle-input\"\n                        />\n                        <label for=\"billing-toggle\" class=\"toggle-label\">\n                          <span class=\"toggle-slider\"></span>\n                        </label>\n                      </div>\n                    </div>\n                  </div>\n\n                  <div class=\"plan-price\">\n                    <div class=\"price-container\">\n                      <span v-if=\"hasActiveObicoProSubscription\" class=\"original-price\">\n                        ${{ originalPriceDollars\n                        }}<span class=\"original-price-cents\">.{{ originalPriceCents }}</span>\n                      </span>\n                      <span class=\"price\">\n                        ${{ discountedPriceDollars\n                        }}<span class=\"price-cents\">.{{ discountedPriceCents }}</span>\n                      </span>\n                      <span class=\"price-period\">{{\n                        isAnnual ? $t('per year') : $t('per month')\n                      }}</span>\n                    </div>\n\n                    <div v-if=\"hasActiveObicoProSubscription\" class=\"obico-discount-banner\">\n                      <i class=\"fas fa-star\"></i>\n                      <span>{{\n                        $t('{percentage}% off for Obico Pro subscribers, Yay!', {\n                          percentage: obicoProDiscountPercentage,\n                        })\n                      }}</span>\n                    </div>\n                  </div>\n\n                  <div class=\"plan-action\">\n                    <button\n                      class=\"btn upgrade-btn\"\n                      :class=\"hasActiveSubscription ? 'btn-outline-primary' : 'btn-primary'\"\n                      @click=\"upgradeToProPlan\"\n                    >\n                      {{ upgradeButtonText }}\n                    </button>\n                  </div>\n\n                  <div class=\"plan-features\">\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span class=\"important-feature\">\n                        {{ $t('Unlimited AI credits') }}\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                        <img\n                          src=\"/static/img/jusprin-credit.png\"\n                          alt=\"Credit\"\n                          class=\"feature-credit-icon\"\n                        />\n                      </span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span class=\"important-feature\">{{\n                        $t('Unlimited \"Do Your Magic\" AI generations')\n                      }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('AI memory: remember your slicing preferences') }}</span>\n                    </div>\n                    <div class=\"feature-item\">\n                      <i class=\"fas fa-check feature-check\"></i>\n                      <span>{{ $t('Email support. 24 hours response time') }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div v-else class=\"loading-container\">\n            <div class=\"text-center\">\n              <div class=\"spinner-border text-primary\" role=\"status\">\n                <span class=\"sr-only\">{{ $t('Loading...') }}</span>\n              </div>\n              <p class=\"mt-2\">{{ $t('Loading subscription information...') }}</p>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- FAQ Section -->\n      <div class=\"row justify-content-center\">\n        <div class=\"col-lg-10\">\n          <div class=\"faq-container\">\n            <div class=\"row justify-content-center\">\n              <div class=\"col-lg-10\">\n                <div class=\"faq-section\">\n                  <h2 class=\"faq-title\">{{ $t('Frequently Asked Questions') }}</h2>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{\n                        $t(\n                          'I am an Obico Pro Plan subscriber. Am I eligible for a discount on the Unlimited Plan?'\n                        )\n                      }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"Yes! You'll receive 30% off the Unlimited Plan. By the way, thank you for supporting the Obico project! 😊\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{\n                        $t(\"I'm an Obico Pro Plan subscriber. Why don't I see the 30% discount?\")\n                      }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"First, make sure you're signed into the Obico account with an active Pro subscription. If you still don't see the discount on this page, it should appear at checkout. If it doesn't show up there either, please contact us at support@obico.io for assistance.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Am I able to cancel the Unlimited Plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{ $t(\"Yes, you can cancel at any time by clicking 'Downgrade to Free.'\") }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('What happens after I downgrade to the Free plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"Your Unlimited Plan won't renew when your current term ends, and your account won't be charged. You'll still have access to unlimited AI credits until the end of your current term.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Can I get a refund for the Unlimited Plan?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          \"By default, no. This is to prevent abuse, as processing refunds incurs significant fees that we're unable to absorb.\"\n                        )\n                      }}\n                    </p>\n                  </div>\n\n                  <div class=\"faq-item\">\n                    <h3 class=\"faq-question\">\n                      {{ $t('Is it possible to request an exception for a refund?') }}\n                    </h3>\n                    <p class=\"faq-answer\">\n                      {{\n                        $t(\n                          'We handle these requests on a case-by-case basis. You can contact support@obico.io to request an exception and provide your reason for the request.'\n                        )\n                      }}\n                    </p>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <!-- Success Popup Modal -->\n    <div v-if=\"showSuccessPopup\" class=\"success-popup-overlay\">\n      <div class=\"success-popup-modal\">\n        <div class=\"success-popup-content\">\n          <h3 class=\"success-title\">🎉 {{ $t('Unlimited Plan Activated!') }}</h3>\n          <p class=\"success-message\">\n            {{ $t('Enjoy unlimited AI credits!') }}\n          </p>\n\n          <div v-if=\"canGoBackToChat\" class=\"countdown-container\">\n            <div class=\"circular-progress\">\n              <svg class=\"progress-circle\" viewBox=\"0 0 120 120\">\n                <circle\n                  class=\"progress-track\"\n                  cx=\"60\"\n                  cy=\"60\"\n                  r=\"50\"\n                  fill=\"none\"\n                  stroke=\"var(--color-divider)\"\n                  stroke-width=\"8\"\n                />\n                <circle\n                  class=\"progress-bar\"\n                  cx=\"60\"\n                  cy=\"60\"\n                  r=\"50\"\n                  fill=\"none\"\n                  stroke=\"var(--color-primary)\"\n                  stroke-width=\"8\"\n                  stroke-linecap=\"round\"\n                  :stroke-dasharray=\"circleCircumference\"\n                  :stroke-dashoffset=\"circleOffset\"\n                />\n              </svg>\n              <div class=\"countdown-text\">\n                <span class=\"countdown-number\">{{ countdownSeconds }}</span>\n              </div>\n            </div>\n\n            <p class=\"redirect-message\">\n              {{ $t('Redirecting to chat window in') }}\n              <strong>{{ countdownSeconds }}</strong>\n              {{ countdownSeconds === 1 ? $t('second') : $t('seconds') }}\n            </p>\n          </div>\n\n          <div v-if=\"!canGoBackToChat\" class=\"no-redirect-message\">\n            <p class=\"close-app-message\">\n              {{\n                $t('You can now close the JusPrin app to make sure the new plan will be effective.')\n              }}\n            </p>\n          </div>\n\n          <div v-if=\"canGoBackToChat\" class=\"popup-actions\">\n            <button class=\"btn btn-outline-secondary cancel-btn\" @click=\"cancelRedirect\">\n              {{ $t('Cancel') }}\n            </button>\n            <button class=\"btn btn-primary redirect-btn\" @click=\"redirectToChat\">\n              {{ $t('Go to Chat Now') }}\n            </button>\n          </div>\n\n          <div v-if=\"!canGoBackToChat\" class=\"popup-actions\">\n            <button class=\"btn btn-primary close-btn\" @click=\"closeSuccessPopup\">\n              {{ $t('OK') }}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport * as jusprinChargebee from './lib/jusprin_chargebee.js'\nimport DowngradeConfirmation from './components/DowngradeConfirmation.vue'\n\nexport default {\n  name: 'JusPrinPricingPage',\n\n  props: {\n    isAuthenticated: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeSite: {\n      type: String,\n      required: true,\n    },\n    obicoProDiscountPercentage: {\n      type: Number,\n      required: true,\n    },\n  },\n\n  data() {\n    return {\n      isAnnual: true,\n      chargeBeeInstance: null,\n      currentSubscription: null,\n      obicoSubscription: null,\n      loading: true,\n      showBackToChatHeader: false,\n      // Success popup data\n      showSuccessPopup: false,\n      countdownSeconds: 5,\n      countdownInterval: null,\n      circleCircumference: 2 * Math.PI * 50, // radius is 50\n    }\n  },\n\n  mounted() {\n    // Initialize Chargebee instance\n    this.chargeBeeInstance = jusprinChargebee.init(this.chargeBeeSite)\n\n    // Handle can_go_back_to_chat parameter first\n    this.handleCanGoBackToChatParam()\n\n    // Fetch current subscription status\n    this.fetchCurrentSubscription()\n    this.fetchObicoSubscription()\n\n    // Check for checkout success parameter\n    this.checkForCheckoutSuccess()\n  },\n\n  computed: {\n    hasActiveSubscription() {\n      return this.currentSubscription && this.currentSubscription.is_active\n    },\n\n    isCurrentPlanAnnual() {\n      return this.currentSubscription && this.currentSubscription.is_annual\n    },\n\n    isCurrentPlanMonthly() {\n      return this.currentSubscription && this.currentSubscription.is_monthly\n    },\n\n    hasActiveObicoProSubscription() {\n      return Boolean(this.obicoSubscription?.cb_subscription)\n    },\n\n    discountedPrice() {\n      if (this.hasActiveObicoProSubscription) {\n        const originalPrice = this.isAnnual ? 59.99 : 6.99\n        const discountMultiplier = (100 - this.obicoProDiscountPercentage) / 100\n        return (originalPrice * discountMultiplier).toFixed(2)\n      }\n      return this.isAnnual ? '59.99' : '6.99'\n    },\n\n    discountedPriceDollars() {\n      return this.discountedPrice.split('.')[0]\n    },\n\n    discountedPriceCents() {\n      return this.discountedPrice.split('.')[1]\n    },\n\n    originalPriceDollars() {\n      const originalPrice = this.isAnnual ? '59.99' : '6.99'\n      return originalPrice.split('.')[0]\n    },\n\n    originalPriceCents() {\n      const originalPrice = this.isAnnual ? '59.99' : '6.99'\n      return originalPrice.split('.')[1]\n    },\n\n    hasBillingCycleChanged() {\n      // Check if user has active subscription and has changed the billing cycle\n      return this.hasActiveSubscription && this.isAnnual !== this.currentSubscription.is_annual\n    },\n\n    upgradeButtonText() {\n      if (this.hasActiveSubscription) {\n        if (this.hasBillingCycleChanged) {\n          return this.$t('Change Plan')\n        }\n        return this.$t('Manage Account')\n      }\n      return this.$t('Upgrade to JusPrin Unlimited')\n    },\n\n    freeButtonText() {\n      if (!this.hasActiveSubscription) {\n        return this.$t('Current plan')\n      }\n      return this.$t('Downgrade to Free')\n    },\n\n    // Circular progress bar offset calculation\n    circleOffset() {\n      const progress = (5 - this.countdownSeconds) / 5\n      return this.circleCircumference * (1 - progress)\n    },\n\n    canGoBackToChat() {\n      return this.showBackToChatHeader\n    },\n  },\n\n  methods: {\n    async fetchCurrentSubscription() {\n      try {\n        const response = await fetch('/ent/jusprin/api/subscription_plan/', {\n          method: 'GET',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-CSRFToken': this.getCsrfToken(),\n          },\n          credentials: 'same-origin',\n        })\n\n        if (response.ok) {\n          this.currentSubscription = await response.json()\n\n          // Set the initial toggle state based on current subscription\n          if (this.currentSubscription && this.currentSubscription.is_active) {\n            this.isAnnual = this.currentSubscription.is_annual\n          }\n        }\n      } catch (error) {\n        console.error('Error fetching current subscription:', error)\n      } finally {\n        this.loading = false\n      }\n    },\n\n    async fetchObicoSubscription() {\n      try {\n        const response = await fetch('/ent/api/subscriptions/active/', {\n          method: 'GET',\n          headers: {\n            'Content-Type': 'application/json',\n            'X-CSRFToken': this.getCsrfToken(),\n          },\n          credentials: 'same-origin',\n        })\n\n        if (response.ok) {\n          const data = await response.json()\n          this.obicoSubscription = data\n        }\n      } catch (error) {\n        console.error('Error fetching Obico subscription:', error)\n      }\n    },\n\n    getCsrfToken() {\n      const cookies = document.cookie.split(';')\n      for (let cookie of cookies) {\n        const [name, value] = cookie.trim().split('=')\n        if (name === 'csrftoken') {\n          return value\n        }\n      }\n      return ''\n    },\n\n    upgradeToProPlan() {\n      if (this.hasActiveSubscription) {\n        if (this.hasBillingCycleChanged) {\n          // User wants to change billing cycle - proceed with checkout\n          const checkoutOptions = {\n            annual: this.isAnnual,\n          }\n\n          // Note: Coupon for Obico Pro subscribers is applied on backend\n          jusprinChargebee.checkout(this.chargeBeeInstance, checkoutOptions)\n        } else {\n          // User wants to manage account - open Chargebee portal\n          jusprinChargebee.portal(this.chargeBeeInstance)\n        }\n      } else {\n        // New user wants to upgrade - proceed with checkout\n        const checkoutOptions = {\n          annual: this.isAnnual,\n        }\n\n        // Note: Coupon for Obico Pro subscribers is applied on backend\n        jusprinChargebee.checkout(this.chargeBeeInstance, checkoutOptions)\n      }\n    },\n\n    downgradeToFree() {\n      if (!this.hasActiveSubscription) {\n        return\n      }\n\n      this.$swal.openModalWithComponent(\n        DowngradeConfirmation,\n        {\n          subscription: this.currentSubscription,\n        },\n        {\n          title: 'Please Confirm',\n          showConfirmButton: false,\n        }\n      )\n    },\n\n    // Success popup methods\n    checkForCheckoutSuccess() {\n      const urlParams = new URLSearchParams(window.location.search)\n      if (urlParams.get('checkout') === 'success') {\n        this.showSuccessPopup = true\n        if (this.canGoBackToChat) {\n          this.startCountdown()\n        }\n      }\n    },\n\n    startCountdown() {\n      this.countdownInterval = setInterval(() => {\n        this.countdownSeconds--\n        if (this.countdownSeconds <= 0) {\n          this.redirectToChat()\n        }\n      }, 1000)\n    },\n\n    cancelRedirect() {\n      if (this.countdownInterval) {\n        clearInterval(this.countdownInterval)\n        this.countdownInterval = null\n      }\n      this.showSuccessPopup = false\n      // Remove the checkout=success parameter from URL\n      const url = new URL(window.location.href)\n      url.searchParams.delete('checkout')\n      window.history.replaceState({}, '', url.toString())\n    },\n\n    redirectToChat() {\n      if (this.countdownInterval) {\n        clearInterval(this.countdownInterval)\n        this.countdownInterval = null\n      }\n      this.showSuccessPopup = false\n      // Redirect to JusPrin chat window\n      window.location.href = '/jusprin/v1.0/embedded_chat/'\n    },\n\n    handleCanGoBackToChatParam() {\n      const urlParams = new URLSearchParams(window.location.search)\n      const canGoBack = urlParams.get('can_go_back_to_chat')\n      if (canGoBack !== null) {\n        sessionStorage.setItem('can_go_back_to_chat', canGoBack)\n        this.showBackToChatHeader = canGoBack === '1'\n      } else {\n        // Check sessionStorage on page load (for refreshes)\n        this.showBackToChatHeader = sessionStorage.getItem('can_go_back_to_chat') === '1'\n      }\n    },\n\n    closeSuccessPopup() {\n      this.showSuccessPopup = false\n    },\n  },\n\n  beforeUnmount() {\n    // Clean up interval when component is destroyed\n    if (this.countdownInterval) {\n      clearInterval(this.countdownInterval)\n    }\n  },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.pricing-page {\n  min-height: 100vh;\n  background: var(--color-background);\n  padding: 0;\n}\n\n.content-container {\n  padding-top: 2rem;\n}\n\n.pricing-container {\n  padding: 2rem 0;\n}\n\n.loading-container {\n  padding: 4rem 0;\n  min-height: 200px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.pricing-card {\n  background: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  padding: 2.5rem 2rem;\n  height: 100%;\n  position: relative;\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.1);\n}\n\n.plan-header {\n  margin-bottom: 2rem;\n}\n\n.plan-title {\n  font-size: 2rem;\n  font-weight: bold;\n  margin-bottom: 0.5rem;\n}\n\n.plan-subtitle {\n  margin-top: 16px;\n  font-size: 1rem;\n  margin-bottom: 0;\n  opacity: 0.8;\n}\n\n.billing-toggle {\n  display: flex;\n  align-items: center;\n  gap: 1rem;\n  margin-top: 1rem;\n}\n\n.billing-text {\n  font-size: 0.875rem;\n}\n\n.toggle-switch {\n  position: relative;\n  display: inline-block;\n  width: 50px;\n  height: 24px;\n}\n\n.toggle-input {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.toggle-label {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  border-radius: 24px;\n  transition: 0.3s;\n  background-color: var(--color-text-secondary);\n}\n\n.toggle-slider {\n  position: absolute;\n  content: '';\n  height: 18px;\n  width: 18px;\n  left: 3px;\n  bottom: 3px;\n  background-color: var(--color-surface-secondary);\n  border-radius: 50%;\n  transition: 0.3s;\n}\n\n.toggle-input:checked + .toggle-label {\n  background-color: var(--color-primary);\n}\n\n.toggle-input:checked + .toggle-label .toggle-slider {\n  transform: translateX(26px);\n}\n\n.plan-price {\n  margin-bottom: 2rem;\n}\n\n.obico-discount-banner {\n  padding: 1rem 0;\n  margin-bottom: 1rem;\n  font-weight: 500;\n  font-size: 0.875rem;\n\n  i {\n    margin-right: 0.5rem;\n    color: #ffd700; // Gold star\n  }\n}\n\n.price-container {\n  display: flex;\n  align-items: baseline;\n  gap: 0.5rem;\n  flex-wrap: wrap;\n}\n\n.original-price {\n  font-size: 2rem;\n  font-weight: normal;\n  text-decoration: line-through;\n  opacity: 0.6;\n  color: var(--color-text-secondary);\n}\n\n.original-price-cents {\n  font-size: 1.25rem;\n  vertical-align: top;\n}\n\n.price {\n  font-size: 4rem;\n  font-weight: bold;\n  line-height: 1;\n}\n\n.price-cents {\n  font-size: 2.5rem;\n  vertical-align: top;\n}\n\n.price-period {\n  font-size: 1rem;\n  margin-left: 0.5rem;\n  opacity: 0.8;\n}\n\n.plan-action {\n  margin-bottom: 2rem;\n}\n\n.current-plan-btn {\n  width: 100%;\n  padding: 0.75rem;\n  border: 2px solid;\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n}\n\n.upgrade-btn {\n  width: 100%;\n  padding: 0.75rem;\n  background-color: var(--color-primary);\n  border: none;\n  color: var(--color-on-primary);\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n\n  &:hover {\n    background-color: var(--color-primary-hover);\n  }\n}\n\n.plan-features {\n  display: flex;\n  flex-direction: column;\n  gap: 1rem;\n}\n\n.feature-item {\n  display: flex;\n  align-items: flex-start;\n  gap: 0.75rem;\n  .important-feature {\n    font-weight: bold;\n    font-size: 1.125rem;\n  }\n}\n\n.feature-check {\n  color: var(--color-primary);\n  margin-top: 0.125rem;\n  flex-shrink: 0;\n}\n\n.feature-credit-icon {\n  width: 22px;\n  height: 22px;\n  flex-shrink: 0;\n  margin-right: 0.25rem;\n}\n\n.new-badge {\n  background: var(--color-primary);\n  color: var(--color-on-primary);\n  font-size: 0.75rem;\n  padding: 0.125rem 0.5rem;\n  border-radius: 12px;\n  margin-left: 0.5rem;\n  font-weight: 500;\n}\n\n// Override button styles for this component\n.btn {\n  border-radius: var(--border-radius-sm) !important;\n}\n\n// Responsive adjustments\n@media (max-width: 768px) {\n  .pricing-container {\n    padding: 1rem 0;\n  }\n\n  .pricing-card {\n    padding: 2rem 1.5rem;\n  }\n\n  .price {\n    font-size: 3rem;\n  }\n}\n\n/* Success Popup Styles */\n.success-popup-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 1000;\n}\n\n.success-popup-modal {\n  background: var(--color-surface-primary);\n  border-radius: var(--border-radius-lg);\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n  max-width: 500px;\n  width: 90%;\n  max-height: 90vh;\n  overflow-y: auto;\n}\n\n.success-popup-content {\n  padding: 2rem;\n  text-align: center;\n}\n\n.success-title {\n  font-size: 1.5rem;\n  font-weight: bold;\n  margin-bottom: 1rem;\n  color: var(--color-primary);\n}\n\n.success-message {\n  font-size: 1rem;\n  margin-bottom: 2rem;\n  color: var(--color-text-primary);\n}\n\n.countdown-container {\n  margin-bottom: 2rem;\n}\n\n.circular-progress {\n  position: relative;\n  display: inline-block;\n  margin-bottom: 1rem;\n}\n\n.progress-circle {\n  width: 120px;\n  height: 120px;\n  transform: rotate(-90deg);\n}\n\n.progress-track {\n  opacity: 0.3;\n}\n\n.progress-bar {\n  transition: stroke-dashoffset 1s ease-in-out;\n}\n\n.countdown-text {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.countdown-number {\n  font-size: 2.5rem;\n  font-weight: bold;\n  color: var(--color-primary);\n  line-height: 1;\n}\n\n.redirect-message {\n  font-size: 1rem;\n  color: var(--color-text-secondary);\n  margin-bottom: 0;\n}\n\n.no-redirect-message {\n  margin-bottom: 2rem;\n}\n\n.close-app-message {\n  font-size: 1.1rem;\n  color: var(--color-text-primary);\n  margin-bottom: 0;\n  text-align: center;\n  line-height: 1.5;\n}\n\n.popup-actions {\n  display: flex;\n  gap: 1rem;\n  justify-content: center;\n  flex-wrap: wrap;\n}\n\n.cancel-btn,\n.redirect-btn,\n.close-btn {\n  padding: 0.75rem 1.5rem;\n  border-radius: var(--border-radius-sm);\n  font-weight: 500;\n  min-width: 120px;\n}\n\n.cancel-btn {\n  background: transparent;\n  border: 2px solid var(--color-divider);\n  color: var(--color-text-secondary);\n}\n\n.cancel-btn:hover {\n  background: var(--color-hover);\n  border-color: var(--color-text-secondary);\n}\n\n.redirect-btn {\n  background: var(--color-primary);\n  border: 2px solid var(--color-primary);\n  color: var(--color-on-primary);\n}\n\n.redirect-btn:hover {\n  background: var(--color-primary-hover);\n  border-color: var(--color-primary-hover);\n}\n\n.close-btn {\n  background: var(--color-primary);\n  border: 2px solid var(--color-primary);\n  color: var(--color-on-primary);\n}\n\n.close-btn:hover {\n  background: var(--color-primary-hover);\n  border-color: var(--color-primary-hover);\n}\n\n@media (max-width: 480px) {\n  .success-popup-content {\n    padding: 1.5rem;\n  }\n\n  .popup-actions {\n    flex-direction: column;\n    align-items: stretch;\n  }\n\n  .cancel-btn,\n  .redirect-btn,\n  .close-btn {\n    min-width: auto;\n  }\n}\n\n/* Pricing Header Styles */\n.pricing-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 2px 16px;\n  background-color: var(--color-primary);\n  color: white;\n  position: sticky;\n  top: 0;\n  z-index: 10;\n}\n\n.header-left {\n  display: flex;\n  align-items: center;\n}\n\n.header-button {\n  background: none;\n  border: none;\n  color: white;\n  padding: 4px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 14px;\n  font-weight: 500;\n  transition: opacity 0.2s;\n  text-decoration: none;\n\n  &:hover {\n    opacity: 0.8;\n    color: white;\n    text-decoration: none;\n  }\n\n  &:focus {\n    color: white;\n    text-decoration: none;\n  }\n\n  .large-icon {\n    font-size: 24px;\n  }\n\n  .button-text {\n    display: inline;\n  }\n}\n\n/* FAQ Section Styles */\n.faq-container {\n  padding: 2rem 0;\n}\n\n.faq-section {\n  margin-top: 3rem;\n  padding: 2.5rem 2rem;\n  background: var(--color-surface-secondary);\n  border-radius: var(--border-radius-lg);\n  box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.1);\n}\n\n.faq-title {\n  font-size: 2rem;\n  font-weight: bold;\n  margin-bottom: 2rem;\n  text-align: center;\n  color: var(--color-text-primary);\n}\n\n.faq-item {\n  margin-bottom: 2rem;\n  padding-bottom: 1.5rem;\n  border-bottom: 1px solid var(--color-divider-muted);\n\n  &:last-child {\n    margin-bottom: 0;\n    padding-bottom: 0;\n    border-bottom: none;\n  }\n}\n\n.faq-question {\n  font-size: 1.25rem;\n  font-weight: 600;\n  margin-bottom: 0.75rem;\n  color: var(--color-text-primary);\n  line-height: 1.4;\n}\n\n.faq-answer {\n  font-size: 1rem;\n  color: var(--color-text-secondary);\n  line-height: 1.6;\n  margin-bottom: 0;\n}\n\n// Responsive adjustments for FAQ\n@media (max-width: 768px) {\n  .faq-container {\n    padding: 1rem 0;\n  }\n\n  .faq-section {\n    margin-top: 2rem;\n    padding: 2rem 1.5rem;\n  }\n\n  .faq-title {\n    font-size: 1.75rem;\n  }\n\n  .faq-question {\n    font-size: 1.125rem;\n  }\n\n  .faq-answer {\n    font-size: 0.9rem;\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JusPrinPricingPage.vue?vue&type=template&id=086ae8b6&scoped=true&\"\nimport script from \"./JusPrinPricingPage.vue?vue&type=script&lang=js&\"\nexport * from \"./JusPrinPricingPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JusPrinPricingPage.vue?vue&type=style&index=0&id=086ae8b6&prod&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"086ae8b6\",\n  null\n  \n)\n\nexport default component.exports","import PricingPage from '@entSrc/views/PricingPage.vue'\nimport ArchivedPrintersPage from '@entSrc/views/ArchivedPrintersPage.vue'\nimport DetectiveHourCouponCodesPage from '@entSrc/views/DetectiveHourCouponCodesPage.vue'\nimport PublicTimelapsesPage from '@entSrc/views/PublicTimelapsesPage.vue'\nimport TimelapseUploadPage from '@entSrc/views/TimelapseUploadPage.vue'\nimport WelcomePage from '@entSrc/views/WelcomePage.vue'\nimport CelestriusConfigurePage from '@entSrc/views/CelestriusConfigurePage.vue'\nimport MintionRedeemPage from '@entSrc/views/partners/MintionRedeemPage.vue'\nimport BttRedeemPage from '@entSrc/views/partners/BttRedeemPage.vue'\nimport SovolRedeemPage from '@entSrc/views/partners/SovolRedeemPage.vue'\nimport ThreeDoRedeemPage from '@entSrc/views/partners/ThreeDORedeemPage.vue'\nimport KingroonPricingPage from '@entSrc/views/partners/KingroonPricingPage.vue'\nimport JusPrinPricingPage from '@entSrc/views/jusprin/JusPrinPricingPage.vue'\n\nconst routes = [\n]\n\nconst components = {\n  PricingPage,\n  KingroonPricingPage,\n  ArchivedPrintersPage,\n  DetectiveHourCouponCodesPage,\n  PublicTimelapsesPage,\n  TimelapseUploadPage,\n  WelcomePage,\n  CelestriusConfigurePage,\n  MintionRedeemPage,\n  BttRedeemPage,\n  SovolRedeemPage,\n  ThreeDoRedeemPage,\n  JusPrinPricingPage,\n}\n\nexport { routes, components }\n","import axios from 'axios'\n\nconst state = {\n\n  //Component States\n  RotationbottomSheetOpen: false,\n  ScalebottomSheetOpen: false,\n  TranslatebottomSheetOpen: false,\n  PrintProfilebottomSheetOpen: false,\n  MachineSelectionOpen: false,\n  PatternSelectionOpen: false,\n  GeneralTypeSelectionOpen: false,\n  PatternSelectionType: null,\n  GeneralTypeSelectionType: null,\n  FilamentSelectionOpen: false,\n  PrintProcessSelectionOpen: false,\n  isInitialLoad: true,\n\n\n  // Profile Presets\n  profilePreset: {},   // Preset values for the selected print process. Should not be modified.\n  profileOverwrites: {}, // User-modified values for the selected print process. Should be used to generate the final print process.\n  filamentProfilePreset: {},  // Preset values for the selected filament. Should not be modified.\n  filamentProfileOverwrites: {}, // User-modified values for the selected filament. Should be used to generate the final filament.\n  selectedMachine: null,\n  selectedFilament: null,\n  selectedPrintProcess: null,\n  suggestedPrintProcess: null,\n\n  meshes: [], // Array to store mesh-specific data\n  selectedMeshIndex: 0, // Index of the currently selected mesh\n\n  // JusPrint Chat\n  jusprintCurrentChatId: null,\n}\n\nconst mutations = {\n\n  //ADD MODEL\n  ADD_MODEL(state, mesh) {\n    state.meshes.push(mesh);\n  },\n  SET_SELECTED_MESH_INDEX(state, index) {\n    state.selectedMeshIndex = index;\n  },\n  UPDATE_MESH_ROTATION(state, { meshIndex, rotation }) {\n    state.meshes[meshIndex].rotation = rotation;\n  },\n\n  UPDATE_MESH_TRANSLATE(state, { meshIndex, translate }) {\n    state.meshes[meshIndex].translate = translate;\n  },\n\n  UPDATE_MESH_DEFAULT_TRANSLATE(state, { meshIndex, translate }) {\n    state.meshes[meshIndex].defaultTranslate = translate;\n  },\n\n\n  UPDATE_MESH_DIMENSIONS(state, { index, dimensions }) {\n\n    state.meshes[index].currentDimensions = {\n      x: parseFloat(dimensions.x),\n      y: parseFloat(dimensions.y),\n      z: parseFloat(dimensions.z),\n    };\n  },\n\n\n\n  SET_ROTATION_BOTTOM_SHEET_OPEN(state, RotationbottomSheetOpen) {\n    state.RotationbottomSheetOpen = RotationbottomSheetOpen\n  },\n\n  SET_SCALE_BOTTOM_SHEET_OPEN(state, ScalebottomSheetOpen) {\n    state.ScalebottomSheetOpen = ScalebottomSheetOpen\n  },\n  SET_TRANSLATE_BOTTOM_SHEET_OPEN(state, TranslatebottomSheetOpen) {\n    state.TranslatebottomSheetOpen = TranslatebottomSheetOpen\n  },\n\n  SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN(state, PrintProfilebottomSheetOpen) {\n    state.PrintProfilebottomSheetOpen = PrintProfilebottomSheetOpen;\n  },\n\n  SET_MACHINE_SELECTION_OPEN(state, MachineSelectionOpen) {\n    state.MachineSelectionOpen = MachineSelectionOpen;\n  },\n\n  SET_PATTERN_SELECTION_OPEN(state, PatternSelectionOpen) {\n    state.PatternSelectionOpen = PatternSelectionOpen;\n  },\n\n  SET_PATTERN_SELECTION_TYPE(state, PatternSelectionType) {\n    state.PatternSelectionType = PatternSelectionType;\n  },\n\n  SET_GENERAL_TYPE_SELECTION_OPEN(state, GeneralTypeSelectionOpen) {\n    state.GeneralTypeSelectionOpen = GeneralTypeSelectionOpen;\n  },\n\n  SET_GENERAL_TYPE_SELECTION_TYPE(state, GeneralTypeSelectionType) {\n    state.GeneralTypeSelectionType = GeneralTypeSelectionType;\n  },\n\n  SET_FILAMENT_SELECTION_OPEN(state, FilamentSelectionOpen) {\n    state.FilamentSelectionOpen = FilamentSelectionOpen;\n  },\n\n  SET_PRINT_PROCESS_SELECTION_OPEN(state, PrintProcessSelectionOpen) {\n    state.PrintProcessSelectionOpen = PrintProcessSelectionOpen;\n  },\n\n  SET_SELECTED_MACHINE(state, printerName) {\n    state.selectedMachine = printerName;\n  },\n\n  SET_SELECTED_FILAMENT(state, filamentName) {\n    state.selectedFilament = filamentName;\n  },\n\n  SET_SELECTED_PRINT_PROCESS(state, selectedPrintProcess) {\n    state.selectedPrintProcess = selectedPrintProcess;\n  },\n\n  SET_SUGGESTED_PRINT_PROCESS(state, suggestedPrintProcess) {\n    state.suggestedPrintProcess = suggestedPrintProcess;\n  },\n\n  SET_PROFILE_PRESET(state, profilePreset) {\n    state.profilePreset = { ...profilePreset,\n      fuzzy_skin: 'none',\n      internal_solid_infill_pattern: 'monotonic',\n      brim_type: 'auto_brim',\n     };\n  },\n\n  CLEAR_PROFILE_OVERWRITE_VALUE(state) {\n    state.profileOverwrites = {}\n  },\n\n  UPDATE_PROFILE_OVERWRITE_VALUE(state, { key, value }) {\n    state.profileOverwrites = {\n      ...state.profileOverwrites,\n      [key]: value,\n    };\n  },\n\n  SET_PROFILE_OVERWRITE(state, profileOverwrites) {\n    state.profileOverwrites = profileOverwrites\n  },\n\n  SET_FILAMENT_PROFILE_PRESET(state, filamentProfilePreset) {\n    state.filamentProfilePreset = { ...filamentProfilePreset };\n  },\n\n  SET_FILAMENT_PROFILE_OVERWRITE_VALUE(state, { key, value }) {\n    state.filamentProfileOverwrites = {\n      ...state.filamentProfileOverwrites,\n      [key]: value,\n    };\n  },\n\n  CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE(state) {\n    state.filamentProfileOverwrites = {}\n  },\n\n  SET_FILAMENT_PROFILE_OVERWRITE(state, filamentProfileOverwrites) {\n    state.filamentProfileOverwrites = filamentProfileOverwrites\n  },\n\n  SET_INITIAL_LOAD(state, value) {\n    state.isInitialLoad = value;\n  },\n\n  SET_JUSPRINT_CURRENT_CHAT_ID(state, jusprintCurrentChatId) {\n    state.jusprintCurrentChatId = jusprintCurrentChatId;\n  },\n}\n\nconst actions = {\n\n  //Multi Mesh Setup\n  addMesh({ commit }, mesh) {\n    commit('ADD_MODEL', mesh);\n  },\n  setSelectedMeshIndex({ commit }, index) {\n    commit('SET_SELECTED_MESH_INDEX', index);\n  },\n  updateMeshRotation({ commit, state }, rotation) {\n    const index = state.selectedMeshIndex;\n    commit('UPDATE_MESH_ROTATION', { index, rotation });\n  },\n\n  updateMeshTranslate({ commit, state }, {meshIndex, translate}) {\n    commit('UPDATE_MESH_TRANSLATE', { meshIndex, translate });\n  },\n\n  updateCurrentDimensions({ commit, state }, { index, dimensions }) {\n    commit('UPDATE_MESH_DIMENSIONS', { index, dimensions });\n  },\n\n  //RotationBottomSheet\n  openMeshRotationBottomSheet({ commit }) {\n    commit('SET_ROTATION_BOTTOM_SHEET_OPEN', true)\n  },\n  closeMeshRotationBottomSheet({ commit }) {\n    commit('SET_ROTATION_BOTTOM_SHEET_OPEN', false)\n  },\n\n  //Scale Bottom Sheet\n  openMeshScaleBottomSheet({ commit }) {\n    commit('SET_SCALE_BOTTOM_SHEET_OPEN', true)\n  },\n  closeMeshScaleBottomSheet({ commit }) {\n    commit('SET_SCALE_BOTTOM_SHEET_OPEN', false)\n  },\n\n  //Translate Bottom Sheet\n  openTranslateBottomSheet({ commit }) {\n    commit('SET_TRANSLATE_BOTTOM_SHEET_OPEN', true)\n  },\n  closeTranslateBottomSheet({ commit }) {\n    commit('SET_TRANSLATE_BOTTOM_SHEET_OPEN', false)\n  },\n\n\n  //Print Profile BottomSheet\n  openPrintProfileBottomSheet({ commit }) {\n    commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', true);\n  },\n  closePrintProfileBottomSheet({ commit }) {\n    commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', false);\n  },\n\n  //Profile Presets\n\n  updateProfileValue({ commit }, { key, value }) {\n    commit('UPDATE_PROFILE_OVERWRITE_VALUE', { key, value });\n  },\n\n  openMachineSelection({ commit }) {\n    commit('SET_MACHINE_SELECTION_OPEN', true);\n  },\n\n  closeMachineSelectionAndClearInitialLoad({ commit }) {\n    commit('SET_INITIAL_LOAD', false);\n    commit('SET_MACHINE_SELECTION_OPEN', false);\n  },\n\n  openPatternSelection({ commit }) {\n    commit('SET_PATTERN_SELECTION_OPEN', true);\n  },\n  closePatternSelection({ commit }) {\n    commit('SET_PATTERN_SELECTION_OPEN', false);\n  },\n  setPatternSelectionType({ commit }, type) {\n    commit('SET_PATTERN_SELECTION_TYPE', type);\n  },\n\n\n  openGeneralTypeSelection({ commit }) {\n    commit('SET_GENERAL_TYPE_SELECTION_OPEN', true);\n  },\n  closeGeneralTypeSelection({ commit }) {\n    commit('SET_GENERAL_TYPE_SELECTION_OPEN', false);\n  },\n  setGeneralTypeSelectionType({ commit }, type) {\n    commit('SET_GENERAL_TYPE_SELECTION_TYPE', type);\n  },\n\n  changeMachineAndRelatedPresets({ commit, state, dispatch }, machine) {\n    commit('SET_SELECTED_MACHINE', machine);\n    dispatch('changeFilamentAndLoadPreset', machine?.default_filament);\n    dispatch('changePrintProcessAndLoadPreset', machine?.default_print_process);\n\n    if (state.isInitialLoad) {\n      setTimeout(() => {\n        // A short delay to allow animation to complete for better UX\n        if (!state.selectedFilament || !state.selectedPrintProcess) {\n          commit('SET_PRINT_PROFILE_BOTTOM_SHEET_OPEN', true);\n        }\n      }, 300)\n    }\n\n    dispatch('closeMachineSelectionAndClearInitialLoad');\n  },\n\n\n  changePrintProcessAndLoadPreset({ commit }, selectedPrintProcess) {\n    commit('SET_SELECTED_PRINT_PROCESS', selectedPrintProcess);\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', false);\n\n    if (selectedPrintProcess?.slicer_profile_url) {\n      // Come on javascript, you still can't do better in 2024 can you?\n      const encodedUrl = encodeURI(selectedPrintProcess.slicer_profile_url).replace(/\\+/g, '%2B');\n      axios\n        .get(encodedUrl)\n        .then((response) => {\n          commit('SET_PROFILE_PRESET', response.data)\n          commit('CLEAR_PROFILE_OVERWRITE_VALUE')\n        })\n    }\n  },\n\n\n  changeFilamentAndLoadPreset({ commit }, selectedFilament) {\n    commit('SET_SELECTED_FILAMENT', selectedFilament);\n\n    if (selectedFilament?.slicer_profile_url) {\n      // Come on javascript, you still can't do better in 2024 can you?\n      const encodedUrl = encodeURI(selectedFilament.slicer_profile_url).replace(/\\+/g, '%2B');\n      axios\n        .get(encodedUrl)\n        .then((response) => {\n          commit('SET_FILAMENT_PROFILE_PRESET', response.data)\n          commit('CLEAR_FILAMENT_PROFILE_OVERWRITE_VALUE')\n        })\n    }\n  },\n\n\n  //FilamentSelection\n  openFilamentSelection({ commit }) {\n    commit('SET_FILAMENT_SELECTION_OPEN', true);\n  },\n  closeFilamentSelection({ commit }) {\n    commit('SET_FILAMENT_SELECTION_OPEN', false);\n  },\n\n\n  //PrintProcess\n  openPrintProcess({ commit }) {\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', true);\n  },\n  closePrintProcess({ commit }) {\n    commit('SET_PRINT_PROCESS_SELECTION_OPEN', false);\n  },\n\n  setInitialLoadDone({ commit }) {\n    commit('SET_INITIAL_LOAD', false);\n  }\n\n}\n\nconst getters = {\n\n  //Multi Mesh Setup\n  selectedMeshRotation: (state) => state.meshes[state.selectedMeshIndex]?.rotation,\n  selectedMeshTranslate: (state) => state.meshes[state.selectedMeshIndex]?.translate,\n  selectedMeshDefaultTranslate: (state) => state.meshes[state.selectedMeshIndex]?.defaultTranslate,\n  selectedMeshCenter: (state) => state.meshes[state.selectedMeshIndex]?.center,\n\n  selectedMeshDimensions: (state) => ({\n    originalDimensions: state.meshes[state.selectedMeshIndex]?.originalDimensions,\n    currentDimensions: state.meshes[state.selectedMeshIndex]?.currentDimensions,\n  }),\n\n  RotationbottomSheetOpen: (state) => state.RotationbottomSheetOpen,\n  ScalebottomSheetOpen: (state) => state.ScalebottomSheetOpen,\n  TranslatebottomSheetOpen: (state) => state.TranslatebottomSheetOpen,\n  PrintProfilebottomSheetOpen: (state) => state.PrintProfilebottomSheetOpen,\n  MachineSelectionOpen: (state) => state.MachineSelectionOpen,\n  PatternSelectionOpen: (state) => state.PatternSelectionOpen,\n  FilamentSelectionOpenn: (state) => state.FilamentSelectionOpen,\n  PrintProcessSelectionOpen: (state) => state.PrintProcessSelectionOpen,\n\n  selectedMachine: (state) => state.selectedMachine,\n  selectedFilament: (state) => state.selectedFilament,\n  selectedPrintProcess: (state) => state.selectedPrintProcess,\n  suggestedPrintProcess: (state) => state.suggestedPrintProcess,\n  profileOverwrites: (state) => state.profileOverwrites,\n  filamentProfileOverwrites: (state) => state.filamentProfileOverwrites,\n  getProfileValue: (state) => (key) => {\n    if (state.profileOverwrites[key]) {\n      return state.profileOverwrites[key];\n    }\n    return state.profilePreset[key] || ''\n  },\n  getFilamentProfileValue: (state) => (key) => {\n    if (state.filamentProfileOverwrites[key]) {\n      return state.filamentProfileOverwrites[key];\n    }\n    return state.filamentProfilePreset[key] || ''\n  },\n  meshes: (state) => state.meshes,\n  jusprintCurrentChatId: (state) => state.jusprintCurrentChatId,\n}\n\nexport default {\n  namespaced: true,\n  state,\n  mutations,\n  actions,\n  getters,\n}\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport sliceSettingsStore from './sliceSettingsStore'\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n  modules: {\n    sliceSettingsStore,\n  }\n});\n","import mountVue from '@src/mount'\nimport { routes, components } from '@src/pages'\nimport { components as entComponents, routes as entRoutes } from '@entSrc/pages'\nimport store from '@src/store'\n\nmountVue(store, [...routes, ...entRoutes], { ...components, ...entComponents })\n","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterTerminalPage.vue?vue&type=style&index=0&id=020f0348&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ArchivedPrintersPage.vue?vue&type=style&index=0&id=b5b4a9e6&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/octopod.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchInput.vue?vue&type=style&index=0&id=76904468&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotCard.vue?vue&type=style&index=0&id=413ec1b9&prod&lang=sass&scoped=true&\"","const SupportEmail = 'support@obico.io'\n\nexport { SupportEmail }\n","module.exports = __webpack_public_path__ + \"img/plugin_verification_code.png\";","module.exports = __webpack_public_path__ + \"img/klipper_logo.jpg\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StreamingBox.vue?vue&type=style&index=0&id=0986fe8b&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/detached-2.jpg\";","module.exports = __webpack_public_path__ + \"img/bumpsAndRoughSurface-2.jpg\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DatePickerModal.vue?vue&type=style&index=0&id=56d59fd8&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-7.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=style&index=0&id=3af0b05a&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsKingroonSection.vue?vue&type=style&index=0&id=84449caa&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./QuickButtonComponent.vue?vue&type=style&index=0&id=79a2bd8c&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./StatsPage.vue?vue&type=style&index=0&id=1a9239ba&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintShotFeedbackApp.vue?vue&type=style&index=0&id=3ab8d3da&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureItem.vue?vue&type=style&index=0&id=22dafde6&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('b-container',[_c('b-row',{staticClass:\"justify-content-center\"},[_c('b-col',[_c('div',{staticClass:\"wizard-container full-on-mobile\"},[_c('b-container',[_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-8 offset-md-2 col-lg-6 offset-lg-3\"},[_c('svg',{staticClass:\"logo-img\",attrs:{\"viewBox\":\"0 0 1965 240\"}},[_c('use',{attrs:{\"href\":\"#svg-logo-compact\"}})])])]),_c('b-row',[_c('h1',{staticClass:\"text-center mx-auto mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t('Welcome To'))+\" \"+_vm._s(_vm.$syndicateText.brandName)+\" \")])]),_c('b-row',[_c('b-col',[_c('hr')])],1),_c('b-row',[_c('div',{staticClass:\"col-sm-12 col-md-10 offset-md-1 col-lg-8 offset-lg-2\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('Your three-month Pro Plan Is Now Active')))]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Premium Webcam Streaming')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Webcam-Based AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Nozzle Ninja First Layer AI Failure Detection')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('G-Code Remote Uploading and Printing')))])]),_c('div',{staticClass:\"feature\"},[_c('i',{staticClass:\"feature-check fas fa-check-circle\"}),_c('span',{staticClass:\"feature-text\"},[_vm._v(_vm._s(_vm.$t('Unlimited Secure Tunnel to OctoPrint/Klipper')))])]),_c('div',{staticClass:\"redirect-button d-flex flex-column align-center justify-content-center\"},[_c('a',{staticClass:\"btn btn-primary btn-block mx-auto btn-lg\",attrs:{\"href\":\"/printers/\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Go To Printer Control Page'))+\" \")])])])])],1)],1)])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","module.exports = __webpack_public_path__ + \"img/install_plugin.png\";","module.exports = __webpack_public_path__ + \"img/download-on-app-store.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./TemperatureWidget.vue?vue&type=style&index=0&id=85ef39ce&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberInput.vue?vue&type=style&index=0&id=0f88dca4&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NavBar.vue?vue&type=style&index=0&id=649a7c88&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DetectiveWorking.vue?vue&type=style&index=0&id=3c99e284&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=style&index=0&id=067e7fa8&prod&lang=sass&scoped=true&\"","const BillingCycle = {\n  Annual: 'annual',\n  Monthly: 'monthly',\n}\n\nconst CalcPeriod = {\n  Year: 'year',\n  Month: 'month',\n  Hour: 'hour',\n}\n\nconst PlanMonthlyPrice = {\n  [BillingCycle.Annual]: 6.99,\n  [BillingCycle.Monthly]: 8.99,\n}\n\nconst LoyaltyMonthlyPrice = {\n  [BillingCycle.Annual]: 5.49,\n  [BillingCycle.Monthly]: 7.49,\n}\n\nconst monthlyPriceFor = (billingCycle, isLoyalty = false) => {\n  if (isLoyalty) return LoyaltyMonthlyPrice[billingCycle]\n  return PlanMonthlyPrice[billingCycle]\n}\n\nconst DHPackBillingCycleMul = {\n  [BillingCycle.Annual]: 1,\n  [BillingCycle.Monthly]: 1.5,\n}\n\nconst AdditionalPrinterPrice = {\n  [BillingCycle.Annual]: 2,\n  [BillingCycle.Monthly]: 3,\n}\n\nconst CalcPeriodMonths = {\n  [CalcPeriod.Year]: 12,\n  [CalcPeriod.Month]: 1,\n}\n\nconst roundCurrency = (price) => Math.round((price + Number.EPSILON) * 100) / 100\n\nconst toCalcPeriod = (billingCycle) => {\n  return billingCycle == BillingCycle.Annual ? CalcPeriod.Year : CalcPeriod.Month\n}\n\nconst DHPacks = {\n  0: { hours: 0, price: 0 },\n  2: { hours: 80, price: 2 },\n  5: { hours: 300, price: 5 },\n  10: { hours: 800, price: 10 },\n  20: { hours: 2500, price: 20 },\n}\n\nconst RecommendedDHPackKey = ['2', '5', '5', '10', '10', '20', '20', '20', '20', '20']\n\nconst PrepaidDHPacks = {\n  10: { hours: 200, price: 10 },\n  20: { hours: 500, price: 20 },\n}\n\nconst calcPlanPrice = (billingCycle, calcPeriod, isLoyalty = false) => {\n  return roundCurrency(monthlyPriceFor(billingCycle, isLoyalty) * CalcPeriodMonths[calcPeriod])\n}\n\nconst calcDHPackPrice = (billingCycle, calcPeriod, dhPackKey) => {\n  return roundCurrency(\n    DHPacks[dhPackKey].price * DHPackBillingCycleMul[billingCycle] * CalcPeriodMonths[calcPeriod]\n  )\n}\n\nconst calcPrinterPrice = (billingCycle, numAdditionalPrinters, calcPeriod) => {\n  return roundCurrency(\n    AdditionalPrinterPrice[billingCycle] * numAdditionalPrinters * CalcPeriodMonths[calcPeriod]\n  )\n}\n\nconst calcPriceTable = (billingCycle, numPrinters, dhPackKey, isLoyalty = false) => {\n  const billingCycleMonths = CalcPeriodMonths[toCalcPeriod(billingCycle)]\n  const basePlanPrice = calcPlanPrice(billingCycle, CalcPeriod.Month, isLoyalty)\n  const basePrinterPrice = calcPrinterPrice(billingCycle, 1, CalcPeriod.Month)\n  const numAdditionalPrinters = Math.max(numPrinters - 1, 0)\n  const additionalPrintersPrice = calcPrinterPrice(\n    billingCycle,\n    numAdditionalPrinters,\n    CalcPeriod.Month\n  )\n  const dhPackPrice = calcDHPackPrice(billingCycle, CalcPeriod.Month, dhPackKey)\n  const totalPlanPrice = calcPlanPrice(billingCycle, toCalcPeriod(billingCycle), isLoyalty)\n  const totalAdditionalPrintersPrice = calcPrinterPrice(\n    billingCycle,\n    numAdditionalPrinters,\n    toCalcPeriod(billingCycle)\n  )\n  const totalDHPackPrice = calcDHPackPrice(billingCycle, toCalcPeriod(billingCycle), dhPackKey)\n  const totalPrice = roundCurrency(totalPlanPrice + totalAdditionalPrintersPrice + totalDHPackPrice)\n  return {\n    billingCycleMonths,\n    basePlanPrice,\n    basePrinterPrice,\n    numAdditionalPrinters,\n    additionalPrintersPrice,\n    dhPackPrice,\n    totalPlanPrice,\n    totalAdditionalPrintersPrice,\n    totalDHPackPrice,\n    totalPrice,\n  }\n}\n\nexport {\n  BillingCycle,\n  CalcPeriod,\n  PlanMonthlyPrice,\n  LoyaltyMonthlyPrice,\n  monthlyPriceFor,\n  DHPackBillingCycleMul,\n  AdditionalPrinterPrice,\n  DHPacks,\n  PrepaidDHPacks,\n  RecommendedDHPackKey,\n  calcPlanPrice,\n  calcDHPackPrice,\n  calcPriceTable,\n}\n","module.exports = __webpack_public_path__ + \"img/octoprint_logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=style&index=0&id=7f862148&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemPage.vue?vue&type=style&index=0&id=7d1ec790&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=style&index=0&id=c75daef2&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/moonraker_verification_code.png\";","module.exports = __webpack_public_path__ + \"img/detached-1.jpg\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatPanelHeader.vue?vue&type=style&index=0&id=33cffac1&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=style&index=0&id=5aa2b926&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FileStructureItem.vue?vue&type=style&index=0&id=56a42b8e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=style&index=0&id=d1933d3e&prod&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./QuestionsSection.vue?vue&type=style&index=0&id=13bcafb3&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinChatHistory.vue?vue&type=style&index=0&id=108f673a&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-1.webp\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ObicoInstallationGuidePage.vue?vue&type=style&index=0&id=3e025757&prod&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/webcam-streaming.png\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=style&index=0&id=21ff5370&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/gaps-1.jpg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NewFolderModal.vue?vue&type=style&index=0&id=6d629910&prod&lang=sass&scoped=true&\"","// Check if localStorage available\nexport function isLocalStorageSupported() {\n  try {\n    const key = '__random_key_we_are_not_going_to_use__'\n    localStorage.setItem(key, key)\n    localStorage.removeItem(key)\n    return true\n  } catch (e) {\n    return false\n  }\n}\n","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterControlWidget.vue?vue&type=style&index=0&id=8cc7b434&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=style&index=1&id=b5cfcc80&prod&lang=sass&scoped=true&\"","import Vue from 'vue'\nimport axios from 'axios'\n\nimport { SupportEmail } from './consts.js'\nimport { inMobileWebView } from '@src/lib/page-context'\nimport i18n from '@src/i18n/i18n.js'\n\nconst init = (site) => {\n  return window.Chargebee.init({\n    site: site,\n  })\n}\n\nconst getInstance = () => {\n  return window.Chargebee.getInstance()\n}\n\nconst checkout = (chargebeeInstance, url, data, errorHandler = null) => {\n  if (inMobileWebView()) {\n    const urlObj = new URL(window.location.origin + url)\n    for (const prop in data) {\n      urlObj.searchParams.append(prop, data[prop])\n    }\n    urlObj.searchParams.append('redirect', true)\n    window.location.href = urlObj.href\n    return\n  }\n\n  chargebeeInstance.openCheckout({\n    hostedPage: function () {\n      // Hit your end point that returns hosted page object as response\n      // This sample end point will call checkout new api\n      // https://apidocs.chargebee.com/docs/api/hosted_pages#checkout_new_subscription\n      // If you want to use paypal, go cardless and plaid, pass embed parameter as false\n      let p = axios\n        .get(url, {\n          params: data,\n          headers: {\n            Accept: 'application/json',\n            'Content-Type': 'application/json',\n          },\n        })\n        .then((result) => result.data)\n      return p\n    },\n    error: function () {\n      if (errorHandler) {\n        errorHandler()\n        return\n      }\n      Vue.swal.fire({\n        type: 'error',\n        title: `${i18n.t('Oops...')}`,\n        html: `${i18n.t('Something went wrong! Please')} <a href=\"mailto:${SupportEmail}\">${i18n.t(\n          'Contact us'\n        )}</a> ${i18n.t('for help.')}`,\n      })\n    },\n  })\n}\n\nconst portal = (chargebeeInstance) => {\n  const fetchPortalSession = function () {\n    return axios\n      .get('/ent/generate_portal_session/', {\n        headers: {\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n        },\n      })\n      .then((result) => result.data)\n  }\n\n  if (inMobileWebView()) {\n    fetchPortalSession()\n      .then((portalSession) => {\n        window.location.href = portalSession.access_url\n      })\n      .catch(() => {\n        Vue.swal.fire({\n          type: 'error',\n          title: `${i18n.t('Oops...')}`,\n          html: `${i18n.t('Something went wrong! Please')} <a href=\"mailto:${SupportEmail}\">${i18n.t(\n            'Contact us'\n          )}</a> ${i18n.t('for help.')}`,\n        })\n      })\n    return\n  }\n\n  chargebeeInstance.setPortalSession(fetchPortalSession)\n\n  let cbPortal = chargebeeInstance.createChargebeePortal()\n  cbPortal.open({\n    close() {\n      //close callbacks\n    },\n  })\n}\n\nexport { init, getInstance, checkout, portal }\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=style&index=0&id=7ebe8524&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/detective-working.gif\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintPage.vue?vue&type=style&index=0&id=3b8e9439&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerShotCard.vue?vue&type=style&index=0&id=26964d5c&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FilteringDropdown.vue?vue&type=style&index=0&id=614429e6&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/vacation.gif\";","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./EmbeddedChatPage.vue?vue&type=style&index=0&id=146a1112&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"subcribe-dlg pt-4\"},[_c('div',{staticClass:\"text-center py-2\"},[_c('div',{staticClass:\"btn-group btn-group-toggle\"},[_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': _vm.isAnnual }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Annual,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Annual)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Annual}}}),_vm._v(\" \"+_vm._s(_vm.$t('Annual (SAVE 33%)'))+\" \")]),_c('label',{class:{ btn: true, 'no-corner': true, 'btn-primary': !_vm.isAnnual }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.billingCycle),expression:\"billingCycle\"}],attrs:{\"type\":\"radio\",\"autocomplete\":\"off\"},domProps:{\"value\":_vm.BillingCycle.Monthly,\"checked\":_vm._q(_vm.billingCycle,_vm.BillingCycle.Monthly)},on:{\"change\":function($event){_vm.billingCycle=_vm.BillingCycle.Monthly}}}),_vm._v(\" \"+_vm._s(_vm.$t('Monthly'))+\" \")])])]),_c('div',[_c('div',{staticClass:\"number-printer py-3\",staticStyle:{\"display\":\"flex\",\"align-items\":\"baseline\"}},[_c('div',[_vm._v(_vm._s(_vm.$t('Number of printer(s)'))+\":\")]),_c('NumberSpinner',{attrs:{\"id\":\"sub-printers\",\"group-class\":\"input-group-sm\",\"min\":1,\"max\":100,\"step\":1},model:{value:(_vm.numPrinters),callback:function ($$v) {_vm.numPrinters=$$v},expression:\"numPrinters\"}}),(_vm.changeSubscription)?_c('small',{staticClass:\"text-warning ml-2\"},[(_vm.numPrinters > _vm.initialNumPrinters)?_c('span',[_vm._v(\" (\"+_vm._s(_vm.$t('Add'))+\" \"+_vm._s(_vm.numPrinters - _vm.initialNumPrinters)+\") \")]):_vm._e(),(_vm.numPrinters === _vm.initialNumPrinters)?_c('span',[_vm._v(_vm._s(_vm.$t(' (No change) ')))]):_vm._e(),(_vm.numPrinters < _vm.initialNumPrinters)?_c('span',[_vm._v(\" (\"+_vm._s(_vm.$t('Remove'))+\" \"+_vm._s(_vm.initialNumPrinters - _vm.numPrinters)+\") \")]):_vm._e()]):_vm._e()],1),_c('div',[_vm._v(_vm._s(_vm.$t('Add Subscribe&Save AI Detection Hour Pack?')))]),_c('div',[_c('div',{staticClass:\"form-group mt-2\"},_vm._l((Object.keys(_vm.DHPacks)),function(key){return _c('div',{key:key,staticClass:\"custom-control custom-radio\",class:{ recommended: key == _vm.recommendedDHPackKey }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.dhPackKey),expression:\"dhPackKey\"}],staticClass:\"custom-control-input\",attrs:{\"id\":'sub-dh-pack-selected-' + key,\"type\":\"radio\",\"name\":\"sub-dh-pack-selected\",\"autocomplete\":\"off\"},domProps:{\"value\":key,\"checked\":_vm._q(_vm.dhPackKey,key)},on:{\"change\":function($event){_vm.dhPackKey=key}}}),_c('label',{staticClass:\"custom-control-label\",attrs:{\"for\":'sub-dh-pack-selected-' + key}},[_vm._v(\" \"+_vm._s(_vm.getDHPackChoiceLabel(key))+\" \"),(key == _vm.recommendedDHPackKey && !_vm.changeSubscription)?_c('span',{staticClass:\"tag\"},[_vm._v(_vm._s(_vm.$t('Popular')))]):_vm._e(),(_vm.changeSubscription && _vm.initialDHPackKey == key)?_c('span',{staticClass:\"text-warning ml-2\"},[_vm._v(\" ⟵ \"+_vm._s(_vm.$t('Current'))+\" \")]):_vm._e()])])}),0)])]),_c('table',{staticClass:\"table table-striped pricing mt-sm-2 mt-md-5\"},[_c('tfoot',[_c('tr',[_c('th',{attrs:{\"scope\":\"col\"}},[_vm._v(\" \"+_vm._s(_vm.$t('Total'))+\" \"),(_vm.changeSubscription)?_c('span',{staticClass:\"text-warning\"},[_vm._v(\" * \")]):_vm._e()]),_c('th',{staticClass:\"text-right\",staticStyle:{\"width\":\"50%\"},attrs:{\"scope\":\"col\"}},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalPrice)))])])])]),_c('tbody',[_c('tr',[_c('td',[_vm._v(\"AI Premium \"+_vm._s(_vm.$t('plan')))]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalPlanPrice)))]),(_vm.isAnnual)?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.basePlanPrice))+\" \")]):_vm._e()])]),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('1st printer (included)')))]),_c('td',{staticClass:\"text-right\"},[_vm._v(\"$0\")])]),_c('tr',[_c('td',[_c('span',[_vm._v(_vm._s(_vm.priceTable.numAdditionalPrinters))]),_vm._v(\" \"+_vm._s(_vm.$t('additional'))+\" \"+_vm._s(_vm._f(\"pluralize\")('printer',_vm.priceTable.numAdditionalPrinters))+\" \")]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalAdditionalPrintersPrice)))]),(_vm.isAnnual && _vm.priceTable.additionalPrintersPrice > 0)?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.additionalPrintersPrice))+\" \")]):_vm._e()])]),_c('tr',[_c('td',[_vm._v(_vm._s(_vm.$t('50 AI Detection Hours / month (included)')))]),_c('td',{staticClass:\"text-right\"},[_vm._v(\"$0\")])]),_c('tr',[_c('td',[_c('span',[_vm._v(_vm._s(_vm.dhPackName))])]),_c('td',{staticClass:\"text-right\"},[_c('span',[_vm._v(_vm._s(_vm.priceDisplay(_vm.priceTable.totalDHPackPrice)))]),(_vm.isAnnual && _vm.dhPackKey != '0')?_c('div',{staticClass:\"price-sub\"},[_vm._v(\" \"+_vm._s(_vm.priceSubDisplay(_vm.priceTable.dhPackPrice))+\" \")]):_vm._e()])])])]),(_vm.changeSubscription)?_c('div',{staticClass:\"text-warning font-italic\",staticStyle:{\"margin-top\":\"-0.75rem\",\"font-size\":\"0.85em\"}},[_vm._v(\" * \"+_vm._s(_vm.$t( \"This is the total amount on your next bill. Click 'Checkout' see how much is due today.\" ))+\" \")]):_vm._e(),(!_vm.calculateOnly)?_c('div',{staticClass:\"my-3\",staticStyle:{\"text-align\":\"right\"}},[_c('a',{staticClass:\"btn mr-3\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.cancel}},[_vm._v(_vm._s(_vm.$t('Cancel')))]),_c('a',{staticClass:\"btn btn-primary border\",attrs:{\"role\":\"button\"},on:{\"click\":_vm.checkout}},[_vm._v(_vm._s(_vm.$t('Checkout')))])]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{class:'input-group ' + _vm.groupClass},[_c('div',{staticClass:\"input-group-prepend\"},[_c('button',{class:'btn btn-num-spinner ' + _vm.buttonsClass,style:({ 'min-width': _vm.buttonsWidth }),attrs:{\"type\":\"button\"},on:{\"click\":_vm.decrease,\"mousedown\":function($event){return _vm.whileMouseDown(_vm.decrease)},\"mouseup\":_vm.clearTimer}},[_vm._t(\"decrementButton\",function(){return [_c('strong',[_vm._v(\"-\")])]})],2)]),_c('input',{class:_vm.classes,style:({ 'text-align': _vm.textAlign }),attrs:{\"type\":\"text\",\"min\":_vm.min,\"max\":_vm.max,\"step\":_vm.step,\"pattern\":\"\\\\d+\"},domProps:{\"value\":_vm.value},on:{\"input\":_vm.onInput,\"paste\":_vm.onInput,\"change\":_vm.onInput,\"focusout\":_vm.onInput}}),_c('div',{staticClass:\"input-group-append\"},[_c('button',{class:'btn btn-num-spinner ' + _vm.buttonsClass,style:({ 'min-width': _vm.buttonsWidth }),attrs:{\"type\":\"button\"},on:{\"click\":_vm.increase,\"mousedown\":function($event){return _vm.whileMouseDown(_vm.increase)},\"mouseup\":_vm.clearTimer}},[_vm._t(\"incrementButton\",function(){return [_c('strong',[_vm._v(\"+\")])]})],2)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div :class=\"'input-group ' + groupClass\">\n    <div class=\"input-group-prepend\">\n      <button\n        type=\"button\"\n        :style=\"{ 'min-width': buttonsWidth }\"\n        :class=\"'btn btn-num-spinner ' + buttonsClass\"\n        @click=\"decrease\"\n        @mousedown=\"whileMouseDown(decrease)\"\n        @mouseup=\"clearTimer\"\n      >\n        <slot name=\"decrementButton\">\n          <strong>-</strong>\n        </slot>\n      </button>\n    </div>\n\n    <input\n      type=\"text\"\n      :class=\"classes\"\n      :style=\"{ 'text-align': textAlign }\"\n      :min=\"min\"\n      :max=\"max\"\n      :step=\"step\"\n      :value=\"value\"\n      pattern=\"\\d+\"\n      @input=\"onInput\"\n      @paste=\"onInput\"\n      @change=\"onInput\"\n      @focusout=\"onInput\"\n    />\n\n    <div class=\"input-group-append\">\n      <button\n        type=\"button\"\n        :style=\"{ 'min-width': buttonsWidth }\"\n        :class=\"'btn btn-num-spinner ' + buttonsClass\"\n        @click=\"increase\"\n        @mousedown=\"whileMouseDown(increase)\"\n        @mouseup=\"clearTimer\"\n      >\n        <slot name=\"incrementButton\">\n          <strong>+</strong>\n        </slot>\n      </button>\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'NumberSpinner',\n  props: {\n    min: {\n      type: Number,\n      default: () => null,\n    },\n    max: {\n      type: Number,\n      default: () => null,\n    },\n    step: {\n      type: Number,\n      default: () => null,\n    },\n    value: {\n      type: Number,\n      required: true,\n    },\n    groupClass: {\n      type: String,\n      default: () => '',\n    },\n    buttonsClass: {\n      type: String,\n      default: () => '',\n    },\n    buttonsWidth: {\n      type: String,\n      default: () => '2.5rem',\n    },\n    textAlign: {\n      type: String,\n      default: () => 'center',\n    },\n    mouseDownSpeed: {\n      default: () => 500,\n      type: Number,\n    },\n  },\n  computed: {\n    classes() {\n      return 'form-control'\n    },\n  },\n  created() {\n    this.timer = null\n  },\n  methods: {\n    increase() {\n      if (this.max === null || this.max > this.value) {\n        this.onNewValue(Math.min(this.max, this.value + 1))\n      }\n    },\n    decrease() {\n      if (this.min === null || this.min < this.value) {\n        this.onNewValue(Math.max(this.min, this.value - this.step))\n      }\n    },\n    onInput(event) {\n      this.onNewValue(event.target.value)\n    },\n    onNewValue(value) {\n      const v = parseFloat(value)\n      if (v) {\n        if (this.min === null || (v >= this.min && (this.max === null || v <= this.max))) {\n          this.$emit('input', v)\n        }\n      }\n    },\n    clearTimer() {\n      if (this.timer) {\n        clearInterval(this.timer)\n        this.timer = null\n      }\n    },\n    whileMouseDown(callback) {\n      if (this.timer === null) {\n        this.timer = setInterval(() => {\n          callback()\n        }, this.mouseDownSpeed)\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.btn-num-spinner\n  outline: none\n  box-shadow: none\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./NumberSpinner.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NumberSpinner.vue?vue&type=template&id=3af0b05a&scoped=true&\"\nimport script from \"./NumberSpinner.vue?vue&type=script&lang=js&\"\nexport * from \"./NumberSpinner.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NumberSpinner.vue?vue&type=style&index=0&id=3af0b05a&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"3af0b05a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div class=\"subcribe-dlg pt-4\">\n    <div class=\"text-center py-2\">\n      <div class=\"btn-group btn-group-toggle\">\n        <label :class=\"{ btn: true, 'no-corner': true, 'btn-primary': isAnnual }\">\n          <input\n            v-model=\"billingCycle\"\n            type=\"radio\"\n            :value=\"BillingCycle.Annual\"\n            autocomplete=\"off\"\n          />\n          {{ $t('Annual (SAVE 33%)') }}\n        </label>\n        <label :class=\"{ btn: true, 'no-corner': true, 'btn-primary': !isAnnual }\">\n          <input\n            v-model=\"billingCycle\"\n            type=\"radio\"\n            :value=\"BillingCycle.Monthly\"\n            autocomplete=\"off\"\n          />\n          {{ $t('Monthly') }}\n        </label>\n      </div>\n    </div>\n    <div>\n      <div class=\"number-printer py-3\" style=\"display: flex; align-items: baseline\">\n        <div>{{ $t('Number of printer(s)') }}:</div>\n\n        <NumberSpinner\n          id=\"sub-printers\"\n          v-model=\"numPrinters\"\n          group-class=\"input-group-sm\"\n          :min=\"1\"\n          :max=\"100\"\n          :step=\"1\"\n        />\n        <small v-if=\"changeSubscription\" class=\"text-warning ml-2\">\n          <span v-if=\"numPrinters > initialNumPrinters\">\n            ({{ $t('Add') }} {{ numPrinters - initialNumPrinters }})\n          </span>\n          <span v-if=\"numPrinters === initialNumPrinters\">{{ $t(' (No change) ') }}</span>\n          <span v-if=\"numPrinters < initialNumPrinters\">\n            ({{ $t('Remove') }} {{ initialNumPrinters - numPrinters }})\n          </span>\n        </small>\n      </div>\n      <div>{{ $t('Add Subscribe&amp;Save AI Detection Hour Pack?') }}</div>\n      <div>\n        <div class=\"form-group mt-2\">\n          <div\n            v-for=\"key in Object.keys(DHPacks)\"\n            :key=\"key\"\n            class=\"custom-control custom-radio\"\n            :class=\"{ recommended: key == recommendedDHPackKey }\"\n          >\n            <input\n              :id=\"'sub-dh-pack-selected-' + key\"\n              v-model=\"dhPackKey\"\n              type=\"radio\"\n              class=\"custom-control-input\"\n              name=\"sub-dh-pack-selected\"\n              :value=\"key\"\n              autocomplete=\"off\"\n            />\n            <label class=\"custom-control-label\" :for=\"'sub-dh-pack-selected-' + key\">\n              {{ getDHPackChoiceLabel(key) }}\n              <span v-if=\"key == recommendedDHPackKey && !changeSubscription\" class=\"tag\">{{\n                $t('Popular')\n              }}</span>\n              <span v-if=\"changeSubscription && initialDHPackKey == key\" class=\"text-warning ml-2\">\n                ⟵ {{ $t('Current') }}\n              </span>\n            </label>\n          </div>\n        </div>\n      </div>\n    </div>\n    <table class=\"table table-striped pricing mt-sm-2 mt-md-5\">\n      <tfoot>\n        <tr>\n          <th scope=\"col\">\n            {{ $t('Total') }}\n            <span v-if=\"changeSubscription\" class=\"text-warning\"> * </span>\n          </th>\n          <th scope=\"col\" class=\"text-right\" style=\"width: 50%\">\n            <span>{{ priceDisplay(priceTable.totalPrice) }}</span>\n          </th>\n        </tr>\n      </tfoot>\n      <tbody>\n        <tr>\n          <td>AI Premium {{ $t('plan') }}</td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalPlanPrice) }}</span>\n            <div v-if=\"isAnnual\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.basePlanPrice) }}\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td>{{ $t('1st printer (included)') }}</td>\n          <td class=\"text-right\">$0</td>\n        </tr>\n        <tr>\n          <td>\n            <span>{{ priceTable.numAdditionalPrinters }}</span> {{ $t('additional') }}\n            {{ 'printer' | pluralize(priceTable.numAdditionalPrinters) }}\n          </td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalAdditionalPrintersPrice) }}</span>\n            <div v-if=\"isAnnual && priceTable.additionalPrintersPrice > 0\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.additionalPrintersPrice) }}\n            </div>\n          </td>\n        </tr>\n        <tr>\n          <td>{{ $t('50 AI Detection Hours / month (included)') }}</td>\n          <td class=\"text-right\">$0</td>\n        </tr>\n        <tr>\n          <td>\n            <span>{{ dhPackName }}</span>\n          </td>\n          <td class=\"text-right\">\n            <span>{{ priceDisplay(priceTable.totalDHPackPrice) }}</span>\n            <div v-if=\"isAnnual && dhPackKey != '0'\" class=\"price-sub\">\n              {{ priceSubDisplay(priceTable.dhPackPrice) }}\n            </div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n\n    <div\n      v-if=\"changeSubscription\"\n      class=\"text-warning font-italic\"\n      style=\"margin-top: -0.75rem; font-size: 0.85em\"\n    >\n      *\n      {{\n        $t(\n          \"This is the total amount on your next bill. Click 'Checkout' see how much is due today.\"\n        )\n      }}\n    </div>\n\n    <div v-if=\"!calculateOnly\" class=\"my-3\" style=\"text-align: right\">\n      <a role=\"button\" class=\"btn mr-3\" @click=\"cancel\">{{ $t('Cancel') }}</a>\n      <a role=\"button\" class=\"btn btn-primary border\" @click=\"checkout\">{{ $t('Checkout') }}</a>\n    </div>\n  </div>\n</template>\n\n<script>\nimport * as chargeBee from '@entSrc/lib/chargebee.js'\nimport NumberSpinner from '@src/components/NumberSpinner.vue'\nimport { BillingCycle, DHPacks, RecommendedDHPackKey, calcPriceTable } from '@entSrc/lib/pricing.js'\n\nexport default {\n  name: 'ConfigureSubscription',\n  components: {\n    NumberSpinner,\n  },\n  props: {\n    changeSubscription: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    calculateOnly: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    initialNumPrinters: {\n      default() {\n        return 1\n      },\n      type: Number,\n    },\n    initialDHPackKey: {\n      default: () => '0',\n      type: String,\n    },\n    initialBillingCycle: {\n      default: () => BillingCycle.Annual,\n      type: String,\n    },\n    primaryEmailVerified: {\n      type: Boolean,\n      required: true,\n    },\n    chargeBeeInstance: {\n      type: Object,\n      required: true,\n    },\n    couponCode: {\n      type: String,\n      default: () => null,\n    },\n    currentPlanId: {\n      type: String,\n      default: () => null,\n    },\n  },\n  data: function () {\n    return {\n      numPrinters: this.initialNumPrinters,\n      billingCycle: this.initialBillingCycle,\n      dhPackKey: this.initialDHPackKey,\n    }\n  },\n  computed: {\n    isAnnual() {\n      return this.billingCycle === BillingCycle.Annual\n    },\n    recommendedDHPackKey() {\n      return RecommendedDHPackKey[this.numPrinters - 1]\n    },\n    dhPackName() {\n      return this.getDHPackLabel(this.dhPackKey)\n    },\n    isLoyaltyPlan() {\n      return Boolean(this.currentPlanId && this.currentPlanId.endsWith('-loyalty'))\n    },\n    priceTable() {\n      return calcPriceTable(this.billingCycle, this.numPrinters, this.dhPackKey, this.isLoyaltyPlan)\n    },\n  },\n  created() {\n    this.BillingCycle = BillingCycle\n    this.DHPacks = DHPacks\n  },\n  methods: {\n    getDHPackLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month pack`, {\n            name: DHPacks[key].hours,\n          })}`\n        : `${this.$i18next.t('AI Detection Hour Pack not selected')}`\n    },\n    getDHPackChoiceLabel(key) {\n      return key > 0\n        ? `${this.$i18next.t(`{name} AI Detection Hours / month`, { name: DHPacks[key].hours })}`\n        : `${this.$i18next.t('No AI Detection Hour Pack')}`\n    },\n    priceDisplay(price) {\n      if (price == 0) {\n        return '$0'\n      }\n      return this.billingCycle == BillingCycle.Annual ? `$${price} / year` : `$${price} / month`\n    },\n    priceSubDisplay(price) {\n      if (price == 0) {\n        return '$0'\n      }\n      return `= $${price} / month x ${this.priceTable.billingCycleMonths}`\n    },\n    checkout() {\n      if (!this.primaryEmailVerified) {\n        this.showPrimaryEmailUnverifiedWarning()\n        return\n      }\n\n      chargeBee.checkout(this.chargeBeeInstance, '/ent/generate_pro_checkout_url/', {\n        plan: 'pro',\n        annual: this.isAnnual,\n        printers: this.numPrinters,\n        dhpack_level: this.dhPackKey,\n        coupon: this.couponCode,\n      })\n    },\n    showPrimaryEmailUnverifiedWarning() {\n      this.$swal.Reject.fire({\n        html: `<p class=\"text-center\">${this.$i18next.t(\n          'You need to'\n        )} <a href=\"/accounts/email/\">${this.$i18next.t(\n          'verify your primary email'\n        )}</a> ${this.$i18next.t('as it will be used for billing communication.')}</p>`,\n      })\n    },\n    cancel() {\n      this.$swal.close()\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n#sub-printers\n  margin-left: 0.35rem\n\n.price-sub\n  color: var(--color-text-secondary)\n  font-size: 0.9em\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigureSubscription.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigureSubscription.vue?vue&type=template&id=7ebe8524&scoped=true&\"\nimport script from \"./ConfigureSubscription.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigureSubscription.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigureSubscription.vue?vue&type=style&index=0&id=7ebe8524&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7ebe8524\",\n  null\n  \n)\n\nexport default component.exports","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./JusprinFeedback.vue?vue&type=style&index=0&id=e9689bf8&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintCard.vue?vue&type=style&index=0&id=514d0214&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SliderInput.vue?vue&type=style&index=0&id=abb68ee6&prod&lang=sass&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WelcomePage.vue?vue&type=style&index=0&id=34f8280e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=style&index=0&id=058adf52&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bubbling-2.jpg\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GradientFadableContainer.vue?vue&type=style&index=0&id=411f3522&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PageLayout.vue?vue&type=style&index=0&id=b5cfcc80&prod&lang=sass&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ActiveFilterNotice.vue?vue&type=style&index=0&id=061feff7&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./UpgradeModal.vue?vue&type=style&index=0&id=429c0503&prod&lang=scss&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AvailablePrinters.vue?vue&type=style&index=0&id=71e3dd42&prod&lang=sass&scoped=true&\"","export const pageContext = () => {\n  return JSON.parse(document.querySelector('#page-context-json').text)\n}\n\nexport const mobilePlatform = () => {\n  return pageContext()['app_platform']\n}\n\nexport const inMobileWebView = () => {\n  return mobilePlatform() !== ''\n}\n\nexport const user = () => {\n  return JSON.parse(document.querySelector('#user-json').text)\n}\n\nexport const settings = () => {\n  return JSON.parse(document.querySelector('#settings-json').text)\n}\n\nexport const syndicate = () => {\n  return pageContext()['syndicate']\n}\n\nexport const language = () => {\n  return pageContext()['language']\n}","import axios from 'axios'\nimport { getCsrfFromDocument } from '@src/lib/utils'\n\naxios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'\nlet token = getCsrfFromDocument()\nif (token) {\n  axios.defaults.headers.common['X-CSRFToken'] = token\n} else {\n  console.error('CSRF token not found')\n}\n\nexport default axios\n","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveModal.vue?vue&type=style&index=0&id=ef0f185e&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FocusedFeedbackConsent.vue?vue&type=style&index=0&id=91f97838&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=c7179f58&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/full-remote-access.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeDetails.vue?vue&type=style&index=0&id=090fe65d&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintHistoryPage.vue?vue&type=style&index=0&id=29682057&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FirstLayerReportModal.vue?vue&type=style&index=1&id=21ff5370&prod&lang=css&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./HelpWidget.vue?vue&type=style&index=1&id=40661357&prod&scoped=true&lang=css&\"","import entries from 'lodash/entries'\nimport map from 'lodash/map'\n\nexport default {\n  // APIs\n  printShotFeedback: (shotId, printId) =>\n    `/api/v1/printshotfeedbacks/${shotId}/?print_id=${printId}`,\n  print: (printId) => `/api/v1/prints/${printId}/`,\n  prints: () => '/api/v1/prints/',\n  printsBulkDelete: () => '/api/v1/prints/bulk_delete/',\n  stats: () => `/api/v1/prints/stats/`,\n\n  printers: () => '/api/v1/printers/',\n  printer: (printerId) => `/api/v1/printers/${printerId}/`,\n  printerAction: (printerId, path) => `/api/v1/printers/${printerId}${path}`,\n  pubPrinter: () => '/api/v1p/printer/',\n\n  tunnels: () => '/api/v1/tunnels/',\n  tunnel: (id) => `/api/v1/tunnels/${id}/`,\n  tunnelUsage: () => '/api/v1/tunnelusage/',\n  verificationCode: () => '/api/v1/onetimeverificationcodes/',\n  user: () => '/api/v1/users/me/',\n  sharedResources: (paramsObj) =>\n    '/api/v1/sharedresources/?' + map(entries(paramsObj), (entry) => entry.join('=')).join('&'),\n  sharedResource: (resourceId) => `/api/v1/sharedresources/${resourceId}/`,\n  printerDiscovery: () => '/api/v1/printer_discovery/',\n  oneTimePasscodes: () => '/api/v1/one_time_passcodes/',\n\n  printerEvents: () => '/api/v1/printer_events/',\n\n  // Notifications\n  notificationPlugins: () => '/api/v1/notification_settings/available_plugins/',\n  notificationChannels: () => '/api/v1/notification_settings/',\n  updateNotificationChannel: (id) => `/api/v1/notification_settings/${id}/`,\n  testNotificationChannel: (id) => `/api/v1/notification_settings/${id}/send_test_message/`,\n\n  // App urls\n  printerControl: (printerId) => `/printers/${printerId}/control/`,\n  printerWebSocket: (printerId) => `/ws/web/${printerId}/`,\n  printerSharedWebSocket: (token) => `/ws/share_token/web/${token}/`,\n  printerWizard: (printerId) => `/printers/wizard/?printerId=${printerId}`,\n\n  // Gcodes\n  gcodeFile: (id) => `/api/v1/g_code_files/${id}/`,\n  gcodeFiles: () => '/api/v1/g_code_files/',\n  gcodeFolder: (id) => `/api/v1/g_code_folders/${id}/`,\n  gcodeFolders: () => '/api/v1/g_code_folders/',\n  gcode: (gcodeId) => `/api/v1/g_code_files/${gcodeId}/`,\n  gcodeFolderBulkDelete: () => '/api/v1/g_code_folders/bulk_delete/',\n  gcodeFileBulkDelete: () => '/api/v1/g_code_files/bulk_delete/',\n  gcodeFolderBulkMove: () => '/api/v1/g_code_folders/bulk_move/',\n  gcodeFileBulkMove: () => '/api/v1/g_code_files/bulk_move/',\n\n  // JusPrin\n  jusprinMe: () => '/jusprin/api/me/',\n  jusprinChats: (chatId) => (chatId ? `/jusprin/api/chats/${chatId}/` : `/jusprin/api/chats/`),\n  jusprinChatMessages: (chat_id) => `/jusprin/api/chats/messages/`,\n  jusprinPlateAnalysisProcess: () => '/jusprin/api/plate_analysis/',\n  jusprinContactSupport: () => '/jusprin/api/contact_support/',\n}\n","import publicUrls from '@src/config/server-urls'\n\nexport default {\n  ...publicUrls,\n  getMessages: () => '/ent/api/messages/',\n  dismissMessage: (id) => `/ent/api/messages/${id}/dismiss/`,\n  deleteAccount: () => '/ent/api/users/delete/',\n  userExt: () => '/ent/api/users/me_ext/',\n  switchLegacySubscriptionToLoyalty: () => '/ent/api/users/switch_legacy_subscription_to_loyalty/',\n  subscriptions: () => '/ent/api/subscriptions/',\n  activeSubscription: () => '/ent/api/subscriptions/active/',\n  cancelSubscription: (id) => `/ent/api/subscriptions/${id}/cancel/`,\n  publicTimelapses: () => '/ent/api/publictimelapse/',\n  uploadedTimelapses: () => '/ent/api/uploaded_timelapses/',\n  firstLayerInspection: (print_id) => `/ent/api/first_layer_inspection/?print_id=${print_id}`,\n  redeemBtt3mUnlimited: () => `/ent/partners/api/redeem/btt_3m_unlimited/`,\n  redeemThreeDO3mUnlimited: () => `/ent/partners/api/redeem/three_do_3m_unlimited/`,\n  redeemMintion3mUnlimited: () => `/ent/partners/api/redeem/mintion_3m_unlimited/`,\n  detectiveHourCouponCodes: () => '/ent/api/detective_hour_coupon_codes/',\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttUserNotAuthenticatedModal.vue?vue&type=style&index=0&id=0f963e48&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/printoid.webp\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFilePage.vue?vue&type=style&index=0&id=5e958c35&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/print-padded.png\";","var map = {\n\t\"./ApprisePlugin\": [\n\t\t\"f571\",\n\t\t\"chunk-691bc59e\"\n\t],\n\t\"./ApprisePlugin.vue\": [\n\t\t\"f571\",\n\t\t\"chunk-691bc59e\"\n\t],\n\t\"./DiscordPlugin\": [\n\t\t\"2ce8\",\n\t\t\"chunk-19479659\"\n\t],\n\t\"./DiscordPlugin.vue\": [\n\t\t\"2ce8\",\n\t\t\"chunk-19479659\"\n\t],\n\t\"./EmailPlugin\": [\n\t\t\"a80e\",\n\t\t\"chunk-683e0066\"\n\t],\n\t\"./EmailPlugin.vue\": [\n\t\t\"a80e\",\n\t\t\"chunk-683e0066\"\n\t],\n\t\"./PushbulletPlugin\": [\n\t\t\"5e41\",\n\t\t\"chunk-38e6bf7c\"\n\t],\n\t\"./PushbulletPlugin.vue\": [\n\t\t\"5e41\",\n\t\t\"chunk-38e6bf7c\"\n\t],\n\t\"./PushoverPlugin\": [\n\t\t\"e7fb\",\n\t\t\"chunk-312ac63a\"\n\t],\n\t\"./PushoverPlugin.vue\": [\n\t\t\"e7fb\",\n\t\t\"chunk-312ac63a\"\n\t],\n\t\"./SlackPlugin\": [\n\t\t\"0d89\",\n\t\t\"chunk-07cc365e\"\n\t],\n\t\"./SlackPlugin.vue\": [\n\t\t\"0d89\",\n\t\t\"chunk-07cc365e\"\n\t],\n\t\"./TelegramPlugin\": [\n\t\t\"350b\",\n\t\t\"chunk-c8beb52c\"\n\t],\n\t\"./TelegramPlugin.vue\": [\n\t\t\"350b\",\n\t\t\"chunk-c8beb52c\"\n\t],\n\t\"./TwilioPlugin\": [\n\t\t\"425a\",\n\t\t\"chunk-716240ff\"\n\t],\n\t\"./TwilioPlugin.vue\": [\n\t\t\"425a\",\n\t\t\"chunk-716240ff\"\n\t],\n\t\"./WebhookPlugin\": [\n\t\t\"affb\",\n\t\t\"chunk-24e37396\"\n\t],\n\t\"./WebhookPlugin.vue\": [\n\t\t\"affb\",\n\t\t\"chunk-24e37396\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = \"cb77\";\nmodule.exports = webpackAsyncContext;","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KingroonPricingPage.vue?vue&type=style&index=0&id=0cc96e90&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MintionRedeemPage.vue?vue&type=style&index=0&id=456f3cd8&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FullScreenPrintCard.vue?vue&type=style&index=0&id=be9465e8&prod&lang=sass&scoped=true&\"","import startCase from 'lodash/startCase'\nimport toLower from 'lodash/toLower'\nimport replace from 'lodash/replace'\nimport get from 'lodash/get'\nimport DOMPurify from 'dompurify'\n\n// Printer event text is HTML written by agents, or by the server around user-supplied names\nconst EVENT_TEXT_TAGS = ['div', 'p', 'span', 'i', 'b', 'strong', 'em', 'br', 'ul', 'li']\n\nexport const sanitizeEventText = (html) =>\n  DOMPurify.sanitize(html || '', { ALLOWED_TAGS: EVENT_TEXT_TAGS, ALLOWED_ATTR: [] })\n\nexport function getNotificationSettingKey(notificationChannel, key) {\n  return `${notificationChannel.channelName}_${key}`\n}\n\nexport function temperatureDisplayName(name) {\n  return startCase(toLower(replace(name, /_/g, ' ')))\n}\n\nexport const getNormalizedP = (predictions, currentPosition, isPublic) => {\n  const num = Math.round(predictions.length * currentPosition)\n  const propName = isPublic ? 'p' : 'fields.normalized_p'\n  return get(predictions[num], `${propName}`, 0)\n}\n\nexport const toArrayBuffer = (maybeBin, onData) => {\n  if (!maybeBin) {\n    return\n  }\n\n  if (maybeBin instanceof Blob) {\n    const reader = new FileReader()\n    reader.addEventListener('loadend', (e) => {\n      if (!e.srcElement) {\n        return\n      }\n      onData(e.srcElement.result)\n    })\n    reader.readAsArrayBuffer(maybeBin)\n  } else {\n    onData(maybeBin)\n  }\n}\n\nexport const getCsrfFromDocument = () => {\n  return document.getElementsByName('csrfmiddlewaretoken')[0]?.value\n}\n\nexport const downloadFile = (url, filename) => {\n  fetch(url)\n    .then((res) => res.blob())\n    .then((res) => {\n      const aElement = document.createElement('a')\n      aElement.setAttribute('download', filename)\n      const href = URL.createObjectURL(res)\n      aElement.href = href\n      aElement.setAttribute('target', '_blank')\n      aElement.click()\n      URL.revokeObjectURL(href)\n    })\n}\n\nexport const formatWithoutDaylightSavingShift = (date, formattingStr) => {\n  return date.utcOffset(date._tzm).format(formattingStr)\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThreeDORedeemCompletedModal.vue?vue&type=style&index=0&id=29051c79&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SovolRedeemPage.vue?vue&type=style&index=0&id=580015d4&prod&lang=sass&scoped=true&\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{class:{\n      'saving-in-progress': _vm.savingClass,\n      'successfully-saved': _vm.savingDoneClass,\n      'failed-to-save': _vm.savingFailedClass,\n      'small-height': _vm.smallHeightClass,\n    }},[_vm._t(\"default\")],2),(_vm.errors && _vm.errors.length > 0)?_c('small',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.errorMsg))]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <div\n      :class=\"{\n        'saving-in-progress': savingClass,\n        'successfully-saved': savingDoneClass,\n        'failed-to-save': savingFailedClass,\n        'small-height': smallHeightClass,\n      }\"\n    >\n      <slot></slot>\n    </div>\n    <small v-if=\"errors && errors.length > 0\" class=\"text-danger\">{{ errorMsg }}</small>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: 'SavingAnimation',\n\n  props: {\n    saving: {\n      default() {\n        return false\n      },\n      type: Boolean,\n    },\n    errors: {\n      type: Array,\n      default: null,\n    },\n    height: {\n      default() {\n        return 'normal'\n      }, // normal, small\n      type: String,\n    },\n  },\n\n  data() {\n    return {\n      savingTimeout: null,\n      savingDoneTimeout: null,\n    }\n  },\n\n  computed: {\n    savingClass() {\n      return this.saving && this.savingTimeout\n    },\n    savingDoneClass() {\n      return !this.saving && this.savingDoneTimeout && !this.errors\n    },\n    savingFailedClass() {\n      return !this.saving && this.savingDoneTimeout && this.errors && this.errors.length > 0\n    },\n    smallHeightClass() {\n      return this.height === 'small'\n    },\n    errorMsg() {\n      return this.errors ? this.errors.join(' ') : ''\n    },\n  },\n\n  watch: {\n    saving: function (nowSaving, prevSaving) {\n      // watch it\n      if (!prevSaving && nowSaving) {\n        this.clearSavingTimeout()\n        this.savingTimeout = setTimeout(this.clearSavingTimeout, 15 * 1000)\n      } else if (prevSaving && !nowSaving) {\n        this.clearSavingTimeout()\n        this.savingDoneTimeout = setTimeout(() => {\n          clearTimeout(this.savingDoneTimeout)\n          this.savingDoneTimeout = null\n        }, 2 * 1000)\n      }\n    },\n  },\n\n  methods: {\n    clearSavingTimeout() {\n      if (this.savingTimeout) {\n        clearTimeout(this.savingTimeout)\n        this.savingTimeout = null\n      }\n    },\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.saving-in-progress, .successfully-saved, .failed-to-save\n  $indicatorSize: 16px\n\n  &:before\n    content: \"\"\n    background-size: $indicatorSize $indicatorSize\n    width: $indicatorSize\n    height: $indicatorSize\n    display: block\n    position: absolute\n    top: 0\n    bottom: 0\n    right: -#{$indicatorSize + 12px}\n    margin: auto\n    z-index: 9\n\n  &.saving-in-progress\n    position: relative\n\n    &:before\n      background-image: var(--url-loader)\n\n  &.successfully-saved\n    position: relative\n\n    &:before\n      background-image: url('/static/img/tick.svg')\n\n  &.failed-to-save\n    position: relative\n\n    &:before\n      background-image: url('/static/img/cross.svg')\n</style>\n","import mod from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../web_ent/frontend/node_modules/thread-loader/dist/cjs.js!../../../../web_ent/frontend/node_modules/babel-loader/lib/index.js!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SavingAnimation.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SavingAnimation.vue?vue&type=template&id=067e7fa8&scoped=true&\"\nimport script from \"./SavingAnimation.vue?vue&type=script&lang=js&\"\nexport * from \"./SavingAnimation.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SavingAnimation.vue?vue&type=style&index=0&id=067e7fa8&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../web_ent/frontend/node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"067e7fa8\",\n  null\n  \n)\n\nexport default component.exports","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingPlaceholder.vue?vue&type=style&index=0&id=18d7f03c&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/bumpsAndRoughSurface-1.jpg\";","import i18n from '@src/i18n/i18n.js'\n\nexport default {\n  email: {\n    displayName: `${i18n.t('Email')}`,\n    componentName: 'EmailPlugin',\n  },\n  twilio: {\n    displayName: `${i18n.t('SMS')}`,\n    componentName: 'TwilioPlugin',\n  },\n  pushbullet: {\n    displayName: `${i18n.t('Pushbullet')}`,\n    componentName: 'PushbulletPlugin',\n  },\n  discord: {\n    displayName: `${i18n.t('Discord')}`,\n    componentName: 'DiscordPlugin',\n  },\n  telegram: {\n    displayName: `${i18n.t('Telegram')}`,\n    componentName: 'TelegramPlugin',\n  },\n  pushover: {\n    displayName: `${i18n.t('Pushover')}`,\n    componentName: 'PushoverPlugin',\n  },\n  slack: {\n    displayName: `${i18n.t('Slack')}`,\n    componentName: 'SlackPlugin',\n  },\n  webhook: {\n    displayName: `${i18n.t('Webhook')}`,\n    componentName: 'WebhookPlugin',\n  },\n  apprise: {\n    displayName: `${i18n.t('Apprise')}`,\n    componentName: 'ApprisePlugin',\n  },\n}\n","module.exports = __webpack_public_path__ + \"img/compatible-with-favorite-software.png\";","module.exports = __webpack_public_path__ + \"img/mintion-obico-logo.png\";","export * from \"-!../../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./ContactSupportForm.vue?vue&type=style&index=0&id=16e50642&prod&scoped=true&lang=css&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./CollapsableDetails.vue?vue&type=style&index=0&id=48fdd412&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/webpage-multiple.svg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./DisplayStatusWidget.vue?vue&type=style&index=0&id=e46a13a2&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/mobileraker.webp\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"primary\":\"#00c4b4\",\"white\":\"#fff\"};","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PublicTimelapsesPage.vue?vue&type=style&index=0&id=3118e4a9&prod&lang=sass&scoped=true&\"","const Themes = {\n  Light: 'Light',\n  Dark: 'Dark',\n  System: 'System',\n}\n\n\nexport const jusprin = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#694b7c', [Themes.Dark]: '#694b7c'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#7d5c93', [Themes.Dark]: '#7d5c93'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#f3f4f6', [Themes.Dark]: '#f3f4f6'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#f3f4f6', [Themes.Dark]: '#f3f4f6'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#1f2937', [Themes.Dark]: '#1f2937'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#6b7280', [Themes.Dark]: '#6b7280'},\n    },\n  ],\n}\n\n// JusPrin 2, apart from JusPrin v1's brand above. Colours from JusPrin 2's\n// design tokens (JusPrin repo, resources/jusprin/ui/design-tokens.json).\nexport const jusprinv2 = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#3A2D64', [Themes.Dark]: '#3A2D64'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#4B3A77', [Themes.Dark]: '#4B3A77'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#F6F2F7', [Themes.Dark]: '#F6F2F7'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#F6F2F7', [Themes.Dark]: '#F6F2F7'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#17131F', [Themes.Dark]: '#17131F'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#5F5767', [Themes.Dark]: '#5F5767'},\n    },\n  ],\n}\n\nexport const yumi = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#078ED3', [Themes.Dark]: '#FFCC2E'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#0B88C8', [Themes.Dark]: '#FFCC2E'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#24A8EC', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#131920'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n    },\n  ],\n}\n\nexport const kingroon = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#ED7100', [Themes.Dark]: '#ED7100'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#fb7a00', [Themes.Dark]: '#fb7a00'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#24A8EC', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#212224'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#131920'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#42566B'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n    },\n  ],\n}\n\nexport const mintion = {\n  // only light theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#75C4FE', [Themes.Dark]: '#75C4FE'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#35A9FD', [Themes.Dark]: '#35A9FD'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#03DAC5', [Themes.Dark]: '#03DAC5'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#FFFFFF'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#424A54'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#F5F5F5'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#F5F5F5CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#66666613'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#66666626'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#ABB6C2'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#ABB6C266'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#8A94A2'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#E2E8ED'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#28303A80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#E3E3E3'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#4E5D6C'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#1D2935'},\n    },\n  ],\n}\n\n\nexport const biqu = {\n  // only dark theme is supported for now\n  colors: [\n    {\n      name: 'primary',\n      values: {[Themes.Light]: '#3596f3', [Themes.Dark]: '#3596f3'},\n    },\n    {\n      name: 'primary-hover',\n      values: {[Themes.Light]: '#70EFDE', [Themes.Dark]: '#70EFDE'},\n    },\n    {\n      name: 'primary-muted',\n      values: {[Themes.Light]: '#018786', [Themes.Dark]: '#018786'},\n    },\n    {\n      name: 'on-primary',\n      values: {[Themes.Light]: '#001210', [Themes.Dark]: '#001210'},\n    },\n    {\n      name: 'secondary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'secondary-hover',\n      values: {[Themes.Light]: '#D0D0D0', [Themes.Dark]: '#D0D0D0'},\n    },\n    {\n      name: 'on-secondary',\n      values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#28303A'},\n    },\n    {\n      name: 'success',\n      values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n    },\n    {\n      name: 'success-hover',\n      values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n    },\n    {\n      name: 'on-success',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'danger',\n      values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n    },\n    {\n      name: 'danger-hover',\n      values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n    },\n    {\n      name: 'on-danger',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'warning',\n      values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n    },\n    {\n      name: 'warning-hover',\n      values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n    },\n    {\n      name: 'on-warning',\n      values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n    },\n    {\n      name: 'on-warning-2',\n      values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'background',\n      values: {[Themes.Light]: '#0a0c22', [Themes.Dark]: '#0a0c22'},\n    },\n    {\n      name: 'surface-primary',\n      values: {[Themes.Light]: '#20274f', [Themes.Dark]: '#20274f'},\n    },\n    {\n      name: 'surface-secondary',\n      values: {[Themes.Light]: '#0c1239', [Themes.Dark]: '#0c1239'},\n    },\n    {\n      name: 'overlay',\n      values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#F5F5F5CC'},\n    },\n    {\n      name: 'hover',\n      values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#66666613'},\n    },\n    {\n      name: 'hover-accent',\n      values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#66666626'},\n    },\n    {\n      name: 'divider',\n      values: {[Themes.Light]: '#6A7B8A', [Themes.Dark]: '#6A7B8A'},\n    },\n    {\n      name: 'divider-muted',\n      values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#ABB6C266'},\n    },\n    {\n      name: 'text-primary',\n      values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#EBEBEB'},\n    },\n    {\n      name: 'text-secondary',\n      values: {[Themes.Light]: '#AAACB0', [Themes.Dark]: '#AAACB0'},\n    },\n    {\n      name: 'text-help',\n      values: {[Themes.Light]: '#283848', [Themes.Dark]: '#283848'},\n    },\n\n    {\n      name: 'input-background',\n      values: {[Themes.Light]: '#42566B', [Themes.Dark]: '#000000'},\n    },\n    {\n      name: 'input-placeholder',\n      values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#28303A80'},\n    },\n\n    {\n      name: 'table-accent',\n      values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#E3E3E3'},\n    },\n\n    // Icon colors\n    {\n      name: 'icon-tunneling-1',\n      values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#4E5D6C'},\n    },\n    {\n      name: 'icon-tunneling-2',\n      values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#1D2935'},\n    },\n  ],\n}\n","import { isLocalStorageSupported } from './utils.js'\nimport * as syndicates from './syndicate.js'\n\n\nconst Themes = {\n  Light: 'Light',\n  Dark: 'Dark',\n  System: 'System',\n}\n\nconst defaultTheme = (isLocalStorageSupported() ? localStorage.getItem('colorTheme') : Themes.Dark) || Themes.Dark\n\n// CSS Vars\n\nconst colors = [\n  {\n    name: 'primary',\n    values: {[Themes.Light]: '#01A299', [Themes.Dark]: '#03DAC5'},\n  },\n  {\n    name: 'primary-hover',\n    values: {[Themes.Light]: '#019592', [Themes.Dark]: '#70EFDE'},\n  },\n  {\n    name: 'primary-muted',\n    values: {[Themes.Light]: '#03DAC5', [Themes.Dark]: '#018786'},\n  },\n  {\n    name: 'on-primary',\n    values: {[Themes.Light]: '#FFFFFF', [Themes.Dark]: '#001210'},\n  },\n  {\n    name: 'secondary',\n    values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#EBEBEB'},\n  },\n  {\n    name: 'secondary-hover',\n    values: {[Themes.Light]: '#424A54', [Themes.Dark]: '#D0D0D0'},\n  },\n  {\n    name: 'on-secondary',\n    values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#28303A'},\n  },\n  {\n    name: 'success',\n    values: {[Themes.Light]: '#5CB85C', [Themes.Dark]: '#5CB85C'},\n  },\n  {\n    name: 'success-hover',\n    values: {[Themes.Light]: '#4CAE4C', [Themes.Dark]: '#4CAE4C'},\n  },\n  {\n    name: 'on-success',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'danger',\n    values: {[Themes.Light]: '#D9534F', [Themes.Dark]: '#D9534F'},\n  },\n  {\n    name: 'danger-hover',\n    values: {[Themes.Light]: '#C2413D', [Themes.Dark]: '#C2413D'},\n  },\n  {\n    name: 'on-danger',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'warning',\n    values: {[Themes.Light]: '#F0AD4E', [Themes.Dark]: '#F0AD4E'},\n  },\n  {\n    name: 'warning-hover',\n    values: {[Themes.Light]: '#DB9A3F', [Themes.Dark]: '#DB9A3F'},\n  },\n  {\n    name: 'on-warning',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#ffffff'},\n  },\n  {\n    name: 'on-warning-2',\n    values: {[Themes.Light]: '#000000', [Themes.Dark]: '#000000'},\n  },\n  {\n    name: 'background',\n    values: {[Themes.Light]: '#EBEBEB', [Themes.Dark]: '#233141'},\n  },\n  {\n    name: 'surface-primary',\n    values: {[Themes.Light]: '#ffffff', [Themes.Dark]: '#485B71'},\n  },\n  {\n    name: 'surface-secondary',\n    values: {[Themes.Light]: '#F5F5F5', [Themes.Dark]: '#2D3E4F'},\n  },\n  {\n    name: 'overlay',\n    values: {[Themes.Light]: '#F5F5F5CC', [Themes.Dark]: '#000000CC'},\n  },\n  {\n    name: 'hover',\n    values: {[Themes.Light]: '#66666613', [Themes.Dark]: '#FFFFFF13'},\n  },\n  {\n    name: 'hover-accent',\n    values: {[Themes.Light]: '#66666626', [Themes.Dark]: '#C9E0FA26'},\n  },\n  {\n    name: 'divider',\n    values: {[Themes.Light]: '#ABB6C2', [Themes.Dark]: '#6A7B8A'},\n  },\n  {\n    name: 'divider-muted',\n    values: {[Themes.Light]: '#ABB6C266', [Themes.Dark]: '#6A7B8A66'},\n  },\n  {\n    name: 'text-primary',\n    values: {[Themes.Light]: '#28303A', [Themes.Dark]: '#EBEBEB'},\n  },\n  {\n    name: 'text-secondary',\n    values: {[Themes.Light]: '#8A94A2', [Themes.Dark]: '#AAACB0'},\n  },\n  {\n    name: 'text-help',\n    values: {[Themes.Light]: '#4C9BE8', [Themes.Dark]: '#4C9BE8'},\n  },\n\n  {\n    name: 'input-background',\n    values: {[Themes.Light]: '#E2E8ED', [Themes.Dark]: '#42566B'},\n  },\n  {\n    name: 'input-placeholder',\n    values: {[Themes.Light]: '#28303A80', [Themes.Dark]: '#EBEBEB80'},\n  },\n\n  {\n    name: 'table-accent',\n    values: {[Themes.Light]: '#E3E3E3', [Themes.Dark]: '#283848'},\n  },\n\n  // Icon colors\n  {\n    name: 'icon-tunneling-1',\n    values: {[Themes.Light]: '#4E5D6C', [Themes.Dark]: '#EAEAEA'},\n  },\n  {\n    name: 'icon-tunneling-2',\n    values: {[Themes.Light]: '#1D2935', [Themes.Dark]: '#CDCDCD'},\n  },\n]\n\nconst urls = [\n  {\n    name: 'loader',\n    values: {[Themes.Light]: 'url(\"/static/img/loader/loader_light-scheme.svg\")', [Themes.Dark]: 'url(\"/static/img/loader/loader_dark-scheme.svg\")'},\n  },\n]\n\nconst shadows = [\n  {\n    name: 'top-nav',\n    values: {[Themes.Light]: '0px 2px 10px rgb(0 0 0 / .1)', [Themes.Dark]: '0px 2px 10px rgb(0 0 0 / .3)'},\n  },\n]\n\n\n// Get theme value (exclude \"System\")\nfunction currentThemeValue(theme, syndicate) {\n  const singleThemeSyndicates = {\n    jusprin: Themes.Light,\n    jusprinv2: Themes.Light,\n    yumi: Themes.Dark,\n    kingroon: Themes.Light,\n    mintion: Themes.Light,\n  }\n\n  if (syndicate && singleThemeSyndicates[syndicate]) {\n    return singleThemeSyndicates[syndicate]\n  }\n\n  // Get system settings\n  if (theme.value === Themes.System) {\n    if (window.matchMedia('(prefers-color-scheme)').media !== 'not all' && window.matchMedia('(prefers-color-scheme: light)').matches) {\n      return Themes.Light\n    } else {\n      return Themes.Dark\n    }\n  }\n  // Return saved value since it's not \"System\"\n  return theme.value\n}\n\nfunction mergeColorOverrides(defaultColors, syndicateColors) {\n  const merged = new Map(defaultColors.map(color => [color.name, color]));\n\n  syndicateColors.forEach(color => {\n    merged.set(color.name, color);\n  });\n\n  return Array.from(merged.values());\n}\n\n\nfunction initTheme(themeValue, syndicate) {\n  const finalColors = syndicate && syndicates[syndicate]\n  ? mergeColorOverrides(colors, syndicates[syndicate].colors)\n  : colors;\n\n  finalColors.forEach(function(color) {\n    document.documentElement.style.setProperty(`--color-${color.name}`, color.values[themeValue])\n\n    if (color.name === 'surface-secondary') {\n      // Set the <meta name=\"theme-color\"> tag to theme the browser nav bar (Safari)\n      let meta = document.querySelector('meta[name=\"theme-color\"]')\n      meta.content = color.values[themeValue]\n    }\n  })\n\n  urls.forEach(function(url) {\n    document.documentElement.style.setProperty(`--url-${url.name}`, url.values[themeValue])\n  })\n\n  shadows.forEach(function(shadow) {\n    document.documentElement.style.setProperty(`--shadow-${shadow.name}`, shadow.values[themeValue])\n  })\n}\n\n\nexport {\n  Themes,\n  defaultTheme,\n\n  colors,\n  urls,\n  shadows,\n\n  currentThemeValue,\n  initTheme,\n}\n","import Vue from 'vue'\nimport { isLocalStorageSupported } from '@static/js/utils'\nimport {\n  currentThemeValue as themeValue,\n  defaultTheme,\n  initTheme as init,\n} from '@static/js/color-scheme'\n\nexport const theme = Vue.observable({\n  value: defaultTheme,\n})\n\nexport function currentThemeValue(syndicate) {\n  return themeValue(theme, syndicate)\n}\n\nexport function initTheme() {\n  return init(currentThemeValue(Vue.prototype.$syndicate), Vue.prototype.$syndicate)\n}\n\nexport function setTheme(newTheme) {\n  theme.value = newTheme\n  if (isLocalStorageSupported()) {\n    localStorage.setItem('colorTheme', theme.value)\n  }\n  initTheme(Vue.prototype.$syndicate)\n}\n","module.exports = __webpack_public_path__ + \"img/sovol-obico-logo.png\";","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoBox.vue?vue&type=style&index=0&id=39b52572&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/raisedRipples-3.jpg\";","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintJobControlWidget.vue?vue&type=style&index=0&id=6af168b5&prod&lang=sass&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JusPrinPricingPage.vue?vue&type=style&index=0&id=086ae8b6&prod&lang=scss&scoped=true&\"","import notificationPlugins from '@src/notifications/plugins'\n\nconst defaultRoutes = {\n  GeneralPreferences: '/user_preferences/general/',\n  ThemePreferences: '/user_preferences/personalization/',\n  ProfilePreferences: '/user_preferences/profile/',\n  AuthorizedApps: '/user_preferences/authorized_apps/',\n  GeneralNotifications: '/user_preferences/general_notifications/',\n  PushNotifications: '/user_preferences/mobile_push_notifications/',\n}\n\nconst notificationRoutes = Object.keys(notificationPlugins).reduce((obj, name) => {\n  return Object.assign(obj, { [name]: `/user_preferences/notification_${name}/` })\n}, {})\n\nexport default {\n  ...defaultRoutes,\n  ...notificationRoutes,\n}\n","import publicRoutes from '@src/config/user-preferences/pref-routes'\n\nexport default {\n  ...publicRoutes,\n  Subscription: '/user_preferences/subscription/',\n  DetectiveHours: '/user_preferences/dh/',\n  DeleteAccount: '/user_preferences/delete/',\n}\n","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./FailureDetectionWidget.vue?vue&type=style&index=0&id=b62a7098&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./GCodeFoldersPage.vue?vue&type=style&index=0&id=fe48d7b6&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./SharedPrinterPage.vue?vue&type=style&index=0&id=36e7a07b&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrinterListPage.vue?vue&type=style&index=1&id=7f862148&prod&lang=sass&\"","export * from \"-!../../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkPopup.vue?vue&type=style&index=0&id=76d88bae&prod&lang=sass&scoped=true&\"","export * from \"-!../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./MutedAlert.vue?vue&type=style&index=0&id=74f6a500&prod&lang=sass&scoped=true&\"","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BttRedeemCompletedModal.vue?vue&type=script&lang=js&\"","export * from \"-!../../../../../web_ent/frontend/node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../../web_ent/frontend/node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../../web_ent/frontend/node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../web_ent/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../../web_ent/frontend/node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../../web_ent/frontend/node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../web_ent/frontend/node_modules/vue-loader/lib/index.js??vue-loader-options!./PrintProgressWidget.vue?vue&type=style&index=0&id=5b7d73ac&prod&lang=sass&scoped=true&\"","module.exports = __webpack_public_path__ + \"img/app-screenshot-6.webp\";","import { render, staticRenderFns } from \"./ThreeDORedeemCompletedModal.vue?vue&type=template&id=29051c79&scoped=true&\"\nimport script from \"./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ThreeDORedeemCompletedModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThreeDORedeemCompletedModal.vue?vue&type=style&index=0&id=29051c79&prod&lang=sass&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"29051c79\",\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/3do-obico-logo.png\";"],"sourceRoot":""}